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);
        }
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 在宝塔上配置阿里SSL证书流程[通俗易懂]

    在宝塔上配置阿里SSL证书流程[通俗易懂]1.在阿里申请SSL证书2.下载申请好的ssl证书3.在宝塔上找到ssl4.复制证书安装顺序复制用文本打开.key文件复制里面的内容到左侧秘钥(key)用文本打开_public.crt文件复制里面的内容到右侧证书(pem)格式用文本打开_chain.crt文件复制里面的内容到右侧证书(pem)格式5.部署部署成功…

  • mysql官方监控工具_mysql数据库监控

    mysql官方监控工具_mysql数据库监控spy.properties可以直接到http://my.oschina.net/zh119893/blog/272545复制.P6Spy监控JDBC详细配置说明http://blog.csdn.net/u010280007/article/details/88131401、解压出p6spy.jar和spy.properties两个文件2、将p6spy.jar放入应用程序的WEB-INF…

  • vue上传文件夹和文件_vue打包后的文件如何运行

    vue上传文件夹和文件_vue打包后的文件如何运行<template><el-form:model=”formData”label-width=”280px”><el-form-itemlabel=”上传kbase视图文件”><el-uploadclass=”upload-demo”ref=”upload”:action=”formData.url”:he.

    2022年10月10日
  • 21计算机保研经验分享

    21计算机保研经验分享保研最终去向:哈工大威海-计算机个人情况:学校是211计算机弱校,rank7%;个人有数学建模,小程序,网安的省级奖,几个小科研项目,一段工作室经历,擅长后端搬砖。无论文;自我感觉算是保研er水平一般的,我这个去向怎么样啊,欢迎留言面经:吉林大学软件工程+哈工大威海计算机面试经验分享马上写好一、夏令营夏令营经历:北理工网安入营+时间冲突放弃,只能说非常可惜;吉林大学软件入营+优秀营员;哈工大威海计算机入营+面试合格(共投递11所学校学院,只有两个真正参加,但万幸都有收获)吉林大学软件工程

  • php统计近一周和近30天的用户数据

    php统计近一周和近30天的用户数据

    2021年10月25日
  • upx手动脱壳

    upx手动脱壳upxupx是一个开源的工具,可以到github下载upxupx简单的用法upxsrc.exe命令将src.exe加壳upxsrc.exe-odst.exe命令将src.exe加壳并另存为dst.exeupx手动脱壳

发表回复

您的电子邮箱地址不会被公开。

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