0

我想根据两条线的交点生成两个虚拟点。如果线与画布区域相交,则无法计算。这两个虚拟点可以预测为在0 或 max-Y 处具有 ay 位置并与每条线相交。


细节 :

好吧,我的程序有问题。为了从一组一个点和两条线生成一个正确的点,我必须找出我拥有的两条线是否相互交叉。

Java.Line2D.intersectsLine() API可以简单地找到这种情况,但我真正的问题是,有时一条线会在画布边界之外相交(x<0, y<0, x>maxX, y>maxY)。我拥有的线被认为是无限的,但是技术问题限制我在 y=0 和 y=maxY 处画线。为了解决这个问题,我从两条线上生成了一个两个虚拟点来替代该点。

http://i.stack.imgur.com/23aSD.jpg

正如你所看到的,在第一张图片中,我可以很容易地得到 F 作为我任务的答案。但是,当交点超出画布/面板边界时,我必须生成两个虚拟点作为替换。

我可以得到两组点,即 B&E 或 C&D,正确答案当然是 B&E,但我不知道如何获得正确的算法来解决这个问题。起初,我试图创建一条从 A 到每条线中每个相应点的线,并获得最大的一个角度,如您在图片 2 中看到的那样作为答案,我设法找到正确的答案是最大的角度。但是在所有可能的随机条件下,无法预测两条线的定位,不知何故我在这种情况下绊倒了。

出现了一个新情况:http: //i.stack.imgur.com/tGZy1.jpg

在这种情况下,最大的两个角属于 B 和 D,因此破坏了取正确点的假设。所以为了纠正这个问题,我目前正在为这个问题集思广益。但是,如果你们中的任何人可以给我一些启发,那将不胜感激。即使是数学概念也很棒,所以也许你们中的任何人有任何想法?

顺便说一句,该点将在两条线内,我在我的算法中一一检查该线。

任何帮助表示赞赏。

for (int i = 0;i<lineContainer.size()-1;i++){
for (int j = i+1;j<lineContainer.size();j++){

if lineContainer.get(i).intersectsLine(lineContainer.get(j)){
point = getIntersectionPoint(lineContainer.get(i), lineContainer.get(j));
answer.add(point);
}else{
// Based on assumption that line that not paralel will somewhere intersects
Point[] p = new Point[2];
p[0] = lineContainer.get(i).getP1();
p[1] = lineContainer.get(i).getP2();

Line l = new Line(queryPoint, p[0]);
double[] d = new double[2];

d[0] = checkAngle(l, lineContainer.get(i));
l = new Line(queryPoint, p[1]);

d[1] = checkAngle(l, lineContiner.get(i));
if(d[0]>d[1]){
answer.add(p[0]);
}else{
answer.add(p[1]);
}
}
}
}
4

1 回答 1

0

今早解决,图片中的细节

http://i.stack.imgur.com/zk8MQ.jpg

正如您在图像中看到的,您可以通过从每个点创建一个区域来生成替换点,并计算该区域的内角。正确的组合将产生最大的角度总和。并且它将始终 > 180 度,因为该区域内所有角度的总和将始终导致 360 度。

于 2013-08-22T05:29:13.387 回答