19,468
社区成员
发帖
与我相关
我的任务
分享
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);
}
不考虑特殊的情况,如平行于横轴或纵轴
可求出斜率 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 = 2
c = ( ( 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