判断任意一点是否在矩形内(矩形可能与坐标轴有一定夹角)

Posted 非晚非晚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断任意一点是否在矩形内(矩形可能与坐标轴有一定夹角)相关的知识,希望对你有一定的参考价值。

1. 理论方法

1.1 点乘实现理论

  • 问题

如何判断点 P P P是否在被 P 1 P 2 P 3 P 4 P_1P_2P_3P_4 P1P2P3P4四个点围成的矩形框内?

  • 方法

如果在矩形内:点 P P P与矩形4个角的连线与任意轴形成的夹角都为锐角。可以用向量的点乘判断角度是否为锐角。具体方法如下图所示。


所以可以通过下列公式判断:

点 P 位 于 矩 形 框 内 ⇔ { ∠ P P 1 P 4 < 90 ∠ P P 1 P 2 < 90 ∠ P P 3 P 4 < 90 ∠ P P 3 P 2 < 90 ⇔ { P 1 P ⇀ ∗ P 1 P 4 ⇀    > 0 P 1 P ⇀ ∗ P 1 P 2 ⇀    > 0 P 3 P ⇀ ∗ P 3 P 4 ⇀    > 0 P 3 P ⇀ ∗ P 3 P 2 ⇀    > 0 点P位于矩形框内\\Leftrightarrow{\\left\\{\\begin{array}{l}\\angle PP_1P_4<90\\\\\\angle PP_1P_2<90\\\\\\angle PP_3P_4<90\\\\\\angle PP_3P_2<90\\end{array}\\right.}\\Leftrightarrow{\\left\\{\\begin{array}{l}\\overset\\rightharpoonup{P_1P}\\ast\\overset\\rightharpoonup{P_1P_4}\\;>0\\\\\\overset\\rightharpoonup{P_1P}\\ast\\overset\\rightharpoonup{P_1P_2}\\;>0\\\\\\overset\\rightharpoonup{P_3P}\\ast\\overset\\rightharpoonup{P_3P_4}\\;>0\\\\\\overset\\rightharpoonup{P_3P}\\ast\\overset\\rightharpoonup{P_3P_2}\\;>0\\end{array}\\right.} PPP1P4<90PP1P2<90PP3P4<90PP3P2<90P1PP1P4>0P1PP1P2>0P3PP3P4>0P3PP3P2>0

1.2 叉乘实现理论

只需要判断点 P P P是否在上下两条边和左右两条边之间就可以,判断一个点是否在两条线段之间夹着,可以使用叉乘来判断,当 ( P 1 P 2 × P 1 P ) ∗ ( P 3 P 4 × P 3 P ) > = 0 (P_1P_2\\times P_1P)\\ast(P_3P_4\\times P_3P)>=0 (P1P2×P1P)(P3P4×P3P)>=0时,说明点 P P P P 1 P 2 P_1P_2 P1P2 P 3 P 4 P_3P_4 P3P4的中间。同理判断两边即可。所以点 P P P在矩形内的条件为:
( P 1 P 2 × P 1 P ) ∗ ( P 3 P 4 × P 3 P ) > = 0      a n d      ( P 2 P 3 × P 2 P ) ∗ ( P 4 P 1 × P 4 P ) > = 0 (P_1P_2\\times P_1P)\\ast(P_3P_4\\times P_3P)>=0\\;\\;and\\;\\;(P_2P_3\\times P_2P)\\ast(P_4P_1\\times P_4P)>=0 (P1P2×P1P)(P3P4×P3P)>=0and(P2P3×P2P)(P4P1×P4P)>=0

2. 代码实现

2.1 点乘方法实现

#include<iostream>
struct MPoint
{
    double x;
    double y;
};
struct RectPoint
{
    MPoint p1;
    MPoint p2;
    MPoint p3;
    MPoint p4;
};
bool isPointInRect(MPoint p, RectPoint rect)
{
    if ((rect.p1.x - p.x) * (rect.p1.x - rect.p4.x) + (rect以上是关于判断任意一点是否在矩形内(矩形可能与坐标轴有一定夹角)的主要内容,如果未能解决你的问题,请参考以下文章

java知道四个点坐标,怎么判断一个点是否在这个矩形区域内(矩形可能是斜着放的,有一定的斜度)

平面坐标系中 如何判断某一点在一矩形区域内?

用java实现:一个斜向矩形,已知4个点,判断任意一点是不是在区域内?

判断点是否在一个矩形内

平面中判断线段与矩形是否相交

如何判断一个点在一个矩形里边,一直点和矩形的坐标点位置。