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

目录

[TOC]

思路1

一开始考虑,点在四边形内的几何体现是在四条直线的范围内,所以综合直线的五种形式,两点式比较合适建模。但这种有一点比较麻烦,就是直线的方向需要判断哪边是在四边形内部,需要额外的计算过程。

直线的五种形式

一般式

ax+by+c=0 a x + b y + c = 0
直线的一般形式,可以表示任意一条直线

斜截式

y=kx+b y = k x + b
不能表示垂直于x轴的直线,如 x=a x = a ,即要求斜率必须存在

两点式

yy1y2y1=xx1x2x1 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 )
形式: ab a · b
运算方式:
ab=x1y1+x2y2+x3y3 a · b = x 1 ∗ y 1 + x 2 ∗ y 2 + x 3 ∗ y 3
ab=|a||b|cosθ a · b = | a | | b | c o s θ
aa=|a| a · a = | a |
数量积意义: ab=0ab 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=0a//b a × b = 0 等 价 于 a / / b
|a×b|a⃗ b⃗  | a × b | 表 示 a → 和 b → 组 成 的 平 行 四 边 形 的 面 积
a×ba⃗ b⃗  a × b 表 示 a → 和 b → 的 法 向 量
a×ba⃗ 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

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值