码迷,mamicode.com
首页 > 其他好文 > 详细

4.4 点是否在三角形内

时间:2015-05-09 11:48:19      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

题目:给定一个三角形和一个点,判断这个点是否在三角形内。。


第一种方法:面积相等法
    如果点在三角形内部,则如果将三角形的三个顶点与这个点相连所得的三个小三角形的面积之和与原三角形的面积相等
S(A,B,D) + S(A,C,D) + S(B,C,D) = S(A,B,C)


第二种方法:向量叉积法
    判断点P3是否在向向P1P2的左边,只需要通过两个向量P1P2、P1P3做叉积就可以判断
P1P2 X P1P3 > 0 则 P3在P1P2左边
P1P2 X P1P3 = 0 则 P3在P1P2上
P1P2 X P1P3 < 0 则 P3在P1P2右边

注:两个点的叉积:

V1(x1, y1) X V2(x2, y2) = x1y2 – y1x2

代码:

struct point {
	double x;
	double y;
};

double Distance(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 = Distance(B,C);
	b = Distance(A,C);
	c = Distance(A,B);
	p = (a + b + c) / 2;
	return sqrt((p - a) * (p - b) * (p - c) * p);
}
double CrossProduct(point A, point B, point C) {
	double result = (B.x - A.x) * (C.y - A.y) - (C.x - A.x) * (B.y - A.y);
	return result;
}

bool IsInTriangle(point A,point B,point C, point D) {
	double AreaSum = Area(A,B,D) + Area(B,C,D) + Area(A,C,D);
	double AreaSor = Area(A,B,C);
	if(AreaSum - AreaSor > 0.000001)
		return false;
	else
		return true;
}

bool IsInTriangle2(point A, point B, point C, point D) {
	if(CrossProduct(A,B,D) >= 0 && CrossProduct(B,C,D) >= 0 && CrossProduct(C,A,D) >= 0)
		return true;
	else
		return false;
}








4.4 点是否在三角形内

标签:

原文地址:http://blog.csdn.net/u010470972/article/details/45599515

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!