在内存中绘制实心多边形(不在屏幕上)

时间:2013-02-27 20:57:24

标签: c# arrays polygon

我需要在内存中绘制一个实心多边形(到二维数组中)并用数值'填充'多边形(比如'3')。

我希望在C#中做到这一点。

我使用Catfood的Shapefile阅读器(非常好)从Shapefiles获得实心多边形。

有什么想法吗?


在我已经“映射”代表圣地亚哥周围道路网络的16,000条折线后,我附加了这个2D阵列的一小部分(它们显示为数字'9')。我希望通过上传实心多边形的shapefile和数字为'3'的'drawing'来做同样的事情。 Small section of the 'Terrain Map' in memory

4 个答案:

答案 0 :(得分:1)

在C#中,您可以使用Bitmap类对您想要的任何内容进行屏幕外绘制。

答案 1 :(得分:1)

创建Bitmap,从中获取Graphics,在FillPolygon上致电Graphics

答案 2 :(得分: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 :( Henk Holterman)Drawing C# graphics without using Windows Forms

但我怀疑(根据措辞)这是家庭作业,你被告知要手动完成;

因此;对于你想要Bresenham的Line算法的行,然后用填充算法填充它们; See This

答案 3 :(得分: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();

现在你应该迭代Bitmap,在那些像素是黑色的地方,把数字3放在你的2D数组中,有人想这样。

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;
}

我认为您已经了解了问题和可能的解决方案。