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

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

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

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

Q&A

2回答

359閲覧

正方形と直線の当たり判定について

potatumuri

総合スコア1

Processing

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

0グッド

0クリップ

投稿2023/12/04 18:38

編集2023/12/04 18:45

イメージ説明### 実現したいこと

図のようにrectを描画したい

前提

添付している図のように、直線が枠内を通る正方形のみ描画するプログラムを書きたいです。今書いてるのだと斜め方向に描画されることもありますが、横一文字みたいに描画されてしまうこともあります。

該当のソースコード

Processing

1//正方形の接触判定 2int wNum = (int)random(20,30); 3int hNum = (int)random(40,60); 4float m = wNum/hNum; 5int boxSize = 10; 6 7size(800,800); 8translate(width/2,height/2); 9rectMode(CENTER); 10 11 12for(int rx=0; rx<wNum; rx++){ 13 for(int ry=0; ry<hNum; ry++){ 14 int x = rx*boxSize; 15 int y = -ry*boxSize; 16 float d = abs(m*x+y)/sqrt(m*m+1);//点と直線の距離公式 17 if (d <= boxSize/2*sqrt(2)) { 18 rect(x, y, boxSize, boxSize); 19 } 20 } 21}

試したこと

接触判定というか、枠内を直線が通るかどうかを点と直線のきょりを用いて調べていますがこれがあっているかがそもそも不安です。何かいい方法あれば教えてください。

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

Processing4.3

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

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

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

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

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

actorbug

2023/12/05 00:28

直線が枠内を通らないのに塗られているマスがありますが、間違いないでしょうか。 右上隅から数えて、左に3、下に3のマスと、左に5、下に6のマスです。 あと、ご提示の図からすると、やりたいことはこちらの質問に近いように思います。 https://teratail.com/questions/149396
guest

回答2

0

float m = wNum/hNum;

int同士の割り算はintです。
どちらかをfloatにキャストしてから割ってください。

外形を描画すると何か角度が(縦横)逆な気がします。
mの割り算が逆なんじゃないですかね?(数学的なことは何にもわかっていませんがw

Processing

1void setup() { 2 size(800, 800); 3 rectMode(CENTER); 4 noLoop(); 5} 6 7void draw() { 8 background(255); 9 translate(width / 2, height / 2); 10 11 int wNum = (int) random(20, 30); 12 int hNum = (int) random(40, 60); 13 float m = hNum / (float)wNum; 14 int boxSize = 10; 15 16 translate(-wNum * boxSize / 2, hNum * boxSize / 2); 17 18 for (int rx = 0; rx < wNum; rx++) { 19 for (int ry = 0; ry < hNum; ry++) { 20 int x = rx * boxSize; 21 int y = -ry * boxSize; 22 fill(255); 23 square(x, y, boxSize); 24 25 float d = abs(m * x + y) / sqrt(m * m + 1); 26 if (d <= boxSize / 2f * sqrt(2)) { 27 fill(#88CCFF); 28 square(x, y, boxSize); 29 } 30 } 31 } 32} 33 34void mouseClicked() { 35 redraw(); 36}

アプリ動画

投稿2023/12/05 09:27

TN8001

総合スコア9959

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

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

0

線が図形上を通っているかの判定として正しいかは見ていませんが、
float m = wNum/hNum;
の右辺は、wNumとhNumがintなので整数演算になっている、というのはきっと見落としなのだろうと思います。

投稿2023/12/04 23:55

thkana

総合スコア7716

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問