计算机图形学作业:三阶贝塞尔曲面

本文描述了如何编写程序,使用给定的三阶Bezier曲面控制点,计算出曲面上的点并存储在数组中,同时计算并存储以三角形为基础的顶点索引。
摘要由CSDN通过智能技术生成

题目要求

编写程序,设计一个三阶的 Bezier 曲面,在给定控制点的情况下,计算出 Bezier 曲面上的点(设 u,v 方向的曲面精度可通过参数设置),然后将这些点保存到数组中。如果该 Bezier 曲面以三角面为基本图元进行存储,计算出三角形顶点的索引,并保存到数组中。

解答

//三阶(次)Bezier曲面
float R[4][4][3];//控制点三维数组,每一维分别为u,v方向,xyz坐标
typedef struct indexs {
    int m, n;
}Indexs;
Indexs indices[N];  //索引
void Bezier(float uc,float vc) //uc,vc,控制曲面精度的增量
{
//数组最大长度101,精度最大0.01
    float points_u[101][4][3] = { 0.0 };
    for (int j = 0; j < 4; j++) {
        int t = 0;
        for (double u = 0.0; u <= 1.0; u += uc)
        {
            float B0u = (1 - u) * (1 - u) * (1 - u);
            float B1u = 3 * (1 - u) * (1 - u) * u;
            float B2u = 3 * (1 - u) * u * u;
            float B3u = u * u * u;
            points_u[t][j][0] = R[0][j][0] * B0u + R[1][j][0] * B1u + R[2][j][0] * B2u + R[3][j][0] * B3u;
            points_u[t][j][1] = R[0][j][1] * B0u + R[1][j][1] * B1u + R[2][j][1] * B2u + R[3][j][1] * B3u;
            points_u[t][j][2] = R[0][j][2] * B0u + R[1][j][2] * B1u + R[2][j][2] * B2u + R[3][j][2] * B3u;
            t = t + 1;
        }
    }
 float points_uv[101][101][3] = { 0.0 };//存Bezier 曲面上的点
    for (int j = 0; j < 1.0/uc+1; j++) {
        int i = 0;
        for (double t = 0.0; t <= 1.0; t += vc)
        {
            float a1 = (1 - t) * (1 - t) * (1 - t);
            float a2 = 3 * (1 - t) * (1 - t) * t;
            float a3 = 3 * t * t * (1 - t);
            float a4 = t * t * t;
            points_uv[j][i][0] = a1 * points_u[j][0][0] + a2 * points_u[j][1][0] + a3 * points_u[j][2][0] + a4 * points_u[j][3][0];
            points_uv[j][i][1] = a1 * points_u[j][0][1] + a2 * points_u[j][1][1] + a3 * points_u[j][2][1] + a4 * points_u[j][3][1];
            points_uv[j][i][2] = a1 * points_u[j][0][2] + a2 * points_u[j][1][2] + a3 * points_u[j][2][2] + a4 * points_u[j][3][2];
            i = i + 1;
        }
}

int k = 0; //保存索引
    for (int i = 0; i < 1.0/vc+1; i++)
    {
        for (int j = 0; j < 1.0/uc+1; j++)
        {
            indices[k].m = j;
            indices[k].n = i;
            k++;
            indices[k].m = j;
            indices[k].n = i+1;
            k++;
            indices[k].m = j+1;
            indices[k].n = i;
            k++;
            indices[k].m = j + 1;
            indices[k].n = i;
            k++;
            indices[k].m = j ;
            indices[k].n = i+ 1;
            k++;
            indices[k].m = j + 1;
            indices[k].n = i + 1;
            k++;
        }
    }
}

参考:双三次Bezier曲面-CSDN博客

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guts350

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值