点是否在三角形中

主要使用向量外积来判断点是否在三角形内部

  • 点乘 – a·b=|a|·|b|cos<a,b>用来判断两个向量的方向是否相同(90度范围内) —结果为数值
  • 叉乘 – a·b=|a|·|b|sin<a,b>用来判断两个是否同侧(顺逆时针)–结果为向量
   // 方法1: 计算p所形成的三个三角形的面积和大三角形的面积相等。
        function inTriangle(x1, y1, x2, y2, x3, y3, x, y) {
            //pa = (x1 - x, y1 - y), pb(x2-x, y2-y) pc(x3-x, y3-y)
            //ab = (x2 - x1, y2 - y1), ac = (x3 - x1, y3 - y1), bc = (x3-x2,y3-y2)
            let s1 = computeArea(x1, y1, x2, y2, x, y) / 2;
            let s2 = computeArea(x2, y2, x3, y3, x, y) / 2;
            let s3 = computeArea(x1, y1, x3, y3, x, y) / 2;
            let s = computeArea(x1, y1, x2, y2, x3, y3);
            if (s1 + s2 + s3 == s) {
                return true;
            }
            return false;
        }

        function computeArea(x1, y1, x2, y2, x, y) {//a,b,p
            return ((x1 - x) * (y2 - y) - (x2 - x) * (y1 - y));//pa x pb
        }


        // 方法2: 外积判断是否在同侧
        //p,a同侧,则bcxac & bcxpc;p,b同侧,则acxab & acxpa, p,c同侧,则abxac&abxpb
        function inTriangle2(x1, y1, x2, y2, x3, y3, x, y) {
            let f1 = (x3 - x1) * (y3 - y2) - (x3 - x2) * (y3 - y1);  //bc x ca
            let f2 = (x3 - x) * (y3 - y2) - (x3 - x2) * (y3 - y);
            let f3 = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
            let f4 = (x3 - x1) * (y1 - y) - (x1 - x) * (y3 - y1);
            let f5 = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
            let f6 = (x2 - x1) * (y2 - y) - (x2 - x) * (y2 - y1);
            if ((f1 > 0 && f2 > 0) || (f1 < 0 && f2 < 0)) {
                if ((f3 > 0 && f4 > 0) || (f3 < 0 && f4 < 0)) {
                    if ((f5 > 0 && f6 > 0) || (f5 < 0 && f6 < 0)) {
                        return true;
                    }
                }
            }
            return false;
        }

        // 方法3: pa,pb,pc做外积,如果同号则为真(方法最佳)
        function inTriangle3(x1, y1, x2, y2, x3, y3, x, y) {
            let f1 = (x1-x) * (y2-y) - (x2-x) * (y1-y) //pa x pb
            let f2 = (x2-x) * (y3-y) - (x3-x) * (y2-y) //pb x pc
            let f3 = (x1-x) * (y3-y) - (x3-x) * (y1-y) //pa x pc
            return f1 * f2 >= 0 && f1 * f3 >= 0;
        }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值