2015-08-24 44 views
-2

System.DrawingSystem.Drawing.Drawing2D中,我只能画出水平或垂直的形状。现在我想绘制自定义形状。在winform中绘制自定义椭圆C#

给定点A,B,C,D的坐标。我想画一个椭圆,就像图中的蓝色一样。 enter image description here

+1

所以,你将不得不做一点点,而基本的数学。然后你需要做一个TranslateTransform,RotateTransform,最后是DrawEllispse。之后可能是一个ResetTransform。 – TaW

+0

阅读[RotateTransform](https://msdn.microsoft.com/en-us/library/a0z3f662(v = vs.110).aspx) –

回答

2

下面的例子是从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); 
} 
1

正确的解决方案涉及:

  • 使用Graphics.TranslateTransform向中心移动到原点计算中心
  • 计算Size和使用Graphics.RotateTransform旋转画布
  • 绘制椭圆与Graphics.DrawEllipse
  • 重置Graphcis对象

这需要一点Math但会产生真实的和精细的椭圆包围Rectangle

  • 的..

    为了好玩,你也可能想玩一个便宜的,假的解决方案:我使用DrawClosedCurve方法与张力。

    为了测试我添加了一个TrackBar设置了Maximum100。的周围0.8f 80左右,即Tensions

    价值创造相当不错的椭球:

    enter image description here

    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); 
    }