Я хочу, чтобы проверить, если точка является частью квадратичной кривой Безье, определяемой точки p0, p1 и p2 ..Проверьте, если точка является частью квадратичной кривой Безье в Java
Это моя функция для получения точка на кривой с некоторым т:
public static final Point quadratic (Point p0, Point p1, Point p2, double t) {
double x = Math.pow(1-t, 2) * p0.x + 2 * (1-t) * t * p1.x + Math.pow(t, 2) * p2.x;
double y = Math.pow(1-t, 2) * p0.y + 2 * (1-t) * t * p1.y + Math.pow(t, 2) * p2.y;
return new Point((int)x, (int)y);
}
Учитывая, что точка в (т) в квадратичной кривой получается следующим образом:
в (Т) = (1 - т)^2 * p0 + 2 * t * (1 - t) * p1 + t^2 * p2
Я должен проверить, принадлежит ли точка P кривой, получая значение t для этой точки и сравнивая ее с точкой, полученной с использованием этого параметра t param, но в Java у меня возникают проблемы с точностью переменных ,
Моей функция для проверки точки является следующее:
public static final boolean belongsQuadratic (Point p, Point p0, Point p1, Point p2) {
double[] tx = obtainTs(p.x, p0, p1, p2);
double[] ty = obtainTs(p.y, p0, p1, p2);
if (tx[0] >= 0) {
if ((tx[0] >= ty[0] - ERROR && tx[0] <= ty[0] + ERROR) || (tx[0] >= ty[1] - ERROR && tx[0] <= ty[1] + ERROR)) {
return true;
}
}
if (tx[1] >= 0) {
if ((tx[1] >= ty[0] - ERROR && tx[1] <= ty[0] + ERROR) || (tx[1] >= ty[1] - ERROR && tx[1] <= ty[1] + ERROR)) {
return true;
}
}
return false;
}
public static double[] obtainTs (int comp, Point p0, Point p1, Point p2) {
double a = p0.x - 2*p1.x + p2.x;
double b = 2*p1.x - 2*p0.x ;
double c = p0.x - comp;
double t1 = (-b + Math.sqrt(b*b - 4*a*c))/(2*a);
double t2 = (-b - Math.sqrt(b*b - 4*a*c))/(2*a);
return new double[] {t1, t2};
}
Так что, если я запускаю код с этим значением:
Point p0 = new Point(320, 480);
Point p1 = new Point(320, 240);
Point p2 = new Point(0, 240);
double t = 0.10f;
Point p = Bezier.quadratic(p0, p1, p2, t);
double[] ts = Bezier.obtainTs(p.x, p0, p1, p2);
я получить следующий вывод:
For t=0.10000000149011612, java.awt.Point[x=316,y=434]
For t1: -0.1118033988749895, java.awt.Point[x=316,y=536]
For t2: 0.1118033988749895, java.awt.Point[x=316,y=429]
java.awt.Point[x=316,y=434] belongs?: false
Должен ли я использовать BigDecimal
для выполнения операций? Есть ли другой способ проверить это? Благодаря
use 'BigDecimal' – nachokk
Не можете использовать пакет' Graphics2D' для использования методов 'CubicCurve2D'? – Sebastian
@Sebastian в моей проблеме Я использую квадратичные функции, Cubic не будет работать. Nachokk Я дам BigDecimal попробовать, спасибо –