日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

球体模型建立

發布時間:2023/12/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 球体模型建立 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

構建球體模型主要的數據結構是點表*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;//最上方的緯度線的三角形的頂點在北極上elsefaceList[(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;//最下方的緯度線的三角形的頂點在南極上elsefaceList[(NB - 1) * NTheta * 2 + 2 * NT ].vI[2] = (NB * (NTheta + 1) + NT);//其他緯度線的三角形上頂點在下一條緯度線上} }

總結

以上是生活随笔為你收集整理的球体模型建立的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。