Редактировать: кажется, я изначально неправильно понял вопрос.
Что касается проверки пути: я думаю, что было бы проще иметь функцию, которая определяет, является ли точка действительной, чем вычислять все значения заранее. Что-то вроде:
function getValidatorForPoints(x1, y1, x2, y2) {
var slope = (y2 - y1) / (x2 - x1);
return function (x, y) {
return (y - y1) == slope * (x - x1);
}
}
Тогда, учитывая две точки, вы можете сделать это:
var isValid = getValidatorForPoints(x1, y1, x2, y2);
var x = getX(), y = getY();// getX and getY get the user's new point.
if (isValid(x, y)) {
// Draw
}
Этот подход также дает вам некоторую гибкость - вы всегда можете изменить функцию, чтобы она была менее точной, чтобы приспособиться к людям, которые не совсем рисуют прямую линию, но сносно близки.
Точность:
Как упоминалось в моем комментарии, вы можете изменить поведение функции, чтобы сделать ее менее требовательной. Я думаю, что хороший способ сделать это заключается в следующем:
Прямо сейчас мы используем формулу (y - y1) == slope * (x - x1)
. Это то же самое, что и (slope * (x - x1)) - (y - y1) == 0
. Мы можем изменить ноль на некоторое положительное число, чтобы оно принимало точки «рядом» с действительной линией следующим образом:
Math.abs((slope * (x - x1)) - (y - y1)) <= n
Здесь n
изменяет, насколько близко точка должна быть к линии, чтобы считать.
Я почти уверен, что это работает так, как рекламируется, и помогает учесть, что люди чертят кривую линию, но кто-то должен дважды проверить мою математику.