如何画出长半轴与水平线任意角度的椭圆?
用API函数能否实现?最好不要描点画,效率高一点!

解决方案 »

  1.   

    //user Delphi function Arc or Win32 API Arc and ArcTo 
    //and MoveTo and LineTo
    //Example
    procedure TForm1.FormPaint(Sender: TObject);
    var
      R: TRect;
    begin
      R := GetClientRect;   {Gets the boundaries of the current window}
      Canvas.Arc(R.Left, R.Top, R.Right, R.Bottom, R.Right, R.Top, R.Left, R.Top);
    end;
      

  2.   

    定义一个常数,为什么是这么多我也不清楚,谁数学学得好呀?
    const
      r: Double = 0.2761423749154; Center为椭圆中心、mb为短半轴、ma为长半轴
    得到13个点
      P[0].x := Center.x;
      P[0].y := Center.y + mb;
      P[1].x := Center.x + 2 * ma * r;
      P[1].y := Center.y + mb;
      P[2].x := Center.x + ma;
      P[2].y := Center.y + 2 * mb * r;
      P[3].x := Center.x + ma;
      P[3].y := Center.y;
      P[4].x := Center.x + ma;
      P[4].y := Center.y - 2 * mb * r;
      P[5].x := Center.x + 2 * ma * r;
      P[5].y := Center.y - mb;
      P[6].x := Center.x;
      P[6].y := Center.y - mb;
      P[7].x := Center.x - 2 * ma * r;
      P[7].y := Center.y - mb;
      P[8].x := Center.x - ma;
      P[8].y := Center.y - 2 * mb * r;
      P[9].x := Center.x - ma;
      P[9].y := Center.y;
      P[10].x := Center.x - ma;
      P[10].y := Center.y + 2 * mb * r;
      P[11].x := Center.x - 2 * ma * r;
      P[11].y := Center.y + mb;
      P[12].x := Center.x;
      P[12].y := Center.y + mb;旋转,旋转中心是Center, mCosAlpha, mSinAlpha,为旋转角的Cos,Sin值
      for i := 0 to 12 do    P[i] := ThisDxf.Rotate(Center, P[i], mCosAlpha, mSinAlpha);
      ThisDxf.DxfCanvas.PolyBezier(P);
      

  3.   

    定义一个常数,为什么是这么多我也不清楚,谁数学学得好呀?
    const
      r: Double = 0.2761423749154; Center为椭圆中心、mb为短半轴、ma为长半轴
    得到13个点
      P[0].x := Center.x;
      P[0].y := Center.y + mb;
      P[1].x := Center.x + 2 * ma * r;
      P[1].y := Center.y + mb;
      P[2].x := Center.x + ma;
      P[2].y := Center.y + 2 * mb * r;
      P[3].x := Center.x + ma;
      P[3].y := Center.y;
      P[4].x := Center.x + ma;
      P[4].y := Center.y - 2 * mb * r;
      P[5].x := Center.x + 2 * ma * r;
      P[5].y := Center.y - mb;
      P[6].x := Center.x;
      P[6].y := Center.y - mb;
      P[7].x := Center.x - 2 * ma * r;
      P[7].y := Center.y - mb;
      P[8].x := Center.x - ma;
      P[8].y := Center.y - 2 * mb * r;
      P[9].x := Center.x - ma;
      P[9].y := Center.y;
      P[10].x := Center.x - ma;
      P[10].y := Center.y + 2 * mb * r;
      P[11].x := Center.x - 2 * ma * r;
      P[11].y := Center.y + mb;
      P[12].x := Center.x;
      P[12].y := Center.y + mb;旋转,旋转中心是Center, 旋转角的Cos,Sin值mCosAlpha, mSinAlpha
      for i := 0 to 12 do
      begin
        X := P[i].x - Center.x;
        Y := P[i].y - Center.y;    P[i].x := X * CosAlpha - Y * SinAlpha + Center.x;
        P[i].y := X * SinAlpha + Y * CosAlpha + Center.y;
      end;  画Bezier曲线
      ThisDxf.DxfCanvas.PolyBezier(P);  以上方法误差只有0.03%速度很快