点是否在三角形内

《编程之美》 4.4  点是否在三角形内

问题:如果在一个二维坐标系中,一直三角形三个点的坐标,那么对于坐标系中的任意一点,如何判断该店是否在三角形内(点在三角形边上也认为在三角形内)?

解法一:如果三角形面积S△ABD+S△BCD+S△CAD > S△ABC,那么D点在△ABC外,如果面积相等那么D点在△ABC内。

代码一:

inline double CalEdge(Point A,Point B)
{
	return sqrt((A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y));
}

double Area(Point A,Point B,Point C)
{
	double a,b,c,p;
	a = CalEdge(A,B);
	b = CalEdge(B,C);
	c = CalEdge(C,A);	
	p = (a + b + c) / 2;
	return sqrt(p * (p - a) * (p - b) * (p - c));	
}

bool isInTriangle(Point A,Point B,Point C,Point D)
{
	//cout<<"Areas : "<<setprecision(3)<<Area(A,B,D)<<" "<<Area(B,C,D)<<" "
	//		<<Area(C,A,D)<<" "<<Area(A,B,C)<<endl;;
	if (Area(A,B,D) + Area(B,C,D) + Area(C,A,D) > Area(A,B,C)) {
		return false;
	}
	return true;
	
}

解法二:利用矢量叉积判断D点是否在AB、BC和CA的同一侧,在同一侧则在三角形内。

代码二:

double Xproduct(Point A,Point B,Point C)
{
	return (B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y);
} 

bool isInTriangle2(Point A,Point B,Point C,Point D)
{
	//cout<<setprecision(3)<<Xproduct(A,B,D)<<" "<<Xproduct(B,C,D)<<" "
	//		<<Xproduct(C,A,D)<<endl;
	if ((Xproduct(A,B,D) >= 0 && Xproduct(B,C,D) >= 0 && Xproduct(C,A,D) >= 0) ||
		(Xproduct(A,B,D) <= 0 && Xproduct(B,C,D) <= 0 && Xproduct(C,A,D) <=0)) {
		return true;
	}
	return false;
}


REF:

1,编程之美  4.4 点是否在三角形内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值