【问题标题】:Finding Whether A Point is Within a Right-Angle Triangle判断一个点是否在直角三角形内
【发布时间】:2023-03-18 20:07:01
【问题描述】:

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

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

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

糟糕的 ASCII 艺术万岁。

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

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

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

必须有更好的方法。

编辑: 矩形也可以是这样的

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

但我认为在大多数情况下,已经提供的当前答案应该仍然有效......

【问题讨论】:

  • math.stackexchange.com 你也问这个问题。有人会为您的问题提出几种解决方案,但您没有说明您需要什么 - 速度、针对特定情况的优化或只是明确的表述。
  • 只是明确的公式。我通常可以想出一个解决方案,但它并不优雅,而且速度是一个问题。我喜欢看到不同的方式来做这件事,所以我可以在我已经在做的事情之外思考。它也可以帮助我记住基本的数学:[

标签: math geometry


【解决方案1】:

左上角/右下角三角形:对于左上角三角形中的所有点,x+y&lt;=64。右下三角形中的点有x+y&gt;64

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

右上角/左下角三角形:对于左下角三角形中的所有点,x&lt;=y。右上角三角形中的点有x&gt;y

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


我们是如何到达那里的?

对于尺寸为 (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

【讨论】:

  • 这仅适用于直角两边长度相同的情况。
  • 假设我关注的是左下角和右上角。那我该如何编辑呢?例如,wx + hy - w*h > 0?并且,正方形将具有相同的宽度,减去始终返回 FALSE 碰撞值的异常情况:)
  • x
  • 感谢您的解决方案! :)
【解决方案2】:

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

取角在 (0, 0)、(1, 0) 和 (1, 1) 处的单位三角形。边用三条线表示

  1. y = 0
  2. x = 1
  3. y = x

所以三角形的内部和边界作为集合的交集给出

  1. x >= 1
  2. y >= 0
  3. y

所以给定一个点 (x, y),您只需要验证它是否满足这三个不等式。

您当然可以使用任何仿射函数(表示一条线)都可以写成 y = mx + b 的形式将其推广到任何三角形。

【讨论】:

  • 不要忘记适当缩放 x 和 y(以适合实际三角形)。我认为 Jeffrey 不关心轮换。
【解决方案3】:

直线方程如下所示:

y = mx + b

因此,如果您将 x 和 y 值插入该等式,它可能不再成立。让我们重新表述它:

mx + b - y = 0

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

现在您只需要确定该点是否在您的矩形内。

【讨论】:

    【解决方案4】:

    假设您的直角三角形在 0,0 处有一个角,在 a,b 处有对角角。

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

    m=b/a

    所以 y=bx/a

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

    if (d

    if (d>(bc/a)) {//点在上半部分}

    我觉得……

    【讨论】:

      【解决方案5】:

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

      简单地说,该算法在一个方向上取一个假想点(例如,向左无限远)并将光线投射到您的测试点;然后,您计算三角形的每条线是否与那条无限长的线相交。如果你得到奇数个交叉点,你的点就在你的三角形里面;甚至你已经超出了你的三角形

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-01
        • 2011-10-30
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多