连接一组点得到非自相交非凸多边形

2023-12-12

我有一组无序的二维点,代表建筑物的角点。我需要将它们连接起来以获得建筑物的轮廓。

这些点是通过组合不同个体收集的不同多边形来获得的。我的想法是使用这些多边形来按顺序获取点(例如,获取最大和最小多边形之间的区域并连接这些点,使其位于该区域中)。

我尝试使用最小距离标准,并根据角度连接点。但不幸的是它不起作用。我拥有的一件有用的事情是许多多边形的原始数据,其中点顺序是正确的。那么有没有可能与那些多边形进行比较来连接这些点呢?正如我上面提到的,我的教授提出了采用最大和最小的多边形并将其之间的区域用作缓冲区的想法。所有的点都会落在这个缓冲区内。但我不确定如何实现这一点。

X = [364.533 372.267 397.067 408.133 382.471 379.533 329.250 257.200 199.412 195.267 184.385 168.643 157.533 174.500 108.533 99.333 150.733 184.800 138.105 179.474 218.278 232.133 267.714 306.929 312.143 357.733 421.333 431.000 371.867 364.533]; 
Y = [192.027 233.360 228.627 286.693 314.541 292.960 327.450 340.500 348.671 326.693 269.308 330.857 274.493 226.786 239.200 193.467 182.760 101.893 111.000 80.442 74.356 140.360 64.643 56.857 77.786 69.493 133.293 180.427 142.160 192.027];

enter image description here enter image description here

预期结果是一个封闭的多边形,代表建筑物的平面图。我有 15 个建筑样本,代码需要适用于所有样本。有些建筑物不保留拐角之间的直角标准。我附上我所拥有的数据。我拥有的点是通过积分多边形获得的。那么有什么方法可以使用这个多边形(其中点按顺序排列)整合前的实际数据


EDIT

因此,我可以使用下面提到的想法找到解决方案。

Remarks:我手动添加了一个缺失点。而且,我去掉了底部的两个小角。或者,这些角总共必须是四个角,或者可以将它们视为根本没有角。

我明确指出,因为我的想法包含了这样的假设,即角通常具有 90 度角。

一般的做法

  • 通过下面提到的方法找到点的顺序。
  • 对于所有点,在相对于找到的顺序的限制内确定潜在的“邻居”。
  • 对于每两个邻居,确定邻居#1 - 当前点 - 邻居#2 之间的角度。理想情况下,该角度应为 90 度。
  • 对于所有候选组合,找到总距离最小的一个,即距离(邻居#1 - 当前点)+距离(当前点 - 邻居#2)。

我意识到,通过对所有点使用 for 循环,导致将所有线条绘制两次。此外,许多计算可能会被矢量化并从循环中移出。优化不是我现在的意图。 ;-)

% Point data of building corners; modified!
X = [285.400 372.267 397.067 408.133 382.471 379.533 199.412 195.267 184.385 168.643 157.533 174.500 108.533 99.333 150.733 184.800 138.105 179.474 218.278 232.133 267.714 306.929 312.143 357.733 421.333 431.000 371.867 364.533];
Y = [130.150 233.360 228.627 286.693 314.541 292.960 348.671 326.693 269.308 330.857 274.493 226.786 239.200 193.467 182.760 101.893 111.000 80.442 74.356 140.360 64.643 56.857 77.786 69.493 133.293 180.427 142.160 192.027];

% Place approximative center of building at (0, 0)
X = X - mean(X);
Y = Y - mean(Y);
C = [mean(X), mean(Y)];

% Sort points by angle with respect to center
[~, idx] = sort(atan2(X, Y));

% Rearrange points with respect to sorted angles
X = X(idx);
Y = Y(idx);

% Number of data points
n = numel(X);

