You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中正确填充多边形问题:填充区域异常指向原点(0,0)

解决C# FillPolygon填充异常(点指向(0,0))的方案

先排查坐标数据有效性

首先确认你的points数组里的坐标是否正确——如果所有点的X/Y值都接近0,那问题出在坐标采集阶段,和图形变换无关。可以在填充前加一段调试代码验证:

foreach (var p in points)
{
    Debug.WriteLine($"Point: ({p.X}, {p.Y})");
}

如果输出的坐标不符合你标记的蓝色点位置,需要检查标记点时的坐标获取逻辑:

  • 是不是误把控件的相对坐标当成了全局屏幕坐标?比如在MouseDown事件里,应该用e.Location(控件内部坐标)而不是Cursor.Position(屏幕坐标)。
  • 有没有在坐标计算时漏掉了容器的偏移值(比如父控件的Location、滚动条偏移)?

处理图形变换问题

如果points坐标是正确的,但绘制后偏移到(0,0)区域,大概率是Graphics对象的变换矩阵被修改过(比如之前做了平移、缩放),可以按以下方式修复:

1. 重置Graphics变换

如果不需要保留之前的图形变换,直接重置后再填充:

// 重置所有变换,恢复默认坐标系统
e.Graphics.ResetTransform();

using (SolidBrush br = new SolidBrush(Color.FromArgb(100, Color.Yellow)))
{
   e.Graphics.FillPolygon(br, points);
}

2. 手动添加必要的偏移变换

如果需要保留部分变换(比如控件有滚动条),可以手动添加平移修正:
比如你的标记点是基于PictureBox的Client区域,但控件开启了自动滚动,需要抵消滚动偏移:

// 抵消滚动条的偏移
e.Graphics.TranslateTransform(
    -pictureBox1.AutoScrollPosition.X, 
    -pictureBox1.AutoScrollPosition.Y
);

using (SolidBrush br = new SolidBrush(Color.FromArgb(100, Color.Yellow)))
{
   e.Graphics.FillPolygon(br, points);
}

额外排查点

  • 确认多边形的点是按顺时针或逆时针顺序排列的,无序的点可能导致填充区域异常(虽然不会直接指向(0,0),但也是常见的填充问题)。

内容的提问来源于stack exchange,提问作者Vikrant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:00:20