请教P点关于(P1, P2)直线的镜像坐标的计算公式

yzlxy 2008-05-04 04:59:27
该如何计算?
...全文
1650 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldfolker 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yzlxy 的回复:]
搞定了, 不考虑特殊情况的c#代码
C# codepublicstaticPointF CalcPedal(PointF P1, PointF P2, PointF P)
{doublek=(P2.Y-P1.Y)/(P2.X-P1.X);doublec=(k*P1.X-P1.Y)/k;doubleb=-c/(P1.Y-k*P1.X);doublea=-b*k;doublesqr=a*a+b*b;doublex=(b*b*P.X-a*b*P.Y-a*c)/sqr;doubley=(a*a*P.Y-a*b*P.X-b*c)/sqr;returnnewPointF((float)x, (float)y);
}publicstaticPointF MirrorPoint(PointF P1, PointF P2, PointF P…
[/Quote]

那如果这条直线的P1坐标是(0,0),这里不是除零溢出了么?
yzlxy 2008-05-04
  • 打赏
  • 举报
回复
感谢jennyvenus

用户 昵称 2008-05-04
  • 打赏
  • 举报
回复
刚才CSDN出错,我以为不能再打开这个贴子了,所以在即时消息中将后来的算法给您发过去了。
yzlxy 2008-05-04
  • 打赏
  • 举报
回复
搞定了, 不考虑特殊情况的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);
}
yzlxy 2008-05-04
  • 打赏
  • 举报
回复
jennyvenus:

垂足就是最终的newP点和原P点构成的线段中点, 如果能计算出垂足,也可以算newP点

不过,还没看懂,你的一般直线方程是如何推出的
用户 昵称 2008-05-04
  • 打赏
  • 举报
回复
不知道是否有矩阵的方法,如果你按俺的流程走下去,肯定能够算出镜像点。
用户 昵称 2008-05-04
  • 打赏
  • 举报
回复
有了直线的一般式方程,就可以计算点P到直线上的垂足。有了垂足,就得到了P点对垂足镜像的点P'。
yzlxy 2008-05-04
  • 打赏
  • 举报
回复
有没有矩阵变换的方法可以实现?

纯数学方法计算,要考虑很多特殊情况,代码冗长,容易出错
用户 昵称 2008-05-04
  • 打赏
  • 举报
回复
得到方程的一般式,就可以在数学层面解决问题了,不用考虑斜率等问题。
用户 昵称 2008-05-04
  • 打赏
  • 举报
回复
不考虑特殊的情况,如平行于横轴或纵轴 

可求出斜率 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
yzlxy 2008-05-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jennyvenus 的回复:]
不考虑特殊的情况,如平行于横轴或纵轴

可求出斜率 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 );
[/Quote]

计算出直线方程中的a,b,c有何用?
yzlxy 2008-05-04
  • 打赏
  • 举报
回复
vincen_cn:

这种方法,我用数学软件推过了, 表达式奇长无比,行不通
yzlxy 2008-05-04
  • 打赏
  • 举报
回复
我采用的方法是,

1)先计算(P1,P2)直线的斜角
2)以P2点为圆心,旋转P1点到Y轴平行 ,得到新的newP1
3)计算P点关于(newP1,P2)垂直线的对称点newP
4)最后将newP 逆向旋转回头,得到最终的镜像点

用上面的方法计算出来的结果有一点偏差,不知道是哪里错了



用户 昵称 2008-05-04
  • 打赏
  • 举报
回复
不考虑特殊的情况,如平行于横轴或纵轴

可求出斜率 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 );
vincen_cn 2008-05-04
  • 打赏
  • 举报
回复
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)
解呗
用户 昵称 2008-05-04
  • 打赏
  • 举报
回复
这个并不难吧,首先要建立直线的一般式方程

ax + by + c = 0

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