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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot 线程池

    SpringBoot 线程池SpringBoot线程池简介使用开启配置使用SpringBoot默认线程池@Async自定义线程池扩展ThreadPoolTaskScheduler和ThreadPoolTaskExecutor继承关系结构Reject策略预定义总结简介程序、线程和线程池进程是资源分配最小单位,线程是程序执行的最小单位。计算机在执行程序时,会为程序创建相应的进程,进行资源分配时,是以进程为单位进行相应的分配。每个进程都有相应的线程,在执行程序时,实际上是执行相应的一系列线程。总结:进程是资源分配最小单位,线程

    2022年6月29日
    138
  • 在微观经济学中,对某一商品的需求是指_苹果公司因违反俄反垄断法被罚

    在微观经济学中,对某一商品的需求是指_苹果公司因违反俄反垄断法被罚供给与需求理论—–说明市场经济中供给与需求如何决定价格,以及价格又如何配置经济中的稀缺资源。4.1市场与竞争4.1.1什么是市场1、市场:由某种物品或劳务的买者与卖者组成的一个群体;4.1.2什么是竞争市场1、竞争市场:有许多买者与卖者,以至于每个人对市场价格的影响都微乎其微的市场。2、完全竞争市场—-两个特征:1)可供销售的物品是完全相同的;2)买者和卖者人数众

    2025年6月12日
    0
  • vi/vim常用命令

    vi/vim常用命令ctrl+b上一页ctrl+f下一页ctrl+u上半页ctrl+d下半页H跳到屏幕的第一行M跳到屏幕的中间行L跳到屏幕的最后一行zt将光标所在的那一行移至屏幕顶部zb将光…

    2022年5月22日
    31
  • Python的for循环_python中的while语句

    Python的for循环_python中的while语句for循环和while循环有什么区别?众做周知,循环是Python中最基础也是最常见的知识点之一,下面我们来一起好好学习一下for循环和while循环,并对比分析两者的使用区别,帮助Python初学者可以更好地掌握两者的内容和应用,下面一起来看看吧~1、for循环(1)概念for循环可以遍历任何序列的项目,比如字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素。(2)代码示例:终端…

    2022年8月12日
    4
  • bootstrap-datepicker使用

    bootstrap-datepicker使用

    2021年11月5日
    46
  • C# Winform界面美化(借助IrisSkin实现)

    C# Winform界面美化(借助IrisSkin实现)一.添加控件IrisSkin4.dll。方法:先把IrisSkin4.dll文件添加到当前项目引用(解决方案资源管理器->当前项目->引用->右键->添加引用,找到IrisSkin4.dll文件…..).IrisSkin4.dll文件最好放在当前项目bin\Debug文件中.1.右键“工具箱”→“添加选项卡”改名为→“我的皮肤”。2.右键“皮肤”→“选择项”弹出对话框3.点击“浏览“→找到IrisSkin…

    2022年5月8日
    172

发表回复

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

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