如何计算质心

2024-01-02

我正在处理地理空间形状并在这里查看质心算法,

http://en.wikipedia.org/wiki/Centroid#Centroid_of_polygon http://en.wikipedia.org/wiki/Centroid#Centroid_of_polygon

我已经用 C# 实现了这样的代码(只是经过修改),

求多边形的质心? https://stackoverflow.com/questions/2792443/finding-the-centroid-of-a-polygon

class Program
{
    static void Main(string[] args)
    {
        List<Point> vertices = new List<Point>();

        vertices.Add(new Point() { X = 1, Y = 1 });
        vertices.Add(new Point() { X = 1, Y = 10 });
        vertices.Add(new Point() { X = 2, Y = 10 });
        vertices.Add(new Point() { X = 2, Y = 2 });
        vertices.Add(new Point() { X = 10, Y = 2 });
        vertices.Add(new Point() { X = 10, Y = 1 });
        vertices.Add(new Point() { X = 1, Y = 1 });

        Point centroid = Compute2DPolygonCentroid(vertices);
    }

    static Point Compute2DPolygonCentroid(List<Point> vertices)
    {
        Point centroid = new Point() { X = 0.0, Y = 0.0 };
        double signedArea = 0.0;
        double x0 = 0.0; // Current vertex X
        double y0 = 0.0; // Current vertex Y
        double x1 = 0.0; // Next vertex X
        double y1 = 0.0; // Next vertex Y
        double a = 0.0;  // Partial signed area

        // For all vertices except last
        int i=0;
        for (i = 0; i < vertices.Count - 1; ++i)
        {
            x0 = vertices[i].X;
            y0 = vertices[i].Y;
            x1 = vertices[i+1].X;
            y1 = vertices[i+1].Y;
            a = x0*y1 - x1*y0;
            signedArea += a;
            centroid.X += (x0 + x1)*a;
            centroid.Y += (y0 + y1)*a;
        }

        // Do last vertex
        x0 = vertices[i].X;
        y0 = vertices[i].Y;
        x1 = vertices[0].X;
        y1 = vertices[0].Y;
        a = x0*y1 - x1*y0;
        signedArea += a;
        centroid.X += (x0 + x1)*a;
        centroid.Y += (y0 + y1)*a;

        signedArea *= 0.5;
        centroid.X /= (6*signedArea);
        centroid.Y /= (6*signedArea);

        return centroid;
    }
}

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }
}

问题是,当我有这个形状(L 形)时,这个算法,

(1,1) (1,10) (2,10) (2,2) (10,2) (10,1) (1,1)

它给出了结果(3.62,3.62)。这没问题,只是该点位于形状之外。是否有另一种算法考虑到这一点?

基本上,一个人会在地图上画一个形状。这个形状可能跨越多条道路(因此可能是 L 形),我想计算出该形状的中心。这样我就可以算出当时的道路名称。如果他们画了一个细长的 L 形,那么它在形状之外是没有意义的。


