which Point2D should I use

5
jdk8包含三个不同的Point2D类:
- rt.jar中的java.awt.geom.Point2D - jfxrt.jar中的javafx.geometry.Point2D - jfxrt.jar中的com.sun.javafx.geom.Point2D
如果要进行几何计算以判断点是否与线相交(例如Line2D.contains(Point2D)),应该使用哪个Point2D类呢?考虑到还要使用其他javafx功能,我的第一个想法是使用javafx.geometry.Point2D类。然而,尽管这个包含有Point2D类,但它并不包含Line2D类,而其他两个包含有Line2D类。
另一方面,我也不想选择一个即将被弃用的类。
顺便提一下,awt和com.sun包的Point2D类使用float类型定义点,需要进行大量的转换。而javafx版本使用double类型,比较方便,因为javafx也更喜欢用double来安排组件(例如getPrefWidth、getLayoutX等)。
实际上,Line2D类没有什么帮助。contains方法总是返回false。因此,看起来我还是需要编写自己的intersect方法。

所以使用rt.jar - SaviNuclear
我们是否应该避免使用awt类(即Java 1.2),只要有现代化的替代品? - bvdb
2个回答

5

java.awt是一种不同于JavaFX的UI工具包。为了避免使用不同库中的类,尤其是已经使用JavaFX功能的情况下,请不要混用。

com.sun开头的所有内容都应该避免使用,因为它是私有API,并且不能保证在下一个更新中仍然有效。

在这种情况下,您最好使用javafx.geometry.Point2D并实现自己的Line2D。作为替代方案,您可以使用JavaFX场景图及其Circle(半径为0.5)和Line(线宽为1)类来帮助您进行计算。


看起来是个合理的想法。我猜我可以直接复制并修改现有的Line2D类中的contains方法。- 编辑:不行,它们是空方法。 - bvdb
我采纳了你的建议并创建了一个 Line2D 类,如下所示。 - bvdb

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方法也有一个注意点。它假设直线穿过这两个点,但不受其限制(即具有无限长度)。

Intersects方法

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;
    }

这将考虑前面两个评论(即精度和边界)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接