2013-02-27 42 views
0

我需要在內存中繪製一個堅固的多邊形(到二維數組中)並用數值(比如'3')填充多邊形。在內存中繪製一個堅固的多邊形(不在屏幕上)

我希望在C#中做到這一點。

我使用Catfood的Shapefile閱讀器(非常好)從Shapefiles中獲得實心多邊形。

任何想法?


後我已經「映射」 16000條折線代表圍繞聖地亞哥該道路網絡我附加這2D陣列的一小部分(它們顯示爲數字「9」)。我希望通過上傳一個實體多邊形的形狀文件和'數字'3'繪圖'來做同樣的事情。 Small section of the 'Terrain Map' in memory

+8

什麼是未呈現的多邊形?如果它不在屏幕上,你如何繪製它?這沒有意義。 – Oded 2013-02-27 20:59:16

+1

您的多邊形在第一位表現如何? – 2013-02-27 21:02:46

+0

@Oded zetar看起來非常清楚,它正在詢問如何渲染圖像(並且可能將其保存到文件中),而不是將其直接渲染到屏幕上。 – 2013-02-27 21:05:58

回答

1

在C#中,您可以使用Bitmap類來執行任何想要的離線繪製。

+0

使用位圖是一個有趣的想法......只是可能的工作。 – zetar 2013-02-27 21:12:07

+0

是的,但是當我將位圖移動到內存時,它不會消除其他任何東西嗎?我不記得是否有對透明位圖的支持,還是我必須在多年前編寫自己的代碼。 – zetar 2013-02-27 21:31:08

1

創建一個Bitmap,從中獲得一個Graphics,撥打電話FillPolygonGraphics

+0

多邊形通過shapefile進入。它必須是位圖的透明blit ...我不想覆蓋不在實體poly內的其他數據。 – zetar 2013-02-27 21:27:46

+0

它不會覆蓋不在多邊形內的其他數據。它會覆蓋多邊形內的數據。 – 2013-02-27 21:42:55

1

去搶WriteableBitmapEx擴展。這將允許您在圖像內存中繪製任何想要的內容。或者,你可以製作一個DrawingVisual,用它繪製任何你想要的,然後渲染成一個圖像目標;參見:This example

如果你想通過System.Drawing路由去;

using System.Drawing; 

Bitmap bmp = new Bitmap(200, 100); 
Graphics g = Graphics.FromImage(bmp); 
g.DrawLine(Pens.Black, 10, 10, 180, 80); 

REF:(亨克Holterman)Drawing C# graphics without using Windows Forms

但我懷疑(基於措辭),這是家庭作業,而你已經被告知做手工;

所以;對於你想Bresenham的線算法的線條,然後用填充算法填充它們; See This

+1

是的,我使用Bresenham爲折線(參見上文)。不,這不是功課。它幾年前會做出很好的任務。在我的生活中,我無法找到一個繪製實心聚合物的算法。自從我寫了種子填充已經有20多年了(不想再這樣做)。 – zetar 2013-02-27 21:24:52

+0

看看這個庫:你想要的功能:FillPolygon在 主幹/來源/ WritableBitmapEx/WriteableBitmapFillExtensions.cs 在http://writeablebitmapex.codeplex.com/SourceControl/changeset/view/98508#1157213 – 2013-02-28 08:30:54

0

由於您正在繪製二維整型數組(因爲我可以在編輯完問題後看到),所以您應該實現自己的多邊形填充,它將數字存儲在二維數組中。爲此目的,您可以使用此職位Good algorithm for drawing solid 2-dimensional polygons?

另一種解決方法是一個小解決方法。您可以使用已經實現的填充位圖中多邊形的PolygonFill。看一下這個。我必須警告說,獲取位圖像素非常緩慢,爲此您可以使用一些FastBitmap實現。這裏我將使用常規的位圖。

Bitmap bmp = new Bitmap(0,0,mostRightPoint.X - mostLeftPoint.X, mostUpperPoint.Y - mostLowerPoint.Y); 
//this implies that you are on the northern hemisphere 
Graphics g = Graphics.FromImage(bmp); 
g.Clear(Color.White); //clear the whole bitmap into white color 
int [] points = new points[nmbOfPoints]; 

for(int i = 0;i<nmbOfPoints;i++) 
{ 
     //put the points in the points array 
} 
g.FillPolygon(Brushes.Black, points); 
g.Dispose(); 

現在,你應該通過位圖進行迭代,對這些地方的像素是黑色的,把3號在你的二維數組,somethink這樣。

for(int i = 0;i<bmp.Width;i++) 
for(int j = 0;j<bmp.Height;j++) 
if(Bitmap.GetPixel(i,j) == Color.Black) 
{ 
    2DArray[mostLeftPoint.X + i, mostLowerPoint.Y + j] = 3; 
} 

我覺得你有這個問題的意義和可能的解決方案。