画面上をクリックするとクリックした場所に円が表示され、もう一回クリックするとまた円が表示され、それと同時にその二つの円を結ぶ線が表示させる。そしてもう一回クリックすると3つ目の円と二つ目の円、一つ目の円に線が引かれるというようにどんどん円を追加するとそれまでに追加された全ての円を結ぶ線が引かれるというプログラムを作りたいのですが、どのようにすれば良いのかわかりません。また、線を引くときに元々引かれていた線と交差するところは線が引かれないようにもしたいです。円と線それぞれにクラスをつくって、また、円と線それぞれがArrayListに追加されるようにもしたいのですが、どのようなプログラムにすればいいかわかりません。教えて下さい。ちなみにprocessingでお願いします。
No.1
- 回答日時:
こういう質問はダメなんですよ。
「仕様がハッキリしていない」。説明としては足りなくて全然ダメです。> クリックした場所に円が表示され
例えば、その円の「大きさ」はどうするのか、全く定義されていません。
貴方が分かってるだけでこれじゃあ誰も分からない。
当然、コンピュータ(Processing)も理解出来ません。
> その二つの円を結ぶ線が表示させる。
これも全然ダメですね。「結ぶ線」って何でしょうか。円の接線?あるいは中心同士を結ぶ?
マイ定義じゃあ全然ダメなのですよ。
「誰でも読んで理解出来る」ように書いたモノを仕様、と呼びます。こういう仕様が不確かなモノは人間が読んでも混乱するだけ、です。コンピュータなら尚更ですね。
まずキチンとした仕様を確定させましょう。それがプログラミングの第一歩なのです。
ちなみに、クリックして円を表示させるコード自体は次のページで紹介されています。
mousePressed() {...} マウスボタンが押されたときに1回だけ {...} の中を実行する:
https://www.d-improvement.jp/learning/processing …
説明が足りずすいません。sizeは(800,800)で円の大きさは直径15です。また二つの円を結ぶ線とは円の中心と中心を結ぶ線です。
No.2
- 回答日時:
> 説明が足りずすいません。
sizeは(800,800)で円の大きさは直径15です。また二つの円を結ぶ線とは円の中心と中心を結ぶ線です。そうですか。
あと、
> また、線を引くときに元々引かれていた線と交差するところは線が引かれないようにもしたいです。
ってのも良く分からんのですがねぇ。
僕自身は全然Processing詳しくないんですが、基本的なコードは次のようになるんじゃないですか?
// ここから
FloatList xs = new FloatList();
FloatList ys = new FloatList();
int i = 0;
void setup() {
size(800, 800);
}
void draw() {
}
void mousePressed() {
float x = mouseX;
float y = mouseY;
ellipse(x, y, 15, 15);
if (xs.size() > 0 && ys.size() > 0) {
line(xs.get(i-1), ys.get(i-1), x, y);
}
xs.append(x);
ys.append(y);
i++;
}
コードを書いていただき、ありがとうございます。これだと例えば3回違うところにクリックすると全て一直線になると思うのですが、そうではなく2回クリックしたら1回目にクリックしたところと2回目にクリックしたところに線が引かれて、3回目にクリックしたらその場所に1回目にクリックしたところと2回目にクリックしたところから同時に線が引かれて三角形ができる(ある場所にクリックしたら今までクリックしたところから線が引かれる)というようにしたいのですが、どのようにすれば良いのでしょうか…
No.3
- 回答日時:
> これだと例えば3回違うところにクリックすると全て一直線になると思うのです
なりませんよ。折れ線にはなるでしょうが(折れ線は一直線ではない)。
あれ、自身のPCにProcessingインストールして試してないんですか?
> これだと例えば3回違うところにクリックすると全て一直線になると思うのですが、そうではなく2回クリックしたら1回目にクリックしたところと2回目にクリックしたところに線が引かれて、3回目にクリックしたらその場所に1回目にクリックしたところと2回目にクリックしたところから同時に線が引かれて三角形ができる(ある場所にクリックしたら今までクリックしたところから線が引かれる)というようにしたい
と言う事は、4点作れば線が6本になる、5点作れば線が10本、でいいんですか?
No.4
- 回答日時:
例えば、対角線を考慮して、頂点がn個ある場合、
n + n*(n-3)/2
本の線を引きたい、と言うのなら、基本的には次のようなコードになるでしょう。
// ここから
FloatList xs = new FloatList();
FloatList ys = new FloatList();
int i = 0;
void setup() {
size(800, 800);
}
void draw() {
}
void mousePressed() {
int k;
float x = mouseX;
float y = mouseY;
ellipse(x, y, 15, 15);
if (xs.size() > 0 && ys.size() > 0) {
for (k = 0; k < i; k++) { // ここの描画ルーティンを改造する
line(xs.get(k), ys.get(k), x, y);
}
}
xs.append(x);
ys.append(y);
i++;
}
ありがとうございます。ほとんどそんな感じです。ただ、3回クリックするまでは確実に線と線は交わらないのですが、4回目にクリックすると1点だけ線と線がクロスしてしまうと思うのですが、もし今までクリックしたところから線が引かれる時に他の線と交わってしまうのであれば新しく引かれる線は引かれないというようにしたいです…4回クリックすると線は5本、5回クリックしたら7本(書いていただいたプログラムだと5回目は新たに4本引かれると思うのですが、そのうち2本は他の線と交わってしまうので引かない)というようにしたいです…
No.5ベストアンサー
- 回答日時:
> ただ、3回クリックするまでは確実に線と線は交わらないのですが、4回目にクリックすると1点だけ線と線がクロスしてしまうと思うのですが、もし今までクリックしたところから線が引かれる時に他の線と交わってしまうのであれば新しく引かれる線は引かれないというようにしたいです…4回クリックすると線は5本、5回クリックしたら7本(書いていただいたプログラムだと5回目は新たに4本引かれると思うのですが、そのうち2本は他の線と交わってしまうので引かない)というようにしたいです…
ん〜。どうすんべぇ。
ルール的には、恐らく、始点からは全部の点に線を引く、のね。
ただ、次の点からは次の次の点に「だけ」線を引くようにプログラムすれば何とかなるのかねぇ・・・。
それ以外に引くと基本的に「交差」が生じるんだけど、これが望んだカタチかどうかは知りません。あとはデバッグで「思い通りに行ってないトコ」を直すしかないんじゃないかなぁ。
// ここから
FloatList xs = new FloatList();
FloatList ys = new FloatList();
int i = 0;
void setup() {
size(800, 800);
}
void draw() {
}
void mousePressed() {
int k;
float x = mouseX;
float y = mouseY;
ellipse(x, y, 15, 15);
if (xs.size() > 0 && ys.size() > 0) {
for (k = 0; k < i; k++) {
if (k == 0) { // 始点だけは2つのFloatListを舐めて全点に線を引く
line(xs.get(k), ys.get(k), x, y);
} else { // それ以外は強制的にkの値をFloatListのケツの座標(前回作った点)にのみ線を引く
k = i-1;
line(xs.get(k), ys.get(k), x, y);
}
}
}
xs.append(x);
ys.append(y);
i++;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Chrome(クローム) Chromeでgooglemap検索等結果が他国になってしまう 1 2022/10/05 12:18
- 数学 円と直線の共有点を求める時に、円を表す式と直線を表す方程式が提示されるんですが、判別式を使うのは分か 3 2023/02/15 19:20
- その他(ブラウザ) テキストを入れるときの縦線の点滅がそれ以外のブラウザ上にも表れます。 1 2022/07/29 21:55
- その他(Microsoft Office) Microsoft Edgeの「関心のあるカテゴリ」を表示させるには。 1 2023/03/16 18:05
- HTML・CSS トリミングで表示した画像をクリックで元どおりにしたい 3 2022/12/16 18:49
- 数学 円Oの円周上に2点A,Bをとり、扇型OABを切り取ります。ただし、0°<∠AOB<180°とします。 18 2022/04/21 12:08
- 数学 効用関数と直線:なぜ直線になる? 3 2022/06/04 20:39
- 数学 中3 円周角の定理の問題です 3 2022/06/29 22:21
- DIY・エクステリア 円の中心の求め方 6 2022/07/17 19:18
- Wi-Fi・無線LAN 「以前のセキュリティ標準」だと、どんなリスクがありますか? 4 2023/07/01 13:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Notepad++の関数リスト表示の変...
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
C++にてtemplateで受け取った任...
-
戻り値を返す関数の前に(void)...
-
ArduinoでMouse関数を使用して...
-
C++別のオブジェクトからメンバ...
-
合格か否かを表示するプログラ...
-
C#でラジオボタンを設定に記録...
-
C# KeyDownイベントでショート...
-
void*型の配列について
-
C# Controls.Addで動的に配置し...
-
多重定義が起きている?--lnk20...
-
c言語 引数のvoidについて
-
構造体を宣言と共に初期化する方法
-
CTabCtrl:TABインデックス単位...
-
コールバックって・・・
-
静的でないメンバ関数の呼び出...
-
クラス間でのクラスの共有?
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
void*型の配列について
-
GDI+の使用方法について
-
DirectInput でのエラー
おすすめ情報