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

标签 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.DrawPie : x、y、宽度、高度、起始角度、扫描角度

X1,Y1,X2,Y3很简单。 但是,给定 X3,Y3,X4,Y4 时,如何计算 startAngle、sweepAngle

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

最佳答案

您可以使用以下公式计算起始角度和结束角度:

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函数。

关于delphi - 将 TCanvas.Pie 坐标转换为 GDI+ DrawPie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37867344/

相关文章:

Delphi 64 位 Indy OpenSSL 库

delphi - 如何读取其他进程正在使用的文件?

delphi - 通知访问冲突

delphi - 表忙?

delphi indy IdDNSResolver 未返回所有请求的 dns 结果

delphi - Windows 7 中的“打开/保存”对话框时应用程序挂起

windows - 如何将项目添加到右键单击文件夹菜单?

c# - GDI+画线算法

image-processing - 如何使用 GDI+ 将旋转图像居中?

c# - GdiPlus 溢出异常