Javascript 如何求两条直线相对直线的交点

Javascript 如何求两条直线相对直线的交点,javascript,intersection,trigonometry,line-intersection,Javascript,Intersection,Trigonometry,Line Intersection,我试图找到两条线的相对线的交点: 但是,我很困惑于如何找到一条线的对立面 下面是一个在0.0-1.0之间转换点的示例 那么,如何找到这个交集呢?我冒昧地清除了一些代码,并添加了一些对象,以便更容易地回忆数据。添加:点,线对象和它们上面的关联方法draw() 为此,首先需要计算中间点。这很容易,因为点(a,b)和(c,d)对于您的线路,中间点是((a+c)/2,(b+d)/2)。这将是你的对立面的起点 从那里,你可以通过计算直线的梯度(grad=(d-b)/(a-c))并计算出-1/grad(因

我试图找到两条线的相对线的交点:

但是,我很困惑于如何找到一条线的对立面

下面是一个在0.0-1.0之间转换点的示例


那么,如何找到这个交集呢?

我冒昧地清除了一些代码,并添加了一些对象,以便更容易地回忆数据。添加:
线
对象和它们上面的关联方法
draw()

为此,首先需要计算中间点。这很容易,因为点
(a,b)
(c,d)
对于您的线路,中间点是
((a+c)/2,(b+d)/2)
。这将是你的对立面的起点

从那里,你可以通过计算直线的梯度(
grad=(d-b)/(a-c)
)并计算出
-1/grad
(因为垂直直线的梯度相反)。这是我定义的
contract()
函数

从这里开始,你有两条相反的线,你只需要找到交点。两条线都有两个方程(因为你知道一条线是
y=g*x+r
,其中
g
是梯度,
r
是原点的y值),所以你可以很容易地计算出
(x,y)
在两条线上的值是相同的。如果你做不到,那就把问题贴在那里

功能点(x,y){
这个.x=x;
这个。y=y;
}
Point.prototype.draw=函数(color=“blue”){
var-diff=0.0125;
(新行(this.x-diff,this.y-diff,this.x-diff,this.y+diff)).draw(“正常”,颜色);
(新行(this.x-diff,this.y+diff,this.x+diff,this.y+diff)).draw(“正常”,颜色);
(新行(此.x+diff,此.y+diff,此.x+diff,此.y-diff)).draw(“正常”,颜色);
(新线(此.x+diff,此.y-diff,此.x-diff,此.y-diff))绘制(“正常”,颜色);
}
功能线(x1、y1、x2、y2){
该点1=新点(x1,y1);
this.point2=新点(x2,y2);
}
Line.prototype.draw=函数(style=“normal”,color=“black”){
var c=document.getElementById(“myCanvas”);
var ctx=c.getContext(“2d”);
ctx.save();
如果(样式==“虚线背面”){
ctx.setLineDash([5,3]);}
ctx.strokeStyle=颜色;
ctx.beginPath();
ctx.moveTo(xp(this.point1.x)、yp(this.point1.y));
ctx.lineTo(xp(this.point2.x)、yp(this.point2.y));
ctx.stroke();
ctx.restore();
归还这个;
}
Line.prototype.intersect=函数(otherLine){
var grad1=(this.point2.y-this.point1.y)/(this.point2.x-this.point1.x);
var grad2=(otherLine.point2.y-otherLine.point1.y)/(otherLine.point2.x-otherLine.point1.x);
var remainder1=this.point1.y-this.point1.x*grad1;
var remainder2=otherLine.point1.y-otherLine.point1.x*grad2;
变量x=(remainder2-remainder1)/(grad1-grad2);
变量y=grad1*x+remainder1;
返回新点(x,y);
}
Line.prototype.contract=函数(style=“normal”,color=“Black”){
var c=document.getElementById(“myCanvas”);
var ctx=c.getContext(“2d”);
ctx.save();
var midway=新点((this.point1.x+this.point2.x)/2,(this.point1.y+this.point2.y)/2);
var invgrad=-1*1/(this.point2.y-this.point1.y)/(this.point2.x-this.point1.x);
返回新行(midway.x-100,midway.y-100*invgrad,midway.x+100,midway.y+100*invgrad);
}
//为法线打印规范化点
函数xp(x){返回x*300+50;}
函数yp(y){返回450-(y*300);}
//写一篇课文
函数文本(str,x,y,size=12,color=“black”){
var c=document.getElementById(“myCanvas”);
var ctx=c.getContext(“2d”);
ctx.save();
ctx.font=size+“px Arial”;
ctx.fillStyle=颜色;
ctx.fillText(str,xp(x),yp(y));
ctx.restore();
}
//初始指南
函数init(){
新线(0,0,0,1)。绘制(“虚线后退”,“#888”);
新线(0,1,3,1)。画(“虚线后退”,“#888”);
新线(3,1,3,0)。画(“虚线后退”,“#888”);
新线(1,0,1,1)。绘制(“虚线后退”,“#888”);
新线(2,0,2,1)。画(“虚线后退”,“#888”);
文本(“1”、-0.05,0.95)
文本(“0”、-0.05、-0.05)
文本(“1”,1,-0.05)
文本(“2”,2,-0.05)
文本(“3”,3,-0.05)
}
init();
var ax=0.00,ay=0.50;
var bx=1.00,by=1.00;
var cx=2.00,cy=0.25;
var dx=3.00,dy=0.75;
新点(ax,ay)。绘制(“红色”);
新点(bx,by)。绘制(“红色”);
新点(cx,cy)。绘制(“红色”);
新点(dx,dy)。绘制(“红色”);
var line1=新线(ax、ay、bx、by).draw(“正常”、“蓝色”);
var line2=新线(bx、by、cx、cy)。绘制(“正常”、“蓝色”);
var line3=新线(cx、cy、dx、dy)。绘制(“正常”、“蓝色”);
线条2.反面()绘制(“正常”、“红色”);
线条1.反面()绘制(“正常”、“橙色”);
line1.Antivative().相交(line2.Antivative()).绘制(“法线”、“紫色”)

@jonaswillms它的琐碎是我没有给出答案的两个原因之一——另一个原因是它在完全支持LaTeX的情况下更具可读性,这是SO没有的,但math SE有。
var ax=0.00, ay=0.50 ;
var bx=1.00, by=1.00 ;
var cx=2.00, cy=0.25 ;