仿CAD画椭圆弧步骤思路(附加代码)

事件触发及其顺序:
1、单击左键–确定圆心坐标。
2、鼠标移动–画虚线。
3、单击左键–确定椭圆A轴半径m_Axis1。
4、鼠标移动–画虚线,根据实时变化的椭圆B轴半径Axis2,画出实时变化的椭圆。
5、单击左键–确定椭圆B轴半径m_Axis2。
6、单击左键–确定开始角度m_StartAng。
7、鼠标移动–画虚线,根据实时变化的扫描角度SweepAng,画出实时变化的椭圆弧。
8、单击左键–确定扫描角度。

		bool bMouseDown = false;
        int bDrawArcStep = 0;//画弧的点击鼠标步骤序号
		
		double m_dbArcAxis1 = 0;
        double m_dbArcAxis2 = 0;
        double m_dbArcStartAngle = 0;
        double m_dbArcSweepAngle = 0;
        
        private void pictureMark_MouseMove(object sender, MouseEventArgs e)
        {
            DrawDC.ClearDrawImage();
            if (m_strDrawTool == "Arc")
            {
                if (bMouseDown)
                {
                    double dbX = e.X;
                    double dbY = e.Y;
                    Pen pen = new Pen(Pens.DarkGreen.Brush, 1);
                    pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom;
                    pen.DashPattern = new float[] { 10, 10 };
                    DrawDC.DrawLine(pen, (float)m_dotFirst.x, (float)m_dotFirst.y, (float)dbX, (float)dbY);

                    double dbxPos = 0;
                    double dbyPos = 0;
                    double dbWid = 0;
                    double dbHeight = 0;
                    if (bDrawArcStep == 2)
                    {
                        dbxPos = m_dotFirst.x - m_dbArcAxis1;
                        CDot dot = new CDot(e.X, e.Y);
                        double dbArcAxis2 = m_dotFirst.DistanceFromDot(dot);
                        dbyPos = m_dotFirst.y - dbArcAxis2;
                        dbWid = m_dbArcAxis1 * 2;
                        dbHeight = dbArcAxis2 * 2;
                        DrawDC.DrawEllipse(Pens.Blue, dbxPos, dbyPos, dbWid, dbHeight);
                    }
                    else if(bDrawArcStep == 3)
                    {
                        dbxPos = m_dotFirst.x - m_dbArcAxis1;
                        dbyPos = m_dotFirst.y - m_dbArcAxis2;
                        dbWid = m_dbArcAxis1 * 2;
                        dbHeight = m_dbArcAxis2 * 2;
                        DrawDC.DrawEllipse(Pens.Blue, dbxPos, dbyPos, dbWid, dbHeight);

                        double dbStartAngle = Math.Atan2((e.Y - m_dotFirst.y), (e.X - m_dotFirst.x));
                        dbStartAngle = (dbStartAngle / Math.PI) * 180.0;
                        if (dbStartAngle < -0.001)
                            dbStartAngle += 360;
                        string strStartAngle = dbStartAngle.ToString("0.00");
                        DrawDC.DrawText(Pens.DarkGreen, strStartAngle, e.X, e.Y);
                    }
                    else if (bDrawArcStep == 4)
                    {
                        dbxPos = m_dotFirst.x - m_dbArcAxis1;
                        dbyPos = m_dotFirst.y - m_dbArcAxis2;
                        dbWid = m_dbArcAxis1 * 2;
                        dbHeight = m_dbArcAxis2 * 2;
                        double dbEndAngle = Math.Atan2((e.Y - m_dotFirst.y), (e.X - m_dotFirst.x));
                        dbEndAngle = (dbEndAngle / Math.PI) * 180.0;
                        if (dbEndAngle < -0.001)
                            dbEndAngle += 360;
                        double dbSweepAngle = (dbEndAngle > m_dbArcStartAngle) ?
                                         (dbEndAngle - m_dbArcStartAngle) : (360 - (m_dbArcStartAngle - dbEndAngle)); ;
                        DrawDC.DrawArc(Pens.Blue, dbxPos, dbyPos, dbWid, dbHeight, m_dbArcStartAngle, dbSweepAngle);

                        string strSweepAngle = dbSweepAngle.ToString("0.00");
                        DrawDC.DrawText(Pens.DarkGreen, strSweepAngle, e.X, e.Y);
                    }
                    
                }
            }
            pictureMark.Image = DrawDC.m_Bitmap;
        }
private void pictureMark_MouseDown(object sender, MouseEventArgs e)
        {
          	if (m_strDrawTool == "Arc")
            {
                if(e.Button == MouseButtons.Left)
                {
                    if (bDrawArcStep == 0)//确定椭圆心
                    {
                        m_QuadSelect.Initial();
                        m_dotFirst = new CDot(e.X, e.Y);
                        DrawDC.NewBitMap();
                        bDrawArcStep++;
                        bMouseDown = true;
                    }
                    else if (bDrawArcStep == 1)//确定椭圆轴1
                    {
                        CDot dot = new CDot(e.X, e.Y);
                        m_dbArcAxis1 = m_dotFirst.DistanceFromDot(dot);
                        bDrawArcStep++;
                    }
                    else if (bDrawArcStep == 2)//确定椭圆轴2
                    {
                        CDot dot = new CDot(e.X, e.Y);
                        m_dbArcAxis2 = m_dotFirst.DistanceFromDot(dot);
                        bDrawArcStep++;
                    }
                    else if (bDrawArcStep == 3)//确定开始角度
                    {
                        double dbStartAngle = Math.Atan2((e.Y - m_dotFirst.y), (e.X - m_dotFirst.x));
                        m_dbArcStartAngle = (dbStartAngle / Math.PI) * 180.0;
                        if (m_dbArcStartAngle < -0.001)
                            m_dbArcStartAngle += 360;
                        bDrawArcStep++;
                    }
                    else if (bDrawArcStep == 4)
                    {
                        bDrawArcStep = 0;
                        bMouseDown = false;
                        DrawDC.m_CurBitmap = null;
                        panelDraw.Invalidate();
                    }
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值