求点到线段的垂足

第一种: 设直线方程为ax+by+c=0,点坐标为(m,n)  
  则垂足为((b*b*m-a*b*n-a*c)/(a*a+b*b),(a*a*n-a*b*m-b*c)/(a*a+b*b))

第二种:计算点到线段的最近点

如果该线段平行于X轴(Y轴),则过点point作该线段所在直线的垂线,垂足很容
易求得,然后计算出垂足,如果垂足在线段上则返回垂足,否则返回离垂足近的端
点;

如果该线段不平行于X轴也不平行于Y轴,则斜率存在且不为0。设线段的两端点为
pt1和pt2,斜率为:
k = ( pt2.y - pt1. y ) / (pt2.x - pt1.x );
该直线方程为:
y = k* ( x - pt1.x) + pt1.y
其垂线的斜率为 - 1 / k,
垂线方程为:
y = (-1/k) * (x - point.x) + point.y
联立两直线方程解得:
x  =  ( k^2 * pt1.x + k * (point.y - pt1.y ) + point.x ) / ( k^2 + 1)
y  =  k * ( x - pt1.x) + pt1.y;

然后再判断垂足是否在线段上,如果在线段上则返回垂足;如果不在则计算两端点
到垂足的距离,选择距离垂足较近的端点返回。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过以下步骤来绘制两点连接的线段直线段: 1. 首先,计算出两点之间的距离和中心点坐标。 ```c++ CPoint p1, p2; // 两点坐标 float distance = sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2)); // 两点距离 CPoint center((p1.x + p2.x) / 2, (p1.y + p2.y) / 2); // 中心点坐标 ``` 2. 然后,计算出垂直线的起点和终点坐标。 ```c++ float dx = (p2.x - p1.x) / distance; // 两点连线的方向向量 float dy = (p2.y - p1.y) / distance; float offsetX = -dy * 10; // 偏移量(这里取10,可以根据需要调整) float offsetY = dx * 10; CPoint start(center.x + offsetX, center.y + offsetY); // 垂直线的起点坐标 CPoint end(center.x - offsetX, center.y - offsetY); // 垂直线的终点坐标 ``` 3. 最后,使用CDC的LineTo方法绘制线段。 ```c++ CDC* pDC = GetDC(); pDC->MoveTo(start); pDC->LineTo(end); ReleaseDC(pDC); ``` 完整代码如下: ```c++ CPoint p1(100, 100); // 两点坐标 CPoint p2(200, 200); float distance = sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2)); // 两点距离 CPoint center((p1.x + p2.x) / 2, (p1.y + p2.y) / 2); // 中心点坐标 float dx = (p2.x - p1.x) / distance; // 两点连线的方向向量 float dy = (p2.y - p1.y) / distance; float offsetX = -dy * 10; // 偏移量(这里取10,可以根据需要调整) float offsetY = dx * 10; CPoint start(center.x + offsetX, center.y + offsetY); // 垂直线的起点坐标 CPoint end(center.x - offsetX, center.y - offsetY); // 垂直线的终点坐标 CDC* pDC = GetDC(); pDC->MoveTo(start); pDC->LineTo(end); ReleaseDC(pDC); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值