- ベストアンサー
円の中を通る点の軌跡を、パソコンで表現する方法は?
- みんなの回答 (32)
- 専門家の回答
質問者が選んだベストアンサー
VB.NETのプログラムコードを載せておきます。 フォームにButtonとPicureBoxを配置して、 Buttonのクリックイベントに下記のコードを記述してください。 PicureBoxのサイズは500×220にしてください。 VB.NETは、無料のVisula Studio Express 2013 for Desktop をダウンロードしてインストールすれば使えます。 VB.NETの使い方は、ここで簡単に説明することはできないので、入門用のサイトでも見て学習してください。 http://homepage1.nifty.com/rucio/VBNyumon/Index_beg.htm Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim i As Integer, n As Integer Dim a As Single, b As Single, c As Single Dim p As Single, q As Single Dim x1 As Single, y1 As Single Dim x2 As Single, y2 As Single Dim objPen = New Pen(Color.Black, 2) Dim objGrp As Graphics = PictureBox1.CreateGraphics a = 100 b = 80 c = Math.Sqrt((2 * a - b) * b) For n = 0 To 10 objGrp.Clear(PictureBox1.BackColor) objGrp.DrawLine(objPen, 0, 10 + 2 * a, PictureBox1.Width, 10 + a * 2) objGrp.DrawEllipse(objPen, 10 + c * n / 5, 10, 2 * a, 2 * a) objGrp.FillEllipse(Brushes.Black, 7 + a + c, 7 + 2 * a - b, 6, 6) p = c / a * (n - 5) / 5 For i = 0 To n * 10 q = c / a * (50 - i) / 50 x1 = (b - a) * Math.Sin(p + q) + a * q * Math.Cos(p + q) + c * n / 5 y1 = (b - a) * Math.Cos(p + q) - a * q * Math.Sin(p + q) If i > 0 Then objGrp.DrawLine(objPen, 10 + a + x1, 10 + a - y1, 10 + a + x2, 10 + a - y2) x2 = x1 y2 = y1 Next Threading.Thread.Sleep(100) Next objPen.Dispose() objGrp.Dispose() End Sub
その他の回答 (31)
- 178-tall
- ベストアンサー率43% (762/1732)
>[r, θ] → [x, y] と座標変換すれば、スプレッドシートの「散布図」でも描けるのでしょうが、メンドイかな。 例えば、参考 URL ----↓ 極座標表示の式からグラフを描くには
- 178-tall
- ベストアンサー率43% (762/1732)
早速の錯誤 < > 訂正。 ↓ (以下のシナリオは、略図を描き追跡しないと判りにくいかも…。 たとえば、円がペン先の左側から右方へ <時計回り> に回転していく場合を想定してみる)
- 178-tall
- ベストアンサー率43% (762/1732)
0≦β≦α の場合…。 (以下のシナリオは、略図を描き追跡しないと判りにくいかも…。 たとえば、円がペン先の左側から右方へ反時計回りに回転していく場合を想定してみる) 円上にて、中心からの距離 r と円周角θとを示す座標 [r, θ] を想定。 さらに、初期ペン先タッチ点の座標を [α, 0] と想定。 (θの起点とみなし、θ= 0 とする…ということ。 末期ペン先タッチ点の座標は [α, θe] :ただしθe = 2*arccos{ (α-β)/α} 。 (ご注意。これに相当する ANo.14 の式は錯誤でした。) 初期タッチのとき、円中心からタッチ点に向かう半径の水平線からの角度θo は、 θo = arcsin[ (α-β)/α] であり、円上の座標 [r, θ] ではこの角度を基点として [r, 0] と表示。 初期ペン先タッチ点に戻って、円板上のペン-タッチ軌跡を追跡してみる。 (以下の勘定用ツールは Pythagoras 算式) 初期タッチから円板がθだけ回転すると、円板は距離 α*θ だけ進行する (スリップしなければ…) 。 ペン先が円の内部に入り、円中心からの距離 r が短くなる。 r = √{ (d - αθ)^2 + (α-β)^2 } …(P) ただし、d = √(2αβ-β^2) >(P) により [r, θ] の表を作り、その「r - θ 円形グラフ (?)」を描かせれば、円板に残されたペン先の軌跡を眺めることができそう。(どんなカーブになるのやら) (算式には、まだ錯誤があるかも知れません。略図を描き追跡しながら吟味してみて…) ----------- 以下、個別コメント。 >Pythagoras 算式というのは、cadのソフトのことでしょうか? ↓ 算式は「直角三角形についてのピタゴラス公式」だけですヨ … という意味でした。 上記の式 (P) がそれ。 スプレッドシート (EXCEL など) を使っても、容易に [r, θ] の表は作れます。 θを変数とし、r を式 (P) で勘定させる、という「表」を作成すればよいのです。 [r, θ] を与えると「r - θ 円形グラフ (?)」を描いてくれるソフト (当方は EDA のツールに内蔵されたものしか知らないもんで…) はありませんか? スプレッドシートには無いのかな? [r, θ] → [x, y] と座標変換すれば、スプレッドシートの「散布図」でも描けるのでしょうが、メンドイかな。
- 178-tall
- ベストアンサー率43% (762/1732)
ANo.14 の「一行訂正」。 以下、ペン先が円板にタッチする場合 0≦β≦2α に限定して…。 ↓ 以下、ペン先が円板にタッチする場合 α≦β≦2α に限定して…。
お礼
178-tallさん、どうもありがとうございます! 教えて頂いた答えへ、αとβの具体的な数値を入れて、試してみようと四苦八苦しております。 Pythagoras 算式というのは、cadのソフトのことでしょうか? それらしきものを見つけたのですが(英語表記のものです)金額がかなり高く、断念しました。 私は普段、数学やプログラム、エクセル等に従事した仕事をしているわけではなく、今回たまたま、この1枚が必要になってしまったわけで。 この1枚にとても出せる金額ではなかったものですから。。 それで、ANo,1で、shuu_01さんに教えて頂いたソフト2つを試してみました。 このようなソフトを使うのは、初めてです。 Grapes より、function view の方が私には分かりやすそうな印象でした。 これに打ち込んでいけば出来るものなのでしょうか? 「r」の式のαとβに具体的な数値を入れ、「d」部分も「√(具体的な数値)」を代入した状態のものを、 点として登録しようとすると「式が間違っています」と出てしまい。。どうにもこうにも、今、お手上げ状態です。 ルートが2つ重なるのが問題なのか、 式の計算がまだ終わっていなくて中途半端な状態だからなのか、 点のところにθの登録していいのか そもそも点で登録したのでいいのかどうかも、自信ないです。。 実は、私の欲しいαとβは 0<β<α なのです。 ペン先は円板の中心よりも下です。(毎度の情報不足、申し訳ないです。) この条件の部分が違うとやはり結果も違うんだろうなぁと思い。(実際に円板を転がしてペンで描いてみたら、全然違う結果でした) 逆にすると考えて、マイナスを付けてみたりしてやってみたのですが。。。 どうにもこうにも、先に進みません。 関数グラフを描くソフトではなく、cadのソフトが必要なのでしょうか? それとも「function view 」で十分に作れるものでしょうか? 3Dがあったので、それでやってみたいと考えているのですが。 よろしくお願い致します。
- stomachman
- ベストアンサー率57% (1014/1775)
直交座標系(x,y)を考え、yは上が正、xは右が正としましょう。そして、円盤が転がる直線は y=-1 であり、エンピツは (x,y)=(0,H) (0≦H<1) にあるとします。 (1) 半径1の円盤が上を滑らずに右に転がって行くとします。その移動の速さをvとすると、時刻tにおける円盤の中心の位置は (x(t),y(t)) = (vt, 0) です。 (2) このとき、円盤がt=0の時点に対して時計回りにどれだけ回転したかをφ(t)とすると、滑らないということと円盤の半径が1であることから、 φ(t) = vt です。 (3) エンピツによって円盤上に描かれる図形を、円盤に固定した極座標系(r,θ)で表すとどうなるか。ただし極座標系の原点は円盤の中心とし、方向θ=0はt=0のときにy軸に一致するように取り、θの回転方向は反時計回りを正だとします。すると、エンピツと円盤の中心との位置関係を計算し、さらに円盤に対してエンピツが回転する効果を考慮すれば、 r = √((θ/2)^2 + H^2) であると分かります。 もちろん r≦1の部分だけが描かれますから、θの範囲は |θ| ≦2√(1-H^2) です。 (4) この極座標で見ると、時刻tの瞬間にエンピツは θ=2vt の位置に来ています。つまり、時刻tの時点で既に描かれている曲線は -2√(1-H^2)≦θ≦2vt 範囲だけです。 というわけで、 ある時刻tにおける図を描くには、(1)で計算される位置に円を描いて、その中心を原点とし(2)で計算されるだけ時計回りに回転した方向をθ=0に取った極座標で、(3)で計算される曲線を(4)の範囲だけ描く。 ということをやれば、ご希望のアニメーションのひとこまが得られます。 H<0の場合にはどうなるかについては、ご自分で検討できるんじゃないでしょうか。
お礼
stomachmanさん、回答を頂きありがとうございました。 とても丁寧な書き方で、私でも理解することが出来ました。 ありがとうございました。
- nag0720
- ベストアンサー率58% (1093/1860)
>私は数学からすっかり離れてかなりの期間があり、分からないです。 回転の変換式が分からないようでは、プログラミングは難しいですよ。 とりあえず、「回転行列」で検索して回転の変換式を復習しましょう。 これなんか、分かりやすいかも。 http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html
お礼
nag0720さん、ありがとうございます。 回転行列見てみました!
- 178-tall
- ベストアンサー率43% (762/1732)
衍字 (まちがって入った不要な文字列) あり。 無視してください。 ↓ 直線 L に対するαの直線 L に対する角をθo とする。
- 178-tall
- ベストアンサー率43% (762/1732)
> 半径αの円板が直線 L の上を平面に垂直なまま転がっていく (途中でコケない) 。 ↓ better ? 半径αの円板が直線 L の上を平面に垂直なまま転がっていく (途中でスリップしない!) 。 以下、ペン先が円板にタッチする場合 0≦β≦2α に限定して…。 最初と最後のペン-タッチは円周上。(等号の場合には、円周上の一点だけにポツン…) 最初のタッチのあと、ペン先がまだ円板上にある場合を想定。 円上にて、中心からの距離 r と円周角θとを示す座標 [r, θ] を想定。 さらに、初期ペン先タッチ点の座標を [α, 0] と想定。 直線 L に対するαの直線 L に対する角をθo とする。 末期ペン先タッチ点の座標は [α, θq] 、ただしθq = 2*arctan{ (β-α)/α} 。 初期ペン先タッチ点に戻って、α < β < 2α の場合の円板上のペン-タッチ軌跡を追跡。 初期タッチから円板がθだけ回転すると、円板は距離 α*θ だけ進行。 以下の勘定用ツールは Pythagoras 算式。 d = √(2αβ-β^2) とする。 θq≧θ≧0 の範囲にて、r = √[ (d - αθ)^2 + (β-α}^2] …(P) (P) により [r, θ] の表を作り、その「r - θ 円形グラフ (?)」を描かせれば、円板に残されたペン先の軌跡を眺めることができそう。(どんなカーブになるのやら) 「動画」は「細工は流々」で、そちらへお任せ。
- shuu_01
- ベストアンサー率55% (759/1365)
あ、つられた トコロイドでなく、トロコイドでした Wikipedia トロコイド http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%AD%E3%82%B3%E3%82%A4%E3%83%89 * トロッコかと思ったけど、スペル違うのですね
- shuu_01
- ベストアンサー率55% (759/1365)
飲み会から帰った所です 僕はまだ計算してませんが、 nag0720 と同じ発想でやってみようとしてました 「点βが円の中で描く軌跡」 と聞くとそう思ってました でも、 「円は止まらずに進み続け、その接触点の軌跡を描く」 というのであれば、サイクロイド、トコロイドでないの? 数学のプログラム http://www.h6.dion.ne.jp/~ooya/Algorithm/Math.html
お礼
shuu_01さん、ありがとうございました。 無事に作成出来ました!
お礼
nag0720さん、どうもありがとうございました! 連絡が遅くなりまして、失礼致しました。 VBを使い、教えて頂いたコードをコピペして 全くの素人な私でも簡単に、欲しいものが作れました。 本当に助かりました。ありがとうございます。 ベストアンサーに選ばさせて頂きます。 でもこの感謝の気持ちはそれでは足りない程です。 今、線を足したり、数値を表示させたり、色々自分で脚色することに格闘しております。 相談中にも申しましたが、私は数学やプログラム等と無縁な生活をしております。エクセルすら未経験で、プログラムも未経験です。 数学は学生以来で、行列って懐かしいなー。こんな公式あったなー。というレベルでして。 今回どうしても、この一枚の書類が必要に迫られ、途方に暮れていました。 最悪の場合、手描きでと考えていましたが、 手描きのものでは、信憑性がなかったので。 nag0720さんをはじめ、皆さんのおかげです。 ありがとうございました!