極座標で曲線を描く


QA  2009-10-22 01:36:57  No: 35950

極座標を使って曲線を描こうとしているのですが、円積曲線の方がどうしてもきちんと描けません。
  どこに原因があるのでしょうか?
//円積曲線を描く
{
             2θ
     r = ----------
           πsinθ

                      2θ
     x = r・cosθ= ----------・cosθ
                     πsinθ

                      2θ            2θ
     y = r・sinθ= ----------・sinθ= ----
                     πsinθ         π     }
procedure TScrForm.FDrawQuadratrix(TargetCanvas: TCanvas);
var
  i: Integer;
  Ex, Ey, Er, Th: Extended;
begin
  with TargetCanvas do
  begin
    Pen.Width := SubWidth;
    Pen.Color := clRed;
    Th := 0;
    Er := 5*2*Th/Pi*sin(th);//5倍に
    Ex := Er*cos(Th);    Ey := 5*2*Th/Pi;
    MoveTo( RealToDispX(Ex),RealToDispY(Ey) );  //数学座標からPC座標へ変換
                                                //グラフの 1 は 20 ピクセル
    i := 0;
    while i <= 90 do //1/4円
    begin
      Th := Th+Pi/36;     //角度の変化(180/36 = 5度)
      Er := 5*2*Th/Pi*sin(th);
      Ex := Er*cos(Th);    Ey := (2*Th)/Pi;
      Inc(i,5);
      LineTo(RealToDispX(Ex),RealToDispY(Ey) );
    end;
  end;
end;

//クローバを描く r = a・cos3θ  こちらはOK!
procedure TScrForm.FDrawclover(TargetCanvas: TCanvas);
var
  i: Integer;
  Ex, Ey, Er, Th: Extended;
begin
  with TargetCanvas do
  begin
    Pen.Width := SubWidth;
    Pen.Color := TColor($8ED38C);
    Th := 0;
    Er := 5*cos(3*th);
    Ex := Er*cos(Th);    Ey := Er*sin(Th);
    MoveTo( RealToDispX(Ex),RealToDispY(Ey) );

    i := 0;
    while i <= 180 do //半円
    begin
      Th := Th+Pi/36;     //角度の変化(180/36 = 5度)
      Er := 5*cos(3*th);
      Ex := Er*cos(Th);    Ey := Er*sin(Th);
      Inc(i,5);
      LineTo(RealToDispX(Ex),RealToDispY(Ey) );
    end;
  end;
end;


QA  2009-10-22 01:39:00  No: 35951

極方程式が見にくいですね。
//円積曲線を描く
{
             2θ
     r = ----------
           πsinθ

                      2θ
     x = r・cosθ= ----------・cosθ
                     πsinθ

                      2θ            2θ
     y = r・sinθ= ----------・sinθ= ----
                     πsinθ         π     }


QA  2009-10-22 01:41:59  No: 35952

すみません、なんども。yは
y = 2θ/π
です。


ttt  2009-10-22 02:28:58  No: 35953

乗算と除算は優先度が等しく、左から右に計算されます。その式からすると
Er := 5*2*Th/Pi*sin(th)
じゃなくて
Er := 5*2*Th/(Pi*sin(th)) もしくは 5*2*Th/Pi/sin(th)
なのでは。

ついでですが、実数をどんどん足していくと誤差が集積していく可能性があります。
Th := Th+Pi/36
とするよりは
Th := i*Pi/180
の方がおすすめですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加