極座標を使って曲線を描こうとしているのですが、円積曲線の方がどうしてもきちんと描けません。
どこに原因があるのでしょうか?
//円積曲線を描く
{
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;
極方程式が見にくいですね。
//円積曲線を描く
{
2θ
r = ----------
πsinθ
2θ
x = r・cosθ= ----------・cosθ
πsinθ
2θ 2θ
y = r・sinθ= ----------・sinθ= ----
πsinθ π }
すみません、なんども。yは
y = 2θ/π
です。
乗算と除算は優先度が等しく、左から右に計算されます。その式からすると
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
の方がおすすめですね。
ツイート | ![]() |