用c++写一个绘制贝塞尔曲面的cpp文件,用easyx库实现
时间: 2024-06-09 10:11:31 浏览: 220
以下是用 EasyX 库实现绘制贝塞尔曲面的 C++ 代码:
```cpp
#include <graphics.h>
#include <math.h>
// 贝塞尔曲面控制点个数
#define CTRL_POINTS_NUM 16
// 定义控制点结构体
struct CtrlPoint {
int x;
int y;
};
// 控制点数组
CtrlPoint ctrlPoints[CTRL_POINTS_NUM] = {
// 第一行
{ 50, 50 }, { 150, 50 }, { 250, 50 }, { 350, 50 },
// 第二行
{ 50, 150 }, { 150, 150 }, { 250, 150 }, { 350, 150 },
// 第三行
{ 50, 250 }, { 150, 250 }, { 250, 250 }, { 350, 250 },
// 第四行
{ 50, 350 }, { 150, 350 }, { 250, 350 }, { 350, 350 }
};
// 计算阶乘
int factorial(int n) {
int result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
// 计算组合数 C(n, i)
int combination(int n, int i) {
return factorial(n) / (factorial(i) * factorial(n - i));
}
// 计算贝塞尔曲线上的点
CtrlPoint bezier(CtrlPoint* points, double t) {
int n = CTRL_POINTS_NUM - 1; // 控制点数
CtrlPoint result = { 0, 0 };
for (int i = 0; i <= n; i++) {
int c = combination(n, i);
double ti = pow(t, i);
double tni = pow(1 - t, n - i);
result.x += c * ti * tni * points[i].x;
result.y += c * ti * tni * points[i].y;
}
return result;
}
// 绘制贝塞尔曲面
void drawBezierSurface(CtrlPoint* points) {
for (double t = 0; t <= 1; t += 0.01) {
for (double s = 0; s <= 1; s += 0.01) {
// 计算16个控制点
CtrlPoint ctrlPoints[CTRL_POINTS_NUM];
for (int i = 0; i < CTRL_POINTS_NUM; i++) {
int u = i % 4;
int v = i / 4;
ctrlPoints[i] = bezier(&points[v * 4], s);
}
// 计算贝塞尔曲面上的点
CtrlPoint p = bezier(ctrlPoints, t);
putpixel(p.x, p.y, WHITE);
}
}
}
int main() {
initgraph(400, 400);
setbkcolor(BLACK);
cleardevice();
// 绘制控制点
setcolor(GREEN);
for (int i = 0; i < CTRL_POINTS_NUM; i++) {
circle(ctrlPoints[i].x, ctrlPoints[i].y, 3);
}
// 绘制贝塞尔曲面
setcolor(WHITE);
drawBezierSurface(ctrlPoints);
getch();
closegraph();
return 0;
}
```
该代码使用了 EasyX 图形库和数学库,通过计算贝塞尔曲面上的点来绘制出整个曲面。运行该代码,可以得到如下所示的贝塞尔曲面:
![贝塞尔曲面](https://cdn.luogu.com.cn/upload/image_hosting/edn1gm6c.png)
阅读全文
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![7z](https://img-home.csdnimg.cn/images/20241231044736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)