2010-11-20 186 views
3

我正在寻找一种算法(或算法的名称),它将在线段上找到一个点,如果存在这样一个点,那是一些给定的距离从不在线段的另一点。距离某一点的线段距离上的点

即,存在着,三个点Ç;并可能有第四个D。其中AB构成一条线段,并且点C是线段AB的某处关闭的另一点。找到一个点D,如果存在这样的点,则出现在线段AB上,这是距离点distance远点C

回答

5

看看这里:Circle-Line Intersection

C是圆圈中间,distance是半径。

请注意,可能有两个结果点,并且您必须检查点是否确实在您的线上(或者通过扩展它将获得的线上)。

+0

这是一个很好的布尔测试,用来检查是否有这样一个点D.但是,它看起来并不像它会告诉我D点是什么。此外,它看起来像是一个无限的线,我需要一个线段。谢谢,虽然这个建议。 – Ryan 2010-11-21 16:20:22

5

我花了太多时间想清楚这一点,似乎无法在任何地方找到一个简单的答案,所以我想我会在这里发布它,并节省一些人很多时间。尽管原始发布是旧的,但我确实希望有人早已发布了一个简单的答案。这将节省我几天的试验。

public static Point PointFromEndOfLine(Point start, Point end, double distance) 
{ 
    double x = end.X-start.X; 
    double y = end.Y-start.Y; 
    double z = Math.Sqrt(x * x + y * y); //Pathagrean Theorum for Hypotenuse 
    double ratio = distance/z; 
    double deltaX = x * ratio; 
    double deltaY = y * ratio; 

    return new Point(end.X-deltaX, end.Y-deltaY); 
} 

以上该函数采用一个的startPoint(X,Y)和端点(X,Y)的距离(从端点。如果您的距离是负的,则返回的点将超越沿端点如果您的距离大于startPoint和endPoint之间的距离,则返回点将在您的起点之前,但仍位于同一条线上。如果您的距离是正数并且小于startPoint和endPoint之间的距离,返回的点将在startPoint和endPoint之间的距终点“距离”处的线段上

它工作的原因是'类似三角形'。通过与X轴平行的三角形以及大三角形的x,y,z值,并且由您绘制的直线创建的较小值将彼此成比例。

换句话说:X/X == Y/== Z/Z

希望这有助于有人出来。

+0

这看起来不像它回答原来的问题。这找到了一个距离线段的一个端点的“距离”,沿着由两端定义的线;但最初的问题是要求一个距离第三点的距离,这个点可能或可能不在线段上。 – 2012-05-24 20:50:42

+0

正是我需要的。 – Brent 2016-10-29 00:52:25