コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
中国地方 ◆IVVpClkMLp6s
2019/8/4 14:41
質問
sincosで描く曲線
文系の意固地で恥ずかしながらずっとsin.cos.tanを避け続けてきました。
ちょうど興味の強かった3D座標のトピックスがあったので読みましたが、やはり当然ながらsincostanの使用が…。
昔色々な2D曲線図を描いて理解していくサンプルで学びかけた記憶があるのですが昔の事で、今はbasicサンプル自体がそれほど見つかりません。
曖昧な記憶で再現をやってみましたが思った様な図形には全然ならず困っています。
レベルは高いかもしれませんが、「キングボンビーの輪郭」の様な、ポヨンとした、鋭角のない、複数の曲線が繋がってできた鏡餅の様な輪郭を、福笑いの様にランダムで生成するプログラムです。
曲線の頂点を結んで?スムーズに繋げる、という調整が入っていたのでしょうが、アイデアが浮かびません。
もし式が立てられる方いらっしゃいましたら、再現にお知恵お貸し頂けませんでしょうか?

コメント

アバター
あきと 2019/8/4 16:38 ◆qGd5dQw2g3a2
「ベジェ曲線」「スプライン曲線」という言葉で調べれば4つの頂点から曲線を描画する計算式が出てきますよ。
アバター
こういち 2019/8/4 17:15 ◆ou0jbJnEJ0Kb
離散コサイン変換ってやつですかね?

なんかみなつさんがそんな感じのプログラム書いてた気がします。
アバター
あきと 2019/8/4 18:43 ◆qGd5dQw2g3a2
もしかして「リサージュ曲線」の事かな。
アバター
みなつ 2019/8/5 2:58 ◆hJTkStjweib1
はーい!以前私も同じことを考えて、作ってみました!( ゚∀゚)

既存のお絵かきソフトのベクターレイヤーの挙動を参考に、「折れ線の角(頂点)付近に必ず変曲点が来る」ようにした曲線補間アルゴリズムです(≧∇≦)b

基本的な手順は、
(1)折れ線の各頂点に対して角二等分線を求める
(2)その角二等分線の両サイドに、cos曲線のような「x=0付近の傾きが0(接線が水平)な曲線」(これをイーズ・イン(ease-in)な曲線といいます)をはめ込む
(3)以上を完了すると、折れ線の両端以外の辺に2本ずつ曲線がはめ込まれるので、その2本の曲線を、頂点からの距離に応じて重みを変化させながら(片方は0〜1、もう片方は1〜0)合成していく。(ちなみに両端辺には曲線は1本しかはめ込まれないので、合成不要でそのまま描画します)
となります。

ちなみに、イーズ・インであればcos曲線以外の曲線を使ってもOKだと思います(●´ω`●)

■サンプルプルプログラムを以下の公開キーで公開してます。
公開キー【4DC3CKAV】
サンプル内のCOS補間ルーチンの使い方は
「COSINTERP X配列,Y配列,分割数 OUT 補間後のX配列,補間後のY配列」
です。補間後の配列サイズは「(元の頂点数−1)*分割数」になります。

■以下のツイートに、サンプルプログラムの動画があります
https://twitter.com/tksm372/status/1137605465561374720

■以下のブログに解説の図があります。
http://puticon372.hatenablog.jp/entry/2018/02/15/000642
アバター
中国地方 2019/8/5 4:58 ◆IVVpClkMLp6s
みなさん大変ありがとうございます!
まさにこのベジェ曲線の応用でした。
とくにみなつさん素晴らしいプログラムで、何と社長(ハカセ?)から直々に褒められてるじゃないですか!
これを見て色々やってみたいと思います。
ありがとうございます。
アバター
みなつ 2019/8/5 13:50 ◆hJTkStjweib1
(●´ω`●)デヘ
シャチョーに褒められちゃいました〜ヾ(*´∀`*)ノ
アバター
みなつ 2019/8/6 17:06 ◆hJTkStjweib1
そういえば、sinとcosについてですが

半径1[m(メートル)]のアナログ時計があったとして、3時の目盛りのところを角度の基準(0度)として、角度を反時計回りに正とすると、2時の目盛りは角度30度になりますが、このとき
・時計の中心から2時の目盛りまでの横方向(X方向)の距離がcos30度[m]
・時計の中心から2時の目盛りまでの縦方向(Y方向)の距離がsin30度[m]
です(; ̄▽ ̄)

なお、cos30度とかsin30度の具体的な数値は簡単な計算式では求められないため、計算機を使わない場合は、あらかじめ角度毎に計測しておいた表(三角関数表)を使います。つまり、三角関数というのは計算するものではなく、角度毎にあらかじめ計測しておいた「表」なのでした(●´ω`●)

一応、プチコンや関数電卓みたいな計算機の場合は、マクローリン展開という方法を使って繰り返し計算することで、cos30度とかに「極めて近い値」(これを近似値といいます)を計算で求めています。ただし、完全に正しい値を計算するには無限に繰り返さないといけないので、あくまで近似値しか求められないんですねー(´・ω・`)

なお、時計の半径が2倍の2mの場合は、時計の中心から2時の目盛りまでの横の距離も2倍になるので、2*cos30度[メートル]になります。
つまり、cos30度とsin30度の値がわかれば、これに円の半径を掛けてやることで、円周上の角度30度の点の座標が分かるのですねー(●´ω`●)

あと、tan30度は、sin30度/cos30度で、これは時計の針が30度のときの「針の傾き」(横に1m移動したとき、縦に何m移動するかという値)です(; ̄▽ ̄)

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -