2013-10-12 67 views
3

我正在使用剪輯器執行一堆操作在多邊形上,代表我的程序中的對象的輪廓。事情是,我現在想剪輯一個線段的網格來填充這些輪廓,但我正在努力使用Clipper來做到這一點。C#剪輯linesegment與剪輯器庫

此刻我正在將我的線條轉換爲厚度爲2個單位的矩形,然後我進行相交操作,最後我需要將新多邊形恢復爲線段。雖然這樣做效率很低,但會產生很多錯誤。

這可以使用Clipper完成,如果沒有,還有其他的東西可以使用或者我需要實現我自己的線段裁剪器嗎?

回答

6

使用剪版本6 ...

using ClipperLib; 

using Path = List<IntPoint>; 
using Paths = List<List<IntPoint>>; 

static Polygon IntsToPolygon(Int64[] ints) 
{ 
    int len1 = ints.Length/2; 
    Polygon result = new Polygon(len1); 
    for (int i = 0; i < len1; i++) 
    result.Add(new IntPoint(ints[i * 2], ints[i * 2 + 1])); 
    return result; 
} 


static void Main(string[] args) 
{ 
    Paths clip = new Paths(); //clipping polygon(s) 
    //make a polygon in the shape of a pentagram 
    //with center (200,200) and radius 100 ... 
    Int64[][] ints1 = new Int64[][] 
    { 
    new Int64[]{222, 169, 295, 169, 236, 212, 259, 281, 200, 238, 
     141, 281, 164, 212, 105, 169, 178, 169, 200, 100} 
    }; 
    clip.Add(IntsToPolygon(ints1[0])); 

    Paths subj = new Paths(); //subject paths, could be open or closed here 
    int gridWidth = 5; 
    int loopCnt = 200/gridWidth; 

    //now make grid lines and add them to subj ready for clipping ... 

    //add horizontal grid lines ... 
    for (int i = 0; i <= loopCnt; i++) 
    { 
    Path gridLine = new Path(2); 
    gridLine.Add(new IntPoint(100, 100 + i * gridWidth)); 
    gridLine.Add(new IntPoint(300, 100 + i * gridWidth)); 
    subj.Add(gridLine); 
    } 
    //add vertical grid lines ... 
    for (int i = 0; i <= loopCnt; i++) 
    { 
    Path gridLine = new Path(2); 
    gridLine.Add(new IntPoint(100 + i * gridWidth, 100)); 
    gridLine.Add(new IntPoint(100 + i * gridWidth, 300)); 
    subj.Add(gridLine); 
    } 

    //now clip the gridlines (subj) with the pentagram (clip) ... 
    Clipper c = new Clipper(); 
    PolyTree solution = new PolyTree(); 
    c.AddPaths(subj, PolyType.ptSubject, false); //ie paths NOT closed 
    c.AddPaths(clip, PolyType.ptClip, true); //nb: clip paths MUST be closed 
    c.Execute(ClipType.ctIntersection, 
     solution, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd); 
    Paths clippedGrids = Clipper.PolyTreeToPaths(solution); 

    //Display the result (sorry, make your own display function) ... 
    //Display(Paths p, Color stroke, Color brush, PolyFillType pft, bool IsClosed) 
    Display(subj, Color.FromArgb(0x18, 0, 0, 0x9c), 
     Color.Blue, PolyFillType.NonZero, false); //unclipped grid 
    Display(clippedGrids, FromArgb(0, 0, 0, 0), 
     Color.Red, false); //clipped grid 

} 

enter image description here