我有一个10x10像素的正方形。广场可以移动。我想确保这个正方形不会与照片中的形状不符。每17毫秒检查一次。所以,我想用最优化的方法来检查这个正方形是否在这个矩形里面。我找不到类似rectangle.intersects()的方法。那我怎么做呢?形状:形状图像
uqjltbpv1#
通过凸性,如果四边形的四个角是圆的,则四边形完全在矩形内。最明显的是,这需要4 x 4比较(=16)。您还可以使用2 x 4比较获得角点之间的最小/最大横坐标/纵坐标,并使用4个以上比较(=12)与相应的矩形边进行比较。
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 矩形不相交,那么梯形也不会相交。如果矩形相交,则查看梯形给定边的直线是否相交。如果外矩形相交,但梯形线不相交,则查看其中一个内矩形是否与另一个外矩形相交。
tsm1rwdh3#
对我来说,这好像是多边形联合测试。也许像克利伯图书馆这样的东西可以帮你。另请参见https://math.stackexchange.com/questions/15815/how-to-union-many-polygons-efficiently.
3条答案
按热度按时间uqjltbpv1#
通过凸性,如果四边形的四个角是圆的,则四边形完全在矩形内。
最明显的是,这需要4 x 4比较(=16)。
您还可以使用2 x 4比较获得角点之间的最小/最大横坐标/纵坐标,并使用4个以上比较(=12)与相应的矩形边进行比较。
dvtswwa32#
如果两个矩形的边分别与ox和oy向量平行,那么假设(x1,y1)是左上角,而(x2,y2)是右下角,那么求交的方法是:
如果需要确定交叉点,则需要检查矩形1是否完全位于左侧、右侧、顶部或底部,与矩形2相比:
所以,如果上面的否定是真的,那么矩形相交。
但是,如果与ox和oy向量相比,任何矩形都可以旋转,那么它就稍微复杂一些,请参见:如何检查两个旋转矩形之间的交集?
编辑
不管你有什么多项式,每边都有一段线。您可以定义直线的方程式,请参见:https://www.mathsisfun.com/equation_of_line.html
它定义了直线上的所有点。但是,您需要使用直线的不等式,使用>或<关系,这取决于梯形是直线的哪一侧。因为你有四个边,这描述了四个不等式。有两个梯形,总共有8个不等式。https://courses.lumenlearning.com/suny-beginalgebra/chapter/solve-compound-inequalities/
在纸上做这几个例子,然后梯形的算法将很容易。
简言之:做比较矩形,你画你的梯形和包含所有的点的梯形。如果这些 Package 矩形不相交,那么梯形也不会相交。如果矩形相交,则查看梯形给定边的直线是否相交。如果外矩形相交,但梯形线不相交,则查看其中一个内矩形是否与另一个外矩形相交。
tsm1rwdh3#
对我来说,这好像是多边形联合测试。也许像克利伯图书馆这样的东西可以帮你。另请参见https://math.stackexchange.com/questions/15815/how-to-union-many-polygons-efficiently.