点在凸四边形内部

思路1

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

直线的五种形式

一般式

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

斜截式

y=kx+by=kx+b,即要求斜率必须存在

两点式

yy1y2y1=xx1x2x1y−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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值