如何检查一个点是否在四边形内?
How to check if a point is inside a quadrilateral?
我有一个 10x10 像素的正方形。广场可以移动。我想确保这个正方形不会脱离照片中的形状。这将每 17 毫秒检查一次。所以,我想以最优化的方式检查这个正方形是否在这个矩形内部。
我找不到像 rectangle.intersects ().
这样的方法
那我该怎么做呢?
形状:shape image
这对我来说似乎是多边形联合测试。也许像 Clipper library could help you. See also https://math.stackexchange.com/questions/15815/how-to-union-many-polygons-efficiently.
如果您的两个矩形的边分别与 OX 和 OY 向量平行,则假设 (x1, y1) 是左上角,而 (x2, y2) 是右下角,那么您的交集解决方案是:
(p2.x1 >= p1.x1) && (p2.x2 <= p1.x2) && (p2.y1 >= p2.y1) && (p2.x2 <= p1.x1)
而如果需要判断交点,则需要检查rectangle1相对于rectangle2是否完全向左、向右、向上或向下:
!((p2.x2 < p1.x1) || (p2.x1 > p1.x2) || (p2.y2 < p1.y1) || (p2.y1 > p1.y2))
因此,如果上述否定成立,则矩形相交。
但是,如果与 OX 和 OY 向量相比可以旋转任何矩形,那么它会稍微复杂一些,请参见此处:How to check intersection between 2 rotated rectangles?
编辑
无论你有什么多项式,每一边都有一段线。您可以定义线的方程式,请参见此处:https://www.mathsisfun.com/equation_of_line.html
这定义了线上的所有点。但是,您需要使用线的不等式,使用 > 或 < 关系,具体取决于您的梯形位于线的哪一侧。因为你有四个边,所以这描述了四个不等式。有两个梯形,总共有 8 个不等式。 https://courses.lumenlearning.com/suny-beginalgebra/chapter/solve-compound-inequalities/
在纸上做几个例子,然后梯形的算法就很容易了。
简而言之:与您在梯形上绘制并包含梯形所有点的矩形进行比较。如果这些包装矩形不相交,那么梯形也不会相交。如果矩形相交,则查看梯形给定边的线是否相交。如果外矩形相交,但梯形线不相交,则看一个内矩形是否与另一个外矩形相交。
根据凸性,如果四边形的四个角都在矩形内,则四边形完全在矩形内。
以最明显的方式,这需要进行 4 x 4 次比较 (=16)。
也可以得到角中的smallest/largestabscissa/ordinate,用2×4比较,再比较4次(=12)对应的矩形边。
我有一个 10x10 像素的正方形。广场可以移动。我想确保这个正方形不会脱离照片中的形状。这将每 17 毫秒检查一次。所以,我想以最优化的方式检查这个正方形是否在这个矩形内部。
我找不到像 rectangle.intersects ().
那我该怎么做呢?
形状:shape image
这对我来说似乎是多边形联合测试。也许像 Clipper library could help you. See also https://math.stackexchange.com/questions/15815/how-to-union-many-polygons-efficiently.
如果您的两个矩形的边分别与 OX 和 OY 向量平行,则假设 (x1, y1) 是左上角,而 (x2, y2) 是右下角,那么您的交集解决方案是:
(p2.x1 >= p1.x1) && (p2.x2 <= p1.x2) && (p2.y1 >= p2.y1) && (p2.x2 <= p1.x1)
而如果需要判断交点,则需要检查rectangle1相对于rectangle2是否完全向左、向右、向上或向下:
!((p2.x2 < p1.x1) || (p2.x1 > p1.x2) || (p2.y2 < p1.y1) || (p2.y1 > p1.y2))
因此,如果上述否定成立,则矩形相交。
但是,如果与 OX 和 OY 向量相比可以旋转任何矩形,那么它会稍微复杂一些,请参见此处:How to check intersection between 2 rotated rectangles?
编辑
无论你有什么多项式,每一边都有一段线。您可以定义线的方程式,请参见此处:https://www.mathsisfun.com/equation_of_line.html
这定义了线上的所有点。但是,您需要使用线的不等式,使用 > 或 < 关系,具体取决于您的梯形位于线的哪一侧。因为你有四个边,所以这描述了四个不等式。有两个梯形,总共有 8 个不等式。 https://courses.lumenlearning.com/suny-beginalgebra/chapter/solve-compound-inequalities/
在纸上做几个例子,然后梯形的算法就很容易了。
简而言之:与您在梯形上绘制并包含梯形所有点的矩形进行比较。如果这些包装矩形不相交,那么梯形也不会相交。如果矩形相交,则查看梯形给定边的线是否相交。如果外矩形相交,但梯形线不相交,则看一个内矩形是否与另一个外矩形相交。
根据凸性,如果四边形的四个角都在矩形内,则四边形完全在矩形内。
以最明显的方式,这需要进行 4 x 4 次比较 (=16)。
也可以得到角中的smallest/largestabscissa/ordinate,用2×4比较,再比较4次(=12)对应的矩形边。