请教P点关于(P1, P2)直线的镜像坐标的计算公式 该如何计算? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个并不难吧,首先要建立直线的一般式方程ax + by + c = 0 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)解呗 不考虑特殊的情况,如平行于横轴或纵轴可求出斜率 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 ); 我采用的方法是, 1)先计算(P1,P2)直线的斜角 2)以P2点为圆心,旋转P1点到Y轴平行 ,得到新的newP13)计算P点关于(newP1,P2)垂直线的对称点newP4)最后将newP 逆向旋转回头,得到最终的镜像点用上面的方法计算出来的结果有一点偏差,不知道是哪里错了 vincen_cn: 这种方法,我用数学软件推过了, 表达式奇长无比,行不通 计算出直线方程中的a,b,c有何用? 不考虑特殊的情况,如平行于横轴或纵轴 可求出斜率 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.5b = ( -1 * 3.5 ) / ( 1 - 2 * 1 ) = 3.5a = ( -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 有了直线的一般式方程,就可以计算点P到直线上的垂足。有了垂足,就得到了P点对垂足镜像的点P'。 jennyvenus:垂足就是最终的newP点和原P点构成的线段中点, 如果能计算出垂足,也可以算newP点不过,还没看懂,你的一般直线方程是如何推出的 搞定了, 不考虑特殊情况的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); } 刚才CSDN出错,我以为不能再打开这个贴子了,所以在即时消息中将后来的算法给您发过去了。 感谢jennyvenus 怎样用CRgeKey类来操作注册表? 指针在构造函数与OnInitDialog函数区别 VC6.0 项目环境设置问题 大家好,图形图像的开发参考什么样的书籍好?例如地图开发。 对话框中 滑快调试 出错 看看贴图 帮个忙~~谢谢 求有关应用程序框架方面的原理知识 能否取得启动当前打印任务的进程? 谁能给我一个准确的解释? 如何在程序中监测并阻止用户修改系统时间? 如何计算每秒传输的速率啊 vc开发数据库应用程序 如何画过两点的正弦线?
Y-Y0/X-X0 = -(X2 - X1)/(Y2 - Y1)和
(X1-X0)*(X1-X0) +(Y1-Y0)*(Y1-Y0) = (X1-X)*(X1-X) +(Y1-Y)*(Y1-Y)
解呗
b = ( -1.0 * c ) / ( y1 - k * x1 );
a = ( -1.0 * b * k );
2)以P2点为圆心,旋转P1点到Y轴平行 ,得到新的newP1
3)计算P点关于(newP1,P2)垂直线的对称点newP
4)最后将newP 逆向旋转回头,得到最终的镜像点用上面的方法计算出来的结果有一点偏差,不知道是哪里错了
计算出直线方程中的a,b,c有何用?
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
{
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);
}