Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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_Vector_2d_Processing_Collision Detection - Fatal编程技术网

Java 找到两个向量的交点,这两个向量与方向无关

Java 找到两个向量的交点,这两个向量与方向无关,java,vector,2d,processing,collision-detection,Java,Vector,2d,Processing,Collision Detection,我有两个向量,我想知道这些向量在哪里相交,与方向或长度无关。让我们假设我在任意方向画一条无限长的线,我想知道这两条线在哪里相交,然后得到坐标。有关说明,请参见下图: 所以我想知道粉色X的坐标,但是我只能找到两条线的交点的计算公式,这两条线有一个标准点和一个终点,我没有:(所以我在寻找一些关于如何正确处理这个问题的帮助。) 我已经计算了蓝线的标准化方向:如下所示: PVector norm12 = new PVector(-dir12.y, dir12.x); PVector norm23 =

我有两个向量,我想知道这些向量在哪里相交,与方向或长度无关。让我们假设我在任意方向画一条无限长的线,我想知道这两条线在哪里相交,然后得到坐标。有关说明,请参见下图:

所以我想知道粉色X的坐标,但是我只能找到两条线的交点的计算公式,这两条线有一个标准点和一个终点,我没有:(所以我在寻找一些关于如何正确处理这个问题的帮助。)

我已经计算了蓝线的标准化方向:如下所示:

PVector norm12 = new PVector(-dir12.y, dir12.x);
PVector norm23 = new PVector(dir23.y, -dir23.x);
关于我为什么要这样做的一些背景: 我试图找到由3个点创建的圆的中心点

所有这些都是二维的


如果需要额外的信息,我很乐意提供。

如果你有一条由点
p
和标准化方向
R
定义的无休止线,还有一条由点
Q
和方向
S
定义的第二条无休止线,那么无休止线
X
的交点是:

alpha…Q-P和R之间的角度
β…R和S之间的角度
伽马=180°-α-β
h=| Q-P |*sin(α)
u=h/sin(β)
t=| Q-P |*sin(伽马)/sin(贝塔)
t=点(Q-P,(S.y,-S.x))/点(R,(S.y,-S.x))=行列式(mat2(Q-P,S))/行列式(mat2(R,S))
u=dot(Q-P,(R.y,-R.x))/dot(R,(S.y,-S.x))=行列式(mat2(Q-P,R))/行列式(mat2(R,S))
X=P+R*t=Q+S*u
这可通过使用以下公式进行计算:

//两条无休止的线相交
//第1行:“P”位于无极线上,方向为“dir1”(“R”)
//第2行:“Q”位于无极线上,方向为“dir2”(“S”)
PVector相交(PVector P、PVector dir1、PVector Q、PVector dir2){
PVector R=dir1.copy();
PVector S=dir2.copy();
R.规范化();
使正常化();
PVector QP=PVector.sub(Q,P);
PVector SNV=新PVector(S.y,-S.x);
浮点数t=QP.dot(SNV)/R.dot(SNV);
PVector X=PVector.add(P,PVector.mult(R,t));
返回X;
}
请参见示例:

void setup(){
尺寸(500500);
}
作废提款(){
背景(0,0,0);
中风(255);
填充(255,0,0);
PVector l1p1=新的PVector(250150);
PVector l1p2=新的PVector(300300);
PVector l2p1=新的PVector(200,180);
PVector l2p2=新的PVector(300220);
PVector l3p1=新的PVector(200300);
PVector l3p2=新的PVector(250280);
行(l1p1.x,l1p1.y,l1p2.x,l1p2.y);
行(l2p1.x,l2p1.y,l2p2.x,l2p2.y);
行(l3p1.x、l3p1.y、l3p2.x、l3p2.y);
PVector dir1=PVector.sub(l1p2,l1p1);
PVector dir2=PVector.sub(l2p2,l2p1);
PVector dir3=PVector.sub(l3p2,l3p1);
PVector x1=相交(l1p1,dir1,l2p1,dir2);
圆(x1.x,x1.y,10);
PVector x2=相交(l1p1,dir1,l3p1,dir3);
圆(x2.x,x2.y,10);
PVector x3=相交(l2p1,dir2,l3p1,dir3);
圆圈(x3.x,x3.y,10);
}
注意,如果直线平行,则返回点(
PVector
object)的标量为无穷大。这可以通过
Float.isInfinite
进行计算。例如:

if(!Float.isInfinite(x1.x)| |!Float.isInfinite(x1.y))
圆(x1.x,x1.y,10);

我说矢量的方向对两个矢量的交点没有影响,对吗?@FutureCake抱歉,但我不知道你的意思。方向当然重要,因为它们定义了无休止直线的方向。直线是由一个点和一个方向定义的。但在什么地方不重要方向来自形式。