Это вопрос векторной математики. Вы можете вычислить направляющий вектор между двумя точками A и B, вычтя A из B. В 2D и только в 2D вектор, расположенный под прямым углом к этому вектору, можно получить, изменив компоненты x и y на противоположные и взяв одну из составляющих отрицательной. Если вы отмените новый компонент x, вы сделаете поворот налево, отрицая y, вы сделаете поворот направо. Затем вы можете уменьшить направляющий вектор до единичного размера (= длины 1), разделив каждый компонент на длину вектора (sqrt (x x + y y)). Наконец, вы можете снова растянуть единичный вектор на желаемую длину и получить один из желаемых размеров. Если вы добавите этот вектор к A или B, вы получите точку, до которой хотите провести линию.
Вот небольшая помощь по математике:
![](https://i.stack.imgur.com/Cd4gl.png)
Это точки A и B, выраженные в виде вектора.
![](https://i.stack.imgur.com/RJ95P.png)
Направляющий вектор вычисляется простым вычитанием.
![](https://i.stack.imgur.com/1Md6p.png)
Вектор нормали задается путем переворота направляющего вектора, то есть перевернуть компоненты и сделать одну из них отрицательной. nl = нормальный, перевернут влево, nr = нормальный, перевернут вправо
![](https://i.stack.imgur.com/jndgf.png)
Единичный вектор нормального вектора задается делением каждого компонента на длину вектора.
![](https://i.stack.imgur.com/NvfBV.png)
Вычисляет длину вектора
Если вы хотите провести линию от B влево (при выходе из A), вы вычисляете точку P, чтобы провести линию как
![](https://i.stack.imgur.com/kiyg4.png)
Итак, вы хотите чередовать то, что один раз вы рисуете влево и один раз вправо при итерации по точкам.
Если у вас есть точки, лежащие за пределами холста, вероятно, ваша длина слишком велика. Вы, конечно, можете вычислить точку, в которой вектор к P пересечет границу, вычислив точку пересечения вектора BP и границы.
19.09.2011