2015-10-30 76 views
0

我正在嘗試檢查line1是否與line2相交。 Line1和line2是DrawingPath對象。我將這個問題描繪成這樣的代碼:.NET區域與線路相交

let path1 = Drawing2D.GraphicsPath() 
path1.AddLine(0.f, 0.f, 10.f,10.f) 
let rg = Region(path1) 
let path2 = Drawing2D.GraphicsPath() 
path2.AddLine(10.f, 0.f, 0.f, 10.f) 
//Region contains only path1 
rg.Intersect(path2) 
let g = this.CreateGraphics() 
if rg.IsEmpty(g) then 
    printfn "NO INTERSECTION" 

這段代碼總是產生「無交叉」打印。爲什麼線不相交 彼此?

我需要檢查行x是否相交路徑y。

+0

區則被設計成封裝一組像素。它必須包含至少1 x 1像素不能爲空。兩條線的交點不夠大。兩個多邊形,至少1個像素寬,將工作。 –

回答

0

你正在初始化rg與pt而不是path1像我想你打算。

pt不在示例代碼中,我猜測它在測試代碼中的某處更高。

將其更改爲let rg = Region(path1)和我打賭它會工作

+0

錯誤。重寫這段代碼粘貼在這裏,我忘了改變這個變種。應該是path1 – alessandro308

0

還有一點值得做的是,AddLine()創建的GraphicsPath的線路,但線路沒有實際寬度(即0寬度)因此爲什麼不相交。

你需要在每行上給它們一些實際的寬度調用Widen(),然後它們有一個可以相互交叉的區域。

我有低於一個小例子展示瞭如何解決這個問題 - 這是寫有LinqPad使用...

void Main() 
{ 
    Panel panel = new Panel(); 
    Graphics g = panel.CreateGraphics(); 
    Pen p = new Pen(Color.Black, 1); 

    GraphicsPath rect = new GraphicsPath(); 
    rect.AddRectangle(new Rectangle(0, 0, 10, 10)); 

    GraphicsPath li = new GraphicsPath();     // Intersects with Rect 
    li.AddLine(new Point(1, 1), new Point(20, 10)); 
    li.Widen(p); 

    GraphicsPath lc = new GraphicsPath();     // Contained in Rect 
    lc.AddLine(new Point(1, 1), new Point(2, 2)); 
    lc.Widen(p); 

    GraphicsPath ln = new GraphicsPath();     // Not contained or intersect 
    ln.AddLine(new Point(20, 20), new Point(30, 20)); 
    ln.Widen(p); 

    HitTest(rect, li, g); 
    HitTest(rect, lc, g); 
    HitTest(rect, ln, g); 

    g.Dispose(); 
    panel.Dispose();  
} 

private void HitTest(GraphicsPath a, GraphicsPath b, Graphics g) 
{ 
    Region ar = new Region(a); 
    Region br = new Region(b); 

    Region cr1 = ar.Clone(); 
    Region cr2 = ar.Clone(); 

    cr1.Union(br); 
    cr2.Intersect(br); 

    if (cr2.IsEmpty(g)) 
     ("No Intersect, No Contain").Dump(); 

    else if (cr1.Equals(ar, g)) 
     ("Contain").Dump(); 

    else 
     ("Intersect").Dump(); 
}