我正在使用GDI +函数FillClosedCurve(在C#中,如果这很重要),绘制一系列点作为一个漂亮的“圆形”曲线区域。问题是,它似乎在生成的形状的一个角上添加了一个奇怪的“循环”形状。屏幕截图显示了我红色区域右上角的这个小额外循环 -
代码是
g.FillClosedCurve(shapeBrush, shapePoints.ToArray(), FillMode.Winding, 0.4f);
g.DrawPolygon(blackPen, shapePoints.ToArray());
我添加了一个带有DrawPolygon功能的黑色边框,这样你就可以看到我的坐标在哪里。
谁能告诉我为什么我会在右上角得到那个奇怪的循环形状? 谢谢。
答案 0 :(得分:2)
这是由于您在数组中多次指定相同的点,即作为第一个和最后一个点。
FillClosedCurve
“关闭”你的路径....所以没有必要......事实上,指定两次点是不正确的......因为它会尝试关闭路径返回到同一位置的点......导致伪影。
这是一个展示差异的小例子:
private void Form1_Paint(object sender, PaintEventArgs e)
{
PointF[] arrayDuplicatedPointAtStartAndEnd =
{
new PointF(20.0F, 20.0F),
new PointF(150.0F, 50.0F),
new PointF(150.0F, 150.0F),
new PointF(20.0F, 20.0F),
};
PointF[] arrayWithoutPointOverlap =
{
new PointF(20.0F, 20.0F),
new PointF(150.0F, 50.0F),
new PointF(150.0F, 150.0F)
};
float tension = 0.4F;
using (SolidBrush redBrush = new SolidBrush(Color.Red))
{
e.Graphics.FillClosedCurve(redBrush, arrayDuplicatedPointAtStartAndEnd, FillMode.Winding, tension);
}
e.Graphics.TranslateTransform(110.0f, 0.0f, MatrixOrder.Prepend);
using (SolidBrush blueBrush = new SolidBrush(Color.Blue))
{
e.Graphics.FillClosedCurve(blueBrush, arrayWithoutPointOverlap, FillMode.Winding, tension);
}
}