怎么计算两条线段的交点? http://superdullwolf.cnzone.net/index.aspVBS解线性方程 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要求他们的斜率,来判断它们是否是完全相同/部分重叠/平行/完全没关系,这个完全没关系设计到立体了,如果斜率相同则会完全相同,或者是部分重叠,平行,不相同则相交,完全没关系.再(x11,y11)-(x12,y12)写一条直线方程,line2 : (x21,y21)-(x22,y22)写一条直线方程,这就成为方程组了,就可以算出交点了! 计算两条线段的交点: 1)同一平面内 AB[(x1,y1),(x2,y2)], CD[(x3,y3),(x4,y4)]2)立体: AB[(x1,y1,z1),(x2,y2,z2)], CD[(x3,y3,z3),(x4,y4,z4)]情况1)是情况2)的特殊情况,把情况2)的z1z2z3都取相同值就是情况1)了。思路:先判断特殊情况:是否平行、是否在同一直线上再判断是否相交再求交点线段的描述: x + a*y + b*z + c = 0 x1≤x≤x2 y1≤y≤y2 z1≤z≤z2如果:线段AB与CD的a,b相等,则平行或在同一直线上,如果两个的a,b,c都相等,则在同一直线上;在同一直线上时,有一种情况下,有一个交点(AB的某个端点和CD的某个端点),要加以判断。算两个线段的方程的解,再判断这个解是否在限定的大小范围内。算法用小学学到的方法就可以了。代码我没时间给你写。这个很容易的。顺便说一下:! superdullwolf(超级大笨狼,每天要自强) 的 【VBS解线性方程】 是个错误的程序! cuixiping(无心) 你用啥测试数据证明我的程序有问题啊?如果你能证明我的程序有问题,我会修改的. 这是我编写的一个delphi函数,求两条直线的交点,你看着转化成js函数。平行垂直等特殊情况需要单独判断function CalInterPoint(x1, y1, x2, y2, x3, y3, x4, y4: Double; var xj, yj: Double): integer;{----------------------------------------------------------------------------- 函数名: CalInterPoint 作者 : 陈新中 时间 : 2003-8-28 参数 : (x1,y1,x2,y2)是一条直线 (x3,y3,x4,y4)是另一条直线 返回值: 0 相交 功能 : 该函数计算直线的交点-----------------------------------------------------------------------------}var px12, py12,px34,py34,t12,t34,nx12,ny12,nx34,ny34,px13,py13, ty,tysx,tysy,czsx,czsy,cossit,sux,suy,czL:Double;begin Result := -1; px12 := x2 - x1; //12连线矢量 py12 := y2 - y1; px34 := x4 - x3; //34连线矢量 py34 := y4 - y3; t12 := sqrt(px12 * px12 + py12 * py12); //12长度 t34 := sqrt(px34 * px34 + py34 * py34); //34长度 nx12 := px12 / t12; //12单位矢 ny12 := py12 / t12; nx34 := px34 / t34; //34单位矢 ny34 := py34 / t34; px13 := x3 - x1; //13连线矢 py13 := y3 - y1; ty := px13 * nx12 + py13 * ny12; //投影 tysx := ty * nx12; //投影矢量 tysy := ty * ny12; czsx := tysx - px13; //垂线矢 czsy := tysy - py13; czL := sqrt(czsx * czsx + czsy * czsy); //垂线长度 cossit := (czsx * px34 + czsy * py34) / (sqrt(czsx * czsx + czsy * czsy) * sqrt(px34 * px34 + py34 * py34)); //垂线矢与34矢夹角的余弦 sux := czL * nx34 / cossit; //3到交点的连线矢 suy := czL * ny34 / cossit; xj := sux + x3; //最后求出交点 yj := suy + y3; Result := 0end; 判断直线是否平行 function isParalled(vx1,vy1,vx2,vy2){ //两个矢量是否平行 return Math.abs(vx1*vy2-vx2*vy1)<0.00000001; }判断交点是否是真正的交点,即不在直线的延长线上。(xb,yb)是交点(x1,y1,x2,y2)是其中一条直线 (xb-x1)*(xb-x2)+(yb-y1)*(yb-y2))<0.0 && (xb-x3)*(xb-x4)+(yb-y3)*(yb-y4))<0.0 extjs2中tabpanel的中元素显示问题 那位高手有 真正动态找到对象 执行的办法没?高手请进! 16以下进制转10进制 不能另存网页的问题 浮动后退按钮 如何用Up Arrow和Down Arrow两键分别实现Tab和Shift Tab键功能,谢谢! 如何枚举当前web页面中的所有对象? 求救!如何使text只能输入中文以及全角和半角的括号? 小弟在坐tree的时候,想通过点继节点打开一个窗口的问题!!再线等待,立刻给分!! 如何用Java Script生成一个全新的页面并显示? 怎么更改对话框的图表啊,不解决就不下班啦 下拉列表的问题
再(x11,y11)-(x12,y12)写一条直线方程,line2 : (x21,y21)-(x22,y22)写一条直线方程,这就成为方程组了,就可以算出交点了!
计算两条线段的交点:
1)同一平面内 AB[(x1,y1),(x2,y2)], CD[(x3,y3),(x4,y4)]
2)立体: AB[(x1,y1,z1),(x2,y2,z2)], CD[(x3,y3,z3),(x4,y4,z4)]
情况1)是情况2)的特殊情况,把情况2)的z1z2z3都取相同值就是情况1)了。思路:
先判断特殊情况:是否平行、是否在同一直线上
再判断是否相交
再求交点线段的描述:
x + a*y + b*z + c = 0
x1≤x≤x2
y1≤y≤y2
z1≤z≤z2如果:线段AB与CD的a,b相等,则平行或在同一直线上,如果两个的a,b,c都相等,则在同一直线上;
在同一直线上时,有一种情况下,有一个交点(AB的某个端点和CD的某个端点),要加以判断。算两个线段的方程的解,再判断这个解是否在限定的大小范围内。
算法用小学学到的方法就可以了。代码我没时间给你写。这个很容易的。
顺便说一下:
! superdullwolf(超级大笨狼,每天要自强) 的 【VBS解线性方程】 是个错误的程序!
如果你能证明我的程序有问题,我会修改的.
function CalInterPoint(x1, y1, x2, y2, x3, y3, x4,
y4: Double; var xj, yj: Double): integer;
{-----------------------------------------------------------------------------
函数名: CalInterPoint
作者 : 陈新中
时间 : 2003-8-28
参数 : (x1,y1,x2,y2)是一条直线
(x3,y3,x4,y4)是另一条直线
返回值: 0 相交
功能 : 该函数计算直线的交点
-----------------------------------------------------------------------------}
var
px12, py12,px34,py34,t12,t34,nx12,ny12,nx34,ny34,px13,py13, ty,tysx,tysy,czsx,czsy,cossit,sux,suy,czL:Double;
begin
Result := -1;
px12 := x2 - x1; //12连线矢量
py12 := y2 - y1;
px34 := x4 - x3; //34连线矢量
py34 := y4 - y3;
t12 := sqrt(px12 * px12 + py12 * py12); //12长度
t34 := sqrt(px34 * px34 + py34 * py34); //34长度
nx12 := px12 / t12; //12单位矢
ny12 := py12 / t12;
nx34 := px34 / t34; //34单位矢
ny34 := py34 / t34;
px13 := x3 - x1; //13连线矢
py13 := y3 - y1;
ty := px13 * nx12 + py13 * ny12; //投影
tysx := ty * nx12; //投影矢量
tysy := ty * ny12;
czsx := tysx - px13; //垂线矢
czsy := tysy - py13;
czL := sqrt(czsx * czsx + czsy * czsy); //垂线长度
cossit := (czsx * px34 + czsy * py34) / (sqrt(czsx * czsx + czsy * czsy) *
sqrt(px34 * px34 + py34 * py34)); //垂线矢与34矢夹角的余弦
sux := czL * nx34 / cossit; //3到交点的连线矢
suy := czL * ny34 / cossit;
xj := sux + x3; //最后求出交点
yj := suy + y3;
Result := 0
end;
function isParalled(vx1,vy1,vx2,vy2){
//两个矢量是否平行
return Math.abs(vx1*vy2-vx2*vy1)<0.00000001;
}
判断交点是否是真正的交点,即不在直线的延长线上。(xb,yb)是交点(x1,y1,x2,y2)是其中一条直线
(xb-x1)*(xb-x2)+(yb-y1)*(yb-y2))<0.0 && (xb-x3)*(xb-x4)+(yb-y3)*(yb-y4))<0.0