情報工学基礎演習 3D描画用ツール
C言語 ソースコード
--------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
void madotuki();
int menu();
void s_box(double ,double ,double ,double ,double ,double ,double ,double ,double ,double ,int );
int main(){
int n;
while(1){
switch(menu()){
case 1:
madotuki();
break;
case 0:
return 0;
break;
default:
break;
}
}
}
int menu(){
int n;
printf("-----menu----\n");
printf("1:窓付きの建物\n");
printf("0:終了\n");
printf("-------------\n");
scanf("%d",&n);
return n;
}
void madotuki(){
int i,j,k,l,n;
double x_l,z_l;
double x,z;
double c_x,c_z;
double x1,z1;
double x2,z2;
double r,g,b;
double kai,len,high,takasa;
double h_ta,h_yo;
double touka;
int mai;
printf("窓をはる面がxなら 1 zなら 2");
scanf("%d",&n);
printf("対角線の2点を入力(x,z座標)(窓を貼るほうを先に入力)\n");
scanf("%lf %lf",&x1,&z1);
scanf("%lf %lf",&x2,&z2);
if(x1<x2){
x=x1;
x1=x2;
x2=x;
}
if(z1<z2){
z=z1;
z1=z2;
z2=z;
}
x_l = x1 - x2;
z_l = z1 - z2;
c_x=( x1 + x2 )/ 2;
c_z=( z1 + z2 )/ 2;
printf("建物の階数を入力");
scanf("%lf",&kai);
printf("一階あたりの高さを入力");
scanf("%lf",&takasa);
printf("窓の高さ 長さを入力");
scanf("%lf %lf",&high,&len);
printf("窓の透過度を入力");
scanf("%lf",&touka);
if(high > takasa || len > x_l){
printf("窓のほうがでかいね\n");
return ;
}
printf("%f枚まで貼れます。何枚貼りますか?",(x_l)/len);
scanf("%d",&mai);
/* 柱の長さ と 壁の設置 */
h_yo= (x_l - mai * len)/(mai + 1);
h_ta= (takasa - high)/2;
printf("R G Bを入力(壁)");
scanf("%lf %lf %lf",&r,&g,&b);
/* うえから 間 窓 最後の間 壁の上 壁の下*/
for(i=0;i<kai;i++){
for(k=1;k<=mai;k++){
s_box((x2 + h_yo*k + len*(k-1))/2 , takasa*i + takasa/2 , z2+0.25 , r , g , b , h_yo , high , 0.5 , 0,n);
s_box((x2 + h_yo*k + len*k)/2 , takasa*i + takasa/2 , z2+0.25 , r , g , b , len , high , 0.5 , touka,n);
}
s_box((x2 + h_yo*k + len*(k-1))/2 , takasa*i + takasa/2 , z2+0.25 , r , g , b , h_yo , high , 0.5 , 0,n);
s_box( c_x , takasa*i + h_ta/2,z2+0.25 , r , g , b , x_l , h_ta , 0.5 , 0,n);
s_box( c_x , takasa*i + (takasa - high - h_ta)/2 , z2+0.25 , r , g , b , x_l , h_ta , 0.5 , 0,n);
s_box( c_x , takasa*(i+1)-0.25 , c_z , r , g , b , x_l , 0.5 , z_l , 0,n);
}
for(i=0;i<kai;i++){
for(k=1;k<=mai;k++){
s_box((x2 + h_yo*k + len*(k-1))/2 , takasa*i + takasa/2 , z1-0.25 , r , g , b , h_yo , high, 0.5 , 0,n);
s_box((x2 + h_yo*k + len*k)/2 , takasa*i + takasa/2 , z1-0.25 , 0 , 1 , 1 , len , high , 0.5 , touka,n);
}
s_box((x2 + h_yo*k + len*(k-1))/2 , takasa*i + takasa/2 , z1-0.25 , r , g , b , h_yo , high , 0.5 , 0,n);
s_box( c_x , takasa*i + h_ta/2,z1-0.25 , r , g , b , x_l , h_ta , 0.5 , 0,n);
s_box( c_x , takasa*i + (takasa - high - h_ta)/2 , z1-0.25 , r , g , b , x_l , h_ta , 0.5 , 0,n);
}
s_box( x1 - 0.25 , (takasa * kai)/2 , c_z , r , g , b , 0.5 , takasa * kai , z_l , 0,n);
s_box( x2 - 0.25 , (takasa * kai)/2 , c_z , r , g , b , 0.5 , takasa * kai , z_l , 0,n);
}
void s_box(double px,double py,double pz,double r,double g,double b,double sx,double sy,double sz,double t,int n){
if(n==1)printf("BOX{ P %f %f %f C %f %f %f S %f %f %f T %f }\n",px,py,pz,r,g,b,sx,sy,sz,t);
if(n==2)printf("BOX{ P %f %f %f C %f %f %f S %f %f %f T %f }\n",pz,py,px,r,g,b,sz,sy,sx,t);
}
------------------------------------------------------------------------------------------------------------------
使用マニュアル
煮詰まってきてわけわかんないので適当に実行しながら覚えて
s_box(x2 + h_yo*k + len*k + h_yo/2 , takasa*i + takasa/2 , z2+0.25 , r , g , b , h_yo , high , 0.5 , 0,n);
s_box(x2 + h_yo*(k+1) + len*k + len/2 , takasa*i + takasa/2 , z2+0.25 , r , g , b , len , high , 0.5 , touka,n);
k=0から
最終更新:2007年12月05日 23:51