2017-02-06 7 views
1

球面に六角形のグリッドが必要です。ここに示すように。半球の六角穴あけ

enter image description here

今私は、六角形をしていますグリッドをフラット化。 enter image description here とそれを半球の表面に投影します。ここのように、 しかし、あなたが見ることができるように、面白いアーティファクトは、縁の六角形が不均衡に大きくなっています。すべての六角形のサイズがほぼ同じになるようにこれを行うより良い方法があるはずです。

enter image description here

は私が提案した@spektreようなソリューションを試してみましたが、私のコードは、次のプロットを生成されました。

enter image description here 私はaを拡大したかったので、私はそう角度a[0,pi/2]の境界を持つ[0,r]からz[0,r]に行くことa=sqrt(x*x+y*y)/r * (pi/2)を使用していました。

ただし、ちょうどa=sqrt(x*x+y*y)/rで動作します。タスクと enter image description here

新開発、新しい問題 enter image description here

は、私は今、六角形の形状全体を通して等しくされていない問題を抱えています。私は、ドームとシリンダーを横切ってそれらのために一様な形状(面積的に)をしたい。私はこれをどうやって管理するのか混乱していますか?ここで

+0

@Spektreはいこれはxy平面です。アーク長の使用について少し詳しく説明できますか? –

答えて

2

は、私が考えているものです。

  1. XY平面上の平面の六角グリッドを作成し、あなたのグリッド

    センターがあなたの球の中心でなければならない私は(0,0,0)とサイズを選択しましたあなたの球の少なくとも2倍の半径でなければなりません。

  2. コンバート平面は加工点が(x,y,z)あり、球半径がr次いで、緯度の位置であるので、もしそうXY平面内座標する(0,0,0)からの距離があなたの球の表面上を移動弧長である球状

    に配位球上にある:

    a=sqrt(x*x+y*y)/r; 
    

    ので、我々は直接z座標を計算することができます

    球の表面に
    z=r*cos(a); 
    

    と規模x,y

    a=r*sin(a)/sqrt(x*x+y*y); 
    x*=a; y*=a; 
    

    z座標なら、あなたは半分の球を否定交差していているとは異なる処理する必要があります(16進数をスキップしたり、シリンダーまたは任意に変換)

  3. このため

ここで小のOpenGL/C++例:

//--------------------------------------------------------------------------- 
const int _gx=15;   // hex grid size 
const int _gy=15; 
const int _hy=(_gy+1)<<1; // hex points size 
const int _hx=(_gx+1); 
double hex[_hy][_hx][3]; // hex grid points 
//--------------------------------------------------------------------------- 
void hexgrid_init(double r) // set hex[][][] to planar hex grid points at xy plane 
    { 
    double x0,y0,x,y,z,dx,dy,dz; 
    double sx,sy,sz; 
    int i,j; 
    // hex sizes 
    sz=sqrt(8.0)*r/double(_hy); 
    sx=sz*cos(60.0*deg); 
    sy=sz*sin(60.0*deg); 

    // center points arrounf (0,0) 
    x0=(0.5*sz)-double(_hy/4)*(sz+sx); 
    y0=-double(_hx)*(sy); 
    if (int(_gx&1)==0) x0-=sz+sx; 
    if (int(_gy&1)==0) y0-=sy; else y0+=sy; 

    for (y=y0,i=0;i<_hy;i+=2,y+=sy+sy) 
    for (x=x0,j=0;j<_hx;j++,x+=sz) 
     { 
     hex[i][j][0]=x; 
     hex[i][j][1]=y; 
     hex[i][j][2]=0.0; 
     x+=sz+sx+sx; j++; if (j>=_hx) break; 
     hex[i][j][0]=x; 
     hex[i][j][1]=y; 
     hex[i][j][2]=0.0; 
     } 

    for (y=y0+sy,i=1;i<_hy;i+=2,y+=sy+sy) 
    for (x=x0+sx,j=0;j<_hx;j++,x+=sx+sx+sz) 
     { 
     hex[i][j][0]=x; 
     hex[i][j][1]=y; 
     hex[i][j][2]=0.0; 
     x+=sz; j++; if (j>=_hx) break; 
     hex[i][j][0]=x; 
     hex[i][j][1]=y; 
     hex[i][j][2]=0.0; 
     } 

    } 
//--------------------------------------------------------------------------- 
void hexgrid_half_sphere(double r0) // convert planar hex grid to half sphere at (0,0,0) with radius r0 
    { 
    int i,j; 
    double x,y,z,a,l; 
    for (i=0;i<_hy;i++) 
    for (j=0;j<_hx;j++) 
     { 
     x=hex[i][j][0]; 
     y=hex[i][j][1]; 
     z=hex[i][j][2]; 
     l=sqrt(x*x+y*y); // distance from center on xy plane (arclength) 
     a=l/r0;    // convert arclength to angle 
     z=r0*cos(a);  // compute z coordinate (sphere) 
     if (z>=0.0)   // half sphere 
      { 
      a=r0*sin(a)/l; 
      } 
     else{    // turn hexes above half sphere to cylinder 
      z=0.5*pi*r0-l; 
      a=r0/l; 
      } 
     x*=a; 
     y*=a; 
     hex[i][j][0]=x; 
     hex[i][j][1]=y; 
     hex[i][j][2]=z; 
     } 
    } 
//--------------------------------------------------------------------------- 
void hex_draw(int x,int y,GLuint style)  // draw hex x = <0,_gx) , y = <0,_gy) 
    { 
    y<<=1; 
    if ((x&1)==0) y++; 
    if ((x<0)||(x+1>=_hx)) return; 
    if ((y<0)||(y+2>=_hy)) return; 
    glBegin(style); 
    glVertex3dv(hex[y+1][x ]); 
    glVertex3dv(hex[y ][x ]); 
    glVertex3dv(hex[y ][x+1]); 
    glVertex3dv(hex[y+1][x+1]); 
    glVertex3dv(hex[y+2][x+1]); 
    glVertex3dv(hex[y+2][x ]); 
    glEnd(); 
    } 
//--------------------------------------------------------------------------- 

と使用方法:

hexgrid_init(1.5); 
hexgrid_half_sphere(1.0); 

int x,y; 
glColor3f(0.0,0.2,0.3); 
for (y=0;y<_gy;y++) 
for (x=0;x<_gx;x++) 
    hex_draw(x,y,GL_POLYGON); 
glLineWidth(2); 
glColor3f(1.0,1.0,1.0); 
for (y=0;y<_gy;y++) 
for (x=0;x<_gx;x++) 
    hex_draw(x,y,GL_LINE_LOOP); 
glLineWidth(1); 

とプレビュー:

preview

詳細情報やアイデアについては、関連参照:

+1

ねえ、このソリューションをお手伝いしていただきありがとうございます。私は似たような方法を考えていましたが、実際には小さな間違いがありました。私は 'a = sqrt(x * x + y * y)/ r *(p​​i/2)'を定義しました。しかし、それは私に奇妙な結果をもたらしました。私は再び上記の質問に2つの結果を添付しました。助けてくれてありがとう。私はビットを微調整する必要があるが、私の問題を示した:) –

+0

ちょっと@Spektreはコードサンプルのために十分にあなたを感謝することはできません。もう一度私を助けてくれました:) –

+0

@hadik助けになることを嬉しく思います。 – Spektre