2015-09-09 136 views
4

jdk8包含3個不同的Point2D類。哪個Point2D應該使用

  • java.awt.geom.Point2Djfxrt.jar
  • com.sun.javafx.geom.Point2Drt.jar
  • javafx.geometry.Point2Djfxrt.jar

我應該使用哪種Point2D類?

使用/應用程序:我想執行幾何計算來確定一個點是否與一條線相交。 (例如Line2D.contains(Point2D)

鑑於我也在使用其他javafx功能(即在javafx.*包中)也有這個事實。我的第一個猜測,將是使用javafx.geometry.Point2D。然而,雖然此封裝確實包含Point2D類別,但它不包含類別,但其他2個封裝確實包含Line2D封裝。

另一方面,我不想挑選一個在不久的將來會被棄用的類。

編輯:

也許一個小細節:Point2Dawtcom.sun套餐使用float的定義自己的觀點,這需要大量鑄造的。雖然javafx版本使用double,這非常方便,因爲javafx也傾向於使用double來排列組件(例如getPrefWidth,getLayoutX,...)。

EDIT2:

其實Line2D類不是一個很大的幫助。 contains方法總是返回false。所以,看起來我必須寫我自己的相交方法。

+0

所以請使用'rt.jar' – SaviNuclear

+0

每當有現代化的選擇時,我們是否應該避免使用'awt'類(即Java 1.2)? – bvdb

回答

5

java.awt是JavaFX的另一個UI工具包。不建議混合來自不同庫的類,特別是假設您已經使用JavaFX功能。

應該避免以com.sun開頭的所有內容,因爲它是私有API,並且不能保證它會在下次更新中繼續工作。

在這種情況下,您的最佳做法是使用javafx.geometry.Point2D並實施您自己的Line2D。作爲替代,您可以使用JavaFX場景圖及其Circle(半徑爲0.5)和Line(筆劃寬度爲1)的類來幫助您進行計算。

+0

看起來像一個合理的想法。我想我可以複製並重寫現有的'Line2D'類的'contains'方法。 - 編輯:不,我不能他們是空的方法。 – bvdb

+0

我接受了你的建議並創建了一個'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方法也有一個關注點。它假設這條線貫穿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個先前講話(即精度和範圍)。