3Dサンプル(sketch_3D_Bird_box) 巣箱スケッチ
3Dサンプル(sketch_3D_Bird_box) 巣箱スケッチは以下となります。
//sketch_3D_Bird_box 巣箱
Part P;//使用クラスの定義
void setup()
{
size(600, 600, P3D);
P=new Part();//My_OBクラスのオブジェクトを生成
}
void draw()
{
background(255,255,255);
lights();
ortho(-width/2, width/2, -height/2, height/2); // Same as ortho()
translate(width / 2, height / 2);
rotateY(map(mouseX, 0, width, -PI/1, PI/1));
rotateX(map(mouseY, 0, height, PI/1, -PI/1));
//noStroke();
strokeWeight(0.5);
scale(2,2,2);
float[] L={13,150,180,180,90,130,150};
translate(0,L[2]/2,0);
P.Bird_Box(45*PI/180,20,L);
}
//部品
class Part
{
void Bird_Box(float A,float R,float L[])
{
fill(206, 173,52);
Part1(A,R,L);
Part2(A,R,L);
Part3(A,R,L);
fill(0, 150, 0);
Part4(A,R,L);
}
void Part4(float A,float R,float L[])
{
int Pn=7;//ポイント数
float[] X=new float[Pn];
float[] Y=new float[Pn];
X[0]=0;Y[0]=-L[2];
X[1]=-L[3]/2;Y[1]=Y[0]+L[3]*tan(A)/2;
X[2]=X[1]+L[0]*sin(A);Y[2]=Y[1]+L[0]*cos(A);
X[3]=0;Y[3]=Y[0]+L[0]/cos(A);
X[4]=-X[2];Y[4]=Y[2];
X[5]=-X[1];Y[5]=Y[1];
X[6]=X[0];Y[6]=Y[0];
pushMatrix();
Z_Side(Pn,X,Y,L[6]);//側面
translate(0,0,-L[6]/2);
Z_Polyon(Pn,X,Y);//多角形
translate(0,0,L[6]);
Z_Polyon(Pn,X,Y);//多角形
popMatrix();
float LH=sqrt((X[1]-X[0])*(X[1]-X[0])+ (Y[1]-Y[0])*(Y[1]-Y[0]));
println("Part4 W=\t" + (L[6]) + "\tH=\t" + nf(LH,0,1));
}
void Part3(float A,float R,float L[])
{
int Pn=5;//ポイント数
float[] X=new float[Pn];
float[] Y=new float[Pn];
X[0]=L[1]/2;Y[0]=0;
X[1]=X[0];Y[1]=-(L[2]-L[0]/cos(A)-L[1]*tan(A)/2);
X[2]=L[1]/2-L[0];Y[2]=-(L[2]-L[0]/cos(A)-L[1]*tan(A)/2+L[0]*tan(A));
X[3]=X[2];Y[3]=0;
X[4]=X[0];Y[4]=Y[0];
pushMatrix();
Z_Side(Pn,X,Y,L[5]-2*L[0]);//側面
rotateY(PI);
Z_Side(Pn,X,Y,L[5]-2*L[0]);//側面
popMatrix();
println("Part3 W=\t" + (L[5]-2*L[0]) + "\tH=\t" + nf(abs(Y[2]),0,1));
}
void Part2(float A,float R,float L[])
{
pushMatrix();
translate(0,-L[0]/2,0);
box(L[1]-2*L[0],L[0],L[5]-2*L[0]);
popMatrix();
println("Part2 W=\t" + (L[1]-2*L[0]) + "\tH=\t" + nf((L[5]-2*L[0]),0,1));
}
void Part1(float A,float R,float L[])
{
int Pn=6;//ポイント数
float[] X=new float[Pn];
float[] Y=new float[Pn];
X[0]=-L[1]/2;Y[0]=0;
X[1]=X[0];Y[1]=-(L[2]-L[0]/cos(A)-L[1]*tan(A)/2);
X[2]=0;Y[2]=-(L[2]-L[0]/cos(A));
X[3]=-X[1];Y[3]=Y[1];
X[4]=-X[0];Y[4]=Y[0];
X[5]=X[0];Y[5]=Y[0];
int i;
int Pn2=17;//ポイント数
float[] X2=new float[Pn2];
float[] Y2=new float[Pn2];
for(i=0;i<Pn2;i++)
{
float angle = i*TWO_PI/(Pn2-1);
X2[i]=R*cos(angle);Y2[i]=R*sin(angle)-L[4];
}
pushMatrix();
translate(0,0,-L[5]/2+L[0]/2);
Z_Side(Pn,X,Y,L[0]);//側面
translate(0,0,-L[0]/2);
Z_Polyon(Pn,X,Y);//多角形
translate(0,0,L[0]);
Z_Polyon(Pn,X,Y);//多角形
popMatrix();
pushMatrix();
translate(0,0,L[5]/2-L[0]/2);
Z_Side(Pn,X,Y,L[0]);//側面
Z_Side(Pn2,X2,Y2,L[0]);//側面
translate(0,0,-L[0]/2);
beginShape();
Z_Polyon_P(Pn,X,Y);//多角形
beginContour();
Z_Polyon_M(Pn2,X2,Y2);//多角形
endContour();
endShape(CLOSE);
translate(0,0,L[0]);
beginShape();
Z_Polyon_P(Pn,X,Y);//多角形
beginContour();
Z_Polyon_M(Pn2,X2,Y2);//多角形
endContour();
endShape(CLOSE);
popMatrix();
println("Part1 W=\t" + L[1] + "\tH=\t" + nf(abs(Y[2]),0,1));
}
void Z_Side(int Pn,float X[],float Y[],float L)//側面
{
int i;
beginShape(QUAD_STRIP);
for (i = 0; i < Pn; ++i)
{
vertex(X[i],Y[i], -L/2);
vertex(X[i],Y[i], L/2);
}
endShape(CLOSE);
}
void Z_Polyon(int Pn,float X[],float Y[])//多角形
{
int i;
beginShape();
for (i = 0; i < Pn; ++i)
{
vertex(X[i],Y[i]);
}
endShape(CLOSE);
}
void Z_Polyon_P(int Pn,float X[],float Y[])//多角形反時計回り
{
int i;
for (i = 0; i < Pn; i++)
{
vertex(X[i],Y[i]);
}
}
void Z_Polyon_M(int Pn,float X[],float Y[])//多角形時計回り
{
int i;
for (i = Pn-1; i >= 0; i--)
{
vertex(X[i],Y[i]);
}
}
}