椭圆倒是好画,可圆弧总是不精确,根调用GDI+画得不一样
起始位置,结束位置不对多谢了……

解决方案 »

  1.   

    椭圆和画圆差不多嘛,加1个系数n,确定分圆为2的n次方条直线就OK 了。
    最上点,和最左,最右,最下的特征点一定要经过。2的2次方=4,画1个圆至少4条线,所以n>=2,一般下于7就OK 了!椭圆就是把确定下来的点,映射到椭圆上就OK了(就是比列换算嘛)。
      

  2.   

    以圆(椭圆)中心为圆点(x0,y0),假设椭圆的横向半径为R1,纵向半径为R2; 圆的半径为R;圆上的点(x,y) 映射到椭圆上的点就是((x-x0)*R1/R, (y-y0)*R2/R )
      

  3.   

    private void DrawArc(Graphics Gra,Pen DrawPen,float X,float Y,float Width,float Height,float BeginAngle,float SweepAngle)
    {
    // Gra.Clear(this.BackColor);
    float Pi=3.1415926f; //圆心座标
    float X0=X+Width/2;
    float Y0=Y+Height/2;
    //半径
    float R1=Width/2;
    float R2=Height/2;

    //焦点到原点的距离
    float Rj=(float)Math.Sqrt(Math.Abs(R1*R1-R2*R2)); //焦点座标
    Gra.DrawRectangle(DrawPen,(float)X,(float)Y,(float)X+Width,(float)Y+Height);
    Gra.DrawLine(DrawPen,X0,Y,X0,Y+Height);
    Gra.DrawLine(DrawPen,X,Y0,X+Width,Y0 ); //开始角度正切值
    float Bsin=(float)Math.Sin(BeginAngle/180*Pi);
    float Bcos=(float)Math.Cos(BeginAngle/180*Pi);
    float BTan=Bsin/Bcos;
    //起点座标
    float X1=X0+R1*R2/(float)Math.Sqrt(R2*R2+R1*R1*BTan*BTan);
    float Y1=Y0+R1*R2/(float)Math.Sqrt(R2*R2/BTan/BTan+R1*R1); //结束角度的正切值
    float Esin=(float)Math.Sin((BeginAngle+SweepAngle)/180*Pi);
    float Ecos=(float)Math.Cos((BeginAngle+SweepAngle)/180*Pi);
    float ETan=Esin/Ecos;
    //终点座标
    float X2=X0-R1*R2/(float)Math.Sqrt(R2*R2+R1*R1*ETan*ETan);
    float Y2=Y0+R1*R2/(float)Math.Sqrt(R2*R2/ETan/ETan+R1*R1); //获取最小和最大的X座标,准备循环
    float X11=Math.Min(X1,X2);
    float X22=Math.Max(X1,X2); float Xp=X11;
    float Yp=Y0+(float)Math.Sqrt((1-((X11-X0)*(X11-X0)/R1/R1)))*R2; for(float Xi=X11;Xi<X22;Xi+=1)
    {
    float Yt=(float)Math.Sqrt((1-((Xi-X0)*(Xi-X0)/R1/R1)));
    float Yi=Y0+Yt*R2;
    Gra.DrawLine(DrawPen,Xi,Yi,Xp,Yp);
    Xp=Xi;
    Yp=Yi;
    }
    }