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

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)对应的矩形边。