年初,朋友联系到我,给我介绍了一个小活,其中有个部分是需要在 pyside6 框架中实现贝塞尔曲线功能。贝塞尔曲线在图形领域应用广泛,我们日常接触到的很多软件都有这个技术的影子,比如UE5中的蓝图线条、processon的曲线、动画制作中的物体运动轨迹控制等,这个功能对于我这个crud选手来说颇有难度。
要实现贝塞尔曲线需满足以下条件:1、能够精确定义多个控制点,通过这些控制点精确生成具有平滑弧度的曲线,控制点的位置和数量应能灵活调整,以满足不同形状曲线的绘制需求;2、绘制出的线条要可以指定宽度,线条的显示效果要清晰;3、要能将指定的图片贴合到曲线线条上,贴图在曲线拉伸、弯曲过程中不能出现变形、失真。
起初,为了节省时间与精力,我打算在淘宝上找个外包做个 demo 出来,再依据实际需求修改。逛了半天淘宝之后,我找到一家猪八戒的店铺,本指望这个大公司能解决问题,可惜了,白花我五百块。在和他们研发沟通多次,详细描述需求后,他们最终交付的成果却只用了 pyside6 自带功能实现了直线和虚线,贝塞尔曲线应有的弧度完全没实现,贴图功能更是和我直说:搞不了。
简单考虑了原因:第一,贝塞尔曲线的生成并非简单调用现有工具就能实现,它涉及到深入的数学原理,需要精准把握控制点与曲线形状的关系,显然他们和我一样,对于这些问题都是门外汉;其二,一分钱一分货,虽然在沟通之初我们就明确了需求,但是这个功能显然不是五百块就能搞定的。
由于外包计划失败,我只能自己动手干。百度了两天,终于敲定了方案,选择使用opencv和pil来创建图片,然后将图片显示在PySide6界面上。opencv 库作为计算机视觉领域的 “利器”,在图像处理、计算机视觉算法方面有着深厚 “功底”,它对图像的读取、显示、格式转换等基础操作提供了丰富函数支持,而PIL更是python领域图片操作的大杀器,用来编辑图片、绘制线条正式及其方便。
贝塞尔曲线是通过一系列控制点来定义形状的曲线,常见的有二次贝塞尔曲线(由 3 个控制点确定)和三次贝塞尔曲线(由 4 个控制点确定)等。我这个项目使用的是三次贝塞尔曲线,由于线条比较长,存在多段,所以我创建了两个列表参数分别用来记录途径点和控制点,并提供了一个参数用来记录线条的粗细。
然后计算贝塞尔曲线的线条途径点,并根据粗细创建完整线条。由于需要给线条贴图,所以我将贝塞尔曲线分割成多段三角形,为后续精准贴图做准备。OpenCV 的仿射变换是实现贴图的关键,仿射变换本质是一种二维坐标变换,能实现旋转、缩放、平移等操作,我就利用这个技术将切割后的三角形对应并贴到图形中,最终实现了需求。
简单总结一下:
1、一分钱一分货,相当甩手掌柜就得钱给够
2、大多数图形问题都是数学问题,学好数学很重要
3、不要过分依赖AI写的代码,中间我有两天全部在debug AI写的代码,最后发现方向都错了😂
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。