請注意我對使用任何第三方JAR或AWT作爲此解決方案的一部分不感興趣。我正在盡我所能地保持我的項目無依賴關係,我想保持這種狀態。而且,如果JRE提供了可以解決這個問題的任何類,我仍然對這裏的一個定製解決方案感興趣,這樣我就可以真正理解數學,而不是盲目地進行一些API調用。使用Java計算多個2D形狀的交集
我有各種形狀以下POJO結構:
public class Coordinate {
private Double xVal;
private Double yVal;
// Constructors, getters/setters, etc.
public static Double distance(Coordinate c1, Coordinate c2) {
// Calculates the Cartesian distance between c1 and c2 using the standard
// distance formula.
}
}
public abstract class Shape {
// Some properties inherent to all 2D shapes.
public abstract Double calcArea();
public abstract Double calcPerimeter();
}
public class Rectangle extends Shape {
private Coordinate upperLeft;
private Coordinate upperRight;
private Coordinate lowerLeft;
private Coordinate lowerRight;
// Constructors, overrides, getters/setters, etc.
}
public class Circle extends Shape {
private Coordinate center;
private Double radius;
// Constructors, overrides, getters/setters, etc.
}
那麼現在,我將給出一個List<Shape>
(含有0+ Rectangle
S和0+ Circle
S混合集)。我需要確定是否有任何在此列表中的形狀相互(true或false)相交:
public boolean intersectionsExist(List<Shape> shapes) {
// ???
}
我想在這裏實施的最佳實踐,所以我不知道是否有任何已算法來做到這一點(可能)幾十個形狀。我在SO和網上找到的所有「交集檢測」代碼片段都在兩種形狀之間。但是如果我在列表中有3個矩形和7個圓圈怎麼辦?!?
我的想法是,通過列表中的每個Shape
迭代,並與所有其他Shape
(因此一個二次解決方案,我不激動不已)進行比較。但這樣,我可以返回true
我立即找到與另一個相交的Shape
。
至於檢測實際的交叉點,我想知道是否有什麼我可以做,把這些形狀像維恩圖。意思是,以某種方式確定是否一個形狀是重疊另一個。但至於我如何確定「重疊」,我不知道。
那麼幾個問題:
- 是否有任何標準算法在那裏爲3+形狀中檢測交點?如果是這樣,有人可以給我一些鏈接/信息對他們?
- 如果上面#1的答案是「否」,那麼我的二次解決方案是否是最佳方法之一(雙嵌套
for
-將每個Shape
彼此進行比較並在發現一個交叉點時返回true
)?還是有更好/更有效的方法? - 最重要的是:如何檢測實際的交叉點?有沒有標準的算法來完成這個(鏈接?)?有人可以提供一個代碼示例(使用上面的POJO),甚至可以提供一個簡單的僞代碼示例來說明我可以在這裏做什麼?
在此先感謝!
1.不,您只能檢測2個形狀的交集。你的二次方案是最好的。如果您有10個對象,則少於100個相交測試。您不測試形狀A與形狀A的交集。3.使用形狀的交集(和包含)方法。 Shape是一個接口,因此Shape將選擇要使用的具體相交(和包含)方法。 –
謝謝@GilbertLeBlanc(+1) - 什麼庫是「形狀」的一部分?你能提供一個鏈接到它的Javadoc?一旦我知道在哪裏可以找到源代碼,我會仔細分析一下,看看能否找到真正的「相交」算法。再次感謝! – IAmYourFaja
http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html –