系列的交叉点

时间:2017-04-22 06:27:30

标签: java jfreechart

是否可以在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 个答案:

答案 0 :(得分:1)

是的,您可以迭代组成Series的项目。作为一个具体示例,XYSeries内部有List XYDataItem。由于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点为界;第2和第3点的第二个Line等等。