HTML5 холст в зигзагообразную линию? - PullRequest
0 голосов
/ 01 февраля 2019

У меня линия между 2 точками.Линия может быть под любым углом.

Ex

const c = document.getElementById("myCanvas");
const ctx = c.getContext("2d");
const from = {x:50, y:50};
const to = {x: 100, y: 125};
ctx.beginPath();
ctx.moveTo(from.x, from.y);
ctx.lineTo(to.x, to.y);
ctx.stroke()
<canvas id="myCanvas"></canvas>

Как я могу превратить его в зигзагообразную линию?

Редактировать Итак, я играю в маленьком баскетбольном тренировочном приложении.Где вы должны быть в состоянии нарисовать линии, чтобы показать, как следует выполнять упражнение.Вы рисуете прямую линию, и затем вы можете с помощью кнопок меню изменить эту линию, чтобы она была пунктирной и / или зигзагообразной.

class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}

class Line {
    constructor(fromPoint = null, toPoint = null) {
        this.from = fromPoint;
        this.to = toPoint;
        this.dashed = false;
        this.zigZagged = false;
    }

    setFrom(point) { this.from = point;}

    setTo(point) { this.to = toPoint;}

    getFrom() { return this.from; }

    getTo() { return this.to}

    draw(ctx, color = '#000', lineWidth = 2.0) {
        ctx.beginPath();

        if (this.dashed) {
            ctx.setLineDash([5, 10]);
        } else {
            ctx.setLineDash([]);
        }

        //Starting point of the line
        ctx.moveTo(this.from.x, this.from.y);

        if (this.zigZagged) {
            // Need help with this function
            this.drawZigZagged();
        } else {
            ctx.lineTo(this.to.x, this.to.y);
        }



        ctx.lineWidth = lineWidth;
        ctx.strokeStyle = color;
        ctx.stroke();
    }

    drawZigZagged(ctx) {
        // PLEASE help creating this function
        // .. help
        // .. use this.from and this.to to create a zig zag line
        // .. maybe something like 20px for each individual zig zag line
        // .. I guess the function have to calculate the angle the
        // .. current line have (this.from - this.to)
        // .. to be able to create a zig zag line instead of a straight line
    }

    setDashed(enable) {
        this.dashed = enable;
    }

    setZigZagged(enable){
        this.zigZagged = enable
    }
}

Поэтому, пожалуйста, помогите мне создать функцию drawZigZagged (ctx) {...}

1 Ответ

0 голосов
/ 02 февраля 2019

Так что мне удалось это сделать.Так вот мой код для создания зигзагообразной линии.Смотри prepareZigZag и drawZigZag.Я прокомментировал, так что должно быть довольно просто понять, что происходит.Надеюсь, это может кому-то помочь.Пожалуйста, прокомментируйте улучшения.

class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}

class Line {
    constructor(fromPoint = null, toPoint = null, zigZagged = false) {
        this.from = fromPoint;
        this.to = toPoint;
        this.dashed = false;
        this.zigZagged = zigZagged;

        this.prepareZigZag();
    }

    setFrom(point) { this.from = point;}

    setTo(point) { this.to = toPoint;}

    getFrom() { return this.from; }

    getTo() { return this.to}

    prepareZigZag() {
        // Get the radian angle of the line
        this.lineRadians = Math.atan2(this.to.y - this.from.y, this.to.x - this.from.x);

        // Get the length of the line
        const a = this.from.x - this.to.x;
        const b = this.from.y - this.to.y;
        this.lineLength = Math.sqrt( a * a + b * b );

        // 10 pixels between each zig zag "wave"
        this.zigzagSpacing = 10;

        // Length of one zig zag line - will in reality be doubled see below usage
        this.oneZigZagLength = 10;

        //Length of the last straight bit - so we do not zig zag all the line
        this.straightLengthWhenZigZag = 30

        // The length of the zig zag lines
        this.zigZagLength = this.lineLength - this.straightLengthWhenZigZag;
    }


    draw(ctx, color = '#000', lineWidth = 2.0) {
        if (this.dashed) {
            ctx.setLineDash([4, 2]);
        } else {
            ctx.setLineDash([]);
        }

        if (this.zigZagged) {
            this.drawZigZagged(ctx);
        } else {
            ctx.beginPath();
            ctx.moveTo(this.from.x, this.from.y);
            ctx.lineTo(this.to.x, this.to.y);
        }
        ctx.lineWidth = lineWidth;
        ctx.strokeStyle = color;
        ctx.stroke();

    }

    drawZigZagged(ctx) {
        // Save the current drawing state
        ctx.save();

        // Begin the new path
        ctx.beginPath();

        //Set the new 0, 0
        ctx.translate(this.from.x, this.from.y);

        // Rotate the canvas so we can treat it like straight
        ctx.rotate(this.lineRadians);

        // Begin from 0, 0 (ie this.from.x, this.from.y)
        ctx.moveTo(0,0);
        let zx = 0;
        // Create zig zag lines
        for (let n = 0; zx < this.zigZagLength; n++) {
            // The new zig zag x position
            zx = ((n + 1) * this.zigzagSpacing);

            // The new zig zag y position - each and other time up and down
            const  zy = (n % 2 == 0) ? -this.oneZigZagLength : this.oneZigZagLength;

            // Draw the an actual line of the zig zag line
            ctx.lineTo(zx, zy);
        }
        // Back to the center vertically
        ctx.lineTo(this.lineLength - (this.straightLengthWhenZigZag / 2), 0);

        // Draw the last bit straight
        ctx.lineTo(this.lineLength, 0);

        // Restore the previous drawing state
        ctx.restore();
    }

    setDashed(enable) {
        this.dashed = enable;
    }

    setZigZagged(enable){
        this.zigZagged = enable
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...