点是否在三角形中

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

  • 点乘 – 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;
        }



判断一个是否三角形内,可以使用向量叉积的方法。具体步骤如下: 1. 假设有三个 A、B、C 和一个待判断的 P。 2. 分别计算向量 AB、BC、CA 和 AP、BP、CP 的叉积,即: AB x AP、BC x BP 和 CA x CP。 3. 如果三个叉积的符号相同,那么表示 P 在三角形 ABC 内部,否则 P 不在三角形 ABC 内部。 需要注意的是,这个方法只适用于三维空间三角形。如果是二维平面上的三角形,则需要将三个和待判断的都映射到三维空间,然后再进行计算。 具体实现过程如下: ```c++ #include <iostream> #include <cmath> struct Point { double x; double y; }; // 计算向量的叉积 double cross_product(Point p1, Point p2) { return p1.x * p2.y - p1.y * p2.x; } // 判断是否三角形内 bool point_in_triangle(Point A, Point B, Point C, Point P) { double c1 = cross_product(Point{B.x - A.x, B.y - A.y}, Point{P.x - A.x, P.y - A.y}); double c2 = cross_product(Point{C.x - B.x, C.y - B.y}, Point{P.x - B.x, P.y - B.y}); double c3 = cross_product(Point{A.x - C.x, A.y - C.y}, Point{P.x - C.x, P.y - C.y}); if ((c1 > 0 && c2 > 0 && c3 > 0) || (c1 < 0 && c2 < 0 && c3 < 0)) { return true; } return false; } int main() { Point A{0, 0}; Point B{1, 0}; Point C{0, 1}; Point P{0.5, 0.5}; if (point_in_triangle(A, B, C, P)) { std::cout << "Point P is inside triangle ABC." << std::endl; } else { std::cout << "Point P is outside triangle ABC." << std::endl; } return 0; } ``` 以上代码,首先定义了一个 Point 结构体表示二维平面上的一个,然后定义了一个 cross_product 函数计算向量的叉积。point_in_triangle 函数则是用来判断一个是否三角形内部的,它接受四个作为参数,分别表示三角形的三个顶和待判断的。在函数,分别计算了向量 AB、BC、CA 和 AP、BP、CP 的叉积,然后根据叉积的符号来判断 P 是否三角形 ABC 内部。最后在 main 函数调用 point_in_triangle 函数判断 P 是否三角形 ABC 内部
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值