2011-08-22 64 views
5

可能重复:
How can I tell if a point is nearby a certain line?点上最接近x线,Y

//Returns the point on the line traced from start to end which 
//comes nearest to 500,000, 500,000. The points are scaled between 
//1,000,000 and 0 from their original fp types. 
Point closestToCentre(Point start, Point end); 

任何人都知道的不是通过像素单步更快的方法?

可能比我更警觉一些数学演示他们的数学&几何能力?

_______EDIT___________

由于克里斯,这是困惑我:

[X; -a/BX-C/B] = [0; -c/B] - 1/B [-b;斧头。

现在我看到它只是分裂(主要是y分量)向量到两个结合产生相同的结果。得到了老部分分式脑细胞兴奋了一分钟,然后:)

_______EDIT_________

杰森·摩尔,谢谢你的灵感,这里是我在做什么,图形,

64x64 square with 2 sample lines each passing edge to edge and missing the centre by some distance

我希望更清楚。

____EDIT________

所以,我可以合理预期采取直角线到我的采样线,并在中心运行它,但怎么说,当他们联系吗?

enter image description here

我觉得方程的克里斯的页面是要走的路。如果你们都告诉我这是一个两步的过程。现在只有两个联立方程式,所以我可能不需要克里斯的推导。

____EDIT_________

无论是好事还是坏事,我不知道,但计算器作为搜索引擎的美已经向我透露调查的几种途径。主要我喜欢这里的第一个解决方案: Shortest distance between a point and a line segment

但要证明这一点,我的自信心,我需要从马蒂的解决方案的链接在底部(但一):

http://www.topcoder.com/tc?d1=tutorials&d2=geometry1&module=Static

的推导是如此的简单和优雅,甚至我可以按照它!

http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html鉴于

+0

我想无处不在快速排序是将在这里很快就攻尽。没有!他们已经分类!如此接近,但.. – John

+0

这是一个三角问题。尝试在http://math.stackexchange.com/上提问。 – Enigmativity

+0

不重复。那是对其他人提出同样的问题。但是找到最靠近给定点的线上的点是一个不同的问题,而不是找到一个点是否接近一条线。你可以用这个答案找到答案,但特别是对于这个问题的解决方案没有回答这个问题。 – Tatarize

回答

7

这是一个点的线性投影的到线,其可与一些细微的矢量体操来完成,如在MathWorld阐述的问题。

本文详细介绍如何找到的线从一个点的最短距离,和的中间步骤中的一个是找到从点x的垂线,y以原线。相交这两条线会给你最接近x,y的点。

编辑回应评论:链接中的方程式(2)正在将矢量转换成让人联想到y = mx + c的形式,它可让您快速轻松地读取渐变,垂直梯度可以很容易地计算。

+0

这看起来是一个很好的链接。我的迭代sol跑到一个fpPoint类和几个本地变量。现在我迷惑了:[x; -a/BX-C/B] = [0; -c/B] - 1/B [-b;斧头。小心编辑你的帖子,我不认为我已经覆盖简单的载体,所以我在这里速度很慢。谢谢。 – John

+0

啊,是y = mx + c,我以前听说过。但是我认为你会发现这是(eq.1)的目标。是会说我比你先走了一步,但现在我难住了等式3 :) – John

+0

在你的链接中,矢量上面的umlat表示它是一个单位矢量吗?我认为英国的数学书用平帽..答案后6年内 – John

1

我认为最快的方式将分两个步骤:

  1. 假设你的线路长度为无限,并通过(500,000,500,000)找到你的线和垂直平分线的交点。
  2. 确保点实际上在你的线上,否则找到最接近的端点。

Kris的帖子很好地涵盖了第1步,您只需添加第2步的支票,因为您有一个线段,而且您是金手镯。

设点1 =(X1,Y1)和端点2 =(X2,Y2)。然后将含有这两个点的线是

Y =(Y2 - Y1)/(X2 - X1)*(X - X 1)+ Y1

和PERP。平分线通过(5E5,5E5)是

Y =(X1 - X2)/(Y1 - Y2)*(X - 5E5)+ 5E5

你的点(x,y)是解(x, y)到上述两个方程(或两个端点中的一个)。这可能比数学世界链接更直接。请注意,这个解决方案失败了,但是,当你的线几乎是垂直的或几乎是水平的,但我不认为数学世界解决方案的风格确实如此,虽然我没有仔细看过。

+0

好点,没有考虑到! – Kris

+0

对不起,这篇文章的罗列把我变成了我的VC IDE和一个迭代的解决方案。你的观点“2.确保该点实际上在你的线上,否则找到最接近的端点。”没有阅读Kris的链接,听起来好像你期待我在我的专辑上找到我的观点,这是最不可能的。 – John

+0

对不起,如果我不清楚。步骤2简单地从三个候选点中选择最近点:步骤1中找到的点或两个端点。这里没有任何复杂的数学,真的。如果下列条件成立:'x max(p1.x,p2.x)|| y> max(p1.y,p2.y)',则必须在两个端点之间选择正确的最近点。 – Sean

0

见我回答这个堆栈溢出question。这个问题比你的问题更复杂,所以你应该能够使用我的答案中的前几个步骤来获得你所需要的。

+0

我更喜欢http://stackoverflow.com/questions/3120357/get-closest-point-to-a-line – John