前提
目的:
・Processingでベジェ曲線を使って円を表現したい。(4分円以外も表現可)
*ellipse()を使えば簡単に円を描画できるが4分円である。
・fill()の値を指定したら円が塗りつぶされる。
問題:
・「発生している問題」のプログラムだと円を完全に塗りつぶせない。
・「試したこと」のプログラムなら円を塗りつぶすことができるが、簡潔にしたい。
*塗られていない部分が正多角形なので正多角形描画プログラムを追加
発生している問題
Java
1void setup() 2{ 3 size(960, 960); 4 background(255); 5} 6 7void draw() 8{ 9 strokeWeight(1); 10 stroke(0,0,0); 11 fill(255,0,0); 12 13 translate(x, y); 14 15 int r = 400; 16 int p = 4; // p -> Num of polygon 17 18 float a = TWO_PI / p; 19 float c = tan(a * 0.25) * 4/3; 20 21 pushMatrix(); 22 beginShape(); 23 for(int v = 0; v < p; v++) // v -> vertexIndex 24 { 25 float x0_0 = r * cos(a * v + HALF_PI); 26 float y0_0 = r * sin(a * v + HALF_PI); 27 float x1_0 = r * cos(a * (v+1) + HALF_PI); 28 float y1_0 = r * sin(a * (v+1) + HALF_PI); 29 float x0_1 = x0_0 - (r * c * cos(a * v)); 30 float y0_1 = y0_0 - (r * c * sin(a * v)); 31 float x1_1 = x1_0 + (r * c * cos(a * (v+1))); 32 float y1_1 = y1_0 + (r * c * sin(a * (v+1))); 33 34 bezier(x0_0, -y0_0, x0_1, -y0_1, x1_1, -y1_1, x1_0, -y1_0); 35 } 36 endShape(CLOSE); 37 popMatrix(); 38}
試したこと
Java
1void setup() 2{ 3 size(960, 960); 4 background(255); 5} 6 7void draw() 8{ 9 strokeWeight(1); 10 stroke(0,0,0); 11 fill(255,0,0); 12 13 translate(x, y); 14 15 int r = 400; 16 int p = 4; // p -> Num of polygon 17 18 float a = TWO_PI / p; 19 float c = tan(a * 0.25) * 4/3; 20 21 pushMatrix(); 22 beginShape(); 23 for(int v = 0; v < p; v++) // v -> vertexIndex 24 { 25 float x0_0 = r * cos(a * v + HALF_PI); 26 float y0_0 = r * sin(a * v + HALF_PI); 27 float x1_0 = r * cos(a * (v+1) + HALF_PI); 28 float y1_0 = r * sin(a * (v+1) + HALF_PI); 29 float x0_1 = x0_0 - (r * c * cos(a * v)); 30 float y0_1 = y0_0 - (r * c * sin(a * v)); 31 float x1_1 = x1_0 + (r * c * cos(a * (v+1))); 32 float y1_1 = y1_0 + (r * c * sin(a * (v+1))); 33 34 bezier(x0_0, -y0_0, x0_1, -y0_1, x1_1, -y1_1, x1_0, -y1_0); 35 } 36 endShape(CLOSE); 37 popMatrix(); 38 39 noStroke(); 40 pushMatrix(); 41 beginShape(); 42 for(int v = 0; v < p; v++) // v -> vertexIndex 43 { 44 vertex(r * sin(TWO_PI*v / p), -r * cos(TWO_PI*v / p)); // TWO_PI = 2 * PI 45 } 46 endShape(CLOSE); 47 popMatrix(); 48}
・塗りつぶされなかった部分は正多角形になっている。
・塗りつぶされなかった部分を正多角形で塗りつぶす。
補足情報(FW/ツールのバージョンなど)
使用したソフト:Processing4
回答2件
あなたの回答
tips
プレビュー