home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / MACRO / CREATEB.M < prev    next >
Text File  |  1996-06-24  |  6KB  |  253 lines

  1. var private const    Mensu_pos = 1;
  2. var private const    Length_pos = 2;
  3. var private point[2];
  4.  
  5. function private InputSetup()
  6. {
  7.     var    men[6], i, j, length, key, v;
  8.  
  9.     men = {"  20 面", "  80 面", " 320 面", " 1280面"," 5120面","20480面" };
  10.  
  11.     length = abs(Position(cur) - Position(point[0]));
  12.  
  13.     DlogOpen( "球作成 設定変更", 3, "キャンセル ", " 決定 " );
  14.     DlogString( 0, "半径", substr(tostring( length ), 8 ), 10 );
  15.     DlogSelect( 2, "面数", men, Ball_level );
  16.     key = DlogWait();
  17.     if( key == 0 )
  18.         return FALSE;
  19.     else
  20.     {
  21.         j = DlogAnswer( 0 );
  22.         if( j != substr(tostring( length ), 8 ))
  23.         {
  24.             if( MouseWindow() == WIN_YZ )
  25.                 v = vector( 0, 1, 0 );
  26.             else
  27.                 v = vector( 1, 0, 0 );
  28.             cur = point[0] + v*atof(j);
  29.             Cursor( cur );
  30.             Status_title[Length_pos] = "半径:"+ substr( j, 8 );
  31.         }
  32.         Ball_level = DlogAnswer( 2 );
  33.         j = 20;
  34.         for( i = 0;i<Ball_level;i++ )
  35.             j = j*4;
  36.         Status_title[Mensu_pos] = "面数: "+tostring( j, 6 )+" ";
  37.         DrawStatus();
  38.     }
  39. }
  40.  
  41. //
  42. //    Tamenのサブルーチン
  43. //
  44. function private MakePoly( length, level, v0, v1, v2, c )
  45. {
  46.     var    v3, v4, v5;
  47.     if( level == 0 )
  48.     {
  49.         PolySetVertex( c + (v0*length), 0 );
  50.         PolySetVertex( Vertex(v1*length)+c, 1 );
  51.         PolySetVertex( Vertex(v2*length)+c, 2 );
  52.         PolyVertexs( 3 );
  53.         PolyType( POLY_SIMPLE );
  54.         PolyAttr( AttrCurrent() );
  55.         PolyObj( ObjCurrent() );
  56.         PolyAppend( TRUE );
  57.         DrawCurrent( TRUE );
  58.     }
  59.     else
  60.     {
  61.         v3 = unit(v0+v1);
  62.         v4 = unit(v1+v2);
  63.         v5 = unit(v2+v0);
  64.         MakePoly( length, level-1, v0, v3, v5, c );
  65.         MakePoly( length, level-1, v3, v4, v5, c );
  66.         MakePoly( length, level-1, v1, v4, v3, c );
  67.         MakePoly( length, level-1, v2, v5, v4, c );
  68.     }
  69. }
  70.  
  71. //
  72. //    正20面体を発生
  73. //    length:半径
  74. //    level:丸めレベル
  75. //    c:中心座標
  76. //
  77. function private Tamen( length, level, c )
  78. {
  79.     var    theta;
  80.     var    ue_ten[6], shita_ten[6];
  81.     var    i;
  82.     var    v[3];
  83.     var    temp_vertex;
  84.  
  85.     theta = PI/2 - 2.0*acos( 0.5/sin(PI/5));
  86.     for( i = 0;i<5;i++ )
  87.     {
  88.         ue_ten[i] = vector( cos(PI*2/5*i)*cos(theta), sin(PI*2/5*i)*cos(theta), sin(theta));
  89.         shita_ten[i] = vector( cos(PI/5+PI*2/5*i)*cos(theta), sin(PI/5+PI*2/5*i)*cos(theta), -sin(theta));
  90.     }
  91.     ue_ten[5] = ue_ten[0];
  92.     shita_ten[5] = shita_ten[0];
  93.  
  94.     for(i = 0;i<5;i++ )
  95.     {
  96.         v[0] = vector( 0, 0, 1 );
  97.         v[1] = ue_ten[i];
  98.         v[2] = ue_ten[i+1];
  99.         MakePoly( length, level, v[0], v[1], v[2], c );
  100.     }
  101.     for( i = 0;i<5;i++ )
  102.     {
  103.         v[0] = ue_ten[i];
  104.         v[1] = shita_ten[i];
  105.         v[2] = ue_ten[i+1];
  106.         MakePoly( length, level, v[0], v[1], v[2], c );
  107.         v[0] = ue_ten[i+1];
  108.         v[1] = shita_ten[i];
  109.         v[2] = shita_ten[i+1];
  110.         MakePoly( length, level, v[0], v[1], v[2], c );
  111.     }
  112.     for(i = 0;i<5;i++ )
  113.     {
  114.         v[0] = vector( 0, 0, -1 );
  115.         v[1] = shita_ten[i+1];
  116.         v[2] = shita_ten[i];
  117.         MakePoly( length, level, v[0], v[1], v[2], c );
  118.     }
  119. }
  120.  
  121. //
  122. //    球作成
  123. //
  124. function CreateBall()
  125. {
  126.     var temp, i, length;
  127.     var vers, key, prev_sel;
  128.     var suu[6];
  129.     var pick ,draw_flag = ON;
  130.  
  131.     length = 0.0;
  132.     suu[0] = 20;
  133.     for( i = 1;i<6;i++ )
  134.         suu[i] = suu[i-1]*4;
  135.  
  136.     PushMenu();
  137.     Status_org = Status_title;
  138.     ClearStatus();
  139.     MenuPosition( Menu( " 動作設定(&S)",
  140.             "設定変更",        InputSetup,
  141.             "--------",        SEPARATE_MENU,
  142.             "作成中止    ESC",    MenuQuit
  143.         ), Menu_Title );
  144.  
  145.     prev_sel = Select();
  146.     quit_flag = FALSE;
  147.  
  148.     Status_title[0] = "【球作成中】";
  149.     Status_title[Mensu_pos] = "面数: "+tostring(suu[Ball_level], 6 )+" ";
  150.     Status_title[Length_pos] = "半径:"+substr(tostring( length ),8);
  151.     DrawStatus();
  152.  
  153.     point[0] = Cursor();
  154.     cur = point[0];
  155.     pick = cur;
  156.     vers = 1;
  157.     input_flag = OFF;
  158.     while( TRUE )
  159.     {
  160.         if( draw_flag == ON )
  161.             DrawLine( point[0], cur );
  162.         key = WaitEvent();
  163.         if( key )
  164.             input_flag = ON;
  165.         if(( ShiftStat() & 1 ) == 1)
  166.         {
  167.             cur = Cursor();
  168.             TrimCursor(point[0], MouseWindow());
  169.             Cursor( cur );
  170.         }
  171.         else
  172.             cur = Cursor();
  173.         key = KeyCode();
  174.         if( input_flag | key == INPUT_KEY )
  175.         {
  176.             point[vers] = cur;
  177.             if( cur == point[0] )
  178.             {
  179.                 Warning();
  180.                 if( MESSAGE == ON )
  181.                     Message( "最初に指定した点と同じ点です\n"
  182.                         +"2点目は半径を指定してください" );
  183.             }
  184.             else
  185.                 break;
  186.         }
  187.         else if( key == ESC | key == BS | quit_flag == TRUE )
  188.         {
  189.             PopandClear( OVERWRITE );
  190.             return;
  191.         }
  192.         else if( key == KEY_ROLLUP )
  193.         {
  194.             if( Ball_level < 5 )
  195.             {
  196.                 Ball_level++;
  197.                 Status_title[Mensu_pos] =
  198.                     "面数: "+tostring(suu[Ball_level], 6 )+" ";
  199.             }
  200.             else
  201.             {
  202.                 Warning();
  203.                 if( MESSAGE == ON )
  204.                     Message( "球の面数はこれ以上は増やせません" );
  205.             }
  206.         }
  207.         else if( key == KEY_ROLLDOWN )
  208.         {
  209.             if( Ball_level > 0 )
  210.             {
  211.                 Ball_level--;
  212.                 Status_title[Mensu_pos] =
  213.                     "面数: "+tostring(suu[Ball_level], 6 )+" ";
  214.             }
  215.             else
  216.             {
  217.                 Warning();
  218.                 if( MESSAGE == ON )
  219.                     Message( "球の面数はこれ以下には減らせません" );
  220.             }
  221.         }
  222.         else
  223.             temp = KeyProcess( key );
  224.         length = abs(Position( cur )- Position(point[0]));
  225.         Status_title[Length_pos] = "半径:"+substr(tostring( length ),8);
  226.         DrawStatus();
  227.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  228.         {
  229.             draw_flag = ON;
  230.             DrawLine( point[0], pick );
  231.         }
  232.         else
  233.             draw_flag = OFF;
  234.         pick = Cursor();
  235.         input_flag = OFF;
  236.     }
  237.     Clear( OVERWRITE );
  238.     if( SelectPolygons( prev_sel ) != 0 )
  239.     {
  240.         SelectAllFalse();
  241.         SelectAll( FALSE );
  242.     }
  243.     length = abs( Position(point[1]) - Position(point[0] ));
  244.     ViewCursor( OFF );
  245.     Tamen( length, Ball_level, point[0] );
  246.     ViewCursor( ON );
  247.     UpdateObject();
  248.     pers_rotation_flag = FALSE;
  249.     PopMenu();
  250.     Status_title = Status_org;
  251.     DrawStatus();
  252. }
  253.