该如何计算?

解决方案 »

  1.   

    这个并不难吧,首先要建立直线的一般式方程ax + by + c = 0
      

  2.   

    P(X0, Y0), P1(X1, Y1 ),P2(X2,Y2)
    Y-Y0/X-X0 = -(X2 - X1)/(Y2 - Y1)和
    (X1-X0)*(X1-X0) +(Y1-Y0)*(Y1-Y0) = (X1-X)*(X1-X) +(Y1-Y)*(Y1-Y)
    解呗
      

  3.   

    不考虑特殊的情况,如平行于横轴或纵轴可求出斜率 k = ( y2 - y1 ) / ( x2 - x1 );由点斜式可得方程 y = kx + c,可得c = ( ( k * x1 ) - y1 ) / k;
    b = ( -1.0 * c ) / ( y1 - k * x1 );
    a = ( -1.0 * b * k );
      

  4.   

    我采用的方法是, 1)先计算(P1,P2)直线的斜角 
    2)以P2点为圆心,旋转P1点到Y轴平行 ,得到新的newP1
    3)计算P点关于(newP1,P2)垂直线的对称点newP
    4)最后将newP 逆向旋转回头,得到最终的镜像点用上面的方法计算出来的结果有一点偏差,不知道是哪里错了
      

  5.   

    vincen_cn:  这种方法,我用数学软件推过了, 表达式奇长无比,行不通
      

  6.   


    计算出直线方程中的a,b,c有何用?
      

  7.   

    不考虑特殊的情况,如平行于横轴或纵轴 可求出斜率 k = ( y2 - y1 ) / ( x2 - x1 ); 由点斜式可得方程 y = kx + c,可得 c = ( ( k * x1 ) - y1 ) / k; 
    b = ( -1.0 * c ) / ( y1 - k * x1 ); 
    a = ( -1.0 * b * k ); 设x1 = 1, y1 = 1, x2 = 5, y2 = 9,套用公式可得k = 8 / 4 = 2c = ( ( 8 * 1 ) - 1 ) / k = 7 / 2 = 3.5
    b = ( -1 * 3.5 ) / ( 1 - 2 * 1 ) = 3.5
    a = ( -1 * 3.5 * 2 ) = -7现在a < 0 ,可以将a, b, c都除以a,得a = 1, b = -0.5, c = -0.5 得一般式方程为  X - 0.5 * Y - 0.5 = 0
      

  8.   

    有了直线的一般式方程,就可以计算点P到直线上的垂足。有了垂足,就得到了P点对垂足镜像的点P'。
      

  9.   

    jennyvenus:垂足就是最终的newP点和原P点构成的线段中点, 如果能计算出垂足,也可以算newP点不过,还没看懂,你的一般直线方程是如何推出的
      

  10.   

    搞定了, 不考虑特殊情况的c#代码        public static PointF CalcPedal(PointF P1, PointF P2, PointF P)
            {
                double k = (P2.Y - P1.Y) / (P2.X - P1.X);
                double c = (k * P1.X - P1.Y) / k;
                double b = -c / (P1.Y - k * P1.X);
                double a = -b * k;            double sqr = a * a + b * b;            double x = (b * b * P.X - a * b * P.Y - a * c) / sqr;
                double y = (a * a * P.Y - a * b * P.X - b * c) / sqr;
                return new PointF((float)x, (float)y);
            }               public static PointF MirrorPoint(PointF P1, PointF P2, PointF P)
            {
                PointF pedal = CalcPedal(P1, P2, P);
                return new PointF(2 * pedal.X - P.X, 2 * pedal.Y - P.Y);
            }
      

  11.   

    刚才CSDN出错,我以为不能再打开这个贴子了,所以在即时消息中将后来的算法给您发过去了。
      

  12.   

    感谢jennyvenus