作成日: 2010/09/06

メモ: 座標の回転

概要

Windows API の GetGlyphOutline() を使って得るフォントのアウトラインを回転させる必要があり、 結局、7 番目の引数である「変換行列構造体: MAT2」に、

  • MAT2.eM11 = cos(θ)

  • MAT2.eM12 = -sin(θ)

  • MAT2.eM21 = sin(θ)

  • MAT2.eM22 = cos(θ)

※θ は角度を表すラジアン値として渡す。

を設定することで、回転したアウトライン座標を得られたのですが、何故これで回転するんだ?、という疑問がわいたので、 今更ながら、調べてみました。
高校時代にきちんと授業を聞いておられた方には、「そんなの自明だろう」、と笑われるかもしれませんが、、、(^^;)。

加法定理

私にとって、一番わかりやすかったのが、ウィキブックスにあった、 高等学校数学II 加法定理の幾何的導出 です。これにより、

sin(α+β) = sinα・cosβ + cosα・sinβ

cos(α+β) = cosα・cosβ - sinα・sinβ

を手に入れました。

座標の回転

元の座標を (x1, y1)、回転後の座標を (x2, y2) とすると、座標の回転は以下の式で行うことができました。

x2 = x1・cosβ - y1・sinβ

y2 = x1・sinβ + y1・cosβ

また、上記を行列式で表すと、以下のようになります。

変換の行列式

GetGlyphOutline() の引数に渡している値は、この行列式の各値でありました。

参考文献:
「篠原研究室」様: 1.座標の回転

※解説の中で加法定理が使われています。

おまけ

GetGlyphOutline() を使って回転させたフォントのアウトラインを取得、描画した例です。
なお、アウトラインを描画するコードは、

Article ID: 243285 - Last Review: February 12, 2007 - Revision: 1.5
How To Draw TrueType Glyph Outlines

http://support.microsoft.com/?scid=kb;en-us;243285

から流用しました。

Rotate.zip (70.7 KB)