% Calculate direction vectors for X and Y coordinates
dvX = repmat(X.', 1, n);
dvX = dvX - dvX.';
dvY = repmat(Y.', 1, n);
dvY = dvY - dvY.';

% Calculate distances
dst = sqrt(dvX.^2 + dvY.^2);

% Number of "neighbouring" points to be considered with respect to the order
nn = 8;


figure(1);
hold on;

% Center
plot(C(1), C(2), 'kx', 'MarkerSize', 15);

% Plain points
plot(X, Y, '.', 'MarkerSize', 15);

for k = 1:n

  % Index  
  text(X(k) + 0.05, Y(k) + 0.05, num2str(k), 'FontSize', 12);
  
  % Set up neighbourhood  
  nbh = mod([k-nn/2:k-1 k+1:k+nn/2], n);
  nbh(nbh == 0) = n;
  
  % Calculate angles and total distance arrays
  ang = Inf(nn);
  len = Inf(nn);
  for ii = 1:nn
    l = nbh(ii);
    d1 = [dvX(k, l) dvY(k, l)];
    for jj = ii+1:nn
      m = nbh(jj);
      d2 = [dvX(k, m) dvY(k, m)];
      len(ii, jj) = dst(k, l) + dst(k, m);
      ang(ii, jj) = abs(pi/2 - acos(dot(d1, d2) / (norm(d1) * norm(d2))));
    end
  end
 
  % Find candidates with angle difference < 10 degree
  cand = find(ang < pi/18);
 
  % For these candidates, find the one with the shortest total distance
  [~, I] = min(len(cand));
  
  % Get corresponding indices
  [I, J] = ind2sub([nn nn], cand(I));
  cand = nbh([I J]);

  % Lines 
  plot([X(k) X(cand(1))], [Y(k) Y(cand(1))], 'b', 'LineWidth', 1);
  plot([X(k) X(cand(2))], [Y(k) Y(cand(2))], 'b', 'LineWidth', 1);

end

hold off;

输出图像:

Output


近似(!)解决方案是确定由找到的点描述的轮廓的中心,并使用atan2相对于中心按角度对点进行排序。请参阅以下代码片段进行可视化:

% Points
X = 2 * rand(1, 15) - 1;
Y = 2 * rand(1, 15) - 1;

% Center
C = [0, 0];

% Determine indices
[~, idx] = sort(atan2(X, Y));

figure(1);
hold on;

% Center
plot(C(1), C(2), 'kx', 'MarkerSize', 15);

% Plain points
plot(X, Y, '.', 'MarkerSize', 15);

% Indices and lines
for k = 1:numel(X)
  text(X(idx(k)) + 0.05, Y(idx(k)) + 0.05, num2str(k), 'FontSize', 12);
  if (k == numel(X))
    plot([X(idx(k)) X(idx(1))], [Y(idx(k)) Y(idx(1))], 'b');
  else
    plot([X(idx(k)) X(idx(k+1))], [Y(idx(k)) Y(idx(k+1))], 'b');
  end
end

hold off;

给出以下输出:

Output

尽管我确信一定数量的凹面将得到正确处理,但我担心,对于给定的示例(尤其是上部部分),它会失败。这是因为图像不是完美的俯视图,因此角度有点“扭曲”。

尽管如此,也许排序可以提高您的最小距离方法。

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

连接一组点得到非自相交非凸多边形 的相关文章

  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • MATLAB 图中轴标签与轴之间的距离

    我正在使用 MATLAB 绘制一些数据 我想调整轴标签与轴本身之间的距离 但是 只需向标签的 位置 属性添加一点即可使标签移出图窗窗口 是否有 保证金 属性或类似的东西 在上图中 我想增加数字和标签 Time s 之间的距离 同时自动扩展数
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • 如何每次使用按钮将数据添加到 MATLAB 中的现有 XLSX 文件?

    我有一个函数可以生成一些变量 例如分数 对 错 未回答 使用按钮调用此功能 问题是如何每次将函数生成的这些值添加 附加到 XLSX 文件中 或者 如何创建 MAT 文件以便可以添加它 可能的解决方案是什么 附加到 xls 文件所涉及的挑战是
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • 垂直子图的单一颜色条

    我想让下面的 MATLAB 图有一个沿着两个子图延伸的颜色条 像这样的事情 使用图形编辑器手动完成 Note 这与提出的问题不同here https stackoverflow com questions 39950229 matlab t
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • Matlab颜色检测

    我试图一致地检测同一场景的图像之间的某种颜色 这个想法是根据颜色配置文件识别一组对象 因此 例如 如果给我一个带有绿色球的场景 并且我选择绿色作为我的调色板的一部分 我想要一个具有反映它检测到球的矩阵的函数 任何人都可以为这个项目推荐一些
  • 如何在Matlab中绘制网络?

    我有一个矩阵AMatlab中的维数mx2每行包含两个节点的标签 显示网络中的直接链接 例如 如果网络有4矩阵的节点A可能A 1 2 1 3 2 1 2 4 3 2 4 1 4 2 其中第一行表示有一个链接来自1 to 2 第二行表示有一个链
  • Matlab 一个图上有多个图例 2014b

    我想在一个地块上有多个传说 该解决方案在 2014b 版本之前完美运行 我试图弄清楚如何使用手柄优雅地制作它 但到目前为止还没有成功 欢迎任何想法 2013b 的示例 x 1 50 y1 sin x 2 y2 cos x 2 f figur
  • DbGeography 多边形到 JSON

    我将 DbGeography 多边形存储在数据库中 我的控制器从数据库获取多边形 我需要将它们转换为 JSON var polygons db Areas Where x gt x Type type Select x gt new Vie
  • 在matlab中不使用for循环检查数组中的成员资格

    我想简化这段代码 使其无需 for 循环即可工作 for i 1 N for j 1 N if ismember j A PID i i TFP i j PID i i end end end 其中A是一个包含一些标签的矩阵 我之前存储的T
  • 将 Matlab 数组移植到 C/C++

    我正在将 matlab 程序移植到 C C 我有几个问题 但最重要的问题之一是 Matlab 将任何维度的数组都视为相同 假设我们有一个这样的函数 function result f A B C result A 2 B C A B and
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • MATLAB 除法...29/128 应该返回 0 吗?

    我真的不认为这是一个精度问题 答案应该是0 226左右 这是确切的代码 val I i j bucketSize pos val bucketSize I只是我从中获取值的矩阵 以下是 MATLAB 的输出 val 29 bucketSiz
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • 多边形内的 SQL 地理点在 STIntersect 上不返回 true(但使用 Geometry 返回 true)

    我不想仅仅为了在 STIntersect 中返回 true 而将地理数据转换为几何图形 下面是 SQL 中的代码 DECLARE point GEOGRAPHY GEOGRAPHY Point 1 1 4326 DECLARE polygo
  • Deploytool for MATLAB R2013b 不起作用,发生了什么变化?

    多年来我一直在使用集成deploytool为我的同事创建易于分发的 exe 文件 我几天前安装了R2013b 但无法使用deploytool不再了 尝试打包时的日志文件给出了以下内容 ant
  • matlab 中的动画绘图

    我正在尝试创建一个三角形的动画图 最终结果应该是十个三角形 后面跟着两个更大的三角形 后面跟着一条直线 使用matlab文档 https de mathworks com help matlab ref drawnow html 我最终得到

随机推荐

  • 为什么java无法从死锁中恢复?

    我正在读 Java Concurrency in Practice 一书 里面是关于死锁的内容 JVM无法从死锁中恢复 只有摆脱死锁的方法 lock就是重启服务器 还提到了JVM使用graph 搜索其中线程充当两个线程 A 之间的图节点和边
  • Oracle SQL - 识别顺序值范围

    这是我的桌子 ID Name Department 1 Michael Marketing 2 Alex Marketing 3 Tom Marketing 4 John Sales 5 Brad Marketing 6 Leo Marke
  • 调用窗口加载事件 - javascript

    我将尽力在这里不使用 jsfiddle 清楚地解释我的问题是什么 因为 window on load 不会在他们的 IDE 中触发 我有一个 html 包装器 它动态加载 ajax html 到div content div class h
  • 在 ASP.NET MVC 3 中添加您自己的 HtmlHelper

    我是 MVC 新手 我正在尝试创建自己的扩展方法 以便我可以添加到我的 razor 视图中可用的 html 帮助器中 Html DropDownListFor 允许您为模型上的任何属性创建下拉列表 我想创建一个名为的助手Html State
  • 替换 jQuery 中选定的 HTML 文本

    我有这个代码用于替换选定的文本 它在选定的文本之前和之后放置 1 和 2 var content text html if window getSelection not IE case var selObj window getSelec
  • 如何获取Meteor包中文件的路径?

    我知道怎么做从 Meteor 包中获取当前目录 但是如何获取项目中特定文件的路径呢 node s dirname and filename在流星中不起作用 这很复杂 meteor run将您的项目文件复制到内部的目录树中
  • --oaa 2 和 --loss_function=logistic 在 Vowpal Wabbit 中的效果

    我应该在 VW 中使用哪些参数来执行二元分类任务 例如 让我们使用rcv1 small dat I thought最好使用逻辑损失函数 或铰链 但使用没有意义 oaa 2 然而 经验结果 所有 4 个实验中报告的渐进验证 0 1 损失 表明
  • 如何防止为未实现方法的对象生成模板

    因此 出于示例的目的 假设我有 3 个简单的struct是 其中第二个不包含bar method struct one void foo const int void bar struct two void foo const int st
  • 每个物种使用多个条目的系统发育模型

    我对系统发育回归模型比较陌生 过去 当我的树中每个物种只有 1 个条目时 我使用 PGLS 现在我有一个包含 9 个物种的数千条记录的数据集 我想运行一个系统发育模型 我阅读了最常见的软件包 例如 caper 的教程 但我不确定如何构建模型
  • jQuery 在第一个 11 后停止“单击”操作

    有两个嵌套元素 两者都有不同的click行动 单击内部元素时 我需要停止外部元素操作 HTML div div div div jQuery out click function alert OUT div is pressed in cl
  • 读取 Magic Mouse 和 Apple 无线键盘的电池百分比

    我想问您是否有人知道在 Mac 操作系统中访问鼠标和键盘电池状态的简单方法 有一些API可以访问这些信息吗 谢谢 对于键盘来说是 ioreg n IOAppleBluetoothHIDDriver grep i batterypercent
  • Ruby:仅在某些情况下重载运算符行为

    我的问题是 如何在内置类 例如 Integer new 上重载运算符 但仅限于某些情况 具体取决于第二个操作数的类 这是我正在寻找的行为 myObject myClass new 1 myObject gt special behaviou
  • 移动向量

    我有一个数据框 我想 对齐 每一列 以便每列的最大值位于同一行 我试图使用基本功能来做到这一点 但得到了错误的结果 即 只是覆盖而不转移 我刚刚在 Hmisc 中找到了 Lag 函数 但是 我确信有一种方法可以在基础上做到这一点 我只是想错
  • 函数式语言中的“模式匹配”是什么?

    我正在阅读有关函数式编程的内容 我注意到模式匹配许多文章都提到它是函数式语言的核心特性之一 有人可以为 Java C JavaScript 开发人员解释一下这是什么意思吗 理解模式匹配需要解释三个部分 代数数据类型 什么是模式匹配 为什么它
  • 如何在 javascript 中使用 i18next 中的翻译

    我知道我可以使用 i18next 来翻译 html 中的语言 例如 div div 但是有没有办法在 JS 中使用它 例如 如果我想做类似的事情 alert someKey 它应该是alert t someKey see http i18n
  • 打开 dfm 文件时出错 - 未找到类 xxxx

    通过双击打开 dfm 文件时 出现以下错误 Class TMyClass not found Ignore the error and continue Note Ignoring the error may cause component
  • 你要在c#中获取windows安装SID吗?

    我知道这个问题已经被问过很多次了 但没有人回答我的问题 我从 Comptiat A 的研究中了解到 当使用自动化 无人值守 安装时 技术人员总是必须返回并更改机器 SID 然后才能在每台计算机上激活操作系统 似乎有很多关于如何通过网络获取S
  • 如何匹配 powershell 中的 wsl 输出? [复制]

    这个问题在这里已经有答案了 我想查看我是否正在运行特定的 wsl 发行版 Windows 10 Home WSL 2 PS C Users User gt wsl list running Windows Subsystem for Lin
  • QTP 数据表操作*极其*慢(在 MMDRV 批处理执行器下好多了)?

    可能是一个精彩的故事 QTP 似乎无缘无故地浪费了你的工作时间 考虑这个脚本 其中的数据表只有一个全局行 有 26 列 名为 A 到 Z 填充了任意值 Print Started Services StartTransaction Simp
  • 连接一组点得到非自相交非凸多边形

    我有一组无序的二维点 代表建筑物的角点 我需要将它们连接起来以获得建筑物的轮廓 这些点是通过组合不同个体收集的不同多边形来获得的 我的想法是使用这些多边形来按顺序获取点 例如 获取最大和最小多边形之间的区域并连接这些点 使其位于该区域中 我