数据库已经有了各种点的信息。界面上可以显示点,现在需要将点用箭头画下来
function LoadCanvas(v) {
var canvas = $("#myCanvas");//获取画布的width,heigth
canvas.attr("width", v.width);
canvas.attr("height", v.height);
LoadLine();//加载点
}
//获取点,绘制路线,因为数据库查找时已经对点按时间排序,故这里的点是有序的
function LoadLine() {
var lstMapPoint = $(".MapPoint");
var i = 1;
var x1, x2, y1, y2;
for (i = 1; i < lstMapPoint.length; i++) {
x1 = lstMapPoint.eq(i - 1).css("left");//eq()索引从0开始
y1 = lstMapPoint.eq(i - 1).css("top");
x2 = lstMapPoint.eq(i).css("left");
y2 =lstMapPoint.eq(i).css("top");
x1 = parseInt(x1) + 20;
y1 = parseInt(y1) + 20;
x2 = parseInt(x2) + 20;
y2 = parseInt(y2) + 20;
arrow2("myCanvas", 0, 0, x1, y1, x2, y2);
}
}
//绘制路线
function arrow2(canId, ox, oy, x1, y1, x2, y2) {
//参数说明 canvas的 id ,原点坐标 第一个端点的坐标,第二个端点的坐标
var sta = new Array(x1, y1);
var l = Math.pow((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2), 1 / 2);
x2 = x2 - (20 / l) * (x2 - x1);
x2 = x2.toFixed(0);
y2 = y2 - (20 / l) * (y2 - y1);
y2 = y2.toFixed(0);
var end = new Array(x2, y2);
var canvas = document.getElementById(canId);
if (canvas == null) return false;
var ctx = canvas.getContext('2d');// 指定了在画布上绘制的类型。当前唯一的合法值是 "2d",
//画线
ctx.beginPath();//丢弃任何当前定义的路径并且开始一条新的路径。它把当前的点设置为 (0,0)
ctx.translate(ox, oy, 0); //坐标原点 为画布的变换矩阵添加水平的和垂直的偏移
ctx.moveTo(sta[0], sta[1]);//窗口的左上角移动到一个指定的坐标
ctx.lineTo(end[0], end[1]);//方法添加一个新点,然后创建从该点到画布中最后指定点的线条
ctx.strokeStyle = "#0000ff";
ctx.fill();//方法使用 fillStyle 属性所指定的颜色、渐变和模式来填充当前路径
ctx.lineWidth = 3;
ctx.stroke();//绘制当前路径的边框。路径定义的几何线条产生了,但线条的可视化取决于 strokeStyle、lineWidth、lineJoin、lineCap 和 miterLimit 等属性
ctx.save();
//画箭头
ctx.translate(end[0], end[1]);
//我的箭头本垂直向下,算出直线偏离Y的角,然后旋转 ,rotate是顺时针旋转的,所以加个负号
var ang = (end[0] - sta[0]) / (end[1] - sta[1]);
ang = Math.atan(ang);
if (end[1] - sta[1] >= 0) {
ctx.rotate(-ang);
} else {
ctx.rotate(Math.PI - ang);//加个180度,反过来
//ctx.scale(1, 0.2);
}
ctx.lineTo(-5, -10);
ctx.lineTo(0, -5);
ctx.lineTo(5, -10);
ctx.lineTo(0, 0);
ctx.fillStyle = "#0000ff";
ctx.fill(); //箭头是个封闭图形
ctx.lineWidth = 3;
ctx.restore(); //恢复到堆的上一个状态,其实这里没什么用。
ctx.closePath();
}