Javascript 直线的交点被镜像并以一定角度移动

Javascript 直线的交点被镜像并以一定角度移动,javascript,math,p5.js,Javascript,Math,P5.js,为了方便地可视化线之间的交点,我尝试用p5.js编写一个程序 我的临时原型在计算交点(createIntersection)时出错。它们总是按角度镜像,并按特定单位移动。数组的转换和定义(如索引号112/210…)必须以这种方式完成,因为由于历史代码片段,我在工作中有某些要求 粗红线应表示多边形,浅蓝色直线为动态生成的辅助线。 在内部,所有偶数线都是无限的。为了创建一个整洁的视图,我已经为现在设置了一个固定长度 我认为错误应该在LineData类的构造函数中。在那里我创建了必要的变量“m”和“b

为了方便地可视化线之间的交点,我尝试用p5.js编写一个程序 我的临时原型在计算交点(createIntersection)时出错。它们总是按角度镜像,并按特定单位移动。数组的转换和定义(如索引号112/210…)必须以这种方式完成,因为由于历史代码片段,我在工作中有某些要求

粗红线应表示多边形,浅蓝色直线为动态生成的辅助线。 在内部,所有偶数线都是无限的。为了创建一个整洁的视图,我已经为现在设置了一个固定长度

我认为错误应该在LineData类的构造函数中。在那里我创建了必要的变量“m”和“b”。或者在createIntersection()方法中。 我使用框架P5

类点数据{
构造函数(x,y){
这个.x=x;
这个。y=y;
}
show(){
if(this.x==未定义)返回;
中风(255,0255);
冲程重量(3);
点(这个.x,这个.y);
冲程重量(1);
}
}
类行数据{
建造商(p1、p2、c、sw=1){
这1.x1=p1.x;
这1.y1=p1.y;
这是x.x2=p2.x;
这1.y2=p2.y;
这个.c=c;
this.sw=sw;
this.m=(this.y1-this.y2)/(this.x2-this.x1);
this.b=this.y2 this.m*this.x2;
};
show(){
如果(this.x1==未定义)返回;
中风(本例为c);
冲程重量(本标准西南);
行(this.x1,this.y1,this.x2,this.y2);
}   
创建交点(直线){
if(this.m==Infinity&&line.m==0)返回新的点数据(this.x1,line.y1);
else if(line.m==Infinity&&this.m==0)返回新的点数据(line.x1,this.y1);
var px=(line.b-this.b)/(this.m-line.m);
var py=line.m*px+line.b;
if(px==Infinity | | py==Infinity)返回新的点数据(未定义,未定义);
返回新的点数据(px,py);
}
创建平行(距离){
设xDiff=0;
设yDiff=0;
if(abs(this.x1-this.x2)>abs(this.y1-this.y2)){
yDiff=距离;
}否则{
xDiff=距离;
}
返回新的线数据(新的点数据(this.x1+xDiff,this.y1+yDiff),新的点数据(this.x2+xDiff,this.y2+yDiff),颜色(0,70200,80));
}
};
设varData=newarray(99);
设lineData=新数组(499);
设pointData=新数组(99);
函数设置(){
createCanvas(1600800);
//康斯坦顿
lineData[112]=新的lineData(新的PointData(300400)、新的PointData(600400)、颜色(255,0,0100)、3);
lineData[111]=新的lineData(新的PointData(300430)、新的PointData(600430)、颜色(255,0,0100)、3);
lineData[110]=新的lineData(新点数据(300460)、新点数据(600460)、颜色(255,0,0100)、3);
lineData[210]=新的lineData(新的点数据(360460)、新的点数据(260150)、颜色(255,0,0100)、3);
lineData[211]=新的lineData(新的PointData(330,460)、新的PointData(230,150)、颜色(255,0,0,100)、3);
lineData[212]=新的lineData(新的PointData(300460)、新的PointData(200150)、颜色(255,0,0100)、3);
lineData[1]=lineData[112]。CreateParallele(-10);
lineData[2]=lineData[1]。CreateParallele(-20);
lineData[3]=lineData[112].CreateParallele(10);
lineData[4]=lineData[211]。CreateParallele(-7.5);
lineData[5]=lineData[211].CreateParallele(7.5);
lineData[6]=lineData[211].CreateParallele(-15);
lineData[7]=lineData[211].CreateParallele(15);
pointData[0]=lineData[210]。createIntersection(lineData[112]);
pointData[1]=lineData[5]。创建交点(lineData[112]);
pointData[2]=lineData[5]。创建交点(lineData[3]);
pointData[3]=lineData[3]。创建交点(lineData[4]);
pointData[4]=lineData[112]。创建交点(lineData[4]);
pointData[5]=lineData[112]。createIntersection(lineData[212]);
pointData[6]=lineData[1]。创建交点(lineData[212]);
pointData[7]=lineData[1]。创建交点(lineData[6]);
pointData[8]=lineData[2]。创建交点(lineData[4]);
pointData[9]=lineData[2]。创建交点(lineData[5]);
pointData[10]=lineData[1]。创建交点(lineData[7]);
pointData[11]=lineData[210]。createIntersection(lineData[1]);
pointData[12]=lineData[210]。createIntersection(lineData[112]);
}
//功能图纸为30 mal die Sekunde aufgerufen
函数绘图(){
背景(10);
lineData.forEach(line=>{
line.show();
});
pointData.forEach(点=>{
point.show();
});
}

如果将
LineData
构造函数中的代码更改为

this.m = (this.y2 - this.y1) / (this.x2 - this.x1);
交叉点应正确绘制:

类点数据{
构造函数(x,y){
这个.x=x;
这个。y=y;
}
show(){
if(this.x==未定义)返回;
中风(255,0255);
冲程重量(3);
点(这个.x,这个.y);
冲程重量(1);
}
}
类行数据{
建造商(p1、p2、c、sw=1){
这1.x1=p1.x;
这1.y1=p1.y;
这是x.x2=p2.x;
这1.y2=p2.y;
这个.c=c;
this.sw=sw;
//this.m=(this.y1-this.y2)/(this.x2-this.x1);
this.m=(this.y2-this.y1)/(this.x2-this.x1);
this.b=this.y2 this.m*this.x2;
};
show(){
如果(this.x1==未定义)返回;
中风(本例为c);
冲程重量(本标准西南);
行(this.x1,this.y1,this.x2,this.y2);
}   
创建交点(直线){
if(this.m==Infinity&&line.m==0)返回新的点数据(this.x1,line.y1);
else if(line.m==Infinity&&this.m==0)返回新的点数据(line.x1,this.y1);
var px=(line.b-this.b)/(t