将 TCanvas.Pie 坐标转换为 GDI+ DrawPie
Convert TCanvas.Pie coordinates to GDI+ DrawPie
我需要创建一个程序,例如:
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, width, height, startAngle, sweepAngle
X1,Y1,X2,Y3
很简单。
但是,给定 X3,Y3,X4,Y4
如何计算 startAngle, sweepAngle
?
我找到了这个 link:How to create a pie chart。但我似乎仍然无法 "reverse" 它起作用。
您可以使用这些公式计算开始和结束角度:
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
函数。
我需要创建一个程序,例如:
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, width, height, startAngle, sweepAngle
X1,Y1,X2,Y3
很简单。
但是,给定 X3,Y3,X4,Y4
如何计算 startAngle, sweepAngle
?
我找到了这个 link:How to create a pie chart。但我似乎仍然无法 "reverse" 它起作用。
您可以使用这些公式计算开始和结束角度:
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
函数。