2017-04-22 80 views
-2

是否可以找到JFreeChart中的两个系列的交点?相交的图表系列之间没有任何共同点。因此,需要为图中发生的彼此相交的两个系列计算交点。系列的交叉点

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

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<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)); 
     }      
    } 
} 

但是,在遍历此列表时,即使只有很少的交点,也会产生很多结果(如下图所示)。
交点也不正确。

Image showing results

我的表是这样的: Image for Jfreechart

请这个建议的问题。

回答

1

是的,你可以迭代包含Series的项目。作为具体示例,XYSeries在内部具有ListXYDataItem。因为XYDataItem执行Comparable,所以可以使用equals()测试交集。鉴于两个系列包含在共同的单个项目,

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]

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); 
     } 
    } 
} 

或者,您可以使用功能操作:

list1.stream().forEach((i) -> { 
    list2.stream().filter((j) -> (i.equals(j))).forEach((item) -> { 
     System.out.println(i); 
    }); 
}); 

我需要找到两个不存在公共数据点的XYLineChart系列的交集在他们身上。

您可以在List<Line>的两个实例上使用相同的迭代方案;每个列表应包含连接相应系列的连续点的线。将equals()替换为名义上的intersects()方法。您可以使用line–line intersection; Line::intersection是一个典型的实现。

上述代码...抛出一个ClassCastException与消息,

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 

即预期;您必须遍历每个List<XYDataItem>以创建相应的List<Line>。第一个Line将受到第1点和第2点的限制;第二个Line由点2和3等。

+0

感谢您的回复@trashgod。但是,我拥有的数据集中并没有相同的项目。我需要找到其中没有共同数据点的两个XYLineChart系列的交集。所以我想我将无法使用equals方法。 – Yoo

+0

我已经阐述过了;请更新您的问题以澄清此要求。 – trashgod

+0

谢谢。你说“每个清单应该包含连接相应系列的连续点的线”。您能否详细说明一下这意味着什么?任何帮助都会很棒。 – Yoo