3D-isa

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

情報工学基礎演習 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から