3Dワイヤーフレーム


3Dワイヤーフレーム

ワイヤーフレームモデルを表示するプログラム。
行列演算なんか無理なので、極座標系を採用。カメラを縦回転しない代わりに
比較的高速に表示できるようにした。
といってももともとSPALM向けに作った物ではないので、遅い。
SPALM用の最適化をちゃんとすれば1.5倍くらいのスピードは出るかもしれない。
特に変わったアルゴリズムは使ってない。

soft1("EXIT")
@(VY,90,330,210,270,270,3,0,354,315,357,0,6,45,90,270,270)
@(VZ,2,358,358,300,100,170,176,170,179,10,4,10,1,260,200,0)
@(VD,38,10,10,6,8,25,40,25,9,25,40,25,9,15,10,8)
@(LINE,-999,0100,0200,0300,0400,0401,0301,0402,0302,0201,-559,0502,0605,0706,0807,0901,1009,1110,1211,1303,1413)
@(CRCL,-940,1515)
PN=16
LN=23
CN=2
ox=0
oy=15
oz=80
ou=348
cy=0
label 2
CRCL[1]=1515+(ANM++&3)
lock()
col(0)
frect(0,0,240,240)
for(kx=(ox*cos(cy)+oz*sin(cy))*100,kz=(oz*cos(cy)-ox*sin(cy))*100,display=1,i=PN;i;){
    if(0<tz=(kz+VD[--i]*(sin(VY[i]-cy+ou)*cos(VZ[i])))/285){
        (tx[i]=120+(kx+VD[i]*(cos(VZ[i])*cos(VY[i]-cy+ou)))/tz,
        ty[i]=120+(oy*100+VD[i]*(sin(VZ[i])))*100/tz,
        tz[i]=tz)
    }else{
        display=0
        break
    }
}
if(display){
    for(i=0;i<LN;++i){
        if(0<=J=LINE[i]){
            line(tx[J%100],ty[J%100],tx[J/100],ty[J/100])
        }else{
            color(-J/100*28,-J/10%10*28,-J%10*28)
        }
    }
    for(i=0;i<CN;++i){
        if(0<=J=CRCL[i]){
            arc(tx[j=J/100%50]-r=J%100*2000/tz[i],ty[j]-r,r*2,r*2)
        }else{
            color(-J/100*28,-J/10%10*28,-J%10*28)
        }
    }
}
unlock(1)
if(scan&32768){oz=oz-8}
if(scan&4096){oz=oz+8}
if(scan&8192){cy=cy-4}
if(scan&16384){cy=cy+4}
if(scan&4){oy=oy-4}
if(scan&256){oy=oy+4}
if(scan&16){ox=ox-4}
if(scan&64){ox=ox+4}
if(scan&2){ou=ou-4}
if(scan&8){ou=ou+4}
if(input(0)==131072){end}
goto 2