void __fastcall Arc(int X1, int Y1, int X2, int Y2, int X3, int Y3, int X4, int Y4);
Description
Use Arc to draw an elliptically curved line with the current Pen. The arc traverses the perimeter of an ellipse that is bounded by the points (X1,Y1) and (X2,Y2). The arc is drawn following the perimeter of the ellipse, counterclockwise, from the starting point to the ending point. The starting point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X3,Y3). The ending point is defined by the intersection of the ellipse and a line defined by the center of the ellipse and (X4, Y4).
Note: On Windows 9x or Windows ME, the sums X1 + X2 and Y1 + Y2 cannot exceed 32768. Also, the sum X1 + X2 + Y1 + Y2 cannot exceed 32768.
On NT or Windows 2000, the drawing direction can be changed to clockwise using the Windows API call SetArcDirection.
试试我的方法:
procedure TForm1.Draw(items: array of integer);
var
ox, oy, r, i, sum, a: integer;
f: single;
cls: array of TColor;
begin
sum := 0;// 数值总和
a := 0;// 角度
r := 100;// 半径
ox := 120;// 圆心横坐标
oy := 120;// 圆心纵坐标
// 随机颜色
SetLength(cls, Length(items));
for i := Low(items) to High(items) do
cls[i] := RGB(Random(Random(255)), Round(Random(255)), Round(Random(255)));
for i := Low(items) to High(items) do
Inc(sum, items[i]);
f := 2 * pi / sum;// 角度的系数
for i := Low(items) to High(items) do
begin
Image1.Canvas.Brush.Color := cls[i];
Image1.Canvas.Pie(
ox - r, oy - r,
ox + r, oy + r,
ox + Round(r * cos(f * a)), oy - Round(r * sin(f * a)),
ox + Round(r * cos(f * (a + items[i]))), oy - Round(r * sin(f * (a + items[i]))));
Inc(a, items[i]);
end;
end;