根据坐标查找包含点的区域

时间:2009-08-01 00:41:33

标签: algorithm math

我有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

我认为在使用倾斜线(而不是正方形/矩形)而不解决线方程时这是不可能的。但我以为我会先由数学家运行它。谢谢!

3 个答案:

答案 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+cy0-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=0dx-cy=da-bc,因此有三种可能性,具体取决于dx-cy0和{{{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-cbda-cb之间”,以及“反而大于0“。最后,如果平等一直存在,则点0实际上是 其中一条线而不是其中一条区域。

答案 2 :(得分:1)

  

连接它们的线将场分成9个区域。使用正方形,它看起来像一个井字棋盘(#),但是对于其他形状,线条将成角度。

如果你的点构成梯形(或梯形)怎么办?

例如,如果点是(-2,0),(2,0),(-1,1),(1,1),那么'线...在角度'将相交,它是不清楚你想要的“9个地区”中的哪个,比方说,(0,10):

http://imgur.com/NaGwJ.png

(请原谅我的油漆技巧......)

除非“线条不能交叉或类似”,否则你的意思是四边形总是平行四边形?