如下图,黑色的电芯,蓝色的是治具。
把电芯放在治具里面,如果可以轻松放进去,证明电芯的尺寸是合格的。

在这个例子里面,就要用到检查一个多边形是否在另一个多边形的内部的问题。
使用C#的 Region类就可以检查一个多边形是否在另一个多边的形的内部。
勇哥因为上面的治具验证电芯的问题,偶然发现C#里面居然还有这么一个Region类。
这个检查方法是:Region.IsVisible,如下图所示:

下面的演示程序演示了Region的常见方法。

演示代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CSharp_Region类的方法图解
{
public partial class Form1 : Form
{
Rectangle recta = new Rectangle(20, 20, 180, 160);
Rectangle rectb = new Rectangle(120, 120, 240, 280);
Font font = new Font(new FontFamily("宋体"), 24.0F, FontStyle.Bold);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void DrawRectangle_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
g.FillRectangle(Brushes.Red, recta);
g.FillRectangle(Brushes.Black, rectb);
g.DrawString("A", font, Brushes.Red, (float)recta.Right, (float)recta.Top + (recta.Height - 24) / 2);
g.DrawString("B", font, Brushes.Black, (float)rectb.Right, (float)rectb.Top + (rectb.Height - 24) / 2);
}
private void RegionComplement_Click(object sender, EventArgs e)
{
Region rgn = new Region(recta);
rgn.Complement(rectb);
Graphics g = this.CreateGraphics();
g.FillRegion(Brushes.Green, rgn);
}
private void RegionExclude_Click(object sender, EventArgs e)
{
Region rgn = new Region(recta);
rgn.Exclude(rectb);
Graphics g = this.CreateGraphics();
g.FillRegion(Brushes.Blue, rgn);
}
private void RegionIntersect_Click(object sender, EventArgs e)
{
Region rgn = new Region(recta);
rgn.Intersect(rectb);
Graphics g = this.CreateGraphics();
g.FillRegion(Brushes.Yellow, rgn);
}
private void RegionUnion_Click(object sender, EventArgs e)
{
Region rgn = new Region(recta);
rgn.Union(rectb);
Graphics g = this.CreateGraphics();
g.FillRegion(Brushes.Plum, rgn);
}
private void RegionXor_Click(object sender, EventArgs e)
{
Region rgn = new Region(recta);
rgn.Xor(rectb);
Graphics g = this.CreateGraphics();
g.FillRegion(Brushes.DarkRed, rgn);
}
private void RegionMakeInfinite_Click(object sender, EventArgs e)
{
Region rgn = new Region(recta);
rgn.Complement(rectb);
rgn.MakeInfinite();
Graphics g = this.CreateGraphics();
g.FillRegion(Brushes.Gray, rgn);
}
private void RegionData_Click(object sender, EventArgs e)
{
Region rgn = new Region(recta);
rgn.Complement(rectb);
Graphics g = this.CreateGraphics();
DisplayRegionData(new PaintEventArgs(g, this.Bounds), rgn.GetRegionData().Data.Length, rgn.GetRegionData());
}
// THIS IS A HELPER FUNCTION FOR GetRegionData.
public void DisplayRegionData(PaintEventArgs e,
int len,
System.Drawing.Drawing2D.RegionData dat)
{
// Display the result.
int i;
float x = 20, y = 140;
Font myFont = new Font("Arial", 8);
SolidBrush myBrush = new SolidBrush(Color.Black);
e.Graphics.DrawString("myRegionData = ",
myFont,
myBrush,
new PointF(x, y));
y = 160;
for (i = 0; i < len; i++)
{
if (x > 300)
{
y += 20;
x = 20;
}
e.Graphics.DrawString(dat.Data[i].ToString(),
myFont,
myBrush,
new PointF(x, y));
x += 30;
}
}
private void button1_Click_1(object sender, EventArgs e)
{
this.Invalidate(recta, false);
}
}
}勇哥的另一个贴子介绍了halcon实现的代码:
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:



少有人走的路



















