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

📄 carc.cs

📁 苏金明编写的《用VB.NET和VC#.NET开发交互式CAD系统》一书的源代码
💻 CS
字号:
using System;
using System.Collections;
using System.Drawing;

namespace VCSharp
{
	/// <summary>
	/// CArc 的摘要说明。
	/// </summary>
	/// 

	[Serializable()]public class CArc:CGElement
	{
		protected PointF m_Center;
		protected PointF m_Begin;
		protected PointF m_End;
		Module m=new Module();

		public PointF Center
		{
			get{return m_Center;}
			set{m_Center=value;}
		}

		public PointF ABegin
		{
			get{return m_Begin;}
			set{m_Begin=value;}
		}

		public PointF AEnd
		{
			get{return m_End;}
			set{m_End=value;}
		}

		public float Radius
		{
			get
			{
				float r=m.DistPtoP(m_Center,m_Begin);
				return r;
			}
		}

		public float AngleBegin
		{
			get
			{
				float aAngle=m.GetAngle(m_Center,m_Begin);
				return aAngle;
			}
		}

		public float AngleEnd
		{
			get
			{
				float aAngle=m.GetAngle(m_Center,m_End);
				return aAngle;
			}
		}

		public CArc()
		{
            Init();
		}

		//构造函数,用已知的圆心、起点和另一点进行构造
		public  CArc(PointF pCenter,PointF p1,PointF p2)
		{
			Init();
			m_Center=pCenter;
			m_Begin=p1;
			float r=m.DistPtoP(m_Center,m_Begin);
			float angle2=m.GetAngle(m_Center,p2);
			m_End.X=(float)(r*Math.Cos(angle2))+m_Center.X;;
			m_End.Y=(float)(r*Math.Sin(angle2))+m_Center.Y;
		}

		//构造函数,用已知的一个圆弧进行构造
		public  CArc(CArc aArc)
		{
			m_Center=aArc.Center;
			m_Begin=aArc.ABegin;
			m_End=aArc.AEnd;
		}

        //初始化圆弧
		private new void Init()
		{
			base.Init();
			m_Center=new PointF(0,0);
			m_Begin=new PointF(0,0);
			m_End=new PointF(0,0);
		}

		//绘图
		override public void Draw(Graphics g,DrawMode aDrawMode){
			long aPen,oldP;

			//将控制点的坐标由世界坐标转换为页面坐标
			PointF ec=m.WorldtoPage(m_Center);
			PointF eb=m.WorldtoPage(m_Begin);
			PointF ee=m.WorldtoPage(m_End);

			//获得当前绘图环境的句柄
			IntPtr hdc=g.GetHdc();

			//设置画笔参数
			int[] penPara=DrawSettings(hdc,aDrawMode);
			//创建画笔
            aPen=Win32API.CreatePen(penPara[0],penPara[1],penPara[2]);
			//把画笔选入绘图环境,并返回原来的画笔
			oldP=Win32API.SelectObject(hdc,aPen);
			//用刚刚创建的画笔绘圆弧
			Win32API.Arc(hdc, (int)(ec.X - Radius), (int)(ec.Y + Radius),
			    (int)(ec.X + Radius), (int)(ec.Y - Radius), (int)(eb.X), 
			    (int)(eb.Y), (int)(ee.X), (int)(ee.Y));
	        //把原来的画笔选入绘图环境
	        Win32API.SelectObject(hdc, oldP);
	        //删除新创建的画笔
	        Win32API.DeleteObject(aPen);
	        //释放绘图环境句柄
	        g.ReleaseHdc(hdc);
		}

		//计算圆弧的包围矩形
		override public CBox GetBox(){
			float x1=Math.Min(m_Begin.X,m_End.X);
			float y1=Math.Min(m_Begin.Y,m_End.Y);
			float x2=Math.Max(m_Begin.X,m_End.X);
			float y2=Math.Max(m_Begin.Y,m_End.Y);
			for (int i=0;i<4;i++) 
			{
				if (InArc(AngleBegin,AngleEnd,Const.PI/2*i)) 
				{
					//如果圆弧与X轴正向相交
						if(i==0) { x2=m_Center.X+Radius;}
					//如果圆弧与Y轴正向相交
						if(i==1) { y2=m_Center.Y+Radius;}
					//如果圆弧与X轴负向相交
						if(i==2) {x1=m_Center.X-Radius;}
					//如果圆弧与Y轴负向相交
						if(i==3) { y1=m_Center.Y-Radius;}
				}
			}
      
			CBox aBox=new CBox();
			aBox.minX=x1;
			aBox.minY=y1;
			aBox.maxX=x2;
			aBox.maxY=y2;

			return aBox;

		}

		//判断角度Angle对应的点是否在Angle1至Angle2的圆弧上
		private bool InArc(float Angle1,float Angle2,float Angle)
	    {
			//如果起始角小于终止角
			if (Angle1<Angle2) 
			{
				//如果方向角在起始角与终止角之间,则返回true;
				//否则返回false
				if (Angle>=Angle1 && Angle<=Angle2)
				{
					return true;
				}
				else
				{
					return false;
				}
			}
			//如果起始角小于终止角
			else 
			{
				//如果方向角大于起始角或小于终止角,则返回true
				//否则返回false
				if (Angle>=Angle1 || Angle<=Angle2) 
				{
					return true;
				}
				else
				{
					return false;
				}
			}
		}
      
		//拾取圆弧
		override public bool Pick(PointF aPos)
		{
			//如果拾取点不在包围矩形中,则该圆弧不被拾取
			if (!(m.InBox(GetBox(),aPos))) 
			{
				return false;
			}
			else
			{
				//计算拾取点与圆心之间的距离
				float dist=m.DistPtoP(aPos,m_Center);
				//计算拾取点的方位角
				float angle=m.GetAngle(m_Center,aPos);

				//如果起始角小于终止角
				if (AngleBegin<AngleEnd) 
				{
					//如果拾取点的方位角界于起始角和终止角之间,
					//则拾取点到圆心的距离与圆弧的半径接近,
					//则圆弧被拾取,否则不被拾取
					if ((angle>=AngleBegin && angle<=AngleEnd) && 
						(Math.Abs(Radius-dist)<=Const.PickRadius)) 
					{
						return true;
					}
					else
					{
						return false;
					}
				}
				//如果起始角大于终止角
				else
				{
					//如果拾取点的方位角大于等于起始角或小于等于终止角
					//且拾取点到圆心的距离与圆弧的半径接近,
					//则该圆弧被拾取;否则不被拾取              
					if ((angle>=AngleBegin || angle<=AngleEnd) &&
						(Math.Abs(Radius-dist)<=Const.PickRadius)) 
					{
						return true;
					}
					else
					{
						return false;
					}
				}
			}
        }

	    //平移变换
	    override public  void Move(Graphics g,PointF  basePos,PointF desPos)
		{
		     float xx,yy;
		     //计算在X和Y两个方向上的位移量
		     xx = desPos.X - basePos.X;
		     yy = desPos.Y - basePos.Y;
		     m_Center.X += xx;
		     m_Center.Y += yy;
		     m_Begin.X += xx;
		     m_Begin.Y += yy;
		     m_End.X += xx;
		     m_End.Y += yy;
		  }


	    //旋转变换
	    override public void Rotate(Graphics g,PointF basePos, float aAngle)
		{
			m_Center =m.pRotate(basePos, m_Center, aAngle);
			m_Begin = m.pRotate(basePos, m_Begin, aAngle);
			m_End = m.pRotate(basePos, m_End, aAngle);
	    }

	   //镜像变换
	    override public void Mirror(Graphics g,PointF pPos1,PointF pPos2)
		{
	       //注意,圆弧的镜像变换要交换起点和终点的坐标
	       m_Center =m.pMirror(pPos1, pPos2, m_Center);
	       PointF pt;
	       pt = m.pMirror(pPos1, pPos2, m_Begin);
	       m_Begin = m.pMirror(pPos1, pPos2, m_End);
	       m_End = pt;
	   }

	    //比例变换
	    override public void Scale(Graphics g, float sx,float sy)
		{
	        m_Center.X *= sx;
	        m_Center.Y *= sy;
	        m_Begin.X  *=sx;
	        m_Begin.Y *= sy;
	        m_End.X *= sx;
	        m_End.Y *=sy;
	    }
	}
}

⌨️ 快捷键说明

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