![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
お世話になります。
宜しくお願いします。
現在、swingとawtを駆使して、線や図形の描画を行うアプリを作成しています。
その中で、次の様な事をする場合の処理で躓いております。助けてください。
よろしければ添付の図をご参照下さい。
ほぼ中央にサイコロの「1」の目の様な正方形があり、
その中心に赤い円(中心点)があります。
図示上ではわかりやすいように赤い円で示しましたが、実際には1pixelの点です。
そして、4本のラインがまとわり付いていると思います。
これらのラインの内、「中心点との最接近点を持つ線」を特定したいです。
各座標同士の頂点情報は、図形の親要素(TextPane)の0,0からの相対頂点情報として、
いつでも参照可能なスコープの変数に保持していますので、
後は特定する為の計算式にあてはめるだけと考えておりますが、難航しております。
どうかお助け下さい。よろしくおねがいします。
<他>
・全ての頂点座標は必ず0,0以上の値となります。
・中心点は必ず正方形の中心に描画されます。ただし、正方形自体の描画位置は無作為です。
・ラインは図示上では4本ですが、実際にはn本です
・ラインは図示上では適度に分散していますが、頂点情報は再描画の度、完全に無作為に設定されます。
・図形をTextPaneの中に書く所までは問題なくできています。
![「最接近点を持つ線を特定」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/9/1040699_5497cc03bf2de/M.jpg)
No.4
- 回答日時:
横から失礼します。
質問者さんと回答者さんとの間で、行き違いがあるように感じました。
#1の回答は、
「任意の1点と直線の距離を求める公式」というものがあるから、その公式を使って
それぞれの直線毎に距離を計算すればいい
と言っています。(つまり計算の回数は、直線の数だけということ)
質問者さんはこれの意味を取り違えているように思えますがいかがでしょうか?
公式で計算した結果は、厳密には1~2ピクセル程度誤差がでるかもしれませんが、
恐らく問題にはならないと思います。
ちなみにですが、私は昔お絵かきソフトのようなものを作ったことがありました。
そこでは、描画済みの図形をマウスでクリックし属性(太さ等)を変更できるのですが、
その際には、描画済みの各図形に対し、マウスでクリックされたかどうかの判定をするのに、
今回のような計算を行いました。
先ほどの誤差はまったく問題にならなかったです。
速度的にも、問題はありませんでした。
(ペンティアム133MHzくらいのマシンでのことです)
ですので、今回も公式を使った方法で問題ないかと思います。
この回答への補足
私の思い込みで話をややこしくしていたようですね。(学が無いもので、お恥ずかしい)
調べてみた所よくわからない記号満載の公式にぶつかったので、
ここから先は数学カテゴリに持ち込もうと思います。
ありがとうございます。
真意に気づいたのはnvsgxさんの助言をいただいてからですが、
回答者は最初から正しい意見を出してくださっていたようですので、
BAは最初の回答者とさせていただきます。申し訳ありません。
No.3
- 回答日時:
ん~, そうなると若干面倒だなぁ.
イメージだけでいくと, 各直線に対し
1. 中心点からその直線に下した垂線の足の座標を求める
2. その「前後」のピクセルを見つけてそいつらとの距離を計算する
という処理で中心点から各直線までの距離が求まるはずです. もちろん直線でなくて線分なら「実は端点が最も近い」とか「2 で『前後』のピクセルを見つけるときに一方が線分の外に出る」という可能性も考慮する必要があります.
面倒ではありますが直線ないし線分の本数に比例する時間でできるはずです.
No.2
- 回答日時:
え? 「中心点との最接近点を持つ線」の「最接近点」って, ひょっとして
「その線を描画したときのピクセルのうち『中心点』と最も近いところ」
って意味?
だとしたら, 「線をどのように描画するか」という情報がないと無理だよ.
この回答への補足
>「その線を描画したときのピクセルのうち『中心点』と最も近いところ」
その通りなのです。
>「線をどのように描画するか」という情報
線は全て直線です。そしてdrawLineの引数となる始点終点の座標情報はアプリ全体で参照可能なスコープの変数に保持してあります。
それを使って判定はできないでしょうか?
計算の為の情報に不足があればご指摘下さい。
一応、昨日出していただいた案で線の始点~終点間の連続する座標を算出し、
(この時点でdrawLineの書き出す線とは微妙にずれた値が出ていると思いますが、そこは最終的にすり合わせますので気にしないで下さい)
各座標と中心座標とでピタゴラスイッチして距離を求めてラインごとのminを保持し、
最終的に全体ラインのminと、それを保持するラインを取得する簡単なロジックを書いてみましたが、
ちょっと時間がかかりすぎてました。(100本で平均して20秒ぐらい)
現在の表示範囲(600,600)で100本の場合、最大で約84,852点、
実際にはそのおおよそ半分ぐらいの所の回数座標計算を行わなければいけないのでしょうが、
関数呼び出しのオーバーヘッドを抑える為にMathは使わずベタ書きし、
また距離も比較に用いるだけなのでルート計算は省いていますので、
1点当たりの計算自体は精々数クロックで済んでいる筈なのですが、それでこの負荷は少し異常です。
ひとまずロジックがタコってる疑いが大なのでそれを改善すれば速度的な向上は見込めると思っていますが、
そもそもの考え方がベタすぎるので、もっと良い方法があれば、できればそちらを取りたいです。
よろしければ引き続きお力添えをいただければ幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Illustrator(イラストレーター) 「頂点で線分を伸ばす」作業がうまく行かない。 1 2022/09/09 10:19
- 画像編集・動画編集・音楽編集 ワード。頂点の編集。 4 2022/09/28 14:14
- PowerPoint(パワーポイント) 2016EXCEL→2016PowerPointにコピペすると図形がゆがみます 5 2022/03/31 11:44
- 数学 写真の図は中心(a,b)半径rの円とその円周上の(x1,y1)における接線lと円の中心とlを結ぶ任意 4 2023/08/08 16:20
- 登山・トレッキング ちゃんと読図を基本から学んだ人って、地形図と現実の地形を照合して現在位置を特定できるのですか? 4 2023/04/15 17:48
- 数学 中3 円周角の定理の問題です 3 2022/06/29 22:21
- 美術・アート ペンタブとオフィス系ソフト 1 2022/10/08 19:27
- 数学 三角形の3つの頂点から出る3本の直線が1点で交わる条件で 「少なくとも1本の直線は、角の二等分線であ 2 2023/02/21 21:24
- その他(プログラミング・Web制作) VBA 1 2023/01/19 16:19
- デザイン オフィス系のソフトのフリーハンドできちんと描画するには 1 2022/11/11 18:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
Androidで画像の中で指定した範...
-
JTableの特定セルの背景色を変更
-
Canvas等の図形を移動する時,直...
-
Javaで文字の角度を変えて表示...
-
VB.NETのSendMessageを教えてく...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
インスタンス参照でアクセスで...
-
変数名の付け方
-
EXCEL VBAにて動的にCheckBOXを...
-
private static という変数の修飾
-
【sendkeysメソッドが動かずに...
-
変数の参照でエラーが出てしま...
-
多人数のじゃんけんプログラム
-
VBA 同じ名前のオブジェクトを...
-
final修飾子を使っているのに、...
-
javaのクラスの作り方、エラー...
-
newしないインスタンス?実体化...
-
java eclipse 型に解決できません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVAでの背景画像表示
-
VB.NET フォーム上に描いたグ...
-
VB.NETのSendMessageを教えてく...
-
C# DataGridView のCellPaintin...
-
Javaで文字の角度を変えて表示...
-
canvasで表示されてる画像を1...
-
画面のちらつきの原因が知りた...
-
Labelコントロールの背景をグラ...
-
重なった要素上でのイベントで...
-
java.awt.peer?
-
Canvas等の図形を移動する時,直...
-
OpenLayersの描画を固定で表示...
-
ID3DXSprite::Drawメソッドに関...
-
SwingとEDT(イベントディスパッ...
-
C#のGraphicsクラスについてです。
-
複数画像表示切り替え Visual c++
-
Androidのフォントサイズ(SP)と...
-
Androidで画像の中で指定した範...
-
描画処理が実行されない
-
JavaScript でスライダーを作る...
おすすめ情報