gts: 三角形網をgtsファイル以外のフォーマットに書き出すには

gtsファイルのフォーマットはなかなか良くできているフォーマットですが、
他のソフトとのやり取りは期待できません。
こんな場合はやはり汎用的なフォーマットで書き出す必要があるでしょう。

できた三角形網をすべて書き出すには、
gts_surface_foreach_face()関数を使います。
以下の例は、shapelibを使ってshp形式で書き出す例です。

   1: 
   2: // gts_surface_foreach_face関数用コールバック
   3: static void write_triangle( GtsTriangle *t, SHPHandle *h )
   4: {
   5:   SHPObject *psOutObj;
   6:   GtsPoint *p1, *p2, *p3;
   7:   double adfX[4], adfY[4], adfZ[4];
   8: 
   9:   p1 = GTS_POINT( GTS_SEGMENT( t->e1 )->v1 );
  10:   p2 = GTS_POINT( GTS_SEGMENT( t->e1 )->v2 );
  11:   p3 = GTS_POINT( gts_triangle_vertex( t ) );
  12: 
  13:   adfX[0] = p1->x;
  14:   adfY[0] = p1->y;
  15:   adfZ[0] = p1->z;
  16:   adfX[1] = p2->x;
  17:   adfY[1] = p2->y;
  18:   adfZ[1] = p2->z;
  19:   adfX[2] = p3->x;
  20:   adfY[2] = p3->y;
  21:   adfZ[2] = p3->z;
  22:   adfX[3] = p1->x;
  23:   adfY[3] = p1->y;
  24:   adfZ[3] = p1->z;
  25: 
  26:   psOutObj = SHPCreateSimpleObject( SHPT_POLYGON, 4, adfX, adfY, adfZ );
  27:   SHPWriteObject( *h, -1, psOutObj );
  28:   SHPDestroyObject( psOutObj );
  29: }
  30: 
  31:   // 中略
  32: 
  33:   //
  34:   // surfaceに三角形網が作成されているとする
  35:   //
  36: 
  37:   SHPHandle hSHP_Out;
  38: 
  39:   hSHP_Out = SHPCreate( szFName, SHPT_POLYGON );
  40: 
  41:   gts_surface_foreach_face( surface, (GtsFunc)write_triangle, &hSHP_Out );
  42: 
  43:   SHPClose( hSHP_Out );

これで、作成結果を元の点群と重ねてみて確認したりすることができます。

下の図は、制約付きdelaunay三角形網の作成
で作成した三角形網と、入力点群、制約線をQGISで重ねて表示したところです。

実行結果

実行結果
アーカイブ