gpt4 book ai didi

delphi - 在 Delphi 上使用 TCanvas 绘制像谷歌地图一样的标记

转载 作者:行者123 更新时间:2023-12-03 14:58:18 25 4
gpt4 key购买 nike

在我的应用程序中,我需要在 TCanvas 上绘制一个“标记”,例如 Google map 标记(参见图片)。

google marker

我想使用半径、高度和原点作为参数:

marker parameters

我不知道要使用的算法。我可以使用圆弧来绘制顶部,但是如何绘制底部呢?注意:我需要使用 GDI 和 GDI+ 来绘制它,所以欢迎任何解决方案。

最佳答案

这是一个使用 200x200 PaintBox 的快速示例 - 它至少应该让您对算法有一个了解。我相信你能画出中间的黑点。阅读Bezier Curves ; PolyBezier 定义 cubic Bezier curves. (link)

bezier

四个点定义三次贝塞尔曲线 - 起点、终点和两个控制点。控制点定义线条从起点移动到终点时的曲率强度。

var origin, innerL, midL, midR, lft, tp, rgt, innerR : TPoint;
radius, hgt : integer;
begin
radius := 25;
hgt := 90;
origin.X := 100;
origin.Y := 180;
//control points
innerL.X := origin.X;
innerL.Y := origin.Y - (hgt - radius) div 3;
midL.X := origin.X - radius;
midL.Y := origin.Y - 2*((hgt - radius) div 3);
//top circle
lft.X := origin.X - radius;
lft.Y := origin.Y - (hgt - radius);
tp.X := origin.X;
tp.Y := origin.Y - hgt;
rgt.X := origin.X + radius;
rgt.Y := lft.Y;
//control points
midR.X := origin.X + radius;
midR.Y := midL.Y;
innerR.X := origin.X;
innerR.Y := innerL.Y;

PaintBox1.Canvas.Pen.Width := 2;
PaintBox1.Canvas.PolyBezier([origin, innerL, midL, lft]);
PaintBox1.Canvas.Arc(lft.X, tp.Y, rgt.X, rgt.Y + radius, rgt.X, rgt.Y, lft.X, lft.Y);
PaintBox1.Canvas.PolyBezier([rgt, midR, innerR, origin]);
//fill
PaintBox1.Canvas.Brush.Color := clYellow;
PaintBox1.Canvas.FloodFill(origin.X, origin.Y - radius,
Canvas.Pen.Color, TFillStyle.fsBorder);
end;

要满足这一点,您可以使用一个贝塞尔曲线来做到这一点:

  // add four more control TPoints
cornerL.X := lft.X;
cornerL.Y := tp.Y + radius div 2;
cL2.X := lft.X + radius div 2;
cL2.Y := tp.Y;
cR2.X := rgt.X - radius div 2;
cR2.Y := tp.Y;
cornerR.X := rgt.X;
cornerR.Y := cornerL.Y;


PaintBox1.Canvas.PolyBezier([origin, innerL, midL, lft,
cornerL, cL2, tp, cR2, cornerR, rgt,
midR, innerR, origin]);

关于delphi - 在 Delphi 上使用 TCanvas 绘制像谷歌地图一样的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18340074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com