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

Jef*_*ern 4 math geometry

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

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

-----
|  /|
| / |
|<__|
Run Code Online (Sandbox Code Playgroud)

霍瑞为糟糕的ASCII艺术.

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

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

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

一定有更好的方法.

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

-----
|\  |
| \ |
|__>|
Run Code Online (Sandbox Code Playgroud)

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

Ore*_*ner 11

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

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

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

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


我们是怎么到达那里的?

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

h*x + w*y - w*h = 0
Run Code Online (Sandbox Code Playgroud)

该线一侧的点数将有

h*x + w*y - w*h > 0
Run Code Online (Sandbox Code Playgroud)

而另一方面则有分数

h*x + w*y - w*h < 0
Run Code Online (Sandbox Code Playgroud)

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

64x + 64y - 64*64 < 0
Run Code Online (Sandbox Code Playgroud)

除以64得到我们:

x+y < 64
Run Code Online (Sandbox Code Playgroud)

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

h*x - w*y = 0
h*x - w*y < 0
h*x - w*y > 0
Run Code Online (Sandbox Code Playgroud)

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

64x-64y < 0
=> x<y
Run Code Online (Sandbox Code Playgroud)

  • x&lt;y 对于 w=h 的情况。对于一般情况,hx-wy&lt;0。推理与答案相同,只是线方程不同。 (2认同)