自动寻路 穿交路点算法(线段相交)
来源:互联网 发布:黑马程序员工作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;
}
- 自动寻路 穿交路点算法(线段相交)
- 线段相交 算法摘记
- 线段相交算法
- 判断两条线段是否相交(三种算法)
- 判断两条线段是否相交(三种算法)
- 判断两条线段是否相交(三种算法)
- 地理信息系统基础算法(二)判断两线段是否相交
- 判断两条线段是否相交(三种算法)
- 判断两条线段是否相交(三种算法)
- 判断两条线段是否相交(三种算法)
- 线段相交算法——平面扫描
- 几何常用算法与判断线段相交
- 数据结构与算法系列----判断线段相交
- pku1410判断线段相交()
- poj 2653(线段相交)
- POJ 2653(线段相交)
- hdu15558(线段相交判定)
- Circuit Board(线段相交)
- 女生喝什么茶好
- svn下下来的项目,项目名报错
- 我的第一次
- css常用属性值
- android中去掉标题栏和状态栏,实现全屏
- 自动寻路 穿交路点算法(线段相交)
- document对象的属性及css内部数组
- 堆区,栈区,new/delete/malloc/free(转载)
- 两个有序链表合并为一个链表
- JSP include指令
- 北京房价
- Silverlight 调用WCF 远程服务器返回了错误: NotFound
- 回文数判断
- document对象方法