在内存中绘制一个坚固的多边形(不在屏幕上)

问题描述:

我需要在内存中绘制一个坚固的多边形(到二维数组中)并用数值(比如'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

在C#中,您可以使用Bitmap类来执行任何想要的离线绘制。

+0

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

+0

是的,但是当我将位图移动到内存时,它不会消除其他任何东西吗?我不记得是否有对透明位图的支持,还是我必须在多年前编写自己的代码。 – zetar 2013-02-27 21:31:08

创建一个Bitmap,从中获得一个Graphics,拨打电话FillPolygonGraphics

+0

多边形通过shapefile进入。它必须是位图的透明blit ...我不想覆盖不在实体poly内的其他数据。 – zetar 2013-02-27 21:27:46

+0

它不会覆盖不在多边形内的其他数据。它会覆盖多边形内的数据。 – 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

+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

由于您正在绘制二维整型数组(因为我可以在编辑完问题后看到),所以您应该实现自己的多边形填充,它将数字存储在二维数组中。为此目的,您可以使用此职位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; 
} 

我觉得你有这个问题的意义和可能的解决方案。