我总是想知道最简单的方法来确定一个点是否在一个三角形内,或者在这种情况下,一个矩形对角切成两半.
假设我有一个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)