绘制Bezier曲线(Windows GDI)

发布时间 2023-06-03 19:57:40作者: 汀洲杜若

本文仅记录绘制贝塞尔曲线的代码写法,不解释贝塞尔曲线本身。

若要了解贝塞尔曲线本身你需要具备一些基础知识:

  1. 基本空间几何知识
  2. 排列组合常用等式
  3. 贝塞尔曲线的数学表达式
  4. 了解Bernstein基函数
  5. 贝塞尔曲线的各种绘制方法

本文使用递推方法绘制。就像这图上显示的:

代码的核心部分大致是:

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];
}

感觉还是比较耗时。不过至少能画出来。