判断一个点是否在四边形内部

您所在的位置:网站首页 四边形一个80度一个160度怎么算 判断一个点是否在四边形内部

判断一个点是否在四边形内部

#判断一个点是否在四边形内部| 来源: 网络整理| 查看: 265

目录

[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; }

该思路引自:http://blog.csdn.net/laukaka/article/details/45168439



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3