从行2D c#创建形状

时间:2014-03-19 17:46:52

标签: c# .net 2d lines shapes

我有一个名为GraphicsLine的图形对象项目。它的作用就是在每个mousedown上画线,并在每个鼠标上停止,没有什么复杂的。它存储行的起点和终点(x,y)的坐标。现在我想知道的是每当创建一个形状时。例如,你创建4条形成正方形的线,我希望能够运行一个算法,告诉我图中有一个正方形。

请注意,形状可以是"关闭"。不仅是方形,矩形或三角形。

这样做的目的是计算所创建形状的面积。

这样做有什么东西吗?我一直在努力寻找能满足我需求的东西。

编辑1:

我添加了一些额外的信息:

行是" cliped"到另一条线的起点或终点,或者它们不是。没有关闭,它是在同一点或根本没有关闭。 1行可以使用多种形状。

编辑2:

所以基本上,我想要的东西可以给我一个" GraphicsLine"形成一个形状。因此,如果我们在图形中有6条线但其中4条形成一个正方形,我想要一些返回那4行的东西,这样我就可以从中创建另一个对象。

提前致谢。

3 个答案:

答案 0 :(得分:1)

请检查此问题How do I calculate the area of a 2d polygon?这可能是您需要的,您只需将其移植到C#:)

编辑:来自@chmike回答:

其中x和y是坐标数组

var x = [10,10,20,20];
var y = [10,20,20,10];

var n = x.Length;
x[n] = x[0];
x[n+1] = x[1];
y[n] = y[0];
y[n+1] = y[1];

// compute area
int area = 0;
for(var i = 1; i <= n; ++i ) {
  area += x[i]*( y[i+1] - y[i-1] );
}

Console.Write(area /= 2);

答案 1 :(得分:0)

看看AForge.NET的这个教程Shape Checker

如果您的GraphicsLine对象正在PictureBox上绘图,或者您可以将该对象转换为位图,则可以运行以下代码。

你可以轻松尝试检测四边形,这里的代码实际上会突出显示检测到的对象,你确实改变了循环并让它做任何你想做的事情:

// if you are using a PictureBox to draw the shapes, then convert it to a bitmap
Bitmap bitmap = new Bitmap(pictureBox1.Image)

// locate objects using blob counter
BlobCounter blobCounter = new BlobCounter( );

blobCounter.ProcessImage( bitmap );

Blob[] blobs = blobCounter.GetObjectsInformation( );

// create Graphics object to draw on the image and a pen
Graphics g = Graphics.FromImage( bitmap );

Pen bluePen = new Pen( Color.Blue, 2 );

// check each object and draw circle around objects, which are recognized as circles
for ( int i = 0, n = blobs.Length; i < n; i++ )
{
    List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints( blobs[i] );
    List<IntPoint> corners = PointsCloud.FindQuadrilateralCorners( edgePoints );

    g.DrawPolygon( bluePen, ToPointsArray( corners ) );    
}

bluePen.Dispose( );
g.Dispose( );

答案 2 :(得分:0)

我知道它是2年以后,但是我发现了一种带递归函数的方法来知道形状何时被关闭&#34;。从最后绘制的线的任何点开始,然后检查另一个点是否连接到另一条线。你这样做直到你到达起点。我将所有行保存到另一个名为Polygon的类中。这样,它们将所有线条保持为形成多边形的起点和终点。然后计算面积,我按Eduardo Cobuci的答案说。

希望这有帮助。