【问题标题】:How to arrange points for plotting a closed polygon?如何安排点以绘制闭合多边形?
【发布时间】:2013-10-04 12:58:15
【问题描述】:

我想问如何安排点来绘制一个封闭的多边形。

在我的应用程序中,我将有一组点来描述可能是凸面或凹面的形状 - 我想绘制多边形。问题是点的顺序使得直接的plot 命令不会生成我想要的多边形。

例如:

dtheta = pi/150;
theta  = (-pi:dtheta:(pi-dtheta))';
X1   = cos(theta); 
X2   = sin(theta);
[n1,In1]=sort(X1);  % sort is intentional here
n2=X2(In1);

现在,

plot(n1,n2,'.')

给我一​​个圆形的点排列

但是,使用

plot(n1,n2)

由于点的连接顺序,圆圈根本不明显。

有没有办法安排(n1,n2),这样在调用plot(n1,n2) 时,可以清楚地绘制一个多边形,在这种情况下是一个圆?

【问题讨论】:

标签: matlab plot polygon nearest-neighbor


【解决方案1】:

只是不要先排序。相反,做

dtheta = pi/150;
theta  = (-pi:dtheta:(pi-dtheta))';
X1   = cos(theta); 
X2   = sin(theta);
plot(X1, X2);

请注意,这不会关闭多边形,因为您的 theta 不会“一直环绕”。相反,如果您定义

theta = linspace(-pi, pi, 301); % 301 = 2 * 150 + 1 for repeated end point

您将拥有相同间距的点,但现在您将重复第一个点作为最后一个点并闭合多边形。

【讨论】:

  • 谢谢。 sort 命令是为了说明我的观点。想象一下你有(n1,n2),目标是排列点,这样你就有一个多边形。多边形可以是凸的或凹的。我正在查看的应用程序适用于具有多个岛屿的复杂海岸线。
  • 我明白了 - 你是在说“给定一系列顺序不正确的点,我将如何重新排序它们”。这是一个更棘手的问题。问题真的变成了——你怎么知道你想连接哪两个点——它们总是“B点连接到最接近的A和C”?这不包括两个“最近”点都在同一侧的不等间距点。 “相距至少 120 度的两个最近点”?考虑一下并更新您的问题以反映您真正在问什么......这种来回是必不可少的。
  • @mikeP,如果您可以更新您的问题以便明确排序是故意的,这将是很好的,只是为了生成无序的点。或者也许一个 randperm 会更好。
【解决方案2】:

您可以使用convhull。如果给定的点实际上定义了一个正多边形或另一个凸形的边缘,那么它们都应该包含在凸包中。该函数以适合绘图的顺序返回点的索引。

继续你的例子,

k = convhull(n1, n2);
plot(n1(k), n2(k))

恢复你原来的圈子。

【讨论】:

  • 不幸的是“多边形可以是凸的或凹的”,根据@mikeP 在我最初的回答下发布的评论......但这是一个很好的“答案的第一部分”,我像这样支持它。
  • 没注意到。我更新了我的答案,说“正多边形”。好吧,我相信发帖人的问题定义不够明确。用一组点制作多边形的方法有很多。
  • 我同意 - 我在之前的评论中指出了这一点。我编辑了这个问题以反映我目前的理解,但需要一些额外的信息。我认为“这些是海岸线上的点”这一事实给出了一些合理的限制——连接的点是“距离很近并且在合理的曲线上”。但它不能导致一个独特的解决方案。
  • 感谢@Floris 更新问题。 A. 如果您只考虑一个多边形(在我的例子中是一个岛),Donda 的解决方案效果很好。当试图为彼此靠近的多个多边形寻找通用解决方案时,复杂性就出现了。点的排列如此混乱,以至于多边形中的一个点被列在另一个多边形中的另一个点旁边,依此类推......此时更合适的问题可能是分开每个多边形?分离多边形后,我可以应用 A. Donda 的解决方案,然后合并“排列”点。
  • 如果结合“距离”等关键词开始搜索“聚类算法”,会发现很多起点。我建议您研究这些,尝试他们的方法,发布您的尝试和结果 - 获得帮助解决潜在问题的机会将非常大。
猜你喜欢
  • 2017-04-13
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2017-04-20
  • 2016-04-08
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多