目录
[TOC]
思路1
一开始考虑,点在四边形内的几何体现是在四条直线的范围内,所以综合直线的五种形式,两点式比较合适建模。但这种有一点比较麻烦,就是直线的方向需要判断哪边是在四边形内部,需要额外的计算过程。
直线的五种形式
一般式
ax+by+c=0
a
x
+
b
y
+
c
=
0
直线的一般形式,可以表示任意一条直线
斜截式
y=kx+b
y
=
k
x
+
b
不能表示垂直于x轴的直线,如
x=a
x
=
a
,即要求斜率必须存在
两点式
y−y1y2−y1=x−x1x2−x1
y
−
y
1
y
2
−
y
1
=
x
−
x
1
x
2
−
x
1
不能表示垂直或水平的直线
截距式
xa+yb=1
x
a
+
y
b
=
1
不能表示截距为0的直线
思路2
后来,在网上找了解决方法,可以直接进行向量运算来判断方向,这样就能直接判断是否在四边形内部。
向量运算
向量
向量即有大小、有方向的量,也称矢量,和标量相对。
数量积(内积、点积)
a=(x1,x2,x3),b=(y1,y2,y3)
a
=
(
x
1
,
x
2
,
x
3
)
,
b
=
(
y
1
,
y
2
,
y
3
)
形式:
a⋅b
a
·
b
运算方式:
a⋅b=x1∗y1+x2∗y2+x3∗y3−−−−−−−−−−−−−−−−−−−−√
a
·
b
=
x
1
∗
y
1
+
x
2
∗
y
2
+
x
3
∗
y
3
a⋅b=|a||b|cosθ
a
·
b
=
|
a
|
|
b
|
c
o
s
θ
a⋅a=|a|−−√
a
·
a
=
|
a
|
数量积意义:
a⋅b=0等价于a⊥b
a
·
b
=
0
等
价
于
a
⊥
b
向量积(外积、叉积)
形式:
a×b
a
×
b
运算方式:
a×b=⎡⎣⎢a⃗ x1y1b⃗ x2y2c⃗ x3y3⎤⎦⎥
a
×
b
=
[
a
→
b
→
c
→
x
1
x
2
x
3
y
1
y
2
y
3
]
a⃗ 和b⃗ ,c⃗ 是x,y,z轴的单位向量
a
→
和
b
→
,
c
→
是
x
,
y
,
z
轴
的
单
位
向
量
a×b=|a||b|sinθ
a
×
b
=
|
a
|
|
b
|
s
i
n
θ
向量积意义:
a×b=0等价于a//b
a
×
b
=
0
等
价
于
a
/
/
b
|a×b|表示a⃗ 和b⃗ 组成的平行四边形的面积
|
a
×
b
|
表
示
a
→
和
b
→
组
成
的
平
行
四
边
形
的
面
积
a×b表示a⃗ 和b⃗ 的法向量
a
×
b
表
示
a
→
和
b
→
的
法
向
量
a×b还可以看作a⃗ 在b⃗ 上的投影二者同向为正,反向为负
a
×
b
还
可
以
看
作
a
→
在
b
→
上
的
投
影
二
者
同
向
为
正
,
反
向
为
负
原理
四边形内的点都在顺时针(逆时针)向量的同一边,即夹角小于 90o 90 o ,向量积同向。
private boolean isPointInRect(int x, int y) {
final Point A = mLBPoint;
final Point B = mLTPoint;
final Point C = mRTPoint;
final Point D = mRBPoint;
final int a = (B.x - A.x)*(y - A.y) - (B.y - A.y)*(x - A.x);
final int b = (C.x - B.x)*(y - B.y) - (C.y - B.y)*(x - B.x);
final int c = (D.x - C.x)*(y - C.y) - (D.y - C.y)*(x - C.x);
final int d = (A.x - D.x)*(y - D.y) - (A.y - D.y)*(x - D.x);
if((a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0)) {
return true;
}
// AB X AP = (b.x - a.x, b.y - a.y) x (p.x - a.x, p.y - a.y) = (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x);
// BC X BP = (c.x - b.x, c.y - b.y) x (p.x - b.x, p.y - b.y) = (c.x - b.x) * (p.y - b.y) - (c.y - b.y) * (p.x - b.x);
return false;
}