🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Processing

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

Q&A

解決済

2回答

12740閲覧

dist関数の使い方

ex_nh0

総合スコア7

Processing

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

0グッド

0クリップ

投稿2019/09/10 05:18

編集2019/09/11 12:15

processingで半径100の円cを書き円cに外接する四角形Rを書いた後100個の点を打ち円の中にあれば青色、円の外なら赤色の点となるプログラムを作っていて、点と円の中心の距離を求める際にdist関数を用いているのですが、エラーがでてしまいます。float d=dist(x[i], y[i], l, m);の入れる場所をsetupやdrawの中に入れてみたり、エラーメッセージに変数iが存在しないとでてくるのでfloat d=dist(x, y, l, m);にしてiを消してみたりと思いつく限り色々やってみたのですがうまくいかないので何が悪いのか教えてください。

int l=100,m=100; float [] x=new float[100]; float [] y=new float[100]; float d=dist(x[i], y[i], l, m); void setup() { size(200, 200); rect(0, 0, 200, 200); ellipse(100, 100, 200, 200); } void draw() { for (int i=0; i<100; i++) { x[i]=random(0, 200); y[i]=random(0, 200); } if (d<100) { stroke(0, 0, 255, 100); } else { stroke(255, 0, 0, 100); } point(x[i], y[i]); }

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

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

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

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

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

stdio

2019/09/10 05:27

分からないところがいまいち伝わらないので箇条書きで書いて頂いてよろしいですか? それとコードはcodeで囲って下さい。
ex_nh0

2019/09/10 05:43

すいません、まだこのサイトで質問するのに慣れてないのでcodeで囲むというのがよくわかりません。 なのでコードはint l=100,m=100;から下のすべてです。 あとわからない部分についてですが ・float d=dist(x[i],y[i],l,m)でエラーが出てしまう理由と改善点 どうかよろしくお願いします。
thkana

2019/09/10 13:02

「わからない」ならやらなくていいのでしょうか... 質問の編集に入り、プログラム部分を選択して記入欄上の方の<code>をクリックすれば出来るはずです。 手動で、プログラム部分の前後に ```Processing int l=100,m=100; <略> point(x[i], y[i]); } ``` としてもいいですけれど。(`と'は違う記号なので注意)
guest

回答2

0

float [] x=new float[100];

float [] y=new float[100];

次のように float と [] の間のスペースを取り除いてください。

processing

1float[] x=new float[100]; 2float[] y=new float[100];

これでエラーは消えますが、他にも間違いがあるので、どのみちうまく動きません。
しかしそれは別問題なので、改めて直してください。

投稿2019/09/10 05:42

Zuishin

総合スコア28669

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

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

Zuishin

2019/09/10 05:45

「他の間違い」はスコープの間違いだったり、ループの間違いだったりと多岐にわたります。
thkana

2019/09/10 14:48

> float と [] の間のスペースを取り除いてください。 私のてもとではそれではエラーに変化はありませんでした。
guest

0

ベストアンサー

思いつく限り色々やってみた

エラー対策は、エラーメッセージを見て、ソースを見て、ちゃんと考えるものです。考えずに目茶苦茶やってもそうそう当たるものではありません。

Text

1i cannot be resolved to a variable

iは変数として解決(解釈出来ない)と言われているのですから、まずiの宣言を確認してみて下さい。
float d=dist(x[i], y[i], l, m);でiが登場する以前にiなんて宣言してないでしょ?
いちばん先頭にでも
int i;
を追加すれば、そのエラーは消えます。というか、そうするとプログラム全体でも文法エラーはなくなります。

エラーはなくても、プログラムは(多分あなたが思ったようには)動きませんけどね。文法エラーがある、というのはそれはプログラムとしての体をなしていないということなので問題外。エラーがなくなってやっと、テストで正しい日本語で解答欄を埋めた段階と思えばいいかしら。解答欄を埋めたからといって合格点なわけじゃないです。今回のように...


Processing(というかその中で動いているJava)では、「代入」というのは、その時点で=の右辺を計算した「結果の値」を左辺の変数の値にする(俗に「入れる」という)だけです。
float d=dist(x[i], y[i], l, m);
では、例えばその時(iは宣言されて適切な値だったとして)dist(x[i],y[i],l,m)の計算をして、それが例えば25だったら、dの値を25にする「だけ」です。(ここは代入じゃなくて「初期化」ですけれど、とにかくその「値」だけが扱われるということ)
きっと、
if (d<100) {
のところで、dと書いたらその時のdist(x[i], y[i], l, m)が新しく計算されてその値と100とを比較する...と考えたんじゃないかと思いますけど、それは違います。最初の計算で25だったら、新しくdに値を代入しない限り、プログラムが終わるまでdの値は25のまま。


もうひとつ、変数にはスコープ(適用範囲)というものがあります。

Processing

1 for (int j=0; j<100; j++) {//前述のエラー対策で宣言したiと区別するためjに名前を変えます 2 x[j]=random(0, 200); 3 y[j]=random(0, 200); 4 }//jの有効範囲はここまで 5//略 6 point(x[i], y[i]); //この場所では有効なjという変数は無い。

このjは、つまりfor文の間しか有効ではありません。最後のx[i],y[i]のiはこのfor文とは関係なく、最初に宣言したiが適用されます。もし、iを0~99まで変化させた点を打ちたいのなら、point()はfor文の中に含む場所に書いてやる必要があります。
なお、ある変数名(例えばi)が有効な中に、明確に区切られた範囲であれば(今回のfor文のように)名前が同じで、でも実体は別の変数を作ってしまうことが出来ます。あくまで別の変数になるので注意して下さい。


おまけ。私だったらこう書きます。(これが正解、とかいうわけではありません)
点を打ってしまったらx,yのデータはもう使わないので、さっさと描画すれば配列にデータを保存する必要はありません。
width, heightといったシステムが値を設定する変数を使えば、例えばウインドウのサイズを変えてもプログラム本体は全然いじらなくても大きい/小さい画に出来たりします。
このような画なら、画面の中心を原点にするように考えた方が考えやすくありませか? Processingでは座標の変換が簡単なので、そのようにしてみました。

Processing

1void setup() { 2 size(200, 200); 3 background(255); 4 ellipse(width/2, height/2, width, height); 5} 6 7 8void draw() { 9 translate(width/2, height/2);//ウインドウの真ん中を0,0とする 10 for (int i=0; i<100; i++) { 11 float x=random(-width/2, width/2); 12 float y=random(-height/2, height/2); 13 float d=dist(0, 0, x, y); 14 if (d<width/2) { 15 stroke(0, 0, 255, 255); 16 } else { 17 stroke(255, 0, 0, 255); 18 } 19 point(x, y); 20 } 21}

投稿2019/09/10 12:19

編集2019/09/11 14:04
thkana

総合スコア7703

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

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

ex_nh0

2019/09/11 12:22

回答ありがとうございました。まだ勉強中ですのでわからないことだらけですのでしっかり説明してもらって とても助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問