http://superdullwolf.cnzone.net/index.aspVBS解线性方程 

解决方案 »

  1.   

    要求他们的斜率,来判断它们是否是完全相同/部分重叠/平行/完全没关系,这个完全没关系设计到立体了,如果斜率相同则会完全相同,或者是部分重叠,平行,不相同则相交,完全没关系.
    再(x11,y11)-(x12,y12)写一条直线方程,line2 : (x21,y21)-(x22,y22)写一条直线方程,这就成为方程组了,就可以算出交点了!
      

  2.   


    计算两条线段的交点:
      
    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解线性方程】 是个错误的程序!
      

  3.   

    cuixiping(无心) 你用啥测试数据证明我的程序有问题啊?
    如果你能证明我的程序有问题,我会修改的.
      

  4.   

    这是我编写的一个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 := 0
    end;
      

  5.   

    判断直线是否平行
        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