找出一个点是否在直角三角形内

时间:2010-09-30 07:48:33

标签: math geometry

我一直想知道最简单的方法来确定一个点是否位于三角形内,或者在这种情况下,是一个对角线切成两半的矩形。

假设我有一个64x64像素的矩形。使用此矩形,如果传递的点位于矩形的左上角,我想返回TRUE值,如果不是,则返回FALSE。

-----
|  /|
| / |
|<__|

Horray表示糟糕的ASCII艺术。

无论如何,这个返回TRUE的三角形的假设点将是(0,0)和(63,0)和(0,63)。如果一个点落在一条线上(例如50,0),它也将返回TRUE。

假设0,0位于左上角并向下增加......

我脑子里有一个可能的解决方案,但它似乎比它应该更复杂 - 取过传递的Y值,确定它在矩形中的位置,并手动计算线条在哪里切割Y值。例如,传递的Y值为16将是矩形的四分之一高度。因此,根据您检查的哪一侧(左侧或右侧),线条将为16px或48px,具体取决于线的方向。 在上面的示例中,由于我们正在测试左上角,高度为16px,因此该线的宽度为48px

必须有更好的方法。

编辑: 矩形也可能看起来像这样

-----
|\  |
| \ |
|__>|

但我在大多数情况下都认为目前已经提供的答案仍应该坚持......

5 个答案:

答案 0 :(得分:11)

左上角/右下角三角形:对于左上角三角形中的所有点x+y<=64。右下角三角形中的点为x+y>64

(对于大小为(w,h)的矩形,使用w * y + h * x-w * h <0)

右上角/左下角三角形:对于左下角三角形中的所有点x<=y。右上角三角形中的点为x>y

(对于大小为(w,h)的矩形,使用h * x-w * y <0)


我们是如何到达那里的?

对于尺寸(w,h)和TL / BR三角形的矩形,对角线的等式是(试一试!指定x = 0并检查你得到y == h ,并指定y = 0并检查x == w)

h*x + w*y - w*h = 0

该行一侧的点数将

h*x + w*y - w*h > 0

虽然另一个点上有点

h*x + w*y - w*h < 0

为w和h插入64,我们得到:

64x + 64y - 64*64 < 0

除以64得到我们:

x+y < 64

对于TR / BL三角形,线方程和由此产生的不等式是:

h*x - w*y = 0
h*x - w*y < 0
h*x - w*y > 0

为w和h插入64,我们得到

64x-64y < 0
=> x<y

答案 1 :(得分:2)

你可以用三个仿射函数来表示三角形

取角度为(0,0),(1,0)和(1,1)的单位三角形。两边用三行代表

  1. y = 0
  2. x = 1
  3. y = x
  4. 因此,三角形的内部和边界作为集合的交集给出

    1. x&gt; = 1
    2. y&gt; = 0
    3. y&lt; = x
    4. 所以给出一个点,(x,y),你只需要验证它是否满足这三个不等式。

      当然,您可以将此概括为任何三角形,使用任何仿射函数(表示一条线)可以以y = mx + b的形式写入。

答案 2 :(得分:0)

一个简单的选择是使用光线投射算法。虽然对于你需要的东西来说可能有点过分,但它确实具有可以处理更复杂的三角形和多边形的优点。

松散地,算法在一个方向上取一个虚点(例如,向左无限偏离)并将光线投射到测试点;然后计算三角形的每条线是否与无限长的线相交。如果你得到偶数个交叉点,你的点就在你的三角形里面;甚至,你已经脱离了三角形

答案 3 :(得分:0)

该行的等式如下所示:

y = mx + b

因此,如果您将x和y值插入该等式中,它可能不再存在。让我们重新制定它:

mx + b - y = 0

同样的,不同的外观。同样,结果可能不是零。但是,结果现在将告诉您它是在线的一侧还是另一侧。

现在你只需要知道这个点是否在你的矩形内。

答案 4 :(得分:0)

让我们假设你的直角三角形有一个角在0,0,对角在a,b。

所以当我们从原点开始时,y = mx + c c = 0。

M = B / A

所以y = bx / a

要知道你的点(c,d)落在三角形的哪一半

if(d <=(bc / a)){//指向下半部分}

if(d&gt;(bc / a)){// point在上半部分}

我想......