我有一个名为GraphicsLine的图形对象项目。它的作用就是在每个mousedown上画线,并在每个鼠标上停止,没有什么复杂的。它存储行的起点和终点(x,y)的坐标。现在我想知道的是每当创建一个形状时。例如,你创建4条形成正方形的线,我希望能够运行一个算法,告诉我图中有一个正方形。
请注意,形状可以是"关闭"。不仅是方形,矩形或三角形。
这样做的目的是计算所创建形状的面积。
这样做有什么东西吗?我一直在努力寻找能满足我需求的东西。
编辑1:
我添加了一些额外的信息:
行是" cliped"到另一条线的起点或终点,或者它们不是。没有关闭,它是在同一点或根本没有关闭。 1行可以使用多种形状。
编辑2:
所以基本上,我想要的东西可以给我一个" GraphicsLine"形成一个形状。因此,如果我们在图形中有6条线但其中4条形成一个正方形,我想要一些返回那4行的东西,这样我就可以从中创建另一个对象。
提前致谢。
答案 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的答案说。
希望这有帮助。