我应该使用哪个Point2D

时间:2015-09-09 08:59:18

标签: java javafx geometry java-8

jdk8包含3个不同的Point2D类。

    {li> java.awt.geom.Point2Drt.jar 中 {li> javafx.geometry.Point2Djfxrt.jar 中 {li> com.sun.javafx.geom.Point2Djfxrt.jar

我应该使用哪个Point2D课程?

使用/应用:我想执行几何计算以确定点是否与线相交。 (例如Line2D.contains(Point2D)

鉴于我还使用其他javafx功能(即也在javafx.*包中)。我的第一个猜测是使用 javafx.geometry.Point2D。但是,虽然此软件包包含Point2D类,但不包含Line2D,但其他2个软件包执行包含{{ 1}}包。

另一方面,我不想选择在不久的将来会弃用的课程。

编辑:

可能是一个小细节: Line2DPoint2D包的awt类使用com.sun来定义他们的点,需要大量的铸造。虽然float版本使用javafx,但非常方便,因为javafx也更喜欢double来安排组件(例如doublegetPrefWidth,...)

EDIT2:

实际上getLayoutX课程并不是一个很大的帮助。 Line2D方法始终返回contains。所以,看起来我必须编写自己的交叉方法。

2 个答案:

答案 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方法

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个备注(即精确度和界限)。