专栏首页sofu456多边形几何

多边形几何

任意多边形几何中心

public Point Center
        {
            get
            {
                Point ptCenter = new Point();
                int i, j;
                double ai, atmp = 0, xtmp = 0, ytmp = 0;
                if (m_LogicPoints.Count == 1)
                    return m_LogicPoints[0];
                if ((m_LogicPoints.Count == 2) || (m_LogicPoints.Count == 3 && m_LogicPoints[0] == m_LogicPoints[2]))
                    return new Point() { X = (m_LogicPoints[1].X + m_LogicPoints[0].X) / 2, Y = (m_LogicPoints[1].Y + m_LogicPoints[0].Y) / 2 };

                int n = m_LogicPoints.Count;
                for (i = n - 1, j = 0; j < n; i = j, j++)
                {
                    ai = m_LogicPoints[i].X * m_LogicPoints[j].Y - m_LogicPoints[j].X * m_LogicPoints[i].Y;
                    atmp += ai;
                    xtmp += (m_LogicPoints[j].X + m_LogicPoints[i].X) * ai;
                    ytmp += (m_LogicPoints[j].Y + m_LogicPoints[i].Y) * ai;
                }

                if (atmp != 0)
                {
                    ptCenter.X = Convert.ToInt32(xtmp / (3 * atmp));
                    ptCenter.Y = Convert.ToInt32(ytmp / (3 * atmp));
                }
                return ptCenter;
            }
        }

线段相交

public bool isColide(Line line)//判断是否相交,直线p1p2与线段p3p4
        {
            //判处端点
            if (this.V0 == line.V0 || this.V0 == line.V1 || this.V1 == line.V0 || this.V1 == line.V1)
                return false;

            double deviation = 0.1;//允许误差
            //排斥试验,判断p1p2在q1q2为对角线的矩形区之外
            if (Math.Max(line.V0.X, line.V1.X) < Math.Min(this.V0.X, this.V1.X)- deviation)
            {//P1P2中最大的X比Q1Q2中的最小X还要小,说明P1P2在Q1Q2的最左点的左侧,不可能相交。
                return false;
            }

            if (Math.Min(line.V0.X, line.V1.X) > Math.Max(this.V0.X, this.V1.X)+ deviation)
            {//P1P2中最小的X比Q1Q2中的最大X还要大,说明P1P2在Q1Q2的最右点的右侧,不可能相交。
                return false;
            }

            if (Math.Max(line.V0.Y, line.V1.Y) < Math.Min(this.V0.Y, this.V1.Y)- deviation)
            {//P1P2中最大的Y比Q1Q2中的最小Y还要小,说明P1P2在Q1Q2的最低点的下方,不可能相交。
                return false;
            }

            if (Math.Min(line.V0.Y, line.V1.Y) > Math.Max(this.V0.Y, this.V1.Y)+ deviation)
            {//P1P2中最小的Y比Q1Q2中的最大Y还要大,说明P1P2在Q1Q2的最高点的上方,不可能相交。
                return false;
            }

            //跨立试验
            var crossP1P2Q1 = Cross(line.V0, line.V1, this.V0);
            var crossP1Q2P2 = Cross(line.V0, this.V1, line.V1);
            var crossQ1Q2P1 = Cross(this.V0, this.V1, line.V0);
            var crossQ1P2Q2 = Cross(this.V0, line.V1, this.V1);

            return (crossP1P2Q1 * crossP1Q2P2 >= 0 || Math.Abs(crossP1P2Q1 * crossP1Q2P2) < 0.01) && (crossQ1Q2P1 * crossQ1P2Q2 >= 0 || Math.Abs(crossQ1Q2P1 * crossQ1P2Q2) < 0.01);
        }

参考: https://zh.wikipedia.org/wiki/几何中心 https://blog.csdn.net/xxdddail/article/details/70264399

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • UE4源码编译 failed to open/create XGE(incredible build工具)

    C++项目编译失败,UnrealBuildTool项目添加ShaderCompileWorker Win64 Development -waitmutex参数,...

    sofu456
  • WDK设备驱动开发

    https://msdn.itellyou.cn/ 安装完成后,开始菜单中找到Windows Device Kits目录,查看帮助文档和编译demo

    sofu456
  • MarkDown轻量级标记语言

    ####1.标题 #一级标题 ##二级标题 ###三级标题 … ######六级标题 ####2.引用 >这个是引用 >是不是和电子邮件中的 ...

    sofu456
  • 借助云开发搭建专属技术博客小程序丨实战

    一直对小程序开发很感兴趣,之前就准备做一款属于自己的小程序,无奈还需要购买云服务器和部署后台,有点麻烦,自从知道有了云开发这个免去服务器搭建和运维的一站式后端云...

    腾讯云开发TCB
  • 【云计算奇妙学习之旅】第二期:云计算

    在上一期的分享中,我们了解到云计算是什么,以及它的发展历程和前景,那本期我们继续分享云计算它是怎样部署呢,它有哪些服务模式,以及华为的云计算又包含什么呢?

    誉天小鹿
  • EasyUI 创建 CRUD 应用

    数据收集并妥善管理数据是网络应用共同的必要。CRUD 允许我们生成页面列表,并编辑数据库记录。本教程将向你演示如何使用 jQuery EasyUI 框架实现一个...

    java达人
  • 2020年商业领域的十大编程语言

    硬件和软件的结合是技术进步的主要原因。顶级编程语言是我们今天看到的现代和新兴技术的核心部分。当今的开发人员要处理的编程语言比以往任何时候都多。

    HuangWeiAI
  • K8S 生态周报| 终端下的 K8S 资源树查看器

    「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s 生态」。

    Jintao Zhang
  • 雷达图的一种实现! Cocos Creator !

    1.新建一个节点2.为节点添加graphics组件3.添加用户脚本radar4.调整对应参数

    白玉无冰
  • CRM PRDCT_OBJECT, BDOC和customer product id修改

    This wiki page discusses the second BDOC PRDCT_OBJECT which is generated after c...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券