1

私は GDI+ 関数 FillClosedCurve (それが重要な場合は C# で) を使用して、一連のポイントを素敵な「丸みを帯びた」曲線領域として描画します。問題は、結果の形状の 1 つのコーナーに奇妙な「ループ」形状を追加しているように見えることです。スクリーンショットは、私の赤い色の領域の右上隅にあるこの小さな余分なループを示しています - 私の曲線のスクリーンショット

コードは

g.FillClosedCurve(shapeBrush, shapePoints.ToArray(), FillMode.Winding, 0.4f);
g.DrawPolygon(blackPen, shapePoints.ToArray());

DrawPolygon 関数を使用して黒い境界線を追加したので、座標がどこにあるかがわかります。

右上隅に奇妙なループ形状が表示される理由を誰か教えてもらえますか?? ありがとうございました。

4

1 に答える 1

2

これは、配列内で同じポイントを複数回指定したことが原因です。つまり、最初と最後のポイントです。

FillClosedCurveパスを「閉じます」....その必要はありません...実際、ポイントを2回指定するのは正しくありません....ポイントからポイントに戻るパスを閉じようとするためです同じ位置....アーティファクトを引き起こします。

違いを示すための小さな例を次に示します。

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

ここに画像の説明を入力

于 2013-08-23T12:13:40.810 に答える