⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 line.cpp

📁 将数学上的线段作为一对象进行封装成类,实现两直线相交求交点等
💻 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 + -