2011-06-14 59 views
3

我剛剛使用迭代器,並想知道如何迭代通過線段上的每個點(Line2D.Double,準確地說) - 我需要檢查看看生產線上的每個點是否滿足某些要求。迭代通過java中的一條線/路徑上的每個點

此外,給定一個路徑對象(如GeneralPath),你將如何做同樣的事情(遍歷形狀輪廓上的每個點)?

理想情況下,我想是這樣的(帶有一個線條或路徑):

Line2D line = new Line2D.Double(p1,p2); 
for (Point2D point : line) 
{ 
    point.callSomeMethod(); 
} 

回答

8

Java API中似乎沒有任何東西讓Bresenham算法的用戶可見。 So I wrote a class that iterates over a line.

您可以使用它像這樣:

List<Point2D> points = new ArrayList<Point2D>(); 
Line2D line = new Line2D.Double(0, 0, 8, 4); 
Point2D current; 

for (Iterator<Point2D> it = new LineIterator(line); it.hasNext();) { 
    current = it.next(); 
    points.add(current); 
} 

assertThat(points.toString(), 
    is("[Point2D.Double[0.0, 0.0], Point2D.Double[1.0, 0.0], " + 
     "Point2D.Double[2.0, 1.0], Point2D.Double[3.0, 1.0], " + 
     "Point2D.Double[4.0, 2.0], Point2D.Double[5.0, 2.0], " + 
     "Point2D.Double[6.0, 3.0], Point2D.Double[7.0, 3.0], " + 
     "Point2D.Double[8.0, 4.0]]")); 
+0

非常感謝你,讓你的所有觀點符合要求的邏輯都很棒。而且它對我來說工作得非常好。 – Jay 2012-08-22 10:49:33

+0

謝謝!你救了我幾個小時! – rpax 2014-11-28 10:09:19

0

雖然你的問題是缺少了很多相關的信息(即我猜了很多關於你的類),最乾淨的循環代碼是foreach語法:但是,你不能修改上迭代用這種循環的對象

GeneralPath path = ...; 
for (Line2D.Double point : path.getPoints()) { 
    // do something 
} 

注意。

+2

我在尋找的東西幾乎完全一樣foreach循環,但我只是想它和的GeneralPath沒有一個方法叫做getPoints()(同樣沒有的Line2D )...另外,我不想爲(_Point2D _...)而不是Line2D在參數中做什麼? – scaevity 2011-06-14 06:01:47

0

檢查返回類型:

  • PathIterator.SEG_MOVETO
  • PathIterator.SEG_LINETO
  • PathIterator.SEG_QUADTO
  • PathIterator.SEG_CUBICTO
  • PathIterator.SEG_CLOSE

有限公司de:

PathIterator pi = path.getPathIterator(null); 

while (pi.isDone() == false) { 
    double[] coordinates = new double[6]; 
    int type = pi.currentSegment(coordinates); 
    pi.next(); 
} 
+1

但是,(從我對迭代器的有限理解中)不是隻給出了路徑中每個段的開始/結束點,而不是路徑上的每個點? – scaevity 2011-06-14 06:29:55

+0

你是對的,但是在一條線上,你可以得到無限的點數。所以如果你得到一個線段的起點和終點,爲什麼不根據你想要的精度來計算自己呢? – Tommy 2011-06-14 07:00:05

+0

編輯:我誤解了你的問題,看到以前的評論就夠了,記住兩點的形式,你可以自己搞定座標。 //我認爲可以使用Line2D.Double(double X1,double Y1,double X2,double Y2)先創建Line2D,然後使用Line2D方法包含(double x,double y)來檢查點是否在行 – Tommy 2011-06-14 07:08:53

1

這會很慢,因爲它會爲每個點生成一個新的對象。如果您需要更快的解決方案,則可能需要考慮使用Bresenham algorithm自己實現循環。

+0

這可能會也可能不會。 Escapa分析樣式優化使每次都不需要創建新對象。仍然投票,因爲這是唯一的答案,至少有點意義。 – nes1983 2012-04-07 08:18:46

+0

的確,JVM可以「優化」對象。 – 2012-04-07 19:39:13

0

使用FlatteningPathIterator傳遞Shape的路徑迭代器。

+0

不產生個別點。 – nes1983 2012-04-07 08:17:49