Picture1.Line (5,5)-(30,50)
と描き、ラインをひいたのですが、このラインが通った各点の
座標を取得する方法はありますか。
中学程度の数学で求められると思いますが…?
>このラインが通った各点の座標
線は無数の点の集まりなので、優秀な中学生でも答えの出しようがない。(^^;
線が表示されてる、ピクセルのことを言ってるのでしょうか?
それだと処理がちと面倒な気もするが。
>線は無数の点の集まりなので、優秀な中学生でも答えの出しようがない。(^^;
あれ?、サイン・コサイン・タンジェントって確か中学で習ったような
気がしたんだが、気のせいだったかなぁ〜
>あれ?、サイン・コサイン・タンジェントって確か中学で習ったような
>気がしたんだが、気のせいだったかなぁ〜
気のせいでしょう。
三角関数は、普通高校で習うのですが、日本では。
> 三角関数は、普通高校で習うのですが、日本では。
なるほど、海外に居たので、その辺り曖昧になっていたようです。
確かに、高校でもやっていましたね。
三角関数が出てきてしまいましたが、要するに言いたかったことは
質問の内容が良くわからないということです。
Lineで線を引いた時に線がどのピクセルに表示されているか調べるのは
丸め誤差の問題があり、ちと厄介かなと思ったのですが、もしかしたら
良い方法が有るかもしれません。
もちろん線が通る点の座標を全て列挙するのは、現在の数学では困難
で有ると言うことは、御理解いただけるものと思いますが。
三角関数を使う必要はありません。
直線でなお且つ始点と終点の座標値がわかっていれば
比の問題です。
Lineで線を引いた時に線がどのピクセルに表示されているか調べるので
あれば線を引く前の画像を保存しておき、線を引いた後の画像との比較で
調べることも出来ます。(効率は悪いが)
他に自分でブレゼンハムのアルゴリズムで線を引き、このとき
各点の座標を取得する手段もあります。
比を使うより1次方程式の方が楽だと思います。
おそらく、ガッさんはこのことを言っていると思いますよ。きっと。
よって、中学程度のレベルの問題になってくると思います。
先に書いたことの補足をします。線が引かれたピクセルを調べるときに引かれる前の画像との比較をする際に X,Y でループをまわすと効率が悪いので
皆さんが先に述べているような方法で点が打たれた(線が引かれた)
ピクセルの位置に当たりをつけ、その前後のピクセルの変化をチエック
することで高速に調べることができます。
各点の座標=ピクセルのX、Yであれば・・
ベクトルの内分点でもとめるとか。
質問の内容があいまいでした。申し訳ありません。
「直線を構成している各ピクセルの座標(x,y)」を
取得したく思っておりました。
アドバイスを読んで、わたしのレペルでは、そう簡単なことでは
ないのだとわかりました。
とりあえず、最後に頂いたアドバイスの「前の画像と比較」
の方法のプログラムを作成して、動作させてみたいと思います。
お返事ありがとうございました。
度々すいません。また補足させていただきます。
画像のサイズにもよりますが、線を引く前の
画像をすべて保存するのはどうにもメモリ効率が
悪そうです。
そこで線が通りそうなピクセル周辺の色だけを
保存する手段が考えられそうです。
思いつきだけで書いています。すいません。
ScaleModeは当然ピクセルで
もし、Picture1.Line (a1,b1)-(a2,b2)の
a1<>a2 かつ b1<>b2
ならピタゴラスの定理にて線の長さを求める。
線の長さ=Sqr(Abs(a1-a2)^2 + Abs(b1-b2)^2)
a1=a2 なら 線の長さ=Abs(b1-b2)
b1=b2 なら 線の長さ=Abs(a1-a2)
そして比を求める
横比=Abs(a1-a2)/線の長さ
縦比=Abs(b1-b2)/線の長さ
後は比を元に計算処理でポイントの座標を求める
どっかおかしかったら確認よろ
ピタゴラスの定理も必要ありません。
例えばp0(x0, y0),p1(x1, y1)を始点および終点とする線分の中天は
x = (x0 + x1 )/2
y = (y0 + y1 )/2
であり、同じ様に線分を3等分する線分上の2点は
x = (x0 + x1 )/3
y = (y0 + y1 )/3
および
x = 2 * (x0 + x1 )/3
y = 2 * (y0 + y1 )/3
です。
うーん、離散数学となると 夏の朝も天玉うどん さんのアルゴリズムが適用できますね。
中身は中学で習うことのちょっと拡張版程度なのでどうってことないですが。
逆に実数値に近い計算をすると、実際のアルゴリズムと誤差がでる"かも"わかりません。
というか、線の座標集めて何するつもりだったんだろ…
ツイート | ![]() |