C# 计算GDI中描述曲线周围区域的点阵列+;

C# 计算GDI中描述曲线周围区域的点阵列+;,c#,winforms,gdi+,C#,Winforms,Gdi+,从一条定义为用户绘制的一系列点的曲线(下图左图)开始,我想导出描述该曲线周围区域的点。为此,我正在使用GraphisPath中的加宽函数,如下所示: PointF[] ComputeAreaAroundCurve(PointF[] curvePoints) { GraphicsPath gp = new GraphicsPath(); gp.AddLines(curvePoints); using(Pen pen = new Pen(Color.Black, 10))

从一条定义为用户绘制的一系列点的曲线(下图左图)开始,我想导出描述该曲线周围区域的点。为此,我正在使用
GraphisPath
中的
加宽
函数,如下所示:

PointF[] ComputeAreaAroundCurve(PointF[] curvePoints)
{
    GraphicsPath gp = new GraphicsPath();
    gp.AddLines(curvePoints);
    using(Pen pen = new Pen(Color.Black, 10))
        gp.Widen(pen);
    return gp.PathPoints;
}
如果我画出结果,我会得到右边的图形,当然相交部分(红色箭头)不会被取下。你知道如何计算点f[]吗?绘制时,该点也会包含该部分


诀窍是使用两个

  • 第一个是通过
    加宽
    调用获取轮廓点的一个。它必须处于(默认)填充模式
    Alternate

  • 返回轮廓点
    opp
    后,需要将它们添加到
    图形SPATH
    。此模式必须设置为
    填充模式。绕组

第二个
GraphicsPath
将填充包括交叉点在内的完整轮廓,并将报告内部的点以“可见”

gpWinding = new GraphicsPath();
gpWinding.FillMode = FillMode.Winding;

gpWinding.AddCurve(opp);
现在,
鼠标单击
将起作用:

Text = gpWinding.IsVisible(e.Location) ? "Yes" : "No";
填充它将填充所有轮廓区域:

e.Graphics.FillPath(Brushes.DarkKhaki, gpWinding );
e.Graphics.DrawPath(Pens.White, gpWinding );

绘制路径时是否尝试过
FillMode.Winding
?是的,我在创建路径时尝试过FillMode.Winding,但没有更改。另外,请考虑我喜欢点数组,因为之后我需要执行其他操作(比如确定一个点是否包含在所描述的区域内)。