private void Draw(Bitmap bitmap, GeometryShader2D shader, Matrix4x4 transform) { var geometries = new List <IMarkGeometry>(); var border = (MarkGeometryRectangle)Boundary.Clone(); border.Stroke = Color.White; border.Transform(transform); geometries.Add(border); // apply transformation to geometries foreach (var line in Segments) { var geometry = ((IMarkGeometry)line.Clone()); geometry.Transform(transform); geometries.Add(geometry); } // draw used cells in red shader.Draw( bitmap, geometries ); if (ChildrenExists) { NorthWest.Draw(bitmap, shader, transform); NorthEast.Draw(bitmap, shader, transform); SouthWest.Draw(bitmap, shader, transform); SouthEast.Draw(bitmap, shader, transform); } }
public bool SaveImage(string filePath) { var bitmap = new Bitmap( 480, 480, PixelFormat.Format24bppRgb ); var shader = new GeometryShader2D(); shader.UpdateSettings(1, 1, Color.Red, Color.Green, Color.Transparent); shader.Reset(bitmap, Color.Black); var xScale = bitmap.Width / Boundary.Extents.Width; var yScale = bitmap.Height / Boundary.Extents.Height; // calculate transform var transformationMatrix = GeometricArithmeticModule.CombineTransformations( // centre geometries at origin before scaling GeometricArithmeticModule.GetTranslationTransformationMatrix( -Boundary.Extents.Centre.X, -Boundary.Extents.Centre.Y ), // scale geometries to fit the target bitmap GeometricArithmeticModule.GetScalingTransformationMatrix( xScale, -yScale ), // centre geometries in target bitmap GeometricArithmeticModule.GetTranslationTransformationMatrix( 0.5 * bitmap.Width, 0.5 * bitmap.Height ) ); Draw(bitmap, shader, transformationMatrix); return(shader.WriteToFile(bitmap, filePath, PixelFormat.Format24bppRgb, 120, 120, GeometryShader2D.OptimisationSetting.Default)); }