2015-11-05 57 views
0

我正在從一個項目中獲取DXF文件(來自autocad或任何其他繪圖程序的繪圖文件)的信息。我從中獲取信息並顯示面板的邊框。在這個面板中,我需要設置線條,但是當面板外面有座標的線條時,我不允許繪製它們。帶限制的C#繪圖

下面你可以找到一張圖片,也許它更清晰一點。

所以白線是磚,他們需要膠水線(黃色),海藍寶石線是輪廓線。在此線以外,不允許繪製膠水線(黃線)

正如您在NR 4BA87的磚上所看到的那樣,它會在面板外部繪製膠水線。

Example of drawlines

我需要某種形式的檢查,如果point是我的等值線/面板裏面我可以得出它在其他不畫它。我怎樣才能做到這一點?

編輯:

我從列表繪製這些線因此這將是巨大的,如果我可以刪除(或不添加的話)從我的名單是我的面板外gluelines。

我得配點屬於contourpoints列表:

public List<PointF> ListContourPoints = new List<PointF>(); 

而且我已經得到了與膠線列表:

List<GlueLine> glueLines = new List<GlueLine>(); 

GlueLine類有2 PointF在它,StartPositionEndPosition

,如果我得到的東西像這將是很好:

if(GlueLines.StartPosition is INSIDE panel && GlueLines.EndPosition is INSIDE panel) 
{ 
    glueLines.Add(gl); 
} 
+0

您使用Windows Forms嗎?如果是這樣,只需設置['Graphics.Clip'](https://msdn.microsoft.com/en-us/library/system.drawing.graphics.clip%28v=vs.110%29.aspx)區域做任何繪畫。 (對於WPF圖形,有一個等價的方法。) –

+0

但是磚需要繪製,即使它在面板外面,所以我不能屏蔽所有的繪圖 – Bart

+0

因此只需在繪製需要的元素時設置剪裁區域被裁剪,並在之後恢復。 –

回答

0

你已經得到的一切Points組成面板的角落的位置數據。因此,您需要做的就是找出組成面板的矩形形狀,然後對線進行位置檢查。

創建矩形的示例函數看起來像下面那樣,但請注意,該函數是在面板與示例提供的形狀相同的假設下創建的,因此需要更多的邏輯來創建其中一個包含了所有的變化:

private static Rectangle[] SplitPointsIntoRectangles(Point[] pa) 
{ 
    pa = pa.OrderBy(p => p.X).ToArray(); 
    Point[] leftmost = pa.Select(p => p).Where(p => p.X == pa[0].X).ToArray(); 
    Point[] rightmost = pa.Select(p => p).Where(p => p.X == pa[pa.Length - 1].X).ToArray(); 

    pa = pa.OrderBy(p => p.Y).ToArray(); 
    Point[] topmost = pa.Select(p => p).Where(p => p.Y == pa[0].Y).ToArray(); 
    Point[] bottommost = pa.Select(p => p).Where(p => p.Y == pa[pa.Length - 1].Y).ToArray(); 

    List<Point> edges = new List<Point>(); 
    edges.AddRange(leftmost); 
    edges.AddRange(rightmost); 
    edges.AddRange(topmost); 
    edges.AddRange(bottommost); 

    Point middlePixel = pa.FirstOrDefault(p => !edges.Contains(p)); 

    Rectangle[] ra = new Rectangle[2]; 
    ra[0] = new Rectangle(leftmost[0].X, leftmost.Min(p => p.Y), rightmost[0].X - leftmost[0].X, bottommost[0].Y - leftmost[0].Y); 
    ra[1] = new Rectangle(topmost.Min(p => p.X), topmost[0].Y, rightmost[0].X - middlePixel.X, middlePixel.Y - topmost[0].Y); 

    return ra; 
} 

一旦我們有矩形,我們則需要確保該線是不能超出,爲此我們可以使用Rectangle.Intersects方法。爲此,我們使用的每個膠線的點來創建一個矩形,像這樣(假設所有這些線是水平的):

Rectangle glueLineRect = new Rectangle(glueLineStartPoint.X, glueLineStartPoint.Y, glueLineEndPosition.X - glueLineStartPoint.X, 1); 

如果下面的函數返回一個空矩形則兩個矩形不相交,否則他們會這樣做。注意:如果矩形部分相交,這個函數將返回一個沒有空的矩形。

Rectangle intersectionRect = Rectangle.Intersect(MainRect, glueLineRect); 

這可以被擴展,以測試所有包含在所述面板內的矩形的,如果失敗就所有這些然後膠線位於所述面板的外側。

我創建此答案讓您開始,SplitPointsIntoRectangles方法需要通用。此外,需要創建循環以測試膠水線是否位於面板內部。

+0

當我使用ur代碼時,'RectangleF intersectionRect2 = RectangleF.Intersect(a_ContourRects [1],glueLineRect);'返回一個包含'0'的所有東西的矩形。仍然感謝幫助,我現在可以自己找出一些東西 – Bart

+0

@Bart如果它返回一個空矩形,這意味着這些矩形不相交 – TheLethalCoder

+0

@Bart如果這有助於您自由地上傳和/或標記爲答案所以未來的遊客可以看到 – TheLethalCoder