0

Clipper ライブラリを使用してグラフィック パスを変更しようとしています。

アウトライン/ストロークを表す幅のリストがあります。最初に最大のものから始めて、最小のものに向かって進みたいと思います。

この例では、幅 20 と 10 の 2 つのストロークを追加します。

グラフィックパスを取得し、それを 20 ピクセルずつ拡張/オフセットして、新しいグラフィックパスにしたいと考えています。元のパスを変更したくありません。次に、新しいグラフィックス パスを単色で塗りつぶします。

次に、元のグラフィックス パスを取得し、それを 10 ピクセルずつ拡張またはオフセットして、新しいグラフィックス パスにします。この新しいパスを別の色で塗りつぶしたいと思います。

次に、元のパスを別の色で塗りつぶしたいと思います。

これを行う適切な方法は何ですか。これを行うために作成した次の方法がありますが、正しく機能していません。

private void createImage(Graphics g, GraphicsPath gp, List<int> strokeWidths)
{
  ClipperOffset pathConverter = new ClipperOffset();
  Clipper c = new Clipper();
  gp.Flatten();

  foreach(int strokeSize in strokeWidths)
  {
    g.clear();
    ClipperPolygons polyList = new ClipperPolygons();
    GraphicsPath gpTest = (GraphicsPath)gp.Clone();    
    PathToPolygon(gpTest, polyList, 100);
    gpTest.Reset();

    c.Execute(ClipType.ctUnion, polyList, PolyFillType.pftPositive, PolyFillType.pftEvenOdd);
    pathConverter.AddPaths(polyList, JoinType.jtMiter, EndType.etClosedPolygon);                  
    pathConverter.Execute(ref polyList, strokeSize * 100);

    for (int i = 0; i < polyList.Count; i++)
    {
      // reverses scaling
      PointF[] pts2 = PolygonToPointFArray(polyList[i], 100);
      gpTest.AddPolygon(pts2);
    }
    g.FillPath(new SolidBrush(Color.Red), gpTest);
  }
}

        private void PathToPolygon(GraphicsPath path, ClipperPolygons polys, Single scale)
        {
            GraphicsPathIterator pathIterator = new GraphicsPathIterator(path);
            pathIterator.Rewind();
            polys.Clear();
            PointF[] points = new PointF[pathIterator.Count];
            byte[] types = new byte[pathIterator.Count];
            pathIterator.Enumerate(ref points, ref types);
            int i = 0;
            while (i < pathIterator.Count)
            {
                ClipperPolygon pg = new ClipperPolygon();
                polys.Add(pg);
                do
                {

                    IntPoint pt = new IntPoint((int)(points[i].X * scale), (int)(points[i].Y * scale));
                    pg.Add(pt);
                    i++;
                }
                while (i < pathIterator.Count && types[i] != 0);
            }
        }
        private PointF[] PolygonToPointFArray(ClipperPolygon pg, float scale)
        {
            PointF[] result = new PointF[pg.Count];
            for (int i = 0; i < pg.Count; ++i)
            {
                result[i].X = (float)pg[i].X / scale;
                result[i].Y = (float)pg[i].Y / scale;
            }
            return result;
        }
4

1 に答える 1