球体模型建立

构建球体模型主要的数据结构是点表*pointList 和面表 *faceList,两个数据结构都是指针,首先利用void createPointList()函数创建点表,球面的参数方程如下,可以通过构建很多离散点,最后用这些离散点构建三角形面片,生成球面。
在这里插入图片描述

void CSphere::createPointList()
{
	int NBeta = (int) (180 / this->beta);
	int NTheta = (int)(360 / this->theta);
	//+2是南北极的点 -1是纬度线只有中间的线,两极点没有线,沿纬度线一圈把七点和终点都保存下来,虽然两点位置一样
	this->point3DList = new CPoint3D[(NTheta+1) * (NBeta-1)+ 2];
	//创建北极点
	point3DList[0].x = 0;
	point3DList[0].y = 0;
	point3DList[0].z = this->R;
	//for循环不能从0开始
	for(int NB = 1;NB < NBeta;NB++)
		for (int NT = 1; NT <= (NTheta+1); NT++) {
			point3DList[(NB - 1) * (NTheta + 1) + NT ].x = (this->R * sin(NB * beta*PI/180)) * cos((NT-1) * theta * PI / 180);
			point3DList[(NB - 1) * (NTheta + 1) + NT ].y = (this->R * sin(NB * beta * PI / 180)) * sin((NT-1) * theta * PI / 180);
			point3DList[(NB - 1) * (NTheta + 1) + NT ].z = this->R * cos(NB * beta * PI / 180);
		}
	//创建南极点
	point3DList[(NTheta + 1) * (NBeta - 1) + 1].x = 0;
	point3DList[(NTheta + 1) * (NBeta - 1) + 1].y = 0;
	point3DList[(NTheta + 1) * (NBeta - 1) + 1].z = -(this->R);
}
//此函数的关键在对维度进行分割时,多计算了最后一个点,也就是最后一个点和第一个点实际上是同一个点,这样做的好处是最后生成三角形面片的函数更容易写,少了一次判断

接下来看看三角形面片是什么生成的?

生成三角形面片的思路如下:对每一个维度从七点开始以此选择两个点,然后依据右手定则旋转,分别在上一个维度和下一个维度的同一条找到一个点,分别构成两个三角形面片,依此原则可以构成铺满整个球体的三角形面片。
在这里插入图片描述

void CSphere::creatFaceList()
{
	int NBeta = (int)(180 / this->beta);
	int NTheta = (int)(360 / this->theta);

	faceList = new CFace[(NBeta - 1)* NTheta * 2+1];//三角形面片的个数,+1的原因是没有使用第一个内存存储三角形面
	for(int NB = 1;NB < NBeta;NB++)
		for (int NT = 1; NT <= NTheta ; NT = NT + 1) {
			//按照纬度线划分三角形,每一个纬度线上的两个点与上下的两点分别形成两个三角形
			//创建第一个三角形,上三角形
			faceList[(NB-1) * NTheta * 2 + 2*NT - 1].SetNum(3);
			faceList[(NB-1) * NTheta * 2 + 2 * NT - 1].vI[0] = ((NB-1) * (NTheta+1) + NT );//当前纬度线三角形的起点
			faceList[(NB - 1) * NTheta * 2 + 2 * NT - 1].vI[1] = ((NB - 1) * (NTheta+1) + NT+1);//当前纬度线的另一个点
			if (NB == 1)
				faceList[(NB - 1) * NTheta * 2 + 2 * NT - 1].vI[2] = 0;//最上方的纬度线的三角形的顶点在北极上
			else
				faceList[(NB - 1) * NTheta * 2 + 2 * NT - 1].vI[2] = ((NB - 2) * (NTheta+1) + NT + 1);//其他纬度线的三角形上顶点在上一条纬度线上
			//创建第二个三角形,下三角形
			faceList[(NB - 1) * NTheta * 2 + 2 * NT].SetNum(3);
			faceList[(NB - 1) * NTheta * 2 + 2 * NT].vI[0] = ((NB - 1) * (NTheta + 1) + NT + 1);
			faceList[(NB - 1) * NTheta * 2 + 2 * NT].vI[1] = ((NB - 1) * (NTheta + 1) + NT);
			if (NB == (NBeta - 1))
				faceList[(NB - 1) * NTheta * 2 + 2 * NT ].vI[2] = (NTheta + 1) * (NBeta - 1) + 1;//最下方的纬度线的三角形的顶点在南极上
			else
				faceList[(NB - 1) * NTheta * 2 + 2 * NT ].vI[2] = (NB * (NTheta + 1) + NT);//其他纬度线的三角形上顶点在下一条纬度线上
		}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值