Delphi ,画布,馅饼60度楔形

h6my8fg2  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(90)

我到处找遍了,想找到一个简单的解决办法。我是一个新的工作与画布上的绘画。
我对线条、圆形或矩形没有任何问题。派让我吃不下去了。
我想做的是画一个方位角为60度的楔子。它需要从300度开始,然后进展到30度。楔块必须为纯绿色。
我的问题是我不太理解所有的参数。
canvas.pie(x1,y1,x2,y2,x3,y3,x4,y4)-- x1,y1=Top Left -- x2,y2=Width and height,bottom right.
有没有人能成为一颗宝石,帮助解释其他4个参数,或者在网上给我一个很好的描述。一些示例代码也将非常方便。
我试过chatGPT,但没有用。
我甚至不能得到一个接近的结果

xeufq47z

xeufq47z1#

正如菲利普所写的,X3,Y3和X4,Y4是与馅饼的边相交的点。
您可以使用一个小trigonometry来计算这些点的位置,以便它们与您想要的Angular 相匹配。以下是我遵循的步骤:
1.创建新的VCL应用程序
1.在窗体上放置TPaintBox和TTrackbar
1.将System.Math添加到窗体的uses子句
1.将下面的代码添加到组件事件中
1.运行应用程序并使用轨迹条更改结束Angular
半径其实并不重要。我随意选了100个。SIN和COS使用弧度,但我仍然以度为单位,所以我使用DegToRad进行转换。
默认情况下,零度指向右侧。我从转换前的Angular 减去90度,使其指向上。调整以满足您的需求。
您可以通过交换X3、Y3和X4、Y4的值来控制饼图的绘制方向(顺时针与逆时针)。我想你也可以使用SetArcDirection WinAPI调用。我还没有搞混,但它在TCanvas.Arc文档中提到。

procedure TForm1.FormCreate(Sender: TObject);
begin
  TrackBar1.Min := 0;
  TrackBar1.Max := 360;
  TrackBar1.Position := 30;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
const
  RADIUS = 100;
  DEFAULT_THETA = 60;
var
  X1, Y1: Integer;
  X2, Y2: Integer;
  X3, Y3: Integer;
  X4, Y4: Integer;
  LStartTheta: Single;
  LEndTheta: Single;
begin
  X1 := 0;
  Y1 := 0;
  X2 := PaintBox1.Width;
  Y2 := PaintBox1.Height;

  LStartTheta := DegToRad(DEFAULT_THETA - 90);
  X3 := Round(RADIUS * Cos(LStartTheta) + PaintBox1.Width / 2);
  Y3 := Round(RADIUS * Sin(LStartTheta) + PaintBox1.Height / 2);

  LEndTheta := DegToRad(TrackBar1.Position - 90);
  X4 := Round(RADIUS * Cos(LEndTheta) + PaintBox1.Width / 2);
  Y4 := Round(RADIUS * Sin(LEndTheta) + PaintBox1.Height / 2);

  PaintBox1.Canvas.Pen.Color := clWhite;
  PaintBox1.Canvas.Brush.Style := bsSolid;
  PaintBox1.Canvas.Brush.Color := clGreen;
  PaintBox1.Canvas.Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4);
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  PaintBox1.Invalidate;
end;

相关问题