我有一组点(地理坐标值中的黑点)从多边形(红色)的凸面外壳(蓝色)中导出。见图:
[(560023.44957588764,6362057.3904932579),
(560023.44957588764,6362060.3904932579),
(560024.44957588764,6362063.3904932579),
(560026.94957588764,6362068.3904932579),
(560028.44957588764,6362069.8904932579),
(560034.94957588764,6362071.8904932579),
(560036.44957588764,6362071.8904932579),
(560037.44957588764,6362070.3904932579),
(560037.44957588764,6362064.8904932579),
(560036.44957588764,6362063.3904932579),
(560034.94957588764,6362061.3904932579),
(560026.94957588764,6362057.8904932579),
(560025.44957588764,6362057.3904932579),
(560023.44957588764,6362057.3904932579)]
我需要按照以下步骤(在R-project和Java中填写此post)或在this example procedure之后计算长轴和短轴长度
然后我们知道角度θ(表示边框相对于图像y轴的方向)。所有边界点上a和b的最小值和最大值为 找到:
值(a_max-a_min)和(b_max-b_min)分别定义了长度和宽度, θ方向的边界矩形。
我自己刚刚实现了这个,所以我想把我的版本放在这里让其他人看:
下面是四个不同的例子。对于每个示例,我生成4个随机点并找到边界框。
(由@heltonbiker编辑) 绘图的简单代码:
(结束编辑)
对于4个点上的这些样本来说,速度也相对较快:
Link to the same answer over on gis.stackexchange供我参考。
github上已经有一个这样做的模块。 https://github.com/BebeSparkelSparkel/MinimumBoundingBox
你只需要把你的点云插入其中。
您可以通过以下方法获得长轴和短轴长度:
它还返回面积、矩形中心、矩形角度和角点。
给定一组点的凸包中n个点的顺时针顺序列表,找到包围矩形的最小面积是一个O(n)运算。(对于凸包查找,在O(n logn)时间内,请参见activestate.com recipe 66527或非常紧凑的Graham scan code at tixxit.net。)
下面的python程序使用与通常的O(n)算法相似的技术来计算凸多边形的最大直径。也就是说,它保持三个索引(iL、iP、iR)在相对于给定基线的最左边、最对面和最右边。每一个指数最多前进n个点。程序的输出示例如下所示(添加了标题):
例如,i=10条目表示相对于从点10到11的基线,点0最左边,点4相对,点7最右边,产生187.451个单位的面积。
注意,代码使用
mostfar()
来推进每个索引。mx, my
参数告诉它要测试什么极端;例如,使用mx,my = -1,0
,mostfar()
将尝试最大化-rx(其中rx是点的旋转x),从而找到最左边的点。注意,在不精确算法中进行if mx*rx + my*ry >= best
时,可能应该使用epsilon余量:当船体有许多点时,舍入误差可能是一个问题,并导致该方法错误地不提前索引。代码如下所示。船体数据取自上述问题,不相关的大偏移和相同的小数位被省略。
注意:若要获取包围矩形的最小区域的长度和宽度,请修改上面的代码,如下所示。这将产生一个输出行,如
其中第二个和第三个数字表示矩形的长度和宽度,四个整数表示矩形边上的点的索引号。
相关问题 更多 >
编程相关推荐