|
2007/03/19(Mon) 23:29:14 編集(投稿者)
すいません。テストできる環境にいなかったので返信が遅れました。
リンク先にも書いてあるとおり、Matrix は「行列」を使った計算になります。
例えばスカラー式「A・B」は「B・A」と等しいですが(A・B=B・A)、行列式の「A×B」は「B×A」と等しくなりません(A×B≠B×A)。(高校数学ですね(^_^))
で、何が言いたいかというと、「Matrix.Scale」や「Matrix.RotateAt」メソッドは上記の行列式を内部で行っています。「拡大してから回転」するのと「回転してから拡大」するのでは最終的な表示結果が異なってきます。
セインさんが行いたいのは「拡大してから回転」になるので、セインさんの書いた処理で正しいように見えますが、実は「Matrix.Scale」などのメソッドはデフォルトでは「前掛け」の計算になってしまいます。
どういうことかというと、Matrix.Scale、Matrix.RotateAt の順番で処理しても「結果=回転×拡大」となってしまうのです。
これを解決するには、単純に処理の順番を反対にする方法もありますし、Matrix.Scale メソッドとMatrix.RotateAt の第3引数に「MatrixOrder」を指定して掛ける順番を指定できるので、そこを「MatrixOrder::Append」として指定してください。
//-----------------------------------------------------// float XScale = 0.5; //Xスケール(0.5はスリム文字 1.5は幅広文字) float YScale = 1.0; //Yスケール
for( int i=0; i<=180; i+=45 ) { Matrix mx; mx.Scale(XScale, YScale, MatrixOrder::Append );//スケール適応 mx.RotateAt( (REAL)i, origin, MatrixOrder::Append ); graphics.SetTransform( &mx ); SolidBrush brush( Color(255-i, 0,0,0) ); graphics.DrawString( pStr, -1, &myFont, origin, &format, &brush ); } // これであってるかな? //-----------------------------------------------------//
※余談ですが、Graphics::DrawString の point 引数を使用すると、「結果=移動×拡大×回転」になることに注意してください。
|