Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于超出画布限制的两条线的交点生成点_Java_Math_Geometry - Fatal编程技术网

Java 基于超出画布限制的两条线的交点生成点

Java 基于超出画布限制的两条线的交点生成点,java,math,geometry,Java,Math,Geometry,我想根据两条线的交点生成两个虚拟点。如果线在画布区域之外相交,因此无法计算。可以预测两个虚拟点的y位置为0或最大y,并与每条线相交。 详情: 嗯,我的程序有问题。为了从一个点和两条线的集合中生成一个正确的点,我必须找出我拥有的两条线是否相交 Java.Line2D.intersectsLine()API可以简单地找到这种情况,但我真正的问题是有时一条线会在画布边界之外相交(xmaxY)。我拥有的线被认为是无限的,但是技术问题限制我在y=0和y=maxY处画线。为了解决这个问题,我从两条直线生成

我想根据两条线的交点生成两个虚拟点。如果线在画布区域之外相交,因此无法计算。可以预测两个虚拟点的y位置为0或最大y,并与每条线相交。


详情:

嗯,我的程序有问题。为了从一个点和两条线的集合中生成一个正确的点,我必须找出我拥有的两条线是否相交

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

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

我可以得到两个点,即B&E或C&D,正确的答案当然是B&E,但我不知道如何得到正确的算法来解决这个问题。首先,我试着从a到每一条线中的每一个点画一条线,并得到最大的一个角度,正如你在第二张图片中看到的,作为答案,我设法发现正确的答案是最大角度的答案。但是在任何可能的随机条件下,双线定位都无法预测,不知何故,我在这种条件下绊倒了

出现了一种新情况:

在这种情况下,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]);
}
}
}
}

for(inti=0;i今早解决它,细节如图所示


如图所示,您可以通过从每个点创建一个区域来生成替换点,并计算该区域的内角。正确的组合将创建最大的角度总和。该角度总和将始终大于180度,因为该区域内的所有角度总和将始终为360度。

编辑您的问题,包含较少的文本,并包含一些代码来演示您到目前为止所做的工作和您需要的内容,您的问题将获得更多的视图、注释和答案您可以缩小比例以适应该视图中的观点?或者您可以剪裁视图的较小部分,并使用另一个预览视图来显示交叉点什么是c正确的解决方案,不是CD?已编辑,但不知道如何格式化代码,这不是一个实时代码,只是一个例子。@Joni,因为交点在y<0,但是我无法知道线是否会在ymax y中相交。嘿,这可能是个主意,如果我知道每条线的梯度,也许我可以预测交点。