自动寻路 穿交路点算法(线段相交)

来源:互联网 发布:黑马程序员工作5年工资 编辑:程序博客网 时间:2024/04/29 14:10

#include <Windows.h>
#include <iostream>
using namespace std;


#pragma comment( lib,"winmm.lib")
/*
struct point{
 int x;
 int y;
};

struct v{
 point start;
 point end;
};

int crossProduct(v* v1, v* v2){
 v vt1, vt2;
 int result = 0;

 vt1.start.x = 0;
 vt1.start.y = 0;
 vt1.end.x = v1->end.x - v1->start.x;
 vt1.end.y = v1->end.y - v1->start.y;

 vt2.start.x = 0;
 vt2.start.y = 0;
 vt2.end.x = v2->end.x - v2->start.x;
 vt2.end.y = v2->end.y - v2->start.y;

 result = vt1.end.x * vt2.end.y - vt2.end.x * vt1.end.y;
 return result;
}


int direction(point* pi, point* pj, point* pk){
 point p1, p2;

 p1.x = pk->x - pi->x;
 p1.y = pk->y - pi->y;

 p2.x = pj->x - pi->x;
 p2.y = pj->y - pi->y;

 return crossProduct(&p1, &p2);
}

int onSegment(point* pi, point* pj, point* pk){
 int minx, miny, maxx, maxy;
 if (pi->x > pj->x){
  minx = pj->x;
  maxx = pi->x;   
 }
 else{
  minx = pi->x;
  maxx = pj->x;
 }

 if (pi->y > pj->y){
  miny = pj->y;
  maxy = pi->y;   
 }
 else{
  miny = pi->y;
  maxy = pj->y;
 }

 if (minx <= pk->x && pk->x <= maxx && miny <= pk->y && pk->y <= maxy)
  return 1;
 else
  return 0;
}

int segmentIntersect(point* p1, point* p2, point* p3, point* p4){
 int d1 = direction(p3, p4, p1);
 int d2 = direction(p3, p4, p2);
 int d3 = direction(p1, p2, p3);
 int d4 = direction(p1, p2, p4);
 if (d1 * d2 < 0 && d3 * d4 < 0)
  return 1;
 else if (!d1 && onSegment(p3, p4, p1))
  return 1;
 else if (!d2 && onSegment(p3, p4, p2))
  return 1;
 else if (!d3 && onSegment(p1, p2, p3))
  return 1;
 else if (!d4 && onSegment(p1, p2, p4))
  return 1;
 else
  return 0;
}

*/


//////////////////////////////////////////////////////////////////////////
///判断两个线段是否相交
///首先判断线段AB是否与直线CD相交
///在判断线段CD是否与直线AB相交
///如果都相交,则两个线段相交
///判断一个线段与直线相交:
///判断线段的一头在直线的哪一边
///判断线段的另一头在直线的那一边
///如果在不同的一端,则线段与该直线相交
//////////////////////////////////////////////////////////////////////////
///点在线上返回0,线左上1,线右下-1
int pointLine(int px,int py,int ax,int ay,int bx,int by){
 if(ax == bx){
  if(px < ax)
   return 1;
  else if(px == ax)
   return 0;
  else
   return -1;
 }
 if(ay == by){
  if(py < ay)
   return -1;
  else if(py == ay)
   return 0;
  else
   return 1;
 }
 float xie = ((float)(by-ay))/((float)(bx-ax));
 float aim = (float)by - ((float)(bx - px)*xie);
 if(aim > py){
  return 1;
 }else if(aim == (float)py){
  return 0;
 }else
  return -1;
}
///线段是否在直线上
int lineLine(int cx,int cy,int dx,int dy,int ax,int ay,int bx,int by){
 int pc = pointLine(cx,cy,ax,ay,bx,by);
 int pd = pointLine(dx,dy,ax,ay,bx,by);
 if(pc == 0 || pd == 0){
  return 1;
 }
 if(pc > 0 && pd < 0)
  return 1;
 if(pc < 0 && pd > 0)
  return 1;
 return 0;
}
int twoLine(int ax,int ay,int bx,int by,int cx,int cy,int dx,int dy){
 int p1 = lineLine(cx,cy, dx, dy, ax, ay, bx, by);
 int p2 = lineLine(ax, ay, bx, by, cx, cy, dx, dy);
 if(p1 && p2){
  return 1;
 }else
  return 0;
}

 

int main()
{

 long x1 = 5;
 long y1 = 5;

 long x2 = 0;
 long y2 = 0;

 long x3 = 3;
 long y3 = 0;

 long x4 = 0;
 long y4 = 3;

 long a = timeGetTime();

 // 判断是否相交
 int k = twoLine(x1,y1,x2,y2,x3,y3,x4,y4);

 if (k == 1)
 {
  // 交点坐标
  long x0   =   (double)(((x2-x1)*(x4-x3)*(y3-y1)+(y2-y1)*(x4-x3)*x1-(y4-y3)*(x2-x1)*x3))/((y2-y1)*(x4-x3)-(y4-y3)*(x2-x1));
  long y0   =   (double)(((y2-y1)*(y4-y3)*(x3-x1)+(x2-x1)*(y4-y3)*y1-(x4-x3)*(y2-y1)*y3))/(-((y2-y1)*(x4-x3)-(y4-y3)*(x2-x1)));
  int uu;
  uu = 0;
 }

 long b = timeGetTime() - a;

 return 0;
}

原创粉丝点击