无法在画布上绘制垂直虚线

加贾南·查凡(Gajanan Chavhan)

我正在使用以下javascript算法在画布上绘制虚线。该算法正确绘制水平线,但无法绘制垂直线:

            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();
        };

以下用于测试垂直线条绘制的点:

  g.dashedLine(157, 117, 157,153, [10, 5]);

用于测试水平线绘制的以下点:g.dashedLine(157,117,160,157,[10,5]);

鲍比·奥恩多夫(Bobby Orndorff)

当直线垂直时,dx = 0,这导致斜率=无穷大。如果编写自己的破折号逻辑,则需要处理dx = 0(或非常接近0)的特殊情况。在这种特殊情况下,您将不得不使用反斜率(即dx / dy)和yStep(而不是xStep)。

一个更大的问题是,为什么要编写自己的破折号逻辑。Canvas内置了对虚线的支持。调用setLineDash()函数设置虚线图案。完成后恢复以前的破折号模式。例如...

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);
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法在画布上绘制垂直虚线

来自分类Dev

画布用箭头绘制虚线

来自分类Dev

画布用箭头绘制虚线

来自分类Dev

无法删除画布上绘制的线条

来自分类Dev

Delphi:无法在面板的画布上绘制

来自分类Dev

在画布上绘制多次

来自分类Dev

在旋转的画布上绘制

来自分类Dev

无法在html5画布上绘制

来自分类Dev

使用 clearRect 时无法在画布上绘制多个形状

来自分类Dev

无法使用 setInterval 在画布上绘制正方形?

来自分类Dev

以编程方式在Android上绘制虚线

来自分类Dev

在iOS中的CorePlot图表上绘制虚线

来自分类Dev

在Google Map上绘制虚线折线-Android

来自分类Dev

在画布上初始绘制后无法绘制“fillRect” - Angular2+

来自分类Dev

Android L无法将虚线绘制为可绘制背景

来自分类Dev

画布问题,无法绘制矩形

来自分类Dev

Qt-在画布上绘制

来自分类Dev

使用GPU在画布上绘制

来自分类Dev

传单-在单独的画布上绘制

来自分类Dev

使用GPU在画布上绘制

来自分类Dev

使用按钮在画布上绘制

来自分类Dev

在画布上绘制旋转的元素

来自分类Dev

在画布上绘制多个元素

来自分类Dev

在 QML 画布上绘制段

来自分类Dev

在mouseclick上的画布上绘制实心圆

来自分类Dev

画布上的文字未绘制在图像上

来自分类Dev

是否可以绘制虚线或虚线?

来自分类Dev

是否可以绘制虚线或虚线?

来自分类Dev

使用React.js在画布上绘制图像后无法将画布转换为图像