HTML Canvas - пунктирная обводка вокруг круга - PullRequest
6 голосов
/ 09 июня 2011

Я знаю, что нет встроенной поддержки для создания пунктирных линий обводки, отображаемых на холсте, но я видел, как умные люди смогли создать поддержку для этого.

Что мне интересно, так это еслиЕсть ли способ перевести это, чтобы позволить точечные штрихи вокруг фигур (в частности, кругов)?

Ответы [ 5 ]

9 голосов
/ 09 июня 2011

Демо-версия

calcPointsCirc принимает 4 аргумента: центр x / y, радиус и длину штрихов. Возвращает массив точек x, y, ex, ey. Вы можете просто перебрать точки, чтобы нарисовать пунктирную окружность. Вероятно, есть гораздо более изящные способы сделать это, но я решил, что это поможет.

function calcPointsCirc( cx,cy, rad, dashLength)
{
    var n = rad/dashLength,
        alpha = Math.PI * 2 / n,
        pointObj = {},
        points = [],
        i = -1;

    while( i < n )
    {
        var theta = alpha * i,
            theta2 = alpha * (i+1);

        points.push({x : (Math.cos(theta) * rad) + cx, y : (Math.sin(theta) * rad) + cy, ex : (Math.cos(theta2) * rad) + cx, ey : (Math.sin(theta2) * rad) + cy});
        i+=2;
    }              
    return points;            
} 


var canvas = document.getElementById('canvas'),
    ctx = canvas.getContext('2d');

canvas.width = canvas.height= 200;

var pointArray= calcPointsCirc(50,50,50, 1);
    ctx.strokeStyle = "rgb(255,0,0)";
    ctx.beginPath();

    for(p = 0; p < pointArray.length; p++){
        ctx.moveTo(pointArray[p].x, pointArray[p].y);
        ctx.lineTo(pointArray[p].ex, pointArray[p].ey);
        ctx.stroke();
    }

    ctx.closePath();
4 голосов
/ 22 октября 2017

самый простой способ, используя context.setLineDash ()

ctx.beginPath();
ctx.setLineDash([5, 5]);
ctx.beginPath();
ctx.arc(100, 60, 50, 0, Math.PI * 2);
ctx.closePath();
ctx.stroke();
4 голосов
/ 09 июня 2011

Если все остальное терпит неудачу, вы всегда можете зациклить переменную от 0 до 2 *pi, пропуская каждые step элементы и рисуя на всех остальных step элементах, указывающих на sin(angle)*radius+centerx, cos(angle)*radius+centery.

Ну вот, самодельный пунктирный круг:)

2 голосов
/ 07 февраля 2012

My JavaScript Path library реализует штриховой и пунктирный рисунок произвольных путей (которые могут состоять из любого количества прямых или изогнутых сегментов), включая эллипсы.Загрузите его и ознакомьтесь с примерами.

1 голос
/ 08 сентября 2014

Я искал пунктирный кружок для своей игры, и после прочтения всех страниц, которые я написал для машинописного текста, он работает очень хорошо. Если кто-нибудь ищет пунктирный круг в машинописи, он здесь;

export class DashedCircle
{
    centerX: number;
    centerY: number;
    radius: number;
    color: string;
    dashSize: number;
    ctx: CanvasRenderingContext2D;

    constructor(ctx:CanvasRenderingContext2D, centerX: number, centerY: number, radius: number, color: string, dashSize: number)
    {
        this.ctx = ctx;
        this.centerX = centerX;
        this.centerY = centerY;
        this.radius = radius;
        this.color = color;
        this.dashSize = dashSize;
    }

    CalculateCirclePoints()
    {
        var n = this.radius / this.dashSize;
        var alpha = Math.PI * 2 / n;
        var pointObj = {};
        var points = [];
        var i = -1;

        while (i < n)
        {
            var theta = alpha * i;
            var theta2 = alpha * (i + 1);
            points.push({
                x: (Math.cos(theta) * this.radius) + this.centerX,
                y: (Math.sin(theta) * this.radius) + this.centerY,
                ex: (Math.cos(theta2) * this.radius) + this.centerX,
                ey: (Math.sin(theta2) * this.radius) + this.centerY });
                i += 2;
        }

        return points;
    }

    Draw()
    {
        var points = this.CalculateCirclePoints();
        this.ctx.strokeStyle = this.color;
        this.ctx.beginPath();
        for (var p = 0; p < points.length; p++)
        {
            this.ctx.moveTo(points[p].x, points[p].y);
            this.ctx.lineTo(points[p].ex, points[p].ey);
            this.ctx.stroke();
        }
        this.ctx.closePath();
    }
}
...