给定一组线条,如何计算它们形成的三角形

时间:2017-02-19 03:09:38

标签: java

当给出以下一组坐标时,这些坐标定义了从(x1,y1)(x2,y2)

的线段
1.350 1.890 3.825 3.330
3.915 1.575 2.385 3.690
1.350 2.295 4.545 1.845
2.250 1.710 4.140 3.060
2.250 3.150 3.465 1.755

你有三角形,如果你可以从 A B 的线段开始,请按 B 直到它与某个线段 C 相交,然后按 C 直到它与 A 相交。

对我来说,输入的每一行对应于由两个点定义的直线似乎是显而易见的,因为如果我使用Line2D.Double将它们转换为五条2D线并将这5条线存储在ArrayList中。

我的问题实际上是找到三角形。 我最初的想法是找到一个交叉点,然后前进到相交的线,看看它是否相交,然后看第三条线是否与第一条线相交。

这是我尝试这样做的:

for (int i = 0; i < list.size() - 2; i++) {
  if (list.get(i).intersectsLine(list.get(i + 1))) {
    if (list.get(i+1).intersectsLine(list.get(i + 2))) {
      if (list.get(i+2).intersectsLine(list.get(i))) {
        count++; // Count number of triangles
      }
    }
  }
}

然而,这给了我答案3而不是正确答案(即4)。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

试试这个: -

for(int n = 0;n<list.size(); i++) {
    for(int m = n+1;m<list.size(); m++) {  //m=n+1 : guarantee unique
        for(int k = m+1;k<list.size(); k++) {  //k=m+1 : guarantee unique
            if (
                list.get(n).intersectsLine(list.get(m))  &&
                list.get(m).intersectsLine(list.get(k))  &&
                list.get(n).intersectsLine(list.get(k))  
            ) {
                 amountOfTriangle++;
            }
        }
    }
}

描述

我们的想法是找到形成三角形的唯一元组(n,m,k)的数量 棘手的部分是计算重复的 例如,(0,1,2)(0,2,1)是相同的三角形 - 不应计算两次 因此,我添加了m=n+1k=m+1来保证唯一性。

进一步改善

请注意,此解决方案只是草稿 如果你是一个完美主义者,你也可以: -

  • 稍微优化一下(例如,在内部循环之外移动一些语句)
  • 检查一些边缘情况,例如3条线在同一点不相交。

请告诉我它是否有效。

答案 1 :(得分:0)

我为你创建了一个示例程序。这个程序需要一些点,找到不同的点,然后使用这些点来绘制三角形。

option1