emgucv 画圆弧「建议收藏」

emgucv画圆弧

大家好,又见面了,我是你们的朋友全栈君。

emgucv中没有根据给定点画圆弧的函数,自己写了一个,在此给出该函数。其中DrawPixel函数是将圆弧中的点标记一下,需要根据自己程序里的函数具体给出。

    private void DrawArc( List<Point> points ) //三个点
    {
        double x1 = points[0].X;
        double x2 = points[1].X;
        double x3 = points[2].X;
        double y1 = points[0].Y;
        double y2 = points[1].Y;
        double y3 = points[2].Y;
        double x, y;
        double r;
        double a, b, c, d, e, f;
        a = 2 * (x2 - x1);
        b = 2 * (y2 - y1);
        c = x2 * x2 + y2 * y2 - x1 * x1 - y1 * y1;
        d = 2 * (x3 - x2);
        e = 2 * (y3 - y2);
        f = x3 * x3 + y3 * y3 - x2 * x2 - y2 * y2;
        x = (b * f - e * c) / (b * d - e * a);
        y = (d * c - a * f) / (b * d - e * a);
        r = Math.Sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));

        double startAngle = Math.Atan2( points[0].Y-y, points[0].X-x );
        double endAngle = Math.Atan2(points[2].Y - y, points[2].X - x);
        double midAngle = Math.Atan2(points[1].Y - y, points[1].X - x);

        double xi, yi;  //循环过程中实时的点

        double minAngle = startAngle <= endAngle ? startAngle : endAngle;
        double maxAngle = startAngle <= endAngle ? endAngle : startAngle;

        if (midAngle < minAngle || midAngle > maxAngle) //所需要画的弧穿越了二三象限的交线,需要分成2部分来画
        {
            xi = (r * Math.Cos(minAngle));
            yi = (r * Math.Sin(minAngle));

            do
            {
                if ((int)(x + xi + 0.5) >= 0 && (int)(x + xi + 0.5) < currentImage.Width && (int)(y + yi + 0.5) >= 0 && (int)(y + yi + 0.5) < currentImage.Height)
                {
                    ps.Add(new Point((int)(x + xi + 0.5), (int)(y + yi + 0.5)));
                    currentImage[ps[ps.Count - 1].Y, ps[ps.Count - 1].X] = new Gray(255);
                }
                minAngle -= 0.001;

                xi = (r * Math.Cos(minAngle));
                yi = (r * Math.Sin(minAngle));
            }
            while (minAngle >= -Math.PI);


            minAngle = maxAngle;
            xi = (r * Math.Cos(minAngle));
            yi = (r * Math.Sin(minAngle));

            do
            {
                if ((int)(x + xi + 0.5) >= 0 && (int)(x + xi + 0.5) < currentImage.Width && (int)(y + yi + 0.5) >= 0 && (int)(y + yi + 0.5) < currentImage.Height)
                {
                    drawPixel((int)(y + yi + 0.5) , (int)(x + xi + 0.5));
                }
                minAngle += 0.001;

                xi = (r * Math.Cos(minAngle));
                yi = (r * Math.Sin(minAngle));
            }
            while (minAngle <= Math.PI);
        }
        else //记录的三个点在圆上的点是按照从小到大的顺序排列的,从小到的顺序即可画完
        {
            xi = (r * Math.Cos(minAngle));
            yi = (r * Math.Sin(minAngle));

            do
            {
                if ((int)(x + xi + 0.5) >= 0 && (int)(x + xi + 0.5) < currentImage.Width && (int)(y + yi + 0.5) >= 0 && (int)(y + yi + 0.5) < currentImage.Height)
                {
                    drawPixel((int)(y + yi + 0.5) , (int)(x + xi + 0.5));
                }
                minAngle += 0.001;

                xi = (r * Math.Cos(minAngle));
                yi = (r * Math.Sin(minAngle));
            }
            while (minAngle <= maxAngle);
        }
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125806.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java位运算

    java位运算

    2021年9月29日
    41
  • 电商后台管理系统主页布局[通俗易懂]

    电商后台管理系统主页布局[通俗易懂]目录一点睛1整体布局1.1先上下划分,在左右划分。1.2菜单分两级,并且可以折叠。2通过接口获取菜单数据二代码1新增主页Home.vue2注册组件element.js3修改main.js4新增欢迎组件Welcome.vue5修改路由index.js三测试效果四代码参考一点睛1整体布局1.1先上下划分,在左右划分。1.2菜单分两级,并且可以折叠。2通过接口获取菜单数据通过ax…

    2022年5月22日
    45
  • linux struts2漏洞,Struts2漏洞分析,漏洞波及全系版本

    linux struts2漏洞,Struts2漏洞分析,漏洞波及全系版本Struts漏洞分析ApacheStruts团队已经发布了Struts2.3.15.1安全更新版本。在Struts2.3.15.1版本之前,存在着严重的安全漏洞,如果现在一些比较大的网站是用JAVA做的,没有把版本升级,还用的是Strtus2.3.15.1版本之前的话,那么你们就要小心,服务器被黑了哦。下面就来说一下之前版本,Struts2的漏洞是如何产生的,我们自己去做,该如何的去解决这个…

    2022年7月19日
    10
  • The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.

    The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.ThemethodsetPositiveButton(int,DialogInterface.OnClickListener)inthetypeAlertDialog.Builderisnotapplicableforthearguments(String,new  View.OnClickListener(){})Hereis

    2022年6月22日
    26
  • java treeset subset_Java TreeSet subSet()方法

    java treeset subset_Java TreeSet subSet()方法JavaTreeSetsubSet()方法java.util.TreeSet.subSet(EfromElement,EtoElement)方法用于返回位于给定范围(包括fromElement和不包括toElement)之间的一组元素。1语法publicSortedSetsubSet(EfromElement,EtoElement)2参数fromElement:这是返回集的最…

    2022年10月31日
    0
  • STM32的IWDG(独立看门狗)详细用法

    STM32的IWDG(独立看门狗)详细用法文章出处:https://www.cnblogs.com/Liu-Jing/p/7243029.html章参考资料:《STM32F4XX中文参考手册》IWDG章节。1、IWDG简介:  STM32有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬,本章我们主要分析独立看门狗的功能框图和它的应用。独立看门狗用通俗一点的话来解释就是一个12位的递减计…

    2022年6月14日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号