www.pudn.com > C sharp和MapObjects实现.rar > CBusLine.cs


using System; 
 
namespace MainSystem 
{ 
	public class CGisSegLine 
	{ 
		public MPoint	m_ptStartPoint ; 
		public MPoint	m_ptEndPoint ; 
 
		public CGisSegLine() 
		{ 
			m_ptStartPoint = new MPoint() ; 
			m_ptEndPoint = new MPoint(); 
		} 
 
		public int GetDistance(ref MPoint point,ref MPoint ptHFoot,ref double distance ) 
		{ 
			double Px,Py,Ax,Ay,Bx,By; 
			const double ZERODIST=0.00000001; 
			double AB2,PA2,PB2,AB,PA,PB,S,AREA; 
			double med,k1,k2,b1,b2; 
			Px=point.x; 
			Py=point.y; 
			Ax=m_ptStartPoint.x; 
			Ay=m_ptStartPoint.y; 
			Bx=m_ptEndPoint.x; 
			By=m_ptEndPoint.y; 
			AB2=(Ax-Bx)*(Ax-Bx)+(Ay-By)*(Ay-By); 
			PB2=(Px-Bx)*(Px-Bx)+(Py-By)*(Py-By); 
			PA2=(Ax-Px)*(Ax-Px)+(Ay-Py)*(Ay-Py); 
			if(AB2PB2) 
				{ 
					med=PB2; 
					ptHFoot.x=Bx; 
					ptHFoot.y=By; 
				} 
				else 
				{ 
					med=PA2; 
					ptHFoot.x=Ax; 
					ptHFoot.y=Ay; 
				} 
				med=System.Math.Sqrt(med);	 
				distance=med; 
				return  -3 ; 
			} 
			else		 
			{ 
				AB=System.Math.Sqrt(AB2); 
				PA=System.Math.Sqrt(PA2); 
				PB=System.Math.Sqrt(PB2); 
				S=(AB+PA+PB)/2.0; 
				AREA=S; 
				AREA*=(S-PA); 
				AREA*=(S-PB); 
				AREA*=(S-AB); 
				AREA=System.Math.Sqrt(AREA); 
				med=(2.0*AREA)/AB; 
				distance=med; 
					 
				med=Ay-By;		 
				if(med==0.0) 
				{ 
					ptHFoot.x=Px; 
					ptHFoot.y=Ay; 
					return  -4 ; 
				}	 
				med=Ax-Bx;		 
				if(med==0.0) 
				{ 
					ptHFoot.y=Py; 
					ptHFoot.x=Ax; 
					return  -4 ; 
				}	 
				k1=(Ay-By)/(Ax-Bx);	 
				k2=-1.0/k1;			 
				b1=Ay-k1*Ax; 
				b2=Py-k2*Px; 
				S=(b2-b1)/(k1-k2); 
				ptHFoot.x=S; 
				S=k1*S+b1; 
				ptHFoot.y=S; 
				return 0; 
			}		 
		} 
	}; 
 
	///  
	/// Summary description for CBusLine. 
	///  
	public class CBusLine 
	{ 
		public CBusLine() 
		{ 
			// 
			// TODO: Add constructor logic here 
			// 
		} 
 
		public void CutLine(MLine LineSrc,MPoint pt1,MPoint pt2,ref MLine LineRes) 
		{ 
			//计算到线段的距离 
			double dMinDistance1 = 10000.0; 
			double dMinDistance2 = 10000.0; 
			double dTheDis = 0.0; 
			MPoint ptRealFrom,ptRealTo; 
			MPoint ptTemp = new MPoint(); 
			int nPointOrderInMLine1=0,nPointOrderInMLine2=0; 
			CGisSegLine SegMLine = new CGisSegLine(); 
			for(int i=0;i0 ) 
			{ 
				LineRes.nPointNumber = nPointOrderInMLine2 - nPointOrderInMLine1 +2; 
				LineRes.pPoint = new MPoint[LineRes.nPointNumber]; 
				int i; 
				LineRes.pPoint[0] = pt1; 
				for(i=1;i