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 >
Wrap
Text File
|
1996-06-24
|
6KB
|
253 lines
var private const Mensu_pos = 1;
var private const Length_pos = 2;
var private point[2];
function private InputSetup()
{
var men[6], i, j, length, key, v;
men = {" 20 面", " 80 面", " 320 面", " 1280面"," 5120面","20480面" };
length = abs(Position(cur) - Position(point[0]));
DlogOpen( "球作成 設定変更", 3, "キャンセル ", " 決定 " );
DlogString( 0, "半径", substr(tostring( length ), 8 ), 10 );
DlogSelect( 2, "面数", men, Ball_level );
key = DlogWait();
if( key == 0 )
return FALSE;
else
{
j = DlogAnswer( 0 );
if( j != substr(tostring( length ), 8 ))
{
if( MouseWindow() == WIN_YZ )
v = vector( 0, 1, 0 );
else
v = vector( 1, 0, 0 );
cur = point[0] + v*atof(j);
Cursor( cur );
Status_title[Length_pos] = "半径:"+ substr( j, 8 );
}
Ball_level = DlogAnswer( 2 );
j = 20;
for( i = 0;i<Ball_level;i++ )
j = j*4;
Status_title[Mensu_pos] = "面数: "+tostring( j, 6 )+" ";
DrawStatus();
}
}
//
// Tamenのサブルーチン
//
function private MakePoly( length, level, v0, v1, v2, c )
{
var v3, v4, v5;
if( level == 0 )
{
PolySetVertex( c + (v0*length), 0 );
PolySetVertex( Vertex(v1*length)+c, 1 );
PolySetVertex( Vertex(v2*length)+c, 2 );
PolyVertexs( 3 );
PolyType( POLY_SIMPLE );
PolyAttr( AttrCurrent() );
PolyObj( ObjCurrent() );
PolyAppend( TRUE );
DrawCurrent( TRUE );
}
else
{
v3 = unit(v0+v1);
v4 = unit(v1+v2);
v5 = unit(v2+v0);
MakePoly( length, level-1, v0, v3, v5, c );
MakePoly( length, level-1, v3, v4, v5, c );
MakePoly( length, level-1, v1, v4, v3, c );
MakePoly( length, level-1, v2, v5, v4, c );
}
}
//
// 正20面体を発生
// length:半径
// level:丸めレベル
// c:中心座標
//
function private Tamen( length, level, c )
{
var theta;
var ue_ten[6], shita_ten[6];
var i;
var v[3];
var temp_vertex;
theta = PI/2 - 2.0*acos( 0.5/sin(PI/5));
for( i = 0;i<5;i++ )
{
ue_ten[i] = vector( cos(PI*2/5*i)*cos(theta), sin(PI*2/5*i)*cos(theta), sin(theta));
shita_ten[i] = vector( cos(PI/5+PI*2/5*i)*cos(theta), sin(PI/5+PI*2/5*i)*cos(theta), -sin(theta));
}
ue_ten[5] = ue_ten[0];
shita_ten[5] = shita_ten[0];
for(i = 0;i<5;i++ )
{
v[0] = vector( 0, 0, 1 );
v[1] = ue_ten[i];
v[2] = ue_ten[i+1];
MakePoly( length, level, v[0], v[1], v[2], c );
}
for( i = 0;i<5;i++ )
{
v[0] = ue_ten[i];
v[1] = shita_ten[i];
v[2] = ue_ten[i+1];
MakePoly( length, level, v[0], v[1], v[2], c );
v[0] = ue_ten[i+1];
v[1] = shita_ten[i];
v[2] = shita_ten[i+1];
MakePoly( length, level, v[0], v[1], v[2], c );
}
for(i = 0;i<5;i++ )
{
v[0] = vector( 0, 0, -1 );
v[1] = shita_ten[i+1];
v[2] = shita_ten[i];
MakePoly( length, level, v[0], v[1], v[2], c );
}
}
//
// 球作成
//
function CreateBall()
{
var temp, i, length;
var vers, key, prev_sel;
var suu[6];
var pick ,draw_flag = ON;
length = 0.0;
suu[0] = 20;
for( i = 1;i<6;i++ )
suu[i] = suu[i-1]*4;
PushMenu();
Status_org = Status_title;
ClearStatus();
MenuPosition( Menu( " 動作設定(&S)",
"設定変更", InputSetup,
"--------", SEPARATE_MENU,
"作成中止 ESC", MenuQuit
), Menu_Title );
prev_sel = Select();
quit_flag = FALSE;
Status_title[0] = "【球作成中】";
Status_title[Mensu_pos] = "面数: "+tostring(suu[Ball_level], 6 )+" ";
Status_title[Length_pos] = "半径:"+substr(tostring( length ),8);
DrawStatus();
point[0] = Cursor();
cur = point[0];
pick = cur;
vers = 1;
input_flag = OFF;
while( TRUE )
{
if( draw_flag == ON )
DrawLine( point[0], cur );
key = WaitEvent();
if( key )
input_flag = ON;
if(( ShiftStat() & 1 ) == 1)
{
cur = Cursor();
TrimCursor(point[0], MouseWindow());
Cursor( cur );
}
else
cur = Cursor();
key = KeyCode();
if( input_flag | key == INPUT_KEY )
{
point[vers] = cur;
if( cur == point[0] )
{
Warning();
if( MESSAGE == ON )
Message( "最初に指定した点と同じ点です\n"
+"2点目は半径を指定してください" );
}
else
break;
}
else if( key == ESC | key == BS | quit_flag == TRUE )
{
PopandClear( OVERWRITE );
return;
}
else if( key == KEY_ROLLUP )
{
if( Ball_level < 5 )
{
Ball_level++;
Status_title[Mensu_pos] =
"面数: "+tostring(suu[Ball_level], 6 )+" ";
}
else
{
Warning();
if( MESSAGE == ON )
Message( "球の面数はこれ以上は増やせません" );
}
}
else if( key == KEY_ROLLDOWN )
{
if( Ball_level > 0 )
{
Ball_level--;
Status_title[Mensu_pos] =
"面数: "+tostring(suu[Ball_level], 6 )+" ";
}
else
{
Warning();
if( MESSAGE == ON )
Message( "球の面数はこれ以下には減らせません" );
}
}
else
temp = KeyProcess( key );
length = abs(Position( cur )- Position(point[0]));
Status_title[Length_pos] = "半径:"+substr(tostring( length ),8);
DrawStatus();
if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
{
draw_flag = ON;
DrawLine( point[0], pick );
}
else
draw_flag = OFF;
pick = Cursor();
input_flag = OFF;
}
Clear( OVERWRITE );
if( SelectPolygons( prev_sel ) != 0 )
{
SelectAllFalse();
SelectAll( FALSE );
}
length = abs( Position(point[1]) - Position(point[0] ));
ViewCursor( OFF );
Tamen( length, Ball_level, point[0] );
ViewCursor( ON );
UpdateObject();
pers_rotation_flag = FALSE;
PopMenu();
Status_title = Status_org;
DrawStatus();
}