我想基于两条线的交叉生成两个虚拟点。如果线在画布区域之外相交,则无法计算。可以将两个虚拟点预测为在 0或max-Y处具有y位置并且与每条线相交。
详细信息:
我的程序有问题。为了从一个点和两个线的集合生成一个正确的点,我必须找到我所拥有的两条线是否相互交叉。
Java.Line2D.intersectsLine()API 可以简单地找到这个条件,但我真正的问题是有时一条线会超出画布边界(x <0,y&lt; 0,x&gt; maxX) ,y&gt; maxY)。线路im被认为是无限的,但技术问题限制我在y = 0和y = maxY处绘制我的线。为了解决这个问题,我从两行生成一个两个虚拟点,以成为该点的替代。
http://i.stack.imgur.com/23aSD.jpg
正如您所看到的,在第一张图片中,我可以轻松地将F作为我的任务的答案。但是,当交叉点超出画布/面板边界时,我必须生成两个虚拟点作为替换。
我可以得到两套点,即B&amp; E或C&amp; D,正确答案当然是B&amp; 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]);
}
}
}
}
答案 0 :(得分:0)
今天早上解决,图片详情
http://i.stack.imgur.com/zk8MQ.jpg
正如您在图像中看到的,您可以通过从每个点创建一个区域来生成替换点,并计算该区域的内角。正确的组合将创造最大的角度总和。并且它将始终&gt; 180度,因为区域内所有角度的总和将始终导致360度。