本文仅记录绘制贝塞尔曲线的代码写法,不解释贝塞尔曲线本身。
若要了解贝塞尔曲线本身你需要具备一些基础知识:
- 基本空间几何知识
- 排列组合常用等式
- 贝塞尔曲线的数学表达式
- 了解Bernstein基函数
- 贝塞尔曲线的各种绘制方法
本文使用递推方法绘制。就像这图上显示的:
代码的核心部分大致是:
MoveToEx(hdc, Points[0].x, Points[0].y, NULL); for (double t = 0.0; t <= 1.0; t += T_STEP) { POINT p = PointOnBezierAt(t); LineTo(hdc, p.x, p.y); }
POINT PointOnBezierAt(double t){ std::vector<POINT> pts(Points); for (int k = Points.size() - 1; k > 0; k--) { for (int i = 0; i < k; i++) { pts[i].x = (LONG)(pts[i].x * (1-t) + t * pts[1+i].x + 0.5); pts[i].y = (LONG)(pts[i].y * (1-t) + t * pts[1+i].y + 0.5); } } return pts[0]; }
感觉还是比较耗时。不过至少能画出来。
标签:曲线,Windows,绘制,Bezier,贝塞尔,int,Points,GDI,pts From: https://www.cnblogs.com/tingzhouduruo/p/bezier-curve-windows-gdi-2d.html