Задать вопрос
DestinationFront
@DestinationFront

Как нарисовать тонкую нормальную линию на канвасе между двумя кликами мыши?

Добрый день

Мне нужно нарисовать несколько линий от точке к точке. Казалось бы код простой. Что может пойти не так?... Линия рисуется непойми где и непойми как. Чтобы получить линию нужно потыкать в рандомные места в коде ниже. Как нарисовать нормальную тонкую линию между двумя "кликами" по канвасу?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Draw lines</title>
    <style lang="css">
        html, body {
            margin: 0;
            padding: 0;
        }
        #id_canvas {
            width: 1556px;
            height: 1032px;
            background-image: url('https://i.ibb.co/5Kp3J85/2023-08-16-08-03-10.png');
            background-repeat: no-repeat;
            background-position: center;
            background-size: cover;
        }
    </style>
</head>
<body>

<!-- Канвас для рисования -->
<canvas id="id_canvas"></canvas>

<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
<script>
    $('document').ready(function() {
        let poitns = []; // Массив с кликами

        const $canvas = $('#id_canvas')[0];

        const context = $canvas.getContext('2d');
        context.strokeStyle = 'red';
        context.lineWidth = 1;

        const rect = $canvas.getBoundingClientRect();

        $($canvas).bind('click', function (e) {
            // Получаем координаты клика
            const x = Math.round(e.clientX - rect.left);
            const y = Math.round(e.clientY - rect.top);

            // Мне нужно нарисовать несколько линий от точке к точке.
            // Казалось бы код простой. Что может пойти не так?...
            // Линия рисуется непойми где и непойми как. Чтобы получить линию нужно потыкать в рандомные места
            // Как нарисовать нормальную тонкую линию между двумя "кликами" по канвасу?
            if (poitns.length >= 1) {
                // Рисуем линию
                context.beginPath();
                context.moveTo(x, y);
                context.lineTo(poitns.at(-1)[0], poitns.at(-1)[1]);
                context.stroke();

                console.log('Draw line from ', x, y, ' to ', poitns.at(-1)[0], poitns.at(-1)[1]);
            }
            else {
                console.log('First click at ', x, y);
            }

            poitns.push([x, y]);  // Кладем наш клик в массив
        });
    });
</script>
</body>
</html>
  • Вопрос задан
  • 160 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@ksnk
У канваса есть еще атрибуты - высота и ширина. По этим атрибутам и идет рисование и их нужно установить для корректного пересчета координат рисования в клики.
const rect = $canvas.getBoundingClientRect(); // после этого вставить 2 строки
    $($canvas).attr('width', rect.width);
    $($canvas).attr('height', rect.height);
//...

получится что-то вроде https://codepen.io/ksnk/pen/LYMPbxZ
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы