C# Region类的示例程序,判断多边形是否在另一个多边形内部

如下图,黑色的电芯,蓝色的是治具。

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

image.png

在这个例子里面,就要用到检查一个多边形是否在另一个多边形的内部的问题。

使用C#的 Region类就可以检查一个多边形是否在另一个多边的形的内部。

勇哥因为上面的治具验证电芯的问题,偶然发现C#里面居然还有这么一个Region类。

这个检查方法是:Region.IsVisible,如下图所示:

image.png



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


image.png

演示代码:


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实现的代码:

http://www.skcircle.com/?id=1454



--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864