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