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

📄 cbusline.cs

📁 经典的GIS二次开发系列书籍的一本
💻 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(AB2<ZERODIST)
			{
				med=System.Math.Sqrt(PA2);
				distance=med;
				ptHFoot.x=Ax;
				ptHFoot.y=Ay;
				return  -1 ;
			}
			if(PA2<ZERODIST)
			{
				med=System.Math.Sqrt(PA2);
				distance=med;
				ptHFoot.x=Ax;
				ptHFoot.y=Ay;
				return  -2 ;
			}
			if(PB2<ZERODIST)
			{
				med=System.Math.Sqrt(PB2);
				distance=med;
				ptHFoot.x=Bx;
				ptHFoot.y=By;
				return  -2 ;
			}

			if(PA2+AB2<PB2||AB2+PB2<PA2)	
			{                       
				if(PA2>PB2)
				{
					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>
	/// Summary description for CBusLine.
	/// </summary>
	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;i<LineSrc.nPointNumber-1;i++)
			{
				SegMLine.m_ptStartPoint.x = LineSrc.pPoint[i].x;
				SegMLine.m_ptStartPoint.y = LineSrc.pPoint[i].y;
				SegMLine.m_ptStartPoint.x = LineSrc.pPoint[i+1].x;
				SegMLine.m_ptStartPoint.y = LineSrc.pPoint[i+1].y;
				
				SegMLine.GetDistance(ref pt1,ref ptTemp,ref dTheDis);

				if(dTheDis<dMinDistance1)
				{
					dMinDistance1 = dTheDis;
					nPointOrderInMLine1 =i;
					ptRealFrom = ptTemp;
				}

				SegMLine.GetDistance(ref pt2,ref ptTemp,ref dTheDis);

				if(dTheDis<dMinDistance2)
				{
					dMinDistance2 = dTheDis;
					nPointOrderInMLine2 = i;
					ptRealTo = ptTemp;
				}
			}
			if(nPointOrderInMLine2 - nPointOrderInMLine1 >0 )
			{
				LineRes.nPointNumber = nPointOrderInMLine2 - nPointOrderInMLine1 +2;
				LineRes.pPoint = new MPoint[LineRes.nPointNumber];
				int i;
				LineRes.pPoint[0] = pt1;
				for(i=1;i<LineRes.nPointNumber-1;i++)
				{
					LineRes.pPoint[i] = LineSrc.pPoint[nPointOrderInMLine1+i];
				}
				LineRes.pPoint[i] = pt2;
			}
			else
			{
				LineRes.nPointNumber = nPointOrderInMLine1 - nPointOrderInMLine2 +2;
				LineRes.pPoint = new MPoint[LineRes.nPointNumber];
				int i;
				LineRes.pPoint[0] = pt2;
				for(i=1;i<LineRes.nPointNumber-1;i++)
				{
					LineRes.pPoint[i] = LineSrc.pPoint[nPointOrderInMLine2+i];
				}
				LineRes.pPoint[i] = pt1;
			}
		}




	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -