我一直想知道最简单的方法来确定一个点是否位于三角形内,或者在这种情况下,是一个对角线切成两半的矩形。
假设我有一个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
必须有更好的方法。
编辑: 矩形也可能看起来像这样
-----
|\ |
| \ |
|__>|
但我在大多数情况下都认为目前已经提供的答案仍应该坚持......
答案 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)的单位三角形。两边用三行代表
因此,三角形的内部和边界作为集合的交集给出
所以给出一个点,(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在上半部分}
我想......