Angular (Javascript), как контролировать скорость события mousemove?

Я пытаюсь рисовать на холсте, используя событие перемещения мыши.

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

 updateDraw(e: MouseEvent) {

    this.previousCoordinates = this.currentCoordinates;
    this.currentCoordinates = HelloComponent.getCoordinatesOnCanvas(this.canvas.nativeElement, e);
    if (this.drawingMode) {
      HelloComponent.createShape(this.shapes, this.ctx, this.startCoordinates,
        this.currentCoordinates, this.previousCoordinates, true);
      this.endCoordinates = this.currentCoordinates;
    }
  }

Проблема в том, что если я двигаю мышь слишком быстро, я получаю несколько прямоугольников (я предполагаю, что чистый прямоугольник не работает, так как движение мыши слишком быстрое), как я могу избежать этого, должен быть только 1 прямоугольник в 1 перетаскивании ?

Angular (Javascript), как контролировать скорость события mousemove?

Редактировать: Я хочу иметь возможность рисовать более 1 прямоугольника, здесь я отслеживаю и очищаю предыдущие координаты

  private static createShape(shape: Shapes, context: CanvasRenderingContext2D,
    start: Coordinates, end: Coordinates, prev: Coordinates,
    dotted: boolean) {

    context.clearRect(start.x, start.y, (prev.x - start.x), (prev.y - start.y));

Это никак не связано со скоростью движения. Скорее всего, вы не отслеживаете текущее предыдущее значение.

Reactgular 30.05.2019 17:18

@Reactgular Я отредактировал, я отслеживаю и очищаю прямоугольник в функции

dota2pro 30.05.2019 17:21
this.previousCoordinates = this.currentCoordinates это сделано вовремя? Должно быть сделано после очистки прямоугольника.
Reactgular 30.05.2019 17:23

@Reactgular все равно происходит то же самое (создал новый блиц) stackblitz.com/edit/angular-epezro?file=src/app/…

dota2pro 30.05.2019 17:30

просто измените вызов clearRect() на context.clearRect(0,0, context.canvas.width, context.canvas.height);

Randy Casburn 30.05.2019 17:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
368
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

StackBlitz

Объяснение:

Вы правы, проблема в том, что область, в которую вы отправляете clearRect, на самом деле не включает границу. Согласно документация (выделено мной),

The CanvasRenderingContext2D.strokeRect() method of the Canvas 2D API draws a rectangle that is stroked (outlined) according to the current strokeStyle and other context settings.

Итак, чтобы очистить границу, вам действительно нужно учитывать ширину границы, когда вы пытаетесь ее очистить.

const borderWidth = 1;
const x = Math.min(start.x, prev.x) - borderWidth;
const y = Math.min(start.y, prev.y) - borderWidth;
const width = Math.abs(start.x - prev.x) + (2 * borderWidth);
const height = Math.abs(start.y - prev.y) + (2 * borderWidth);

context.clearRect(x, y, width, height);

или просто измените вызов clearRect() на context.clearRect(0,0, context.canvas.width, context.canvas.height);

Randy Casburn 30.05.2019 17:37

@Randy Casburn Это хороший момент, но я хочу иметь возможность рисовать более 1 прямоугольника за раз

dota2pro 30.05.2019 17:49

@Vlad274 Отлично, спасибо!

dota2pro 30.05.2019 17:52

@dota2pro — Что вы обнаружите (скорее всего), так это то, что чем больше вы будете рисовать на холсте, тем чаще вы будете сталкиваться с подобными артефактами. Лучше всего использовать два элемента холста. Один из них является активным холстом для рисования, а второй — холстом постоянного отображения. Холст для рисования получает описанную здесь обработку, но готовый рисунок затем закрашивается в постоянный элемент холста. Много ресурсов, чтобы узнать об этом.

Randy Casburn 30.05.2019 17:59

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

dota2pro 31.05.2019 00:28

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

Randy Casburn 31.05.2019 00:34

@RandyCasburn да

dota2pro 31.05.2019 18:07

Другие вопросы по теме