看过很多遍这个故事,写段代码验证一下:
var
O: Integer;
r, a: Single;
sx, sy, x, y: Integer;
begin
sx := 250; sy := 250;
Canvas.Pen.Color := clBlack;
Canvas.MoveTo(0, sy);
Canvas.LineTo(width, sy);
Canvas.MoveTo(sx, 0);
Canvas.LineTo(sx, height);
Canvas.Pen.Color := clRed;
a := 50;
for O := 0 to 360*2-1 do
begin
// r = a(1-sinθ) //笛卡尔的心型线
// r = a*Arccos(sinθ) //这种更完美些
//r := a * (1-sin(O));
r := a * ArcCos(Sin(O));
//极坐标公式:已知角度和半径,求弧上的点坐标(x=rcosθ,y=rsinθ)
x := sx + Round(r * Cos(O));
y := sy - Round(r * Sin(O));
//Canvas.LineTo(x, y);
Canvas.Ellipse(x-1, y-1, x+1, y+1);
end;
end;