Я працюю над деякою векторною логікою, тому запитую: чи можна заощадити час процесора, спростивши цю нерівність:
distance(vector1, vector2) < distance(vector1, vector3)
Я бачу, що vector1
це повторюється в обох випадках.
Я працюю над деякою векторною логікою, тому запитую: чи можна заощадити час процесора, спростивши цю нерівність:
distance(vector1, vector2) < distance(vector1, vector3)
Я бачу, що vector1
це повторюється в обох випадках.
Відповіді:
Так , ви можете спростити це. По-перше, перестаньте називати їх векторами. Вони є очками. Давайте назвемо їх A
, B
і C
.
Отже, ви хочете цього:
dist(A, B) < dist(A, C)
Замініть відстані на відстані у квадраті, а потім на крапкові вироби (із визначення довжини Евкліда . Замініть AC
на AB + BC
(тепер це справжні вектори). Розгорніть, спростіть, коефіцієнт:
dist(A, B)² < dist(A, C)²
dot(AB, AB) < dot(AC, AC)
dot(AB, AB) < dot(AB + BC, AB + BC)
dot(AB, AB) < dot(AB, AB) + dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC + 2 AB, BC)
Ось ти де:
dot(AB + AC, BC) > 0
З вашими векторними позначеннями:
dot(v2 - v1 + v3 - v1, v3 - v2) > 0
Це кілька доповнень і один крапковий продукт замість двох попередніх точкових продуктів.
dist(A, B)²
це те саме dot(AB, AB)
, це випливає з самого визначення евклідової довжини .
Так. Якщо ваша distance
функція використовує квадратний корінь, ви можете спростити це, видаливши квадратний корінь.
Намагаючись знайти більшу (або меншу) відстань, x^2 > y^2
все-таки справедливо для x > y
.
Однак подальші спроби математичного спрощення рівняння, ймовірно, безглузді. Відстань між vector1
і vector2
не є такою ж, як відстань між vector1
і vector3
. Хоча рівняння може бути спрощене математично, як показує відповідь Сема , форма, в якій він зараз знаходиться, швидше за все, така проста, як ви отримаєте з точки зору використання процесора.
Деякі математики можуть допомогти.
Що ви намагаєтесь зробити:
<v1, v2> < <v1, v3> =>
sqrt((y2-y1)^2+(x2-x1)^2) < sqrt((y3-y1)^2+(x3-x1)^2) =>
y2^2 - 2*y2y1 + y1^2 + x2^2 - 2*x2x1 + x1^2 < y3^2 - 2*y3y1 + y1^2 + x3^2 - 2*x3x1 + x1^2
З чого можна видалити повторні змінні та згрупувати деякі інші. Операція, яку ви повинні перевірити:
y3^2 - y2^2 - 2*y1(y3-y2) + x3^2 - x2^2 - 2*x1(x3-x2) > 0
Сподіваюся, це допомагає.
Справжнє питання, здається, як зменшити обчислення для визначення найближчого об'єкта?
Оптимізація цього часто робиться в іграх, хоча, з усіма оптимізаціями, вона повинна орієнтуватися на профіль і, часто, не спрощує речі.
Спосіб уникнення непотрібних обчислень на відстані для визначення найближчої речі - або всіх речей у певному діапазоні - це використання просторового індексу, наприклад, октре .
Це окупається лише за наявності великої кількості об’єктів. Всього за три об’єкти це навряд чи окупиться і, звичайно, не спрощує код.
це залежить від того, яким є вихід відстані (v1, v2)
якщо це десятковий (поплавковий або подвійний) над вектором, ймовірно, що відстань у квадраті буде набагато швидшою
float
стосується нічого.