Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Это совсем не геосфера, выпрямил решетку 
И геосфера строится вообще не полюдски, меня все эти икосоэдры пугают пока

Handle mCreateSphere(int segments) { Handle mesh=xCreateMesh(); Handle surf=xCreateSurface(mesh); //создание плоскости for(int i=0;i<=2*segments;i++){ for(int j=0;j<=2*segments;j++){ int v0=xAddVertex(surf,i,j,0); }} int qvert=xCountVertices(surf); for(int i=0;i<qvert-2*segments-1;i++){ int v0=i; int v1=i+1; int v2=i+2*segments+1; int v3=v2+1; if(v3<qvert && xMod(i,2*segments+1)!=2*segments){
if(xVertexX(surf,i)>=segments && xVertexY(surf,i)<segments){ xAddTriangle(surf,v1,v2,v3); xAddTriangle(surf,v0,v2,v1);} if(xVertexX(surf,i)<segments && xVertexY(surf,i)>=segments){ xAddTriangle(surf,v1,v2,v3); xAddTriangle(surf,v0,v2,v1);} if(xVertexX(surf,i)>=segments && xVertexY(surf,i)>=segments){ xAddTriangle(surf,v0,v3,v1);xAddTriangle(surf,v2,v3,v0);} if(xVertexX(surf,i)<segments && xVertexY(surf,i)<segments){ xAddTriangle(surf,v0,v3,v1);xAddTriangle(surf,v2,v3,v0);} }}
//теперь выгибание плоскости по полусфере for(int i=0;i<qvert;i++){ double x=xVertexX(surf,i); double y=xVertexY(surf,i); double radius; if(fabs(x-segments)>fabs(y-segments)){radius=fabs(x-segments);} else {radius=fabs(y-segments);} x=x-segments; y=y-segments; double l=sqrt(x*x+y*y); if (l!=0){x=x/l; y=y/l;} y=y*sin(0.5*M_PI*radius/segments); x=x*sin(0.5*M_PI*radius/segments); double z=cos(0.5*M_PI*radius/segments); xVertexCoords(surf,i,x,y,z); xVertexNormal(surf,i,x,y,z); //половинка сферы готова } // вторая часть. Handle surf2=xCreateSurface(mesh); //создание плоскости for(int i=0;i<=2*segments;i++){ for(int j=0;j<=2*segments;j++){ int v0=xAddVertex(surf2,i,j,0); }} for(int i=0;i<qvert-2*segments-1;i++){ int v0=i; int v1=i+1; int v2=i+2*segments+1; int v3=v2+1; if(v3<qvert && xMod(i,2*segments+1)!=2*segments){ if(xVertexX(surf2,i)>=segments && xVertexY(surf2,i)<segments){ xAddTriangle(surf2,v2,v1,v3); xAddTriangle(surf2,v2,v0,v1);} if(xVertexX(surf2,i)<segments && xVertexY(surf2,i)>=segments){ xAddTriangle(surf2,v2,v1,v3); xAddTriangle(surf2,v2,v0,v1);} if(xVertexX(surf2,i)>=segments && xVertexY(surf2,i)>=segments){ xAddTriangle(surf2,v3,v0,v1);xAddTriangle(surf2,v3,v2,v0);} if(xVertexX(surf2,i)<segments && xVertexY(surf2,i)<segments){ xAddTriangle(surf2,v3,v0,v1);xAddTriangle(surf2,v3,v2,v0);} }} //теперь выгибание плоскости по полусфере for(int i=0;i<qvert;i++){ double x=xVertexX(surf2,i); double y=xVertexY(surf2,i); double radius; if(fabs(x-segments)>fabs(y-segments)){radius=fabs(x-segments);} else {radius=fabs(y-segments);} x=x-segments; y=y-segments; double l=sqrt(x*x+y*y); if (l!=0){x=x/l; y=y/l;} y=y*sin(0.5*M_PI*radius/segments); x=x*sin(0.5*M_PI*radius/segments); double z=-cos(0.5*M_PI*radius/segments); xVertexCoords(surf2,i,x,y,z); xVertexNormal(surf2,i,x,y,z);}
return mesh; }
|