?? line.cpp
字號:
// Line.cpp: implementation of the Line class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RDProfile.h"
#include "Line.h"
#include "math.h"
#include "Angle.h"
#define PI 3.1415926
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Line::Line()
{
}
Line& Line::operator =(Line l)
{
Start.x=l.Start.x;
Start.y=l.Start.y;
End.x=l.End.x;
End.y=l.End.y;
Offset=l.Offset;
return *this;
}
Point Line::Inersection(Line l)
{
double k1,k2,d1,d2,x,y,x1,x2,y1,y2;
Angle dir1,dir2;
dir1.Att(End.x-Start.x,End.y-Start.y,&dir1,&d1);
dir2.Att(l.End.x-l.Start.x,l.End.y-l.Start.y,&dir2,&d2);
x1=Start.x;
y1=Start.y;
x2=l.Start.x;
y2=l.Start.y;
k1=tan(dir1.rad);
k2=tan(dir2.rad);
x=(y2-x2*k2+x1*k1-y1)/(k1-k2);
y=(x-x1)*k1+y1;
Point t(x,y);
return t;
}
BOOL Line::Nearest(Point p, Point* IntersP,double* dist)
{
double k1,k2,d1,x1,x2,y1,y2;
Angle dir1,dir2,LocalDirection;
dir1.Att(End.x-Start.x,End.y-Start.y,&dir1,&d1);
LocalDirection=dir1;
dir2.RadCreate(dir1.rad+PI/2);
dir2.TurnToCircle();
x1=Start.x;
y1=Start.y;
x2=p.x;
y2=p.y;
k1=tan(dir1.rad);
k2=tan(dir2.rad);
(*IntersP).x=(y2-x2*k2+x1*k1-y1)/(k1-k2);
(*IntersP).y=((*IntersP).x-x1)*k1+y1;
//dir1.Att((*IntersP).x-p.x,(*IntersP).y-p.y,&dir1,dist);
//if(IsInTheRightSide(p.x,p.y)==TRUE)
// *dist=(*dist)*(-1.);
//判斷P在線路左右側,P在左*dist為正,反之為負
Point LocalP;
LocalP=LocalP.Rotate(Start,p.x,p.y,LocalDirection.rad,false);
//dir1.Att(LocalP.x,LocalP.y,&LocalDirection,dist);
*dist=LocalP.y;
/*
Angle att1,att2;
Point jd,tEnd,tjd;
double dist1,dist2;
BOOL flag=TRUE;
att1.Att(End.x-Start.x,End.y-Start.y,&att1,&dist1);
att2.Att(p.x-Start.x,p.y-Start.y,&att2,&dist2);
if(att1.dms<=90)
{if((att2.dms<att1.dms)||(att2.dms>270))
flag=FALSE;
}
else if((att1.dms<=180)&&(att1.dms>00))
{if(att2.dms<att1.dms)
flag=FALSE;
}
else if(att1.dms<=270)
{
if((att2.dms<att1.dms)&&(att2.dms>(att1.dms-180)))
flag=FALSE;
}
else if(att1.dms<359.59599999)
{
if(((att2.dms>(att1.dms-180))&&(att2.dms<att1.dms)))
flag=FALSE;
}
if (flag==TRUE)
*dist=(*dist)*(-1.0);
*dist=(*dist)*(-1.0);
return flag;
*/
if((*dist)<0)
return true;
else
return false;
}
BOOL Line::Nearest(double x,double y, Point* IntersP,double* dist)
{
Point p(x,y);
return Nearest(p,IntersP,dist);
}
BOOL Line::IsInTheLine(Point P,double det)
{
Point LocalP,LocalEnd;
Angle dir0;
double dist;
dir0.Att(End.x-Start.x,End.y-Start.y,&dir0,&dist);
LocalP=LocalP.Rotate(Start,P.x,P.y,dir0.rad,false);
LocalEnd=LocalP.Rotate(Start,End.x,End.y,dir0.rad,false);
if(fabs(LocalP.y)<0.0004)
{
if((LocalP.x>=0)&&(LocalP.x<=LocalEnd.x))
return true;
}
return false;
/*
Angle dir1,dir2,angle;
double d1,d2;
dir1.Att(End.x-Start.x,End.y-Start.y,&dir1,&d1);
dir2.Att(P.x-Start.x,P.y-Start.y,&dir2,&d2);
angle=dir1-dir2;
/*
if(angle.rad<0)
angle.RadCreate(-angle.rad);
double t=d2*sin(angle.rad);
if(t<0.005)
return TRUE;
if(((angle.rad<0.0001)||((angle.dms>359.5959999)&&(angle.rad<360.0001)))&&(d2<=d1))
return TRUE;
else
return FALSE;
*/
}
BOOL Line::IsInTheLine(double x,double y,double det)
{
Point p(x,y);
return IsInTheLine(p);
}
BOOL Line::IsInTheRightSide(double x,double y)
{
Point LocalP;
Angle dir0;
double dist;
dir0.Att(End.x-Start.x,End.y-Start.y,&dir0,&dist);
LocalP=LocalP.Rotate(Start,x,y,dir0.rad,false);
if(LocalP.y>0)
return true;
return false;
/*
Angle att1,att2;
Point jd,tEnd,tjd;
double dist,a,b,c;
att1.Att(End.x-Start.x,End.y-Start.y,&att1,&dist);
Nearest(x,y,&jd,&c);
if(c<0.0004)
return false;
att2.Att(x-Start.x,y-Start.y,&att2,&b);
att2.Att(jd.x-Start.x,jd.y-Start.y,&att2,&a);
//att2.rad=acos((a*a+b*b-c*c)/(2*a*b));
att2.RadCreate(acos((a*a+b*b-c*c)/(2*a*b)));
if(att1.dms<=90)
{if((att2.dms<att1.dms)||(att2.dms>270))
return FALSE;
}
else if((att1.dms<=180)&&(att1.dms>00))
{if(att2.dms<att1.dms)
return FALSE;
}
else if(att1.dms<=270)
{
if((att2.dms<att1.dms)&&(att2.dms>(att1.dms-180)))
return FALSE;
}
else if(att1.dms<359.5958)
{
if(((att2.dms>(att1.dms-180))&&(att2.dms<att1.dms)))
return FALSE;
}
return TRUE;
*/
}
Point Line::GetCentrlPoint(double l0,Angle* RoadDirection,double dist)
{
Angle dir1;
double d;
Point p;
dir1.Att(End.x-Start.x,End.y-Start.y,&dir1,&d);
(*RoadDirection).RadCreate(dir1.rad);
p.x=Start.x+l0*cos(dir1.rad);
p.y=Start.y+l0*sin(dir1.rad);
if(dist>0)
dir1.rad=dir1.rad+PI/2;
else if(dist<0)
dir1.rad=dir1.rad-PI/2;
dir1.RadCreate(dir1.rad);
dist=fabs(dist);
if(dist>0)
{
p.x=p.x+dist*cos(dir1.rad);
p.y=p.y+dist*sin(dir1.rad);
}
return p;
}
Line::~Line()
{
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -