1. 一种是用矢量叉乘法:
由三个顶点向所求的点引出矢量(注意方向),然后任意用其中两个矢量形成平面,再用这个平面和剩下的矢量叉乘,得出一个新矢量,方向向里,则在三角形外,反之在里面。
2.用面积方法
#include<stdio.h>
#include<math.h>
struct TPoint {
float x;
float y;
};
//求叉积
float mul(struct TPoint p1, struct TPoint p2, struct TPoint p0) {
return ((p1.x - p0.x)*(p2.y - p0.y)-(p2.x - p0.x)*(p1.y - p0.y));
}
/**//*由三个顶点向所求的点引出矢量(注意方向),然后任意用其中两个矢量形成平面,
* 再用这个平面和剩下的矢量叉乘,得出一个新矢量,方向向里,则在三角形外,反之在里面。
*/
int inside(struct TPoint tr[], struct TPoint p) {
int i;
for (i = 0; i < 3; i++)
if (mul(p, tr[i], tr[(i + 1) % 3]) * mul(p, tr[(i + 2) % 3], tr[(i + 1) % 3]) > 0)
return 0;
return 1;
}
float area(struct TPoint p1, struct TPoint p2, struct TPoint p3) {
return fabs((p1.x - p3.x)*(p2.y - p3.y)-(p2.x - p3.x)*(p1.y - p3.y));
}
//用面积判断p是否在三角形内
int inside2(struct TPoint tr[], struct TPoint p) {
if (fabs(area(tr[0], tr[1], tr[2]) -
area(p, tr[1], tr[2]) -
area(tr[0], p, tr[2]) -
area(tr[0], tr[1], p)) < 1.0e-20)
return 1;
else
return 0;
}
int main() {
struct TPoint tr[3] = {{-1, 1},{1, 0},{3, 0}}, p = {1, 2};
//方法一
printf("algorithm 1:");
if (inside(tr, p))
printf("In\n");
else
printf("Out\n");
//方法一
printf("algorithm 2:");
if (inside2(tr, p))
printf("In\n");
else
printf("Out\n");
}
posted on 2010-10-12 09:40
孟起 阅读(1801)
评论(0) 编辑 收藏 引用 所属分类:
计算几何