【IDL】获取多边形的最小外接矩形
原理很简单,就是通过循环旋转多边形,获取外接矩形,找到其中面积最小的即可。
效果图如下:
代码下载:https://pan.baidu.com/s/1ZLd9KLKQZQHEAAYSRtTwgQ
代码如下:
;+
; :Description:
; IDL中获取多边形的最小外接矩形
;
; :Author: duhj@geoscene.cn
;
; :Date: 2018-8-28 11:12:05
;-
PRO test_Minimum_Enclosing_Rectangle
COMPILE_OPT idl2
;输入多边形
x = [0,1,3,9,7,4,2,1]
y = [7,9,8,7,5,3,4,3]
oROI = IDLanROI(x, y)
;获取x、y范围,初始外接矩形
oROI.GetProperty, ROI_XRANGE=min_xrange, ROI_YRANGE=min_yrange
rect_x = min_xrange[1]-min_xrange[0] ;长
rect_y = min_yrange[1]-min_yrange[0] ;宽
min_rect_area = rect_x*rect_y ;面积
center = [MEAN(min_xrange), MEAN(min_yrange), 0] ;中心点
degree_per = 2 ;每次旋转的角度,理论上此值越小越精确
rotate_times = ROUND(90/degree_per) ;旋转次数
min_i = 0 ;记录获取最小外接矩形时的旋转次数
;开始旋转
FOR i=1,rotate_times DO BEGIN
;绕Z轴旋转
oROI.Rotate, [0,0,1], degree_per, center=center
oROI.GetProperty, ROI_XRANGE=xrange, ROI_YRANGE=yrange
;旋转后外接矩形面积
tmp_rect_area = (xrange[1]-xrange[0])*(yrange[1]-yrange[0])
;如果面积小于之前的,则记录下来
IF tmp_rect_area LT min_rect_area THEN BEGIN
min_xrange = xrange
min_yrange = yrange
min_rect_area = tmp_rect_area
min_i = i
ENDIF
ENDFOR
;旋转后的最小外接矩形,需要再旋转回去
min_x = [min_xrange[0],min_xrange[1],min_xrange[1],min_xrange[0]]
min_y = [min_yrange[1],min_yrange[1],min_yrange[0],min_yrange[0]]
MER = IDLanROI(min_x, min_y)
MER.Rotate, [0,0,1], -min_i*degree_per, center=center
MER.GetProperty, data=mer_data ;最小外接矩形的4个角点
;显示输入多边形和最小外接矩形
vROI = IDLgrROI(x, y)
vMER = IDLgrROI(mer_data, color=[255,0,0])
XOBJVIEW, [vROI, vMER]
END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?