将TCanvas.Pie坐标转换为GDI + DrawPie

时间:2016-06-16 18:58:13

标签: delphi delphi-7 gdi+

我需要创建一个程序,例如:

procedure GdiPie(Canvas: TCanvas; X1: Integer; Y1: Integer; X2: Integer; Y2: Integer; X3: Integer; Y3: Integer; X4: Integer; Y4: Integer);
var gr: TGPGraphics;
begin
  ...
  gr.DrawPie(brush, X1, Y1, X2 - X1, Y2 - Y1, ???) // calculate "startAngle, sweepAngle"
end;

它采用与TCanvas.Pie相同的参数并转换为需要参数的TGPGraphics.DrawPiex, y, width, height, startAngle, sweepAngle

X1,Y1,X2,Y3很简单。 但是,我如何计算给定startAngle, sweepAngle的{​​{1}}?

我找到了这个链接:How to create a pie chart。但我仍然无法“扭转”它的工作。

1 个答案:

答案 0 :(得分:2)

您可以使用以下公式计算起点和终点角度:

CX := (X1 + X2) / 2; // center of bounding rectangle
CY := (Y1 + Y2) / 2;
aStart := ArcTan2(Y3 - CY, X3 - CX);
aEnd := ArcTan2(Y4 - CY, X4 - CX);
 SweepAngle := aEnd - AStart

不要忘记ArcTan范围和SweepAngle可能的+-2*Pi偏移量(按差异计算)

另一种方法(通过点和交叉矢量产品):

SweepAngle := ArcTan2((X3 - CX) * (Y4 - CY) - (X4 - CX) * (Y3 - CY),
                      (X3 - CX) * (X4 - CX) + (Y3 - CY) * (Y4 - CY));

似乎你需要以度为单位的角度,所以应用RadToDeg函数。