SharpDxを利用して、ラインを生成し、生成したラインを回転(アフィン変換)して描画します。
SharpDxでは、一般的に、PathGeometryでラインを生成し、生成したラインの回転(アフィン変換)にTransformedGeometryクラスを利用しますが、TransformedGeometryでは、回転後の座標が取得できません。
※どうしても変換後の座標が欲しかったので…
そこで、今回は、GraphicsPathでラインを生成し、生成したラインの回転(アフィン変換)に
Matrix.RotateAt()を利用します。GraphicsPathの場合は、変換後の座標が取得できるので、
変換後の座標から、PathGeometryを生成し、ラインの描画を行います。
2.参考ソース
以下参考ソースです。
初期処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private void Initialize() { this.Factory2D = new SDX2D.Factory(); var properties = new SDX2D.HwndRenderTargetProperties(); properties.Hwnd = this.Handle; properties.PixelSize = new SDX.Size2(this.Size.Width, this.Size.Height); properties.PresentOptions = SDX2D.PresentOptions.None; this.WinRenderTarget = new SDX2D.WindowRenderTarget(Factory2D, new SDX2D.RenderTargetProperties( new SDX2D.PixelFormat(SDX.DXGI.Format.Unknown, SDX2D.AlphaMode.Premultiplied)), properties); this.WinRenderTarget.AntialiasMode = SDX2D.AntialiasMode.PerPrimitive; this.WinRenderTarget.TextAntialiasMode = SDX2D.TextAntialiasMode.Cleartype; this.BmpRenderTarget = new SDX2D.BitmapRenderTarget(this.WinRenderTarget, SDX2D.CompatibleRenderTargetOptions.None, new SDX.Size2F(400, 400), null, null); this.BackRenderTarget = new SDX2D.BitmapRenderTarget(this.WinRenderTarget, SDX2D.CompatibleRenderTargetOptions.None, new SDX.Size2F(200, 200), null, null); } |
画像の生成
GraphicsPathでラインを生成し、生成したラインを回転(アフィン変換)させて、
変換後の座標から、PathGeometryを生成し、ラインの描画を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
private PointF[] CreatePoints(float rotate) { var path = new GraphicsPath(); path.StartFigure(); path.AddLine(50, 100, 150, 100); path.CloseFigure(); var points1 = path.PathData.Points; var mat = new Matrix(); mat.RotateAt(rotate, new PointF(100, 100)); path.Transform(mat); return path.PathData.Points; } private SDX2D.PathGeometry CreatePathGeometry2(PointF[] points) { var pathGeometry = new SDX2D.PathGeometry(this.Factory2D); using (SDX2D.GeometrySink geometrySink = pathGeometry.Open()) { var stPoint = new SDXMath.RawVector2(points[0].X, points[0].Y); var edPoint = new SDXMath.RawVector2(points[1].X, points[1].Y); geometrySink.BeginFigure(stPoint, SDX2D.FigureBegin.Hollow); geometrySink.AddLines(new SDXMath.RawVector2[] { edPoint }); geometrySink.EndFigure(SDX2D.FigureEnd.Open); geometrySink.Close(); } return pathGeometry; } public void CreateImage() { var brush = new SDX2D.SolidColorBrush(this.WinRenderTarget, SDX.Color.Black); var fontFactory = new SDX.DirectWrite.Factory(); var textFormat = new SDXDW.TextFormat(fontFactory, "メイリオ", 8.0f); var textBrush = new SDX2D.SolidColorBrush(this.WinRenderTarget, SDX.Color.Red); this.BmpRenderTarget.BeginDraw(); this.BmpRenderTarget.Clear(SDX.Color.LightGray); var rotates = new float[] { 0f, 30f, 45f, 60f, 90f,150f,300f }; foreach (var rotate in rotates) { var points = this.CreatePoints(rotate); var pathGeometry = this.CreatePathGeometry2(points); this.BmpRenderTarget.DrawGeometry(pathGeometry, brush, 0.5f); this.BmpRenderTarget.DrawText(rotate.ToString(), textFormat, new SDX.RectangleF(points[0].X - 10, points[0].Y - 10, 20, 20), textBrush, SDX2D.DrawTextOptions.None); } this.BmpRenderTarget.EndDraw(); } |
画像の表示
読み込んだ、SharpDX.Direct2D1.Bitmap型のデータを、
画像に表示するためのWinRenderTargetにドローし、画面に表示します。
1 2 3 4 5 6 7 8 9 |
private void OnPaint(object sender, PaintEventArgs e) { var bitmap = this.BmpRenderTarget.Bitmap; var rectF = new SDX.RectangleF(0, 0, bitmap.Size.Width, bitmap.Size.Height); this.WinRenderTarget.BeginDraw(); this.WinRenderTarget.Clear(SDX.Color.White); this.WinRenderTarget.DrawBitmap(bitmap, rectF, 1, SDX2D.BitmapInterpolationMode.NearestNeighbor, rectF); this.WinRenderTarget.EndDraw(); } |