我需要在內存中繪製一個堅固的多邊形(到二維數組中)並用數值(比如'3')填充多邊形。在內存中繪製一個堅固的多邊形(不在屏幕上)
我希望在C#中做到這一點。
我使用Catfood的Shapefile閱讀器(非常好)從Shapefiles中獲得實心多邊形。
任何想法?
後我已經「映射」 16000條折線代表圍繞聖地亞哥該道路網絡我附加這2D陣列的一小部分(它們顯示爲數字「9」)。我希望通過上傳一個實體多邊形的形狀文件和'數字'3'繪圖'來做同樣的事情。
我需要在內存中繪製一個堅固的多邊形(到二維數組中)並用數值(比如'3')填充多邊形。在內存中繪製一個堅固的多邊形(不在屏幕上)
我希望在C#中做到這一點。
我使用Catfood的Shapefile閱讀器(非常好)從Shapefiles中獲得實心多邊形。
任何想法?
後我已經「映射」 16000條折線代表圍繞聖地亞哥該道路網絡我附加這2D陣列的一小部分(它們顯示爲數字「9」)。我希望通過上傳一個實體多邊形的形狀文件和'數字'3'繪圖'來做同樣的事情。
創建一個Bitmap
,從中獲得一個Graphics
,撥打電話FillPolygon
在Graphics
。
多邊形通過shapefile進入。它必須是位圖的透明blit ...我不想覆蓋不在實體poly內的其他數據。 – zetar 2013-02-27 21:27:46
它不會覆蓋不在多邊形內的其他數據。它會覆蓋多邊形內的數據。 – 2013-02-27 21:42:55
去搶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
是的,我使用Bresenham爲折線(參見上文)。不,這不是功課。它幾年前會做出很好的任務。在我的生活中,我無法找到一個繪製實心聚合物的算法。自從我寫了種子填充已經有20多年了(不想再這樣做)。 – zetar 2013-02-27 21:24:52
看看這個庫:你想要的功能:FillPolygon在 主幹/來源/ WritableBitmapEx/WriteableBitmapFillExtensions.cs 在http://writeablebitmapex.codeplex.com/SourceControl/changeset/view/98508#1157213 – 2013-02-28 08:30:54
由於您正在繪製二維整型數組(因爲我可以在編輯完問題後看到),所以您應該實現自己的多邊形填充,它將數字存儲在二維數組中。爲此目的,您可以使用此職位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;
}
我覺得你有這個問題的意義和可能的解決方案。
什麼是未呈現的多邊形?如果它不在屏幕上,你如何繪製它?這沒有意義。 – Oded 2013-02-27 20:59:16
您的多邊形在第一位表現如何? – 2013-02-27 21:02:46
@Oded zetar看起來非常清楚,它正在詢問如何渲染圖像(並且可能將其保存到文件中),而不是將其直接渲染到屏幕上。 – 2013-02-27 21:05:58