【发布时间】:2015-11-17 17:21:28
【问题描述】:
在System.Drawing 和System.Drawing.Drawing2D 中,我只能绘制水平或垂直形状。现在我想绘制自定义形状。
【问题讨论】:
-
所以你必须做一些相当基本的数学运算。然后你需要做一个 TranslateTransform、RotateTransform,最后是 DrawEllispse。之后可能是 ResetTransform。
在System.Drawing 和System.Drawing.Drawing2D 中,我只能绘制水平或垂直形状。现在我想绘制自定义形状。
【问题讨论】:
以下示例取自MSDN:
private void RotateTransformAngle(PaintEventArgs e)
{
// Set world transform of graphics object to translate.
e.Graphics.TranslateTransform(100.0F, 0.0F);
// Then to rotate, prepending rotation matrix.
e.Graphics.RotateTransform(30.0F);
// Draw rotated, translated ellipse to screen.
e.Graphics.DrawEllipse(new Pen(Color.Blue, 3), 0, 0, 200, 80);
}
【讨论】:
正确的解决方法包括:
Graphics.TranslateTransform将中心移到原点Rectangle的Size和Location
Graphics.RotateTransform 旋转画布Graphics.DrawEllipse绘制椭圆
Graphcis 对象这确实需要一点Math,但会产生真实且精细的椭圆......
为了好玩,您可能还想玩一个便宜的、虚假的解决方案:我使用DrawClosedCurve 方法,有点紧张。
为了测试,我添加了一个 TrackBar 集,其中包含 Maximum 的 100。
大约 80 的值,即大约 0.8f 的 Tensions 创建漂亮的椭圆体:
private void panel1_Paint(object sender, PaintEventArgs e)
{
List<Point> points1 = new List<Point>()
{ new Point(300, 100), new Point(500, 300), new Point(400, 500), new Point(200, 300) };
List<Point> points2 = new List<Point>()
{ new Point(100, 100), new Point(500, 100), new Point(500, 400), new Point(100, 400) };
e.Graphics.DrawClosedCurve(Pens.Red, points1.ToArray(),
(float)(trackBar1.Value / 100f), System.Drawing.Drawing2D.FillMode.Alternate);
e.Graphics.DrawClosedCurve(Pens.Blue, points2.ToArray(),
(float)(trackBar1.Value / 100f), System.Drawing.Drawing2D.FillMode.Alternate);
}
【讨论】: