哪位高手能用最少的运算计算出四边形的对角线相交坐标

谁能用最少的运算计算出四边形的对角线相交坐标
数据是我随便写的,谁能用最少的运行计算出红点(对角线相交点)的值呢?



------解决方案--------------------
这个,,小学的时候 不是学过 俩直线相交的么 ,A(x1,y1),B(x2,y2),C(x3,y3),D(x4,y4);你可以先求出对角线的 直线表达式子,然后求出俩直线的交点坐标~亲,不知是不是您要的
------解决方案--------------------
直线相交联解方程就行了
------解决方案--------------------
求出一般式,然后解方程。

C/C++ code
int
Calc_Two_Line_Point( double a1, double b1, double c1, double a2, double b2, double c2, OUT double *x, OUT double *y )
{
    double xx, yy;
    double e;

    e = ( a1 * b2 - a2 * b1 );
    if( equ( e, 0 ) )
    {
        return 0;
    }

    yy = ( a2 * c1 - a1 * c2 ) / e;

    if( equ( a2, 0 ) )
    {
        xx = ( -1 * b1 * yy - c1 ) / a1;
    }
    else
    {
        xx = ( -1 * b2 * yy - c2 ) / a2;
    }

    *x = xx;
    *y = yy;

    return 1;
}

------解决方案--------------------
探讨
求出一般式,然后解方程。


C/C++ code

int
Calc_Two_Line_Point( double a1, double b1, double c1, double a2, double b2, double c2, OUT double *x, OUT double *y )
{
double xx, yy;
double e;

……

------解决方案--------------------
用公式就快
struct Point
{
public:
Point(double x, double y)
{
this->x=x;
this->y=y;
}
double x;
double y;
};
int main()
{
Point ptA(3.5, 11), ptB(9, 7.5), ptC(10, 5), ptD(5, 7);
double x = ((ptB.y-((ptD.y-ptB.y)/(ptD.x-ptB.x))*ptB.x)-(ptA.y-((ptC.y-ptA.y)/(ptC.x-ptA.x))*ptA.x))/(((ptC.y-ptA.y)/(ptC.x-ptA.x))-((ptD.y-ptB.y)/(ptD.x-ptB.x)));
double y = ((ptC.y-ptA.y)/(ptC.x-ptA.x))*x + (ptA.y-((ptC.y-ptA.y)/(ptC.x-ptA.x))*ptA.x);
return 0;
}
你可以优化一下!
------解决方案--------------------
原理就是2直线相交,只是把一部分代数计算手算,而不是交给计算机做,计算机做的只是求结果而已!
------解决方案--------------------
嫖妓将军 说的只是一般的求解办法
同求效率更高,代码量更少的方法
------解决方案--------------------
给个矩阵解法
求解4阶线性方程组Ax=b
A={1,0,x1-x3,0;
0,1,y1-y3,0;
1,0,0,x2-x4;
0,1,0,y2-y4}
b={x1;y1;x2;y2}
求得的前两个解就是交点的横纵坐标
------解决方案--------------------
好处是不用考虑除零问题(无交点则无解)
直观,
手算的话速度肯定更快
用最简单的高斯消去算都很快



------解决方案--------------------
算法效率来自两方面,时空观哦!
------解决方案--------------------
矩阵求解的原理是
交点(x0,y0)坐标是各两端点坐标的线性插值
即 x0 = x1*(1-f1) + x3*f1 = x1+ (x3-x1)*f1
(f1是比例系数,在x线段间的话0~1)
y0 = y1+ (y3-y1)*f1
x0 = x2+ (x4-x2)*f2
y0 = y2+ (y4-y2)*f2

4个线性方程4个未知数
 
------解决方案--------------------
fujialin2011兄的方法其实也是联立方程
我猜利用的是
直线1方程(x-x1)*(y-y3) + (x-x3)*(y-y1) = 0;
直线2方程(x-x2)*(y-y4) + (x-x4)*(y-y2) = 0;
交点2个方程都满足,2个方程2个未知数
不过里面有个2次项xy,只不过他把解析解手算给出了而已
另外跟jennyvenus兄算斜率求直线解析方程的一样,
都有除零问题,例x1 == x3或者 x2 == x4时,程序会崩溃



------解决方案--------------------
x0 = x1+ (x3-x1)*f1
y0 = y1+ (y3-y1)*f1
联立消去 f1
x*(y3-y1) - y *(x3-x1) = x1y3 - x3y1
x0 = x2+ (x4-x2)*f2
y0 = y2+ (y4-y2)*f2
联立消去 f2
x*(y4-y2) - y *(x4-x2) = x2y4 - x4y2
这样就是2阶线性方程组了

------解决方案--------------------
线性方 线性方程 啊哦①