创建形状从线条2D c#

本文关键字:2D 创建 | 更新日期: 2023-09-27 17:50:56

我有一个名为GraphicsLine的图形对象项目。它所做的只是在每次鼠标下移和每次鼠标上移上画线,并不复杂。它存储行开始和结束的坐标(x,y)。现在我想知道的是,当一个形状被创建时。例如,你创建了4条线形成一个正方形,我希望能够运行一个算法,可以告诉我画中有一个正方形。

注意形状可以是任何"闭合"的形状。不仅是正方形、长方形或三角形。

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

是否有已经存在的东西来做这个?我一直在努力寻找符合我需要的东西。

编辑1:

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

行要么被"剪切"到另一行的起点或终点,要么不被"剪切"。没有闭合,它在同一点上或者根本不闭合。1行可用于多种形状

EDIT 2:

基本上,我想要一些东西可以给我一个数组GraphicsLine来形成一个形状。因此,如果我们在绘图中有6条线,其中4条形成一个正方形,我想要返回这4条线,以便我可以根据它创建另一个对象。

创建形状从线条2D c#

请检查这个问题我如何计算一个二维多边形的面积?这可能是你需要的,你只需要把它移植到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);

看看这个教程的AForge。NET形状检查器

如果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年多以后,但我找到了一种递归函数的方法来知道形状何时"关闭"。从最后一条线的任意点开始,然后检查另一个点是否与另一条线相连。这样做,直到到达起点。我将所有的线条保存到另一个名为Polygon的类中。这样,它们就保留了形成多边形的所有起点和终点线。然后计算面积,我按照Eduardo Cobuci在他的回答中所说的去做。