判断一点是否在三角形内

一点 D 是否在三角形 ABC 内,相对于AB边来说,D点在三角形内一定要和C点在 AB 边同侧,对于A,B 点也用相同的方法去判断D点是否于其在相应边的同侧,这种方法还可以用来判断多点是不是可以构成一个凸多边形。

下边以 AB 为边例,验证 C,D两点是否在AB边同侧, AB 的在二维坐标中的线性方程可以表示为

           ay = bx +C1,

 过 C,D两点分别作平行于AB的平行线,其方程分别表示为

          ay = bx + C2,ay = bx + C3,

当 a  !=  0 时,b/a 为三线斜率,C1/a,C2/a,C3/a分别的三线跟y轴的交点

当  a == 0 时 ,-C1/b,-C2/b,-C3/b分别的三线跟x轴的交点

上面两种情况都可以归纳一种情况,要使C,D在AB边同侧,C1要么同时大于等于C2,C3, C1要么同时小于等于C2,C3,当然可以进一步比较C2,C3大小关系统,来确定 D 点是否在C点内侧。

最后就是用简单的代数知识,求出 a,b,C1,C2,C3,具体请见下面代码

 

 

#include <stdio.h>
#include <stdlib.h>


struct point{
	double x;
	double y;
};

int point_in_same_side(struct point *pa, struct point *pb, struct point *pc, struct point *pd){
	// check pc and pd in line AB same side
	// line AB function , y = kx + c , k = b/a 
	// ay = bx + C , C = a*c
	// C = ay - bx
	double a = pa->x - pb->x;
	double b = pa->y - pb->y;
	double c1 = a * pa->y - b * pa->x;
	double c2 = a * pc->y - b * pc->x;
	double c3 = a * pd->y - b * pd->x;
	if(c1 <= c2 && c1 <= c3){
		return 1;
	}
	if(c1 >= c2 && c1 >= c3){
		return 1;
	}

	return 0;
}

int point_in_triangle(struct point *p){
	int r = point_in_same_side(&p[0], &p[1], &p[2], &p[3] )
	     &&  point_in_same_side(&p[0], &p[2], &p[1], &p[3])
	     &&  point_in_same_side(&p[2], &p[1], &p[0], &p[3]);
	 return r;
}

int main(int argc, char **argv){

	struct point p[] = {
		{0, 0},
		{0, 100},
		{100, 0},
		{100, 0},
	};

	printf("%d \n", point_in_triangle(p));
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值