我有4个点形成一些四边形。线条不能交叉或类似的东西,它应该是正方形,矩形,菱形,平行四边形等。
连接它们的线将场分成9个区域。使用正方形,它看起来像一个井字棋盘(#),但是对于其他形状,线条将成角度。
一个点随机落入这个9区域。我知道随机点的坐标,以及四边形4个角的坐标。
有什么方法可以找到哪个字段包含点而不使用线的等式?
我基本上都在寻找像
这样的东西if(p.x > q1.x && p.x < q4.x && p.y < q3.y) {
//It's in the top left region
}
etc
我认为在使用倾斜线(而不是正方形/矩形)而不解决线方程时这是不可能的。但我以为我会先由数学家运行它。谢谢!
答案 0 :(得分:5)
它可能等同于'使用线的方程',但显而易见的事情是计算将你的四个点带到单位平方(0,0),(0,1)的仿射变换, (1,0),(1,1)。要确定点的位置,请将变换应用于该点,并将结果与单位平方进行比较。
答案 1 :(得分:3)
你做的任何事情都是“使用线条方程式”,所以我不确定该怎么做。我假设你只是想要简单的不等式来检查随机点(x,y)
所在的区域,这就是我将告诉你如何做的。
从你的问题来看,听起来你总是有一个平行四边形,所以让我们假设这些点是(0,0)
,(a,b)
,(c,d)
和(a+c,b+d)
,这个解释更容易理解。为了解决您的心理状况,请设想(a,b)
大致在(0,0)
的“右侧”,(c,d)
大致“高于”(0,0)
。那么“水平”线的方程是-bx+ay=0
和-bx+ay=-bc+ad
,因此您可以获得三种可能性,具体取决于-bx+cy
与0
和-bc+ad
的比较方式:
// Assuming -bc+ad is positive
-bx+ay < 0 // it's in the "bottom row"
0 < -bx+ay < -bc+ad // it's in the "middle row"
-bc+ad < -bx+ay // it's in the "top row"
同样,“垂直”线的等式为dx-cy=0
和dx-cy=da-bc
,因此有三种可能性,具体取决于dx-cy
与0
和{{{0}}的比较1}}:
da-cb
当然,如果// Still assuming ad-bc is positive
dx-cy < 0 // it's in the "left column"
0 < dx-cy < da-cb // it's in the "middle column"
da-cb < dx-cy // it's in the "right column"
为否定,那么每种情况下的三种可能性是“小于da-cb
”,“da-cb
和da-cb
之间”,以及“反而大于0
“。最后,如果平等一直存在,则点0
实际上是 其中一条线而不是其中一条区域。
答案 2 :(得分:1)
连接它们的线将场分成9个区域。使用正方形,它看起来像一个井字棋盘(#),但是对于其他形状,线条将成角度。
如果你的点构成梯形(或梯形)怎么办?
例如,如果点是(-2,0),(2,0),(-1,1),(1,1),那么'线...在角度'将相交,它是不清楚你想要的“9个地区”中的哪个,比方说,(0,10):
(请原谅我的油漆技巧......)
除非“线条不能交叉或类似”,否则你的意思是四边形总是平行四边形?