【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
posted @   ENVI-IDL技术殿堂  阅读(697)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示