📄 carc.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 + -