Delphi   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Delphi上用TCanvas绘制像谷歌地图这样的标记大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的应用程序中,我需要在TCanvas上绘制一个“标记”,如谷歌地图标记(见图).

我想用作半径,高度和原点的参数:

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

@H_197_7@

解决方法

这是一个使用200×200 PaintBox的快速示例 – 它至少应该为您提供算法的想法.我相信你可以在中间画出黑点.阅读 Bezier Curves; PolyBezier定义了 cubic Bezier curves. (link)

四个点定义了一个三次贝塞尔曲线 – 起点,终点和两个控制点.当线从开始移动到结束时,控制点定义曲率的强度.

@H_618_13@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,lft]); PaintBox1.Canvas.Arc(lft.X,tp.Y,rgt.X,rgt.Y + radius,rgt.Y,lft.X,lft.Y); PaintBox1.Canvas.PolyBezier([rgt,innerR,origin]); //fill PaintBox1.Canvas.brush.Color := clYellow; PaintBox1.Canvas.FloodFill(origin.X,origin.Y - radius,Canvas.Pen.Color,TFillStyle.fsBorder); end;

为了满足您可以使用一个bezier执行此操作的要点:

@H_618_13@// 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,cornerL,cL2,cR2,cornerR,origin]); @H_197_7@ @H_197_7@

大佬总结

以上是大佬教程为你收集整理的在Delphi上用TCanvas绘制像谷歌地图这样的标记全部内容,希望文章能够帮你解决在Delphi上用TCanvas绘制像谷歌地图这样的标记所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。