【发布时间】:2018-03-21 03:39:34
【问题描述】:
我创建了一个绘制八边形的方法,效果很好,只要大小为200或更大
public static void FillOctagon(PaintEventArgs e, Color color, int x, int y, int width, int height)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
var points = new []
{
new Point(((x + width) / 2) - (width / 4), y), //side 1
new Point(x, ((y + height) / 2) - (height / 4)), //side 2
new Point(x, ((y + height) / 2) + (height / 4)), //side 3
new Point(((x + width) / 2) - (width / 4), y + height), //side 4
new Point((x + width) - (width / 4), y + height), //side 5
new Point(x + width, ((y + height) / 2) + (height / 4)), //side 6
new Point(x + width, ((y + height) / 2) - (height / 4)), //side 7
new Point((x + width) - (width / 4), y) //side 8
};
using (var br = new SolidBrush(color))
{
using (var gpath = new GraphicsPath())
{
gpath.AddPolygon(points);
e.Graphics.FillPath(br, gpath);
}
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
FillOctagon(e, Color.DodgerBlue, 20, 20, 50, 50);
}
好吧,我的问题是,如果尺寸小于 200 或者宽度与高度不同,反之亦然,图形就会变形。 我的目标是创建一个自适应图形,当宽度和高度小于 200 或宽度与高度不同时保持其形状
例如,如果我将大小设置为 50x50,就会发生这种情况:
【问题讨论】:
-
我在 C# 中没有看到问题,我认为你应该检查你的算法,它会绘制形状
-
不要同时使用宽度和高度,而是将
Math.Min(width, height)用于这两个数字。这将使其保持“方形”。 -
我测试了您的代码,50x50 的形状与 200x200 的形状相同(只是更小)。尝试使用
foreach(var p in points) { Debug.WriteLine(p.X + ", " + p.Y); }将坐标记录到调试控制台并检查它们是否正确。 -
我在 200x200、50x50 和 100x50 三种不同的场景中测试了您的代码,并且似乎运行良好。您的代码还有其他内容吗?你都发了吗?
-
是的,这都是我的代码,我当时不明白,因为我被指定为 50x50 的尺寸变形了,如图所示