LineTo: примеры (JAVASCRIPT)

Canvas lineTo: руководство с примерами рисования
Раздел: Canvas, Рисование
lineTo(x: Number, y: Number): undefined

Функция lineTo в JavaScript

Метод lineTo() принадлежит Canvas API и используется для добавления прямой линии в текущий подпуть. Он рисует линию от текущей позиции пера к координатам, указанным в параметрах.

Когда применяется:

Используется в графических приложениях на элементе <canvas> для создания контуров, фигур, схем и других векторных изображений. Часто применяется в сочетании с beginPath(), moveTo() и stroke().

Аргументы:

  • x (число) – Координата X точки, до которой ведется линия.
  • y (число) – Координата Y точки, до которой ведется линия.

Возвращаемое значение:

Метод ничего не возвращает (undefined).

Перед использованием необходимо получить контекст рисования CanvasRenderingContext2D. Линия становится видимой только после вызова методов stroke() или fill().

Примеры lineTo

Простейший пример рисования линии:

<canvas id='canvas1' width='200' height='200'></canvas>
<script>
  const canvas = document.getElementById('canvas1');
  const ctx = canvas.getContext('2d');
  ctx.beginPath();
  ctx.moveTo(20, 20);
  ctx.lineTo(180, 180);
  ctx.stroke();
</script>
// Результат: диагональная линия из точки (20,20) в (180,180)

Рисование ломаной линии с несколькими вызовами:

ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(150, 50);
ctx.lineTo(150, 150);
ctx.lineTo(50, 150);
ctx.closePath();
ctx.stroke();
// Результат: незамкнутый прямоугольник (трехсторонний контур)

Альтернативные методы JavaScript

  • quadraticCurveTo() – Добавляет квадратичную кривую Безье. Используется для плавных кривых с одной контрольной точкой.
  • bezierCurveTo() – Добавляет кубическую кривую Безье. Подходит для сложных кривых с двумя контрольными точками.
  • arc() – Рисует дугу или круг. Применяется для окружностей и их сегментов.
  • rect() – Создает прямоугольный контур. Более удобен для прямоугольников, чем последовательность lineTo.

Метод lineTo предпочтителен для рисования прямых отрезков и многоугольников произвольной формы.

Аналоги в других языках

Python (PIL/Pillow):

from PIL import Image, ImageDraw
img = Image.new('RGB', (200, 200), 'white')
draw = ImageDraw.Draw(img)
draw.line((20, 20, 180, 180), fill='black', width=1)
img.show()

В Pillow функция line() рисует линию сразу, а не добавляет в путь.

PHP (GD):

$image = imagecreate(200, 200);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
imageline($image, 20, 20, 180, 180, $black);
header('Content-Type: image/png');
imagepng($image);

Функция imageline() рисует линию за один вызов с указанием обеих точек.

C (Windows API):

MoveToEx(hdc, 20, 20, NULL);
LineTo(hdc, 180, 180);

Имеет схожий принцип с текущей позицией пера, но работает в контексте устройства (HDC).

Частые ошибки

1. Пропуск beginPath() приводит к перерисовке всех предыдущих линий:

ctx.moveTo(10, 10);
ctx.lineTo(50, 50);
ctx.stroke();
// Новый путь не начат
ctx.moveTo(100, 100);
ctx.lineTo(150, 150);
ctx.stroke(); // Нарисованы обе линии
// Результат: видны две линии, а не только вторая

2. Забывают вызвать stroke(), в результате линия не отображается:

ctx.beginPath();
ctx.moveTo(30, 30);
ctx.lineTo(100, 100);
// ctx.stroke(); отсутствует
// Результат: пустой canvas

3. Использование дробных координат без сглаживания может давать размытые линии:

ctx.lineTo(100.5, 50.5); // Линия может быть размытой

Изменения в спецификации

Метод lineTo() остается стабильным с момента введения Canvas API. Существенных изменений в синтаксисе или поведении не было. Основные обновления связаны с добавлением новых возможностей в Canvas API, таких как улучшенное сглаживание или поддержка новых типов линий, но сам метод неизменен.

Расширенные примеры

Рисование сетки с помощью вложенных циклов:

Пример javascript
ctx.beginPath();
for (let x = 0.5; x < 200; x += 10) {
  ctx.moveTo(x, 0);
  ctx.lineTo(x, 200);
}
for (let y = 0.5; y < 200; y += 10) {
  ctx.moveTo(0, y);
  ctx.lineTo(200, y);
}
ctx.strokeStyle = '#eee';
ctx.stroke();
// Результат: светло-серая сетка 10x10 пикселей

Анимация рисования линии:

Пример javascript
let progress = 0;
function animateLine() {
  ctx.clearRect(0, 0, 200, 200);
  ctx.beginPath();
  ctx.moveTo(20, 100);
  ctx.lineTo(20 + progress * 160, 100);
  ctx.stroke();
  progress += 0.01;
  if (progress <= 1) requestAnimationFrame(animateLine);
}
animateLine();
// Результат: плавное рисование горизонтальной линии слева направо

Создание пунктирной линии с использованием setLineDash:

Пример javascript
ctx.beginPath();
ctx.setLineDash([5, 3]);
ctx.moveTo(20, 50);
ctx.lineTo(180, 50);
ctx.stroke();
// Результат: пунктирная линия с отрезками 5px и промежутками 3px

JS lineTo function comments

En
LineTo Connects the last point in the sub-path to the specified (x, y) coordinates with a straight line