使用easyx绘制贝塞尔曲面
时间: 2023-11-27 12:37:12 浏览: 37
在EasyX中,我们可以通过绘制一系列的贝塞尔曲线来绘制贝塞尔曲面。下面是一个示例代码,展示如何使用EasyX绘制一个简单的贝塞尔曲面:
```c++
#include <graphics.h>
#include <conio.h>
#include <math.h>
const int n = 4; // 控制点个数
// 控制点坐标
int px[n] = {50, 100, 150, 200};
int py[n] = {50, 200, 200, 50};
void drawBezierCurve(int *px, int *py, int n, int step)
{
double t;
int i;
double x, y;
for(t = 0; t < 1; t += 1.0 / step)
{
x = pow(1 - t, 3) * px[0] + 3 * t * pow(1 - t, 2) * px[1] + 3 * pow(t, 2) * (1 - t) * px[2] + pow(t, 3) * px[3];
y = pow(1 - t, 3) * py[0] + 3 * t * pow(1 - t, 2) * py[1] + 3 * pow(t, 2) * (1 - t) * py[2] + pow(t, 3) * py[3];
putpixel((int)x, (int)y, WHITE);
}
// 绘制控制点
for(i = 0; i < n; i++)
{
circle(px[i], py[i], 2);
}
}
void drawBezierSurface(int *px, int *py, int n, int step)
{
int i, j;
for(i = 0; i < step; i++)
{
double u = 1.0 * i / step;
for(j = 0; j < step; j++)
{
double v = 1.0 * j / step;
double x = pow(1 - u, 3) * (pow(1 - v, 3) * px[0] + 3 * v * pow(1 - v, 2) * px[1] + 3 * pow(v, 2) * (1 - v) * px[2] + pow(v, 3) * px[3]) +
3 * u * pow(1 - u, 2) * (pow(1 - v, 3) * px[4] + 3 * v * pow(1 - v, 2) * px[5] + 3 * pow(v, 2) * (1 - v) * px[6] + pow(v, 3) * px[7]) +
3 * pow(u, 2) * (1 - u) * (pow(1 - v, 3) * px[8] + 3 * v * pow(1 - v, 2) * px[9] + 3 * pow(v, 2) * (1 - v) * px[10] + pow(v, 3) * px[11]) +
pow(u, 3) * (pow(1 - v, 3) * px[12] + 3 * v * pow(1 - v, 2) * px[13] + 3 * pow(v, 2) * (1 - v) * px[14] + pow(v, 3) * px[15]);
double y = pow(1 - u, 3) * (pow(1 - v, 3) * py[0] + 3 * v * pow(1 - v, 2) * py[1] + 3 * pow(v, 2) * (1 - v) * py[2] + pow(v, 3) * py[3]) +
3 * u * pow(1 - u, 2) * (pow(1 - v, 3) * py[4] + 3 * v * pow(1 - v, 2) * py[5] + 3 * pow(v, 2) * (1 - v) * py[6] + pow(v, 3) * py[7]) +
3 * pow(u, 2) * (1 - u) * (pow(1 - v, 3) * py[8] + 3 * v * pow(1 - v, 2) * py[9] + 3 * pow(v, 2) * (1 - v) * py[10] + pow(v, 3) * py[11]) +
pow(u, 3) * (pow(1 - v, 3) * py[12] + 3 * v * pow(1 - v, 2) * py[13] + 3 * pow(v, 2) * (1 - v) * py[14] + pow(v, 3) * py[15]);
putpixel((int)x, (int)y, WHITE);
}
}
}
int main()
{
initgraph(640, 480);
drawBezierCurve(px, py, n, 100);
// 计算 4x4 个控制点坐标
int cpx[4][4] = {{50, 75, 100, 125}, {100, 125, 150, 175}, {150, 175, 200, 225}, {200, 225, 250, 275}};
int cpy[4][4] = {{50, 75, 75, 50}, {200, 225, 225, 200}, {200, 225, 225, 200}, {50, 75, 75, 50}};
drawBezierSurface((int *)cpx, (int *)cpy, 4, 50);
_getch();
closegraph();
return 0;
}
```
代码中首先绘制了一个贝塞尔曲线,然后绘制了一个简单的贝塞尔曲面。其中,`drawBezierCurve`函数用于绘制贝塞尔曲线,`drawBezierSurface`函数用于绘制贝塞尔曲面。
需要注意的是,贝塞尔曲面的控制点个数应该是 $(n+1)^2$ 个,其中 $n$ 为一条贝塞尔曲线上的控制点个数。在本例中,我们使用了 $4$ 条贝塞尔曲线,每条曲线上有 $4$ 个控制点,因此贝塞尔曲面的控制点个数为 $16$。我们将这些控制点存储在一个 $4\times4$ 的二维数组中,然后传入 `drawBezierSurface` 函数进行绘制。
运行上述代码,可以看到绘制出的贝塞尔曲线和贝塞尔曲面。