jdk8包含3个不同的Point2D
类。
java.awt.geom.Point2D
在rt.jar
中
{li> javafx.geometry.Point2D
在jfxrt.jar
中
{li> com.sun.javafx.geom.Point2D
在jfxrt.jar
中
我应该使用哪个Point2D
课程?
使用/应用:我想执行几何计算以确定点是否与线相交。 (例如Line2D.contains(Point2D)
)
鉴于我还使用其他javafx功能(即也在javafx.*
包中)。我的第一个猜测是使用 javafx.geometry.Point2D
类。但是,虽然此软件包包含Point2D
类,但不包含Line2D
类,但其他2个软件包执行包含{{ 1}}包。
另一方面,我不想选择在不久的将来会弃用的课程。
可能是一个小细节: Line2D
和Point2D
包的awt
类使用com.sun
来定义他们的点,需要大量的铸造。虽然float
版本使用javafx
,但非常方便,因为javafx也更喜欢double
来安排组件(例如double
,getPrefWidth
,...)
实际上getLayoutX
课程并不是一个很大的帮助。 Line2D
方法始终返回contains
。所以,看起来我必须编写自己的交叉方法。
答案 0 :(得分:5)
java.awt
是与JavaFX不同的UI工具包。不建议混合来自不同库的类,特别是假设您已经使用了JavaFX功能。
应该避免以com.sun
开头的所有内容,因为它是私有API,并且无法保证它会在下次更新时继续工作。
此方案中您最好的做法是使用javafx.geometry.Point2D
并实施您自己的Line2D
。作为替代方案,您可以使用JavaFX场景图及其Circle
(半径为0.5)和Line
(笔划宽度为1)类来帮助您进行计算。
答案 1 :(得分:0)
我接受了AlmastB的建议,并决定创建我自己的Line2D
类以与javafx.geometry.Point2D
类兼容。
public class Line2D {
double x1;
double y1;
double x2;
double y2;
public Line2D(double x1, double y1, double x2, double y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
public Line2D(Point2D point1, Point2D point2) {
this(point1.getX(), point1.getY(), point2.getX(), point2.getY());
}
public double length()
{
return new Point2D(x1, y1).distance(x2, y2);
}
public double distance(double x, double y) {
double d1 = x * (y2 - y1) - y * (x2 - x1) + x2 * y1 - y2 * x1;
return Math.abs(d1) / length();
}
public double distance(Point2D toPoint) {
return distance(toPoint.getX(), toPoint.getY());
}
}
正如您将注意到的,最初我只使用distance
方法。 intersects
方法很棘手,因为它需要比较double
个值。具有浮点数的操作可能引入小的偏差。简而言之:你只能通过一定的精度来判断一个点是否在线上。很难说这个精度应该是多少。
distance
方法也有一个关注点。它假定该线穿过2个点,但不受它的限制(即它具有无限长度)。
intersects
方法如下所示:
public boolean intersects(Point2D toPoint, double precision, boolean checkBounds) {
if (checkBounds &&
((toPoint.getX() < Math.min(x1, x2) - precision) ||
(toPoint.getX() > Math.max(x1, x2) + precision) ||
(toPoint.getY() < Math.min(y1, y2) - precision) ||
(toPoint.getY() > Math.max(y1, y2) + precision))) return false;
return distance(toPoint.getX(), toPoint.getY()) < precision;
}
这会考虑先前的2个备注(即精确度和界限)。