
<script type="text/javascript">
/*1.繪制網格 網格大小 10px 網格的顏色 #ddd */
/*2.繪制坐標 軸的離邊距離 20px 箭頭的尺寸 10px */
/*3.繪制點 點尺寸 6px */
/*4.連接點 */
/*5.准備數據*/
var data = [
{ x: 50, y: 90 },
{ x: 150, y: 150 },
{ x: 250, y: 250 },
{ x: 350, y: 130 },
{ x: 450, y: 80 }
]
/*使用面向對象的方式實現*/
var LineChart = function (ctx) {
//繪制工具
this.ctx = ctx || document.querySelector('canvas').getContext('2d');
//網格大小
this.gridSize = 10;
//網格線的顏色
this.gridColor = '#fff';
//軸的離邊距離
this.space = 20;
//箭頭的尺寸
this.arrowSize = 10;
//點尺寸
this.pointSize = 6;
//畫布的高度
this.canvasHeight = this.ctx.canvas.height;
//畫布的寬度
this.canvasWidth = this.ctx.canvas.width;
//入口函數
//this.init();
}
//入口函數
LineChart.prototype.init = function (data) {
this.drawGrid();
this.drawXY();
this.drawPointList(data);
this.joinPoint();
};
//繪制網格
LineChart.prototype.drawGrid = function () {
/*業務*/
/*1. 繪制X軸方向的線*/
var xCount = Math.floor(this.canvasHeight / this.gridSize);
for (var i = 0; i < xCount; i++) {
this.ctx.beginPath();
this.ctx.moveTo(0, i * this.gridSize - 0.5);
this.ctx.lineTo(this.canvasWidth, i * this.gridSize - 0.5);
this.ctx.strokeStyle = this.gridColor;
this.ctx.stroke();
}
/*2. 繪制Y軸方向的線*/
var yCount = Math.floor(this.canvasWidth / this.gridSize);
for (var i = 0; i < yCount; i++) {
this.ctx.beginPath();
this.ctx.moveTo(i * this.gridSize - 0.5, 0);
this.ctx.lineTo(i * this.gridSize - 0.5, this.canvasHeight);
this.ctx.strokeStyle = this.gridColor;
this.ctx.stroke();
}
}
//繪制原點和坐標軸
LineChart.prototype.drawXY = function () {
/*1.坐標原點*/
this.x0 = this.space;
this.y0 = this.canvasHeight - this.space;
/*2.繪制X軸*/
this.ctx.beginPath();
this.ctx.moveTo(this.x0, this.y0);
this.ctx.lineTo(this.canvasWidth - this.space, this.y0);
this.ctx.lineTo(this.canvasWidth - this.space - this.arrowSize, this.y0 + this.arrowSize / 2);
this.ctx.lineTo(this.canvasWidth - this.space - this.arrowSize, this.y0 - this.arrowSize / 2);
this.ctx.lineTo(this.canvasWidth - this.space, this.y0);
this.ctx.strokeStyle = '#000';
this.ctx.stroke();
this.ctx.fill();
/*3.繪制Y軸*/
this.ctx.beginPath();
this.ctx.moveTo(this.x0, this.y0);
this.ctx.lineTo(this.space, this.space);
this.ctx.lineTo(this.space + this.arrowSize / 2, this.space + this.arrowSize);
this.ctx.lineTo(this.space - this.arrowSize / 2, this.space + this.arrowSize);
this.ctx.lineTo(this.space, this.space);
this.ctx.stroke();
this.ctx.fill();
}
//繪制所有點
LineChart.prototype.drawPointList = function (data) {
//測試
//this.drawPoint(200,200);
var _this = this;
//原來的點
var oldPoint = {
x: this.x0,
y: this.y0
};
data.forEach(function (item, i) {
/*繪制小正方形 就是點*/
/*在繪制之前轉成cnavas坐標*/
var x = _this.x0 + item.x;
var y = _this.y0 - item.y;
_this.drawPoint(x, y);
_this.joinPoint(oldPoint, {
x: x,
y: y
});
//連線完畢之后去記錄 把這一次的點當做下一次連線的起始點
oldPoint = {
x: x,
y: y
}
});
}
LineChart.prototype.drawPoint = function (x, y) {
this.ctx.moveTo(x - this.pointSize / 2, y - this.pointSize / 2);
this.ctx.lineTo(x + this.pointSize / 2, y - this.pointSize / 2);
this.ctx.lineTo(x + this.pointSize / 2, y + this.pointSize / 2);
this.ctx.lineTo(x - this.pointSize / 2, y + this.pointSize / 2);
this.ctx.closePath();
this.ctx.fill();
};
//連接點
LineChart.prototype.joinPoint = function (oldPoint, currPoint) {
/*上一個點的坐標和現在的坐標相連*/
//oldPoint {x,y}
//currPoint {x,y}
this.ctx.beginPath();
this.ctx.moveTo(oldPoint.x, oldPoint.y);
this.ctx.lineTo(currPoint.x, currPoint.y);
this.ctx.stroke();
};
//使用
var lineChart = new LineChart();
lineChart.init(data);
</script>