画得很糟糕的画布

时间:2014-01-24 14:10:06

标签: javascript html canvas

我想画一条线从一个给定点开始并穿过另外两个点。为此,我得到这些点的x和y坐标,然后我绘制。这就是我的代码应该做的事情:

JS:

function getPosition(element)
{
    var left = 0;
    var top = 0;
    var e = document.getElementById(element);
    while (e.offsetParent != undefined && e.offsetParent != null)
    {
        left += e.offsetLeft + (e.clientLeft != null ? e.clientLeft : 0);
        top += e.offsetTop + (e.clientTop != null ? e.clientTop : 0);
        e = e.offsetParent;
    }
    return new Array(left,top);
}

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var point1 = getPosition('firstGalaxy');
var point2 = getPosition('secondGalaxy');
var point3 = getPosition('lastGalaxy');
console.log(point1);
console.log(point2);
console.log(point3);
ctx.beginPath();
ctx.moveTo(point1[0], point1[1]);
ctx.lineTo(point2[0], point2[1]);
ctx.lineTo(point3[0], point3[1]);
ctx.stroke(2);
ctx.closePath();

HTML:

<canvas id="myCanvas" style="position:absolute;" class="constellation">

我的控制台中打印的值似乎很好,但结果很糟糕。 这是结果的图片

enter image description here

右边的灰色方块是结果,红线是我想要的。 我甚至不知道为什么我得到一个正方形,因为我正在使用“stroke()”。

有谁能告诉我我的代码有什么问题?

2 个答案:

答案 0 :(得分:0)

将ctx.stroke(2)更改为ctx.stroke(),添加ctx.strokeStyle =“red”以更改线条的颜色。并且,将</canvas>添加到HTML。

HTML:

<canvas id="myCanvas" style="position:absolute;" class="constellation"></canvas>

使用Javascript:

function getPosition(element)
{
    var left = 0;
    var top = 0;
    var e = document.getElementById(element);
    while (e.offsetParent != undefined && e.offsetParent != null)
    {
        left += e.offsetLeft + (e.clientLeft != null ? e.clientLeft : 0);
        top += e.offsetTop + (e.clientTop != null ? e.clientTop : 0);
        e = e.offsetParent;
    }
    return new Array(left,top);
}

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var point1 = getPosition('firstGalaxy');
var point2 = getPosition('secondGalaxy');
var point3 = getPosition('lastGalaxy');
console.log(point1);
console.log(point2);
console.log(point3);
ctx.beginPath();
ctx.moveTo(point1[0], point1[1]);
ctx.lineTo(point2[0], point2[1]);
ctx.lineTo(point3[0], point3[1]);
ctx.strokeStyle="red";
ctx.stroke();
ctx.closePath();

答案 1 :(得分:0)

几个方向:

1)要进行调试,请使用以下内容绘制它们,确保您的点位于正确的位置:

function drawPoint(ctx, pt, color, pointSize ) {
    ctx.fillStyle = color || '#F88';
    var pointSize = pointSize || 2;
    var x = pt[0], y=pt[1];
    ctx.fillRect(x - pointSize/2, y-pointSize/2, pointSize, pointSize);
}

2)使用getBoundingClientRect以最大可靠性检索控制位置。

function getPosition(element, provideCenter)
{
    var elementBoundingRect = element.getBoundingClientRect();
    var point = [elementBoundingRect.left, elementBoundingRect.top];
    if (provideCenter) {
        point[0] += (elementBoundingRect.right  - elementBoundingRect.left) /2;
        point[1] += (elementBoundingRect.bottom - elementBoundingRect.top ) /2;
    }
    return point;
}

3)确保画布覆盖所有屏幕,并在几个可见的html项目上使用getPosition和drawPoint对屏幕的各个部分进行简单的单元测试。

编辑:1)中提供的代码很好。如有疑问,请在此处查看此测试: http://jsbin.com/aDimoJI/1/ 在进一步前往任何地方之前,您必须能够在任何地方绘制积分 确保您的画布在此测试的其他所有内容之上,因此您必须处理此问题...