質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

1036閲覧

Processingでfill()で値を指定したら円が塗りつぶされる。ellipse()を使わない方法

ghwchikxpgns

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

1グッド

0クリップ

投稿2022/11/24 14:21

編集2022/11/24 14:28

前提

目的:
・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

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2022/11/24 22:45

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11271515476 「マルチポスト」に際してはローカルルールがあるので対処してください。 https://teratail.com/help#posted-otherservice 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。 また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」
ghwchikxpgns

2022/11/25 01:01 編集

取り敢えずteratailを知らない人の為に、複数のサイトに投稿した方がどちらかに回答がつくと考え投稿しました。 そして片方に回答が付き、解決したら未回答の方のサイトに解決URLを貼るつもりで考えていました。 マルチポストの推奨がされていないことから、teratailで解決した為、知恵袋の方は削除しました。
1T2R3M4

2022/11/25 04:11

>マルチポストの推奨がされていないこと 登録した時からわかっていたことでは。 質問する時にも項目は表示されていたような気がしますが。
thkana

2022/11/25 04:13

> 知恵袋の方は削除しました。 解決には至らなかったにしても、あなたの質問に多少なりとも時間を使った回答者の行為?好意は無に帰しても構わない、という考えなのですね。
guest

回答2

0

ベストアンサー

bezierではbeginShapeは効いていないというか、それぞれ単独の曲線になっている気がします。
bezierVertexなら一連の曲線と認識されます。
bezier() / Reference / Processing.org
bezierVertex() / Reference / Processing.org

Processing

1void setup() { 2 size(960, 960); 3} 4 5void draw() { 6 background(255); 7 fill(255, 0, 0); 8 translate(width/2, height/2); 9 10 int r = 400; 11 int p = 4; 12 float a = TWO_PI / p; 13 float c = tan(a * 0.25) * 4 / 3; 14 15 beginShape(); 16 vertex(r * cos(HALF_PI), -r * sin(HALF_PI)); 17 for (int v = 0; v < p; v++) { 18 float x0_0 = r * cos(a * v + HALF_PI); 19 float y0_0 = r * sin(a * v + HALF_PI); 20 float x1_0 = r * cos(a * (v + 1) + HALF_PI); 21 float y1_0 = r * sin(a * (v + 1) + HALF_PI); 22 float x0_1 = x0_0 - (r * c * cos(a * v)); 23 float y0_1 = y0_0 - (r * c * sin(a * v)); 24 float x1_1 = x1_0 + (r * c * cos(a * (v + 1))); 25 float y1_1 = y1_0 + (r * c * sin(a * (v + 1))); 26 27 //bezier(x1, y1, cpx1, cpy1, cpx2, cpy2, x2, y2); 28 //bezier(x0_0, -y0_0, x0_1, -y0_1, x1_1, -y1_1, x1_0, -y1_0); 29 30 //bezierVertex(cpx1, cpy1, cpx2, cpy2, x, y); 31 bezierVertex(x0_1, -y0_1, x1_1, -y1_1, x1_0, -y1_0); 32 } 33 endShape(); 34}

目的がよくわかりませんがarcは使えないでしょうか。
arc() / Reference / Processing.org

投稿2022/11/24 15:34

TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「Processingで正n角形を描画し、塗りつぶせ。」という問題が出されたとき、
本来ならvertex()を使わなければならないところをline()でやっているのと似たような問題でしたね。

わざわざ回答ありがとうございます。
無事に解決しました。

イメージ説明

投稿2022/11/25 00:42

ghwchikxpgns

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問