//sketch_3D_Half_Pipe 半パイプ void setup() { size(400, 400, P3D); } 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); fill(255, 255, 255); scale(1, 1,1); pushMatrix(); Z_Half_Pipe(50,30,100);//Half_Pipe 半パイプ translate(0,0,-60); Z_Half_Circle(50,20);//Half_Pipe 半パイプ popMatrix(); } void Z_Half_Pipe(float R1,float R2,float L)//Half_Pipe 半パイプ { int Pn1=8;//R1,R2分割数 int Pn=2*Pn1+3;//全ポイント数 float[] X=new float[Pn]; float[] Y=new float[Pn]; int i; float Ai; for(i=0;i<=Pn1;i++) { Ai=i*PI/Pn1; X[i]=R1*cos(Ai); Y[i]=R1*sin(Ai); } for(i=0;i<=Pn1;i++) { Ai=PI-i*PI/Pn1; X[i+Pn1+1]=R2*cos(Ai); Y[i+Pn1+1]=R2*sin(Ai); } X[2*Pn1+2]=R1;Y[2*Pn1+2]=0; pushMatrix(); Z_Side(Pn,X,Y,L);//側面 translate(0,0,-L/2); Z_Polyon(Pn,X,Y);//多角形 translate(0,0,L); Z_Polyon(Pn,X,Y);//多角形 popMatrix(); } void Z_Half_Circle(float R1,float L)//Half_Pipe 半パイプ { int Pn1=8;//R1分割数 int Pn=Pn1+2;//全ポイント数 float[] X=new float[Pn]; float[] Y=new float[Pn]; int i; float Ai; for(i=0;i<=Pn1;i++) { Ai=i*PI/Pn1; X[i]=R1*cos(Ai); Y[i]=R1*sin(Ai); } X[Pn1+1]=R1;Y[Pn1+0]=0; pushMatrix(); Z_Side(Pn,X,Y,L);//側面 translate(0,0,-L/2); Z_Polyon(Pn,X,Y);//多角形 translate(0,0,L); Z_Polyon(Pn,X,Y);//多角形 popMatrix(); } 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); }