如何检查点是否在四边形内?

4bbkushb  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(508)

我有一个10x10像素的正方形。广场可以移动。我想确保这个正方形不会与照片中的形状不符。每17毫秒检查一次。所以,我想用最优化的方法来检查这个正方形是否在这个矩形里面。
我找不到类似rectangle.intersects()的方法。
那我怎么做呢?
形状:形状图像

uqjltbpv

uqjltbpv1#

通过凸性,如果四边形的四个角是圆的,则四边形完全在矩形内。
最明显的是,这需要4 x 4比较(=16)。
您还可以使用2 x 4比较获得角点之间的最小/最大横坐标/纵坐标,并使用4个以上比较(=12)与相应的矩形边进行比较。

dvtswwa3

dvtswwa32#

如果两个矩形的边分别与ox和oy向量平行,那么假设(x1,y1)是左上角,而(x2,y2)是右下角,那么求交的方法是:

(p2.x1 >= p1.x1) && (p2.x2 <= p1.x2) && (p2.y1 >= p2.y1) && (p2.x2 <= p1.x1)

如果需要确定交叉点,则需要检查矩形1是否完全位于左侧、右侧、顶部或底部,与矩形2相比:

!((p2.x2 < p1.x1) || (p2.x1 > p1.x2) || (p2.y2 < p1.y1) || (p2.y1 > p1.y2))

所以,如果上面的否定是真的,那么矩形相交。
但是,如果与ox和oy向量相比,任何矩形都可以旋转,那么它就稍微复杂一些,请参见:如何检查两个旋转矩形之间的交集?
编辑
不管你有什么多项式,每边都有一段线。您可以定义直线的方程式,请参见:https://www.mathsisfun.com/equation_of_line.html
它定义了直线上的所有点。但是,您需要使用直线的不等式,使用>或<关系,这取决于梯形是直线的哪一侧。因为你有四个边,这描述了四个不等式。有两个梯形,总共有8个不等式。https://courses.lumenlearning.com/suny-beginalgebra/chapter/solve-compound-inequalities/
在纸上做这几个例子,然后梯形的算法将很容易。
简言之:做比较矩形,你画你的梯形和包含所有的点的梯形。如果这些 Package 矩形不相交,那么梯形也不会相交。如果矩形相交,则查看梯形给定边的直线是否相交。如果外矩形相交,但梯形线不相交,则查看其中一个内矩形是否与另一个外矩形相交。

tsm1rwdh

tsm1rwdh3#

对我来说,这好像是多边形联合测试。也许像克利伯图书馆这样的东西可以帮你。另请参见https://math.stackexchange.com/questions/15815/how-to-union-many-polygons-efficiently.

相关问题