3Dサンプル(sketch_3D_Arc_Straight)円弧+直線スケッチ
3Dサンプル(sketch_3D_Arc_Straight)円弧+直線スケッチは以下となります。
//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);
}