判断任意一点是否在矩形内(矩形可能与坐标轴有一定夹角)
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.} 点P位于矩形框内⇔⎩⎪⎪⎨⎪⎪⎧∠PP1P4<90∠PP1P2<90∠PP3P4<90∠PP3P2<90⇔⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧P1P⇀∗P1P4⇀>0P1P⇀∗P1P2⇀>0P3P⇀∗P3P4⇀>0P3P⇀∗P3P2⇀>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知道四个点坐标,怎么判断一个点是否在这个矩形区域内(矩形可能是斜着放的,有一定的斜度)