2017-04-22 13 views
-2

JFreeChartで2つのシリーズの交差点を見つけることは可能ですか?交差しているチャートシリーズに共通点はありません。したがって、交点は、グラフ上で互いに交差する2つの系列について計算される必要があります。交差点のポイント

List<XYDataItem> l1 = one.getItems(); 
List<XYDataItem> l2 = two.getItems(); 

Line itemOne = null; 
Line itemTwo = null; 
List<Line> lineOne = new ArrayList<Line>(); 
List<Line> lineTwo = new ArrayList<Line>(); 

//Add lines to the first list 
for(int i = 0; i < l1.size(); i++){ 
    if(i < l1.size()-1) { 
     itemOne = new Line(new Vector2D(l1.get(i).getXValue(), 
         l1.get(i).getYValue()), 
         new Vector2D(l1.get(i+1).getXValue(), 
         l1.get(i+1).getYValue()), 0); 
     lineOne.add(itemOne); 
    } 
} 

//Add lines to the second list 
for(int i = 0; i < l2.size(); i++){ 
    if(i < l2.size()-1) { 
     itemTwo = new Line(new Vector2D(l2.get(i).getXValue(), 
         l2.get(i).getYValue()), 
         new Vector2D(l2.get(i+1).getXValue(), 
         l2.get(i+1).getYValue()), 0); 
     lineTwo.add(itemTwo); 
    } 
} 

for(Line i: lineOne) { 
    for(Line j: lineTwo) { 
     if (i.intersection(j) != null) { 
      System.out.println(i.intersection(j)); 
     }      
    } 
} 

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 
org.jfree.data.xy.XYDataItem cannot be cast to 
org.apache.commons.math3.geometry.euclidean.twod.Line 

Trashgodの提案後、私は次のことをやって試してみました:

List<Line> lineOne = one.getItems(); 
List<Line> lineTwo = two.getItems(); 
for (Line i : lineOne) { 
    for (Line j : lineTwo) { 
     if (i.intersection(j) != null) { 
      System.out.println(i.intersection(j)); 
     } 
    } 
} 

上記のコードは、私がやろうとしたが、これは、このメッセージをClassCastExceptionをスローするものです

しかし、このリストをたどっている間は、交差点がほんのわずかであっても、(下の図に示すように)多くの結果が得られます。
交点も正しくありません。

Image showing results

そして、私のチャートは次のようになります。 Image for Jfreechart

これに問題があることを示唆してください。

答えて

1

はい、Seriesのアイテムを繰り返し処理できます。具体的な例として、XYSeriesListXYDataItemで内部的にあります。 XYDataItemComparableを実装しているため、equals()を使用して交差をテストできます。

list1.stream().forEach((i) -> { 
    list2.stream().filter((j) -> (i.equals(j))).forEach((item) -> { 
     System.out.println(i); 
    }); 
}); 
:あなたが機能動作を使用することができ、また

List<XYDataItem> list1 = one.getItems(); 
List<XYDataItem> list2 = two.getItems(); 
for (XYDataItem i : list1) { 
    for (XYDataItem j : list2) { 
     if (i.equals(j)) { 
      System.out.println(i); 
     } 
    } 
} 

:共通で単一のアイテムを含む2つのシリーズは、

private final XYSeries one = new XYSeries("One"); 
private final XYSeries two = new XYSeries("Two"); 
… 
one.add(1, 1); 
one.add(1, 42); 
two.add(1, 2); 
two.add(1, 42); 

次の繰り返しスキームは共通点、[1.0, 42.0]を見つけ考えます

私は共通のデータポイントを持っていない2つのXYLineChartシリーズの交差点を見つける必要がありますそれらをong。

List<Line>の2つのインスタンスで同じ反復スキームを使用できます。各リストには、対応する系列の連続する点を結ぶ線が含まれていなければなりません。 equals()を、概念的なintersects()メソッドに置き換えます。 line–line intersectionを使用できます。 Line::intersectionが一般的な実装です。

コード予想されるメッセージ、

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 
org.jfree.data.xy.XYDataItem cannot be cast to 
org.apache.commons.math3.geometry.euclidean.twod.Line 

ClassCastExceptionをスロー...上記;各List<XYDataItem>をトラバースして対応するList<Line>を作成する必要があります。最初のLineはポイント1とポイント2で囲まれます。 2番目のLine、2番と3番など

+0

@trashgodの返信ありがとうございます。しかし、私が持っているデータセットには、同じアイテムがありません。私はそれらの間に共通のデータポイントを持たない2つのXYLineChartシリーズの交差点を見つける必要があります。だから、私はequalsメソッドを使うことができないだろうと思う。 – Yoo

+0

私は上記で詳しく述べました。この要件を明確にするために質問を更新してください。 – trashgod

+0

ありがとうございます。あなたは、 "各リストには、対応するシリーズの連続する点を結ぶ線が含まれているはずです"と述べました。それが意味することをちょっと詳しく教えてください。どんな助けも素晴らしいだろう。 – Yoo