首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >点到直线/线段的距离

点到直线/线段的距离
EN

Stack Overflow用户
提问于 2012-08-27 01:33:42
回答 2查看 14K关注 0票数 5

我必须计算一个点到一条线的距离(检查它是直线还是线段)。我不确定布尔函数IsSegment是否工作正常。我能有一些建议吗?谢谢。

代码语言:javascript
复制
double Distance_From_Line_to_Point(int *a, int *b, int *c, bool IsSegment) {
    double distance;
    int dot1;
    int dot2;
    distance = Cross_Product(a, b, c) / Distance(a, b);
    if (IsSegment(a,b,c) == true) {
        dot1 = Dot_Product(a, b, c);
        if (dot1 > 0) {
            return Distance(b, c);
        }
        dot2 = Dot_Product(b, a, c);
        if (dot2 > 0) {
            return Distance(a, c);
        }
    }
    return fabs(distance);
}

bool IsSegment(int *a, int *b, int *c) {
    double angle1;
    double angle2;
    angle1 = atan(double(b[1] - a[1]) / (b[0] - a[0]));
    angle2 = atan(double(c[1] - b[1]) / (c[0] - b[0]));
    if ((angle2 - angle1) * (180 / PI) > 90) {
        return false;
    }
    return true;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-27 02:23:54

你不能直接用这个公式来计算距离吗?

所以要找到这行:

代码语言:javascript
复制
void getLine(double x1, double y1, double x2, double y2, double &a, double &b, double &c)
{
       // (x- p1X) / (p2X - p1X) = (y - p1Y) / (p2Y - p1Y) 
       a = y1 - y2; // Note: this was incorrectly "y2 - y1" in the original answer
       b = x2 - x1;
       c = x1 * y2 - x2 * y1;
}

http://formule-matematica.tripod.com/distanta-de-dreapta.htm

代码语言:javascript
复制
double dist(double pct1X, double pct1Y, double pct2X, double pct2Y, double pct3X, double pct3Y)
{
     double a, b, c;
     getLine(pct2X, pct2Y, pct3X, pct3Y, a, b, c);
     return abs(a * pct1X + b * pct1Y + c) / sqrt(a * a + b * b);
}

如何使用代码的示例:

代码语言:javascript
复制
#include <CMATH>

void getLine(double x1, double y1, double x2, double y2, double &a, double &b, double &c)
{
    // (x- p1X) / (p2X - p1X) = (y - p1Y) / (p2Y - p1Y) 
    a = y1 - y2; // Note: this was incorrectly "y2 - y1" in the original answer
    b = x2 - x1;
    c = x1 * y2 - x2 * y1;
}

double dist(double pct1X, double pct1Y, double pct2X, double pct2Y, double pct3X, double pct3Y)
{
    double a, b, c;
    getLine(pct2X, pct2Y, pct3X, pct3Y, a, b, c);
    return abs(a * pct1X + b * pct1Y + c) / sqrt(a * a + b * b);
}


int main(int argc, char* argv[])
{
    double d = dist(1,2,3,4,5,6);

    return 0;
}
票数 6
EN

Stack Overflow用户

发布于 2018-10-16 12:46:33

点到线的距离

你需要两个公式:

行公式:源this answer

代码语言:javascript
复制
    private Vector2 m_point1;
    private Vector2 m_point1;
    private float m_A;
    private float m_B;
    private float m_C;
    public void CalculateLine()
    {
        m_A = m_point1.y - m_point2.y;
        m_B = m_point2.x - m_point1.x;
        m_C = m_point1.x * m_point2.y - m_point2.x * m_point1.y;
        if(m_A == 0 && m_B == 0)
        {
            Debug.LogError("Line error: A & B = 0");
        }
    }

点到线的距离:源Wikipedia

代码语言:javascript
复制
public float Distance2DPointToLine(Vector2 point)
{
    return Mathf.Abs(m_A * point.x + m_B * point.y + m_C) / 
        Mathf.Sqrt(m_A * m_A + m_B * m_B);
}

点到线段的距离

这取决于你如何定义“从一点到线段的距离”。

也许点到线段的距离就是点到线段中点的距离:

如果可以将点投影到线段上,则距离可能是可用的

也许你没有想到当你问细分的时候会有什么结果,所以我不能为你回答细分部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12132352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档