Тема: Странное.
Показать сообщение отдельно
Старый 26.09.2011, 21:52   #57
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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){ xAddTriangle(surf,v1,v2,v3); xAddTriangle(surf,v0,v2,v1);}}
//теперь выгибание плоскости по полусфере
    
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/ly=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){ xAddTriangle(surf2,v2,v1,v3); xAddTriangle(surf2,v2,v0,v1);}}
//теперь выгибание плоскости по полусфере
    
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/ly=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;

(Offline)
 
Ответить с цитированием