C# 在winform中绘制自定义椭圆

C# 在winform中绘制自定义椭圆,c#,winforms,drawing,shape,C#,Winforms,Drawing,Shape,在System.Drawing和System.Drawing.Drawing2D中,我只能绘制水平或垂直形状。现在我想画自定义形状 给定A点,B点,C点,D点的坐标,我想画一个椭圆,像图中蓝色的那个。 以下示例取自: 以下示例摘自: 正确的解决方案包括: 计算中心 使用Graphics.TranslateTransform将中心移动到原点 计算边框的大小和位置 使用Graphics.RotateTransform旋转画布 用Graphics.drawerlipse 重置Graphcis对象

System.Drawing
System.Drawing.Drawing2D
中,我只能绘制水平或垂直形状。现在我想画自定义形状

给定A点,B点,C点,D点的坐标,我想画一个椭圆,像图中蓝色的那个。

以下示例取自:


以下示例摘自:


正确的解决方案包括:

  • 计算中心
  • 使用
    Graphics.TranslateTransform
    将中心移动到原点
  • 计算边框的
    大小
    位置
  • 使用
    Graphics.RotateTransform
    旋转画布
  • Graphics.drawerlipse
  • 重置
    Graphcis
    对象
这确实需要一点数学运算,但会产生真实而精细的椭圆

为了好玩,你可能还想玩一个便宜的、假的解决方案:我使用了
DrawClosedCurve
方法

为了进行测试,我添加了一个
轨迹栏
,设置的
最大值为
100

大约80的值,即大约
0.8f的
张力
创建了非常漂亮的椭球体:

private void panel 1_Paint(对象发送器,PaintEventArgs e)
{
列表点1=新列表()
{新点(300100)、新点(500300)、新点(400500)、新点(200300)};
列表点2=新列表()
{新点(100100)、新点(500100)、新点(500400)、新点(100400)};
e、 Graphics.DrawClosedCurve(Pens.Red,points1.ToArray(),
(浮动)(轨迹栏1.Value/100f)、系统图、绘图2D.FillMode.Alternate);
e、 Graphics.DrawClosedCurve(Pens.Blue,points2.ToArray(),
(浮动)(轨迹栏1.Value/100f)、系统图、绘图2D.FillMode.Alternate);
}

正确的解决方案包括:

  • 计算中心
  • 使用
    Graphics.TranslateTransform
    将中心移动到原点
  • 计算边框的
    大小
    位置
  • 使用
    Graphics.RotateTransform
    旋转画布
  • Graphics.drawerlipse
  • 重置
    Graphcis
    对象
这确实需要一点数学运算,但会产生真实而精细的椭圆

为了好玩,你可能还想玩一个便宜的、假的解决方案:我使用了
DrawClosedCurve
方法

为了进行测试,我添加了一个
轨迹栏
,设置的
最大值为
100

大约80的值,即大约
0.8f的
张力
创建了非常漂亮的椭球体:

private void panel 1_Paint(对象发送器,PaintEventArgs e)
{
列表点1=新列表()
{新点(300100)、新点(500300)、新点(400500)、新点(200300)};
列表点2=新列表()
{新点(100100)、新点(500100)、新点(500400)、新点(100400)};
e、 Graphics.DrawClosedCurve(Pens.Red,points1.ToArray(),
(浮动)(轨迹栏1.Value/100f)、系统图、绘图2D.FillMode.Alternate);
e、 Graphics.DrawClosedCurve(Pens.Blue,points2.ToArray(),
(浮动)(轨迹栏1.Value/100f)、系统图、绘图2D.FillMode.Alternate);
}

所以你必须做一点基础数学。然后你需要做一个TranslateTransform,RotateTransform,最后是drawerLispse。之后可能会进行一次重置转换。请阅读相关内容,这样您将不得不做一点基础数学。然后你需要做一个TranslateTransform,RotateTransform,最后是drawerLispse。之后可能会重新设置转换。阅读
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);
}
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);
}