问题描述
我正在使用以下javascript算法在画布上绘制虚线.该算法正确绘制水平线,但无法绘制垂直线:
I am using following javascript algorithm to draw dashed line on canvas. this algo draws horizontal line correctly but unable to draw vertical line:
g.dashedLine = function (x, y, x2, y2, dashArray) {
this.beginPath();
this.lineWidth = "2";
if (!dashArray)
dashArray = [10, 5];
if (dashLength == 0)
dashLength = 0.001; // Hack for Safari
var dashCount = dashArray.length;
this.moveTo(x, y);
var dx = (x2 - x);
var dy = (y2 - y);
var slope = dy / dx;
var distRemaining = Math.sqrt(dx * dx + dy * dy);
var dashIndex = 0;
var draw = true;
while (distRemaining >= 0.1) {
var dashLength = dashArray[(dashIndex++) % dashCount];
if (dashLength > distRemaining)
dashLength = distRemaining;
var xStep = Math.sqrt((dashLength * dashLength) / (1 + slope * slope));
if (x < x2) {
x += xStep;
y += slope * xStep;
}
else {
x -= xStep;
y -= slope * xStep;
}
if (draw) {
this.lineTo(x, y);
}
else {
this.moveTo(x, y);
}
distRemaining -= dashLength;
draw = !draw;
}
this.stroke();
this.closePath();
};
以下用于测试垂直线条绘制的点:
following Points used for testing vertical line draw:
g.dashedLine(157, 117, 157,153, [10, 5]);
以下用于测试水平线条绘制的点:g.dashedLine(157,117,160,157,[10,5]);
following Points used for testing horizontal line draw: g.dashedLine(157, 117, 160,157, [10, 5]);
推荐答案
当线垂直时,dx = 0导致坡度= Infinity.如果编写自己的破折号逻辑,则需要处理dx = 0(或非常接近0)的特殊情况.在这种特殊情况下,您必须使用反斜率(即dx/dy)和yStep(而不是xStep).
When the line is vertical, dx = 0 which leads to slope = Infinity. If you write your own dash logic then you need to handle the special case where dx = 0 (or very near 0). In this special case you would have to work with the inverse slope (i.e. dx / dy) and yStep (instead of xStep).
一个更大的问题是,为什么要编写自己的破折号逻辑.Canvas内置了对虚线的支持.调用setLineDash()函数设置虚线图案.完成后恢复以前的破折号模式.例如...
A bigger question is why are you writing your own dash logic. Canvas has built-in support for dashed lines. Call setLineDash() function to set the dash pattern. Restore the previous dash pattern when done. For example...
g.dashedLine = function (x, y, x2, y2, dashArray) {
this.beginPath();
this.lineWidth = "2";
if (!dashArray)
dashArray = [10, 5];
var prevDashArray = this.getLineDash();
this.setLineDash(dashArray);
this.moveTo(x, y);
this.lineTo(x2, y2);
this.stroke();
this.closePath();
this.setLineDash(prevDashArray);
};
这篇关于无法在画布上绘制垂直虚线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!