点积和差积

来源:互联网 发布:wlan与移动数据 编辑:程序博客网 时间:2024/05/16 01:08

程序=编程语言+数据结构+算法

struct point_T {
int x, y;
};
struct segment_T {
point_T a, b;
};
int cross(point_T a, point_T b, point_T c)
{
//叉积,结果大于0则AB在AC的顺时针方向上,小于0在逆时针方向,等于0则共线
int x1 = b.x -a.x;
int y1 = b.y -a.y;
int x2 = c.x -a.x;
int y2 = c.y -a.y;
return (x1 * y2- x2 * y1);
}
int dot(point_T a, point_T b, point_T c)
{
//点积,结果大于0则夹角小于90度,小于0则大于90度,等于0则垂直
int x1 = b.x -a.x;
int y1 = b.y -a.y;
int x2 = c.x -a.x;
int y2 = c.y -a.y;
return (x1 * x2+ y1 * y2);
}
int segcrossSimple(segment_T sega, segment_T segb)
{
//判断两线段是否相交(规范相交,非规范相交)
int d1 =cross(sega.a,sega.b,segb.a);
//得用叉积原理判断另外一线段的两点是否在另一线段的两侧
int d2 =
cross(sega.a,sega.b,segb.b);
int d3 =
cross(segb.a,segb.b,sega.a);
int d4 =cross(segb.a,segb.b,sega.b);
//规范相交
if(d1 * d2< 0&& d3 *d4 < 0)
//一线段的两端点在另一线段的两侧,相交
return 1;
//非规范相交
if(d1 == 0&&dot(segb.a,sega.a, sega.b)<= 0)
//如果线段共线,判断是否在线段上
return 1;
if(d2 == 0&&dot(segb.b,sega.a, sega.b)<= 0)
return 1;
if(d3 == 0&&dot(sega.a,segb.a, segb.b)<= 0)

return 1;

if(d4 == 0&&dot(sega.b,segb.a, segb.b)<= 0)
return 1;
return 0;
}
int inRectangle(point_T p, int x1, int x2, int y1, int y2)
{
return (p.x>= x1&& p.x<= x2&& p.y>= y1&& p.y<= y2);
}


原文地址:http://hi.baidu.com/zmqblog/item/99fa57d60df9832539f6f7f4