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

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

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

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

Q&A

解決済

3回答

3167閲覧

ランダム色のコード簡略化

KeeganP

総合スコア6

Processing

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

0グッド

0クリップ

投稿2020/03/18 21:32

編集2020/03/18 22:39

プログラミング歴1週間の者です。

前提・実現したいこと

要求されている内容は全て達成していますが、
コードをコンパクトにする方法を探しています。
特にランダムを10回も呼ばなくていい方法を探しています。

コードの概要

カーソルの位置によって形を変える円と四角を太さ3の縁付きで描写し、初期の青,赤,黒,そして背景のシアンの色をマウスのクリックによってランダムなRGB色に変化させる(ただし背景の色はグレースケールから変化させる)というものです。

該当のソースコード

Java

1color backgroundColour = color(0, 255, 255); //initially cyan 2color strokeColour = color(0); //initially black 3color rectangleColour = color(255, 0, 0); //initially red 4color ellipseColour = color(0, 0, 255); //initially blue 5 6void setup() 7{ 8 size(500, 500); 9} 10 11void draw() 12{ 13 background(backgroundColour); //initially cyan 14 rectMode(CORNERS); //use 2 diagonal coordinates for the rectangle 15 ellipseMode(CORNERS); //use 2 diagonal coordinates for the bounding box 16 stroke(strokeColour); //initially black 17 strokeWeight(3); 18 fill(rectangleColour); //initially red 19 rect(mouseX, mouseY, 1.5, height-1.5); //move the shapes towards the centre by 1.5 to show full stroke width 20 rect(mouseX, mouseY, width-1.5, 1.5); 21 fill(ellipseColour); //initially blue 22 ellipse(1.5, 1.5, mouseX-1.5, mouseY-1.5); 23 ellipse(height-1.5, width-1.5, mouseX+1.5, mouseY+1.5); 24} 25 26void mousePressed() 27{ 28 backgroundColour = color(random(256)); 29 rectangleColour = color(random(256), random(256), random(256)); 30 ellipseColour = color(random(256), random(256), random(256)); 31 strokeColour = color(random(256), random(256), random(256)); 32} 33

試した事

色を生成する機能を作り、それをそれぞれの形に適応させる方針で模索しています。

補足情報(FW/ツールのバージョンなど)

Processing 3.5.4
検索スキルの向上は自分の今後の課題です。

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

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

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

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

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

hoshi-takanori

2020/03/18 22:16

コードをコンパクトにする方法ではありませんが、背景、四角、円、線をそれぞれ単純なランダム色にしたいならそれでいいと思いますが、規則性を持たせて連続的に変えた方が美しくなると思います。どうやるかはプログラミングよりも色彩センスの問題になります。
KeeganP

2020/03/18 22:37

要求されている内容が完全ランダムな色彩なので、解決策としてランダムな色を生成する機能を作り,それをそれぞれの形に適応させる方針で模索しています。
hoshi-takanori

2020/03/18 22:56

それなら、ランダムな色を返す関数を作って呼ぶことで、コード上 random の数は減らせますね。実際に random が呼ばれる回数は変わりませんが。
KeeganP

2020/03/18 23:05

正にそれを求めています。現在 ``` void generateRandomColour() { 試行錯誤中 RandomColour = color(random(256),random(256),random(256)); } ``` の様なものを追加していじっています。しかし、void mousePressed() との連動が上手くいっていません。
guest

回答3

0

ベストアンサー

ランダムな色を返す関数を作って呼ぶ方法ですが、たぶんこんな感じで関数の戻り値を使えばいいと思います。
(Processing 知らないので、エラーが出たらごめんなさい。)

java

1void mousePressed() 2{ 3 backgroundColour = color(random(256)); 4 rectangleColour = generateRandomColour(); 5 ellipseColour = generateRandomColour(); 6 strokeColour = generateRandomColour(); 7} 8 9color generateRandomColour() 10{ 11 return color(random(256), random(256), random(256)); 12}

投稿2020/03/18 23:24

hoshi-takanori

総合スコア7901

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

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

KeeganP

2020/03/19 04:04

ありがとうございます。非常に簡潔なコードで感激しました
guest

0

最終的にランダムな10個の要素が必要なのだから、都合10回randomが呼び出されることは避けられないので、それをいかにまとめて書くか、ぐらいしか工夫の余地はなさそう。

Processing

1color backgroundColour = color(0, 255, 255); //initially cyan 2color strokeColour = color(0); //initially black 3color rectangleColour = color(255, 0, 0); //initially red 4color ellipseColour = color(0, 0, 255); //initially blue 5 6void setup() 7{ 8 size(500, 500); 9 //毎回同じ値が設定されるだけなのでsetup()に括りだす 10 rectMode(CORNERS); //use 2 diagonal coordinates for the rectangle 11 ellipseMode(CORNERS); //use 2 diagonal coordinates for the bounding box 12 strokeWeight(3); 13} 14 15void draw() 16{ 17 background(backgroundColour); //initially cyan 18 stroke(strokeColour); //initially black 19 fill(rectangleColour); //initially red 20 rect(mouseX, mouseY, 1.5, height-1.5); //move the shapes towards the centre by 1.5 to show full stroke width 21 rect(mouseX, mouseY, width-1.5, 1.5); 22 fill(ellipseColour); //initially blue 23 ellipse(1.5, 1.5, mouseX-1.5, mouseY-1.5); 24 ellipse(height-1.5, width-1.5, mouseX+1.5, mouseY+1.5); 25} 26 27enum RANDMODE { 28 MONOCHROME, 29 COLOR 30} 31 32color getRandomColor(RANDMODE mode) { 33 color col; 34 if (mode==RANDMODE.COLOR) { 35 col= color(random(256), random(256), random(256)); 36 } else { 37 col= color(random(256)); 38 } 39 return col; 40} 41 42void mousePressed() 43{ 44 backgroundColour = getRandomColor(RANDMODE.MONOCHROME); 45 rectangleColour = getRandomColor(RANDMODE.COLOR); 46 ellipseColour = getRandomColor(RANDMODE.COLOR); 47 strokeColour = getRandomColor(RANDMODE.COLOR); 48}

10回繰り返し感を解消して、全体の長さとしてはむしろ長くなった。
無理に縮めるよりは、素直に書いたほうがいい範囲じゃないかしら。

(どうでもいいけど、「英語」colourと「米語」colorの混在はちょっと気になるなぁ。なにかポリシーがあるのでなければ、システム側の米語に合わせたら?)

投稿2020/03/18 23:21

thkana

総合スコア7703

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

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

KeeganP

2020/03/19 04:07

ありがとうございます。setup()への括り出し、参考になりました。また、イギリス英語主流の国に住んでいるためcolourの綴りはこのままにします。
guest

0

完全に同じ意味になっているのかは自信ありません。

Processing

1// 変更ないところ省略 2 3void mousePressed() 4{ 5 backgroundColour = color(random(256)); // これはそのままでいいかな? 6 rectangleColour = getRandomColor(); 7 ellipseColour = getRandomColor(); 8 strokeColour = getRandomColor(); 9} 10// どういう意味か分かりにくいので関数にしておきたいところ 11color getRandomColor() { 12 return int(random(0xFFFFFF+1)) | 0xFF000000; 13}

color \ Language (API) \ Processing 3+

投稿2020/03/19 06:18

TN8001

総合スコア9862

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問