思路1
一开始考虑,点在四边形内的几何体现是在四条直线的范围内,所以综合直线的五种形式,两点式比较合适建模。但这种有一点比较麻烦,就是直线的方向需要判断哪边是在四边形内部,需要额外的计算过程。
直线的五种形式
一般式
ax+by+c=0ax+by+c=0
直线的一般形式,可以表示任意一条直线
斜截式
y=kx+by=kx+b,即要求斜率必须存在
两点式
y−y1y2−y1=x−x1x2−x1y−y1y2−y1=x−x1x2−x1
不能表示垂直或水平的直线
截距式
xa+yb=1xa+yb=1
不能表示截距为0的直线
思路2
后来,在网上找了解决方法,可以直接进行向量运算来判断方向,这样就能直接判断是否在四边形内部。
向量运算
向量
向量即有大小、有方向的量,也称矢量,和标量相对。
数量积(内积、点积)
a=(x1,x2,x3),b=(y1,y2,y3)a=(x1,x2,x3),b=(y1,y2,y3)
向量积(外积、叉积)
形式:a×ba×b
a×b=|a||b|sinθa×b=|a||b|sinθ
原理
四边形内的点都在顺时针(逆时针)向量的同一边,即夹角小于90o90o,向量积同向。
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;
}
本文转自:https://blog.csdn.net/san_junipero/article/details/79172260