2017-02-27 19 views
1

我想繪製一個帶有四個4角的矩形A(16,14) B(12,18) C(8,14) D(12,10)。然後我想檢查點P(12,11)是否在矩形內。如何使用4點定義java.awt.Rectangle?

使用java.awt.Rectangle可以實現嗎?

我試過下面,而不是代碼工作作爲期望的(報告說1, 1是在矩形內,當它顯然不是):

Rectangle bounds = new Rectangle(16, 14); 
bounds.add(12, 18); 
bounds.add(8, 14); 
bounds.add(12, 10); 

System.out.println(bounds.contains(1,1)); // printing true which is not right 
+0

你試過了什麼呢? SO不是免費的寫作服務。 –

+0

如果你知道所有的4點座標,你不需要使用任何額外的類來知道你的觀點是否落入其中。嘗試將您的點的X和Y座標與4個角點中的X和Y的範圍進行比較。 –

+0

@MadPhysicist在代碼 –

回答

1

java.awt.Rectangle是不是你心目中的合適的工具:但是,如果您的矩形是數學結構,而不是繪製的對象可以使用的方法add(Rectangle)Rectangles用於表示屏幕繪圖區域,其邊與x-y座標系的軸始終平行。沒有關於旋轉角度的規定。您指定的四邊形是旋轉的,因此檢查Rectangle上的邊界將包含一個像(8, 13)這樣的點,這是您不想要的。參見下圖:

enter image description here

一個更好的選擇是java.awt.Polygon。你可以使用Polygon是,它是真正用於操縱圖形元素,而不是真正的設計來處理非整數的數學非常好通過

Polygon p = new Polygon(new int[] {16, 12, 8, 12}, new int[] {14, 18, 14, 10}, 4); 

或可替代

Polygon p = new Polygon(); 
p.add(16, 14); 
p.add(12, 18); 
p.add(8, 14); 
p.add(12, 10); 

的主要問題構建它。如果您閱讀Polygon.contains(double, double)的文檔並按照解釋內部定義的鏈接進行操作,則會看到Polygon與其左下邊界上的Regtangle有相同的問題。解決這個問題的一種方法是使用Polygon.contains(x, y, 1, 1),但這似乎是過度殺傷。

更好的選擇可能是使用java.awt.geom中的類。我個人的建議是使用Path2D.DoublePath2D.FloatGeneralPath也是選項,但它們的精度有限。如果這對您有好處,請使用Path2D.Float作爲偏好。

你會使用default constructor構建路徑:

Path2D.Double p = new Path2D.Double(); 

可以忽略的能力和纏繞,因爲你有一個微小的和凸的形狀。使用moveTo啓動路徑,lineTo加分的路徑現在填寫,然後closePath完成矩形,並遏制工作:

p.moveTo(16, 14); 
p.lineTo(12, 18); 
p.lineTo(8, 14); 
p.lineTo(12, 10); 
p.closePath(); 

現在你應該看到的一點(8, 13)確實是你的形狀之外:

System.out.println(p.contains(8, 13)); 

也是一樣(1, 1)

System.out.println(p.contains(1, 1)); 
+0

@SantoshHegde我已經更新了這個帖子中的圖片,現在上傳工作再次開始。 –

1

創建4個點的矩形是很容易的。

首先,您需要選擇一個任意點並將該點的x和y分別分配給xy。然後,創建一個參數爲(x, y, 0, 0)的矩形。之後,撥打add三次以添加其他點。

在你的情況,這會工作:

Rectangle rect = new Rectangle(8, 14, 0, 0); // 8 and 14 are the smallerst x and y 
rect.add(16, 14); 
rect.add(12, 18); 
rect.add(12, 10); 
System.out.println(rect.contains(1,1)); // false 

我寫了一個方法給你:

public static Rectangle createRectangeWithPoints(Point p1, Point p2, Point p3, Point p4) { 
    int x = p1.getX(); 
    int y = p1.getY(); 
    Rectangle rect = new Rectangle(x, y, 0, 0); 
    rect.add(p2); 
    rect.add(p3); 
    rect.add(p4); 
    return rect; 
} 
+0

這有點矯枉過正,不是嗎?你根本不需要任何數學代碼,只需要其他的構造函數。 –

+0

哪個構造函數?@MadPhysicist – Sweeper

+0

您正在使用的那個。 –

0

你的做法是聰明的,但您使用了錯誤的構造函數Rectangle。雙int構造函數是Rectangle(int width, int height),並且它隱式地將左上角設置爲(0, 0),這就是爲什麼您的代碼打印true

在添加剩餘點之前,您需要將第一個點指定爲零寬度矩形的左上角。對此使用四個int構造函數:Rectangle(int x, int y, int width, int height)

Rectangle bounds = new Rectangle(16, 14, 0, 0); 
bounds.add(12, 18); 
bounds.add(8, 14); 
bounds.add(12, 10); 

System.out.println(bounds.contains(1,1)); 

現在記住從文檔以下報價爲Rectangle.add(Point)

添加一個點後,以含有添加的點作爲參數調用不一定返回true。 contains方法對於Rectangle右邊或下邊的點不返回true。因此,如果添加的點位於放大的Rectangle的右邊或底部邊緣,則包含將爲該點返回false。如果指定的點必須包含新的矩形內,一個1x1的矩形應改用補充說:

由於OP在他的評論中指出,這在技術上是不正確的,因爲沒有相應的四INT add方法。

Rectangle bounds = new Rectangle(16, 14, 1, 1); 
bounds.add(new Rectangle(12, 18, 1, 1)); 
bounds.add(new Rectangle(8, 14, 1, 1)); 
bounds.add(new Rectangle(12, 10, 1, 1)); 

System.out.println(bounds.contains(1,1)); 
+0

添加函數要麼採取'(x,y)'或'(高度,寬度)''。但它不會同時接受。所以'bounds.add(12,18)'將起作用。但是'bounds.add(12,18,1,1)'是不正確的。 –

+0

@SantoshHegde。謝謝你的收穫。這是文檔中的錯誤,我已經相應地更新了我的描述。 –

+0

@SantoshHegde。我向Oracle發佈了一個關於這個錯誤的錯誤報告。 –

相關問題