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


相关推荐

  • 股票预测 lstm(时间序列的预测步骤)

    LSTM数据集实战如果对LSTM原理不懂得小伙伴可以看博主下一篇博客,因为博主水平有限,结合其他文章尽量把原理写的清楚些。数据集首先附上数据集链接:https://pan.baidu.com/s/1AKsz-ohmYHr9mBEEh76P5g提取码:6owv这个数据集是关于股票的,里面有日期,开盘价等信息。既然是时间序列预测,我们最关心的是预测值在时间维度上的走势如何,那我们只要最后一列volume和第一列date这两列就好了。实战先是导入相关包,一些常见的包就不详细说了,我们需要的Se

    2022年4月17日
    57
  • 浅析javaIO的原理过程

    浅析javaIO的原理过程IO流用来处理设备之间的数据传输。Java程序中,对于数据的输入/输出操作以”流(stream)”的方式进行。是指从源节点到目标节点的数据流动源节点和目标节点可以是文件、网络、内存、键盘、显示器等等。java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。输…

    2022年5月2日
    42
  • intellij idea2021 beta 激活码_通用破解码[通俗易懂]

    intellij idea2021 beta 激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    78
  • SQL Prompt10 安装激活教程,让你写sql 如鱼得水[通俗易懂]

    SQL Prompt10 安装激活教程,让你写sql 如鱼得水[通俗易懂]需要sql_Prompt10压缩包的请看文章最底下1.首先得有我们的SQLPrompt10压缩包2.选择SQLPromptDownload.exe进行安装打开安装界面,全部勾选选点击continue——–>>继续下一步点击accept选择安装位置,一般不推荐安装C盘,继续install——>>>>等待安装完成点击finish3.打开sqlserver数据库打开sqlserver数据库,可能有些兄弟进入不是这样得,有sql_

    2022年7月26日
    50
  • nevicat15激活码_通用破解码[通俗易懂]

    nevicat15激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    31
  • slf4j如何使用_正确刷牙方法图解

    slf4j如何使用_正确刷牙方法图解环境说明Windows101803IDEA2018.2.EAPMaven3.5.2这是正文POM文件&lt;!–https://mvnrepository.com/artifact/org.projectlombok/lombok–&gt;&lt;dependency&gt;&lt;groupId&g…

    2025年9月14日
    8

发表回复

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

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