SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

2022-06-26(Sun) トラディショナルな回転、拡大、縮小技術を再現

  と、いうわけで、試験的に回転、拡大、縮小機能を再現してみた。「三角関数が必要なのは最初だけ、後は加算だけで処理できる」というようなコメントの記憶をもとに、コードを書いた。たぶん、その意図に沿っている。実際、ループの中は異常にシンプル。最初に算出した「斜め方向」に沿ってピクセルを拾っていくだけ。回転って、こんなに簡単だったんだ。そりゃ、ハードウェアで実装もできるはずだ。

 def sclnrot(win, x0, y0, w, h, v, t = 0, dx = 0, dy = 0)
     rxys = Vec.v2vxy(v, t); hxys = Vec.v2vxy(v + 32 & 0x3F, t); vxys = Vec.v2vxy(v + 48 & 0x3F, t)
     _vx8 =   dx * rxys[1] - dy * rxys[0]  - (dx << 8)
     _vy8 = -(dx * rxys[0] + dy * rxys[1]) - (dy << 8)
     h.times {|y|
         _hx8 = _vx8; _hy8 = _vy8
         w.times {|x|
             _hx8 += hxys[0]; _hy8 += hxys[1]    # 横方向加算
             c = LegacyGraphics.point(_hx8 >> 8, _hy8 >> 8)
             win.pset(x0 + x, y0 + y, [c.red / 65536.0, c.green / 65536.0, c.blue / 65536.0])
         }
         _vx8 += vxys[0]; _vy8 += vxys[1]        # 縦方向加算
     }
 end
 
 v = 0
 (0...4).each {|y|
     16.times {|x|
         sclnrot(win, x * 64, y * 64, 64, 64, v); v += 1
     }
 }
 
 v = 0
 (4...8).each {|y|
     16.times {|x|
         sclnrot(win, x * 64, y * 64, 64, 64, v, 0, -32, -32); v += 1
     }
 }

  画像の説明

  試しにテトランを回してみた。腕ではなくて、本体をの方を(笑)。緑色はデバッグ用のマーカー。上半分は、回転の中心位置を左上にしていると画面外にズレていってしまうという例。下半分は、回転の中心位置をパターンの中心にすれば、自然な回転をするという例だ。アルゴリズムは単純なのに、思った以上のクオリティで回転してくれる。

  回転の中心位置を指定する機能を実装するにあたって、だいぶ試行錯誤して苦しんだが、結果はシンプルなコードに昇華できたと思う。

  さて、あとは腕のパターンを生成させて、テトランの再現度を上げてみるとするか。