这个答案的灵感来自于 Jer2654 的答案和这个来源:http://coding-experiments.blogspot.com/2009/09/xna-quest-for-centroid-of-polygon.html http://coding-experiments.blogspot.com/2009/09/xna-quest-for-centroid-of-polygon.html

  /// <summary>
  /// Method to compute the centroid of a polygon. This does NOT work for a complex polygon.
  /// </summary>
  /// <param name="poly">points that define the polygon</param>
  /// <returns>centroid point, or PointF.Empty if something wrong</returns>
  public static PointF GetCentroid(List<PointF> poly)
  {
     float accumulatedArea = 0.0f;
     float centerX = 0.0f;
     float centerY = 0.0f;

     for (int i = 0, j = poly.Count - 1; i < poly.Count; j = i++)
     {
        float temp = poly[i].X * poly[j].Y - poly[j].X * poly[i].Y;
        accumulatedArea += temp;
        centerX += (poly[i].X + poly[j].X) * temp;
        centerY += (poly[i].Y + poly[j].Y) * temp;
     }

     if (Math.Abs(accumulatedArea) < 1E-7f)
        return PointF.Empty;  // Avoid division by zero

     accumulatedArea *= 3f;
     return new PointF(centerX / accumulatedArea, centerY / accumulatedArea);
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何计算质心 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项

随机推荐

  • 我不断收到此错误:“在闭包中隐式使用‘self’;使用‘self’。”使捕获语义明确”

    我不断收到此错误 Implicit use of self in closure use self to make capture semantics explicit 即使我把自我放在代码中 请纠正我 这是我的代码 IBAction fu
  • 引导行和列不起作用

    无论我做什么 内容都不会以列的形式显示 而总是垂直堆叠 你们能仔细检查一下我的代码吗 也许这是我缺少的东西
  • 如何检测单元格值更改datagridview C#

    关于SOF的类似问题似乎没有明确的答案 我有一个DataGridView绑定到一个BindingList
  • 使用 php 进行 Windows 身份验证?

    设想 我的网站上有一个区域需要在异地时保持安全和可访问 我希望用户在网络表单中输入用于登录工作的用户名和密码 该表单将发送用户名和密码以进行身份 验证 如果有效 则用户已登录 我需要使用表单而不是弹出登录框 PHP 是首选 但我很灵活 有什
  • 如何在 ng-grid 中使用 bootstrap datepicker

    我正在尝试使用引导日期选择器 通过角度 ui 引导程序 http angular ui github io bootstrap 内ng grid http angular ui github io ng grid 我正在设置网格 scope
  • List 和 ArrayList 默认容量

    我一直在关注 NETList and 数组列表实现与反射器 http www red gate com products reflector 当看着添加 T项 我遇到了这个 确保产能 this size 1 public void Add
  • 如何使用 Twig (Symfony) 将时间格式设置为 hh:mm

    我从 MS SQL 数据库检索时间字段 例如 10 30 00 hh mm ss 我尝试在树枝模板中渲染它 但我只想显示 10 30 部分 hh mm 我尝试使用 number format 和 date format 来完成此操作 但我似
  • slf4j 石英异常

    我正在尝试在项目的一个简单示例中使用石英 我收到以下异常 我不确定这意味着什么 但是我在 POM 文件中将 slf4j 更新为 1 6 1 即使这样仍然出现 SLF4J slf4j api 1 6 x or later is incompa
  • 如何捕获(并忽略)对错误函数的调用?

    我很惊讶我在任何地方都找不到这个问题的答案 我正在编写一个 Roguelike 游戏 并且正在使用 hackage 的 ncurses 库 它是 ncurses 库的一个非常好的包装器 现在 ncurses 有一个怪癖 如果你尝试写右下角的
  • 用于简单传递性检查的不必要的谓词定义?

    对于给定的事实 trust direct p1 p2 trust direct p1 p3 trust direct p2 p4 trust direct p2 p5 trust direct p5 p6 trust direct p6 p
  • 如何禁用 Mailchimp 双重选择加入 PHP

    我对 Mailshimp 完全陌生 我在网上找不到任何可以禁用双重选择的内容 我不使用任何 Mailchimp API 我只是将 mailchimp 提供的表单放入我的 html 中 有什么想法可以不使用 API 或者如果必须使用 API
  • 我可以使用 EL 从 JSP 访问枚举类的值吗?

    我有一个枚举类USState 我想遍历 JSP 中的状态 是否可以访问列表USState不首先将这样的列表设置为属性 似乎像枚举这样的静态东西应该始终可用 但我不知道如何做到这一点 这就是我正在寻找的 工作除外
  • 读取内存中的整个文件 VS 读取块

    我对 C 和编程还比较陌生 所以请耐心等待 我正在开发一个应用程序 需要读取一些文件并按块处理这些文件 例如 以 48 字节的块处理数据 我想知道什么是更好的 性能方面 在内存中一次读取整个文件然后处理它 或者以块的形式读取文件并直接处理它
  • 实体框架 - 联合导致“无法创建类型的常量值..”

    选择全部Schedulings 是活跃的 我有以下代码 var allSchedulesOnALine CurrentUser Lines SelectMany o gt o Scheduling Where o gt o Active v
  • 根据平均值对 R 数据框中的列重新排序

    我想根据每列的算术平均值对数据框的列重新排序 For S1 S2 S3 1 1 1 2 1 1 3 3 1 预期输出是 S3 S2 S1 1 1 1 1 1 2 1 3 3 在上述情况下 平均值为 S1 2 S2 1 6666 and S3
  • Java DecimalFormat 科学记数法问题

    我正在使用Java的十进制格式 https stackoverflow com questions 168802 where can i find a tutorial to get started learning jquery类以科学记
  • 使用动态规划查找三项式系数

    我正在尝试使用动态编程在Java中实现一个计算三项式系数的函数 我正在使用以下公式 T n k 1 if n 0 and k 0 T n k 0 if k lt n or k gt n T n k T n 1 k 1 T n 1 k T n
  • 是否可以在虾文件中渲染斑点图像?

    我愿意使用Gruff https github com topfunky gruff在虾文件中渲染一些图形 我想避免将图像写入磁盘的延迟 仅让 Prawn 读取它们 格鲁夫提供to blob方法 http www rubydoc info
  • 如何在 PySimple GUI 中根据按钮点击显示不同的布局? (持续窗口循环)

    我想知道是否有一种方法可以根据 PySimple GUI 中的按钮单击来管理不同的布局 我刚刚开始使用这个框架 我想找到导航菜单的最佳方式 不一定要使用不同的布局 但这让我想到了最直观的方法 我在想 当选择某个子菜单按钮时 可能会有一个布局
  • 如何计算质心

    我正在处理地理空间形状并在这里查看质心算法 http en wikipedia org wiki Centroid Centroid of polygon http en wikipedia org wiki Centroid Centro