В Paper.js векторные операции реализованы через объект Point, который представляет собой двух- или трёхмерный вектор. Основные операции с векторами включают скалярное произведение (dot product) и векторное произведение (cross product). Эти операции широко применяются для анализа направления, углов между векторами, вычисления нормалей и для физических симуляций.
Скалярное произведение двух векторов A
и B определяется как:
[ A B = |A| |B| ]
где (|A|) и (|B|) — длины векторов, а () — угол между ними.
В Paper.js для вычисления скалярного произведения используется метод
Point.dot():
var a = new Point(3, 4);
var b = new Point(5, 2);
var dotProduct = a.dot(b); // 3*5 + 4*2 = 15 + 8 = 23
Ключевые особенности:
var cosTheta = a.dot(b) / (a.length * b.length);
var angle = Math.acos(cosTheta) * 180 / Math.PI;
Позволяет определить, направлены ли векторы в одну сторону:
dot > 0 — угол < 90°, векторы примерно
совпадают.dot = 0 — угол = 90°, векторы перпендикулярны.dot < 0 — угол > 90°, векторы направлены в
противоположные стороны.Векторное произведение двух векторов (A B) в трёхмерном пространстве создаёт вектор, перпендикулярный обоим:
[ A B = ]
В Paper.js, который изначально ориентирован на 2D-графику,
Point.cross() возвращает скаляр,
равный “модулю z-компоненты” результата векторного
произведения:
var a = new Point(3, 4);
var b = new Point(5, 2);
var crossProduct = a.cross(b); // 3*2 - 4*5 = 6 - 20 = -14
Особенности 2D-кросс-продукта в Paper.js:
// Определение, лежат ли три точки по часовой стрелке или против
var p0 = new Point(0, 0);
var p1 = new Point(1, 0);
var p2 = new Point(1, 1);
var orientation = (p1 - p0).cross(p2 - p0);
if (orientation > 0) {
console.log("Против часовой стрелки");
} else if (orientation < 0) {
console.log("По часовой стрелке");
} else {
console.log("Точки на одной линии");
}
var v1 = new Point(1, 0);
var v2 = new Point(0.5, Math.sqrt(3)/2);
var angleDeg = Math.acos(v1.dot(v2) / (v1.length * v2.length)) * 180 / Math.PI;
var direction = a.cross(b) > 0 ? "левый поворот" : "правый поворот";
dot() и cross() работают с
объектами Point, поддерживая простую запись и цепочки
операций..normalize():var unitVector = a.normalize(); // вектор длиной 1
var projection = a.normalize().multiply(b.dot(a.normalize()));
| Метод | Возвращаемое значение | Применение |
|---|---|---|
Point.dot(point) |
число | угол между векторами, проверка направления |
Point.cross(point) |
число | ориентация точек, определение поворота |
Point.normalize() |
Point | единичный вектор, подготовка к проекции |
Point.length |
число | длина вектора, масштабирование |
Эти операции образуют фундамент для работы с любыми векторными вычислениями в Paper.js, будь то графика, анимация, физика или интерактивные эффекты.