判断点是否在直线上

这篇博客介绍了一种在GDI中判断点是否在直线上的方法,不依赖于直线方程,而是通过坐标对和距离差进行计算。文章提供了一个名为`isPtAtLine`的函数,该函数接受直线上的坐标对数组、点的坐标和一个偏移量,通过比较点到直线段的角度差和距离来判断点是否在直线上。
摘要由CSDN通过智能技术生成

这是一个纯解析几何的题目,不是有一个直线外一点到直线的距离公式吗?是的,不过在GDI的领域,不需要这样去考虑问题,不需要考虑直一方程,我们直接可以从坐标对上着手。

 

struct CGeoXY
{
 double dx,dy;
};

 

/*参数说明

    pXY是一条直线的所有坐标对数组

    nPointCount是数组中的点数

    dx,dy是要计算的点

    dOffset 是偏移量,即dx,dy与直线的距离差< dOffset 即可判断为在直线上。

*/

bool isPtAtLine(CGeoXY* pXY, int nPointCount,double dx,double dy,double dOffset)
{
 double dx1,dy1,dx2,dy2;
 double dA1,dA2;

 for (int i = 0;i < nPointCount - 1;i++){
  dx1 = pXY[i].dx;
  dy1 = pXY[i].dy;

  dx2 = pXY[i + 1].dx;
  dy2 = pXY[i + 1].dy;

  if (isPtInRect(dx,dy,dx1,dy1,dx2,dy2)){
      dA1 = getDirection(dx1,dy1,dx,dy);
          dA2 = getDirection(dx1,dy1,dx2,dy2);

   if (abs(sin(dA1 - dA2) * getDistance(dx1,dy1,dx,dy)) < dOffset){

判断一个是否直线上,您可以使用以下方法: 1. 获取直线的两个端坐标,假设它们是 (x1, y1) 和 (x2, y2)。 2. 获取的坐标,假设它是 (x, y)。 3. 计算 (x, y) 到直线 (x1, y1) - (x2, y2) 的垂线的垂足坐标 (xv, yv),可以使用以下公式计算: ``` xv = ((x - x1) * (x2 - x1) + (y - y1) * (y2 - y1)) / ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * (x2 - x1) + x1; yv = ((x - x1) * (y2 - y1) - (y - y1) * (x2 - x1)) / ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * (y2 - y1) + y1; ``` 4. 如果 (xv, yv) 在直线的端之间,那么 (x, y) 就在直线上。 以下是一个示例代码,演示如何判断一个是否直线上: ```cpp QPointF lineStart = lineItem->line().p1(); QPointF lineEnd = lineItem->line().p2(); QPointF point = QPointF(x, y); // Calculate the projection of the point onto the line qreal xv = ((point.x() - lineStart.x()) * (lineEnd.x() - lineStart.x()) + (point.y() - lineStart.y()) * (lineEnd.y() - lineStart.y())) / ((lineEnd.x() - lineStart.x()) * (lineEnd.x() - lineStart.x()) + (lineEnd.y() - lineStart.y()) * (lineEnd.y() - lineStart.y())) * (lineEnd.x() - lineStart.x()) + lineStart.x(); qreal yv = ((point.x() - lineStart.x()) * (lineEnd.y() - lineStart.y()) - (point.y() - lineStart.y()) * (lineEnd.x() - lineStart.x())) / ((lineEnd.x() - lineStart.x()) * (lineEnd.x() - lineStart.x()) + (lineEnd.y() - lineStart.y()) * (lineEnd.y() - lineStart.y())) * (lineEnd.y() - lineStart.y()) + lineStart.y(); // Check if the projection is between the endpoints of the line if (xv >= qMin(lineStart.x(), lineEnd.x()) && xv <= qMax(lineStart.x(), lineEnd.x()) && yv >= qMin(lineStart.y(), lineEnd.y()) && yv <= qMax(lineStart.y(), lineEnd.y())) { qDebug() << "The point is on the line."; } else { qDebug() << "The point is not on the line."; } ``` 请注意,此示例假定您已经有了一个 QGraphicsLineItem 对象,其中包含了您要查找的直线。还要注意,此示例中的坐标均为浮数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值