//sketch_3D_Arc_Straight 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(2,2,2); //void Z_Parasol(int Sn,float R,float A)//パラソル面 //Z_Parasol(4,72.5,60);//パラソル面 Z_Arc_Straight(40,20,70,20); } void Z_Arc_Straight(float R1,float R2,float L,float H) { int Pn1=6;//R2ポイント数 int Pn2=6;//R1ポイント数 int Pn=4*Pn1+2+2*Pn2+3;//R2ポイント数 float[] X=new float[Pn]; float[] Y=new float[Pn]; float L0=R1*L/(R1-R2); float A=acos(R1/L0); int i; float Ai1; for(i=0;i<=Pn1;i++) { Ai1=i*A/Pn1; X[i]=R2*cos(Ai1)+L; Y[i]=R2*sin(Ai1); } float Ai2; float dA2=(PI-2*A)/Pn2; for(i=0;i<=Pn2;i++) { Ai2=A+i*dA2; X[Pn1+i+1]=R1*cos(Ai2); Y[Pn1+i+1]=R1*sin(Ai2); } for(i=0;i<=2*Pn1;i++) { Ai1=PI-A+i*A/Pn1; X[Pn1+Pn2+2+i]=R2*cos(Ai1)-L; Y[Pn1+Pn2+2+i]=R2*sin(Ai1); } for(i=0;i<=Pn2;i++) { Ai2=PI+A+i*dA2; X[3*Pn1+Pn2+i+3]=R1*cos(Ai2); Y[3*Pn1+Pn2+i+3]=R1*sin(Ai2); } for(i=0;i<=Pn1;i++) { Ai1=2*PI-A+i*A/Pn1; X[3*Pn1+2*Pn2+i+4]=R2*cos(Ai1)+L; Y[3*Pn1+2*Pn2+i+4]=R2*sin(Ai1); } Z_Side(Pn,X,Y,H);//側面 Z_Polyon_PZS(Pn,X,Y,H/2); Z_Polyon_PZS(Pn,X,Y,-H/2); } 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_PZS(int Pn,float X[],float Y[],float Z)//多角形Z指定タイプ { int i; beginShape(); for (i = 0; i < Pn; i++) { vertex(X[i],Y[i],Z); } endShape(CLOSE); }