Я не кодировал Java годами, и сейчас у меня не так много времени. Из-за этого этот ответ не содержит бегущего Java кода, а содержит только идеи и некоторый псевдокод. В любом случае, я надеюсь, что это вам поможет.
Один дал две кривые curve1
и curve2
и центр отражения c
. Вы хотите вычислить, если одна кривая является точечным отражением другой в данном пороге maxDist
.
Функция для вычисления этого может выглядеть следующим образом:
function checkSymmetry(Curve curve1, Curve curve2, Vector c, float maxDist) {
// reflect one curve
Curve curve2refl = reflect(curve2, c);
// compute curve distance
float d = dist(curve1, curve2refl);
// check if distance is below threshold
return d < maxDist;
(I Я сделал некоторые классы вместо ваших ArrayLists of ArrayLists of Pairs of ... для лучшей читаемости. Я бы рекомендовал вам сделать то же самое в вашем коде.)
Отражение точек
Формула точки Отражение можно найти в Википедии : отражение точки p
с центром отражения c
равно: 2*c - p
.
Чтобы отразить кривую, необходимо отразить все ее вершины .
Кривая расстояния - кривая
Если две красные кривые (почти) симметричны, то после отражения одной из них они должны быть (почти) идентичными, то есть иметь расстояние (почти) ) нуль. Но каково расстояние двух кривых?
В математической теории множеств существует расстояние Хаусдорфа . Это немножко сложно для нематематиков. Но это дает возможность определить расстояние ваших кривых: максимальное расстояние вершины одной кривой до другой кривой:
function dist(Curve curve1, Curve curve2) {
d = 0;
for (Vector p : curve1.vertices) {
d = max(d, dist(curve2, p));
}
for (Vector p : curve2.vertices) {
d = max(d, dist(curve1, p));
}
return d;
}
Расстояние от точки до кривой
Таким образом, мы сократили задача вычислить расстояние от точки до кривой. Это минимальное расстояние от точки до любого из сегментов кривой:
function dist(Curve curve, Vector p) {
d = dist(p, curve.vertices.get(0));
for (int i = 1, n = curve.vertices.size(); i < n; ++i) {
Vector p1 = curve.vertices.get(i-1);
Vector p2 = curve.vertices.get(i);
d = min(d, dist(new Segment(p1, p2), p));
}
return d;
}
Расстояние от точки до сегмента
Для расстояния от точки до сегмента вы найдете множество вопросов с хорошими ответы на стеке потока, например, здесь .