资讯专栏INFORMATION COLUMN

最小外接矩形思路以及实现

qiangdada / 4275人阅读

摘要:最小外接矩形外接矩形计算对一个凸多边形进行外接矩形计算,需要知道当前面的最大和最小值,即可获得外接矩形最小外接矩形计算对凸多边形的每一条边都绘制一个外接矩形求最小面积。

最小外接矩形 外接矩形计算

对一个凸多边形进行外接矩形计算,需要知道当前面的最大xy 和最小xy值,即可获得外接矩形

最小外接矩形计算

对凸多边形的每一条边都绘制一个外接矩形求最小面积。下图展示了计算流程

计算流程

旋转基础算法实现

旋转点基础

 /**
     * 旋转点
     *
     * @param point 被旋转的点
     * @param center 旋转中心
     * @param angle 角度
     * @return 旋转后坐标
     */
    public static Coordinate get(Coordinate point, Coordinate center, double angle) {
        double cos = Math.cos(angle);
        double sin = Math.sin(angle);
        double x = point.x;
        double y = point.y;
        double centerX = center.x;
        double centerY = center.y;
        return new Coordinate(centerX + cos * (x - centerX) - sin * (y - centerY),
                centerY + sin * (x - centerX) + cos * (y - centerY));
    }

凸包算法实现

Geometry hull = (new ConvexHull(geom)).getConvexHull();

获得结果

public static Polygon get(Geometry geom, GeometryFactory gf) {
        Geometry hull = (new ConvexHull(geom)).getConvexHull();
        if (!(hull instanceof Polygon)) {
            return null;
        }
        Polygon convexHull = (Polygon) hull;
        System.out.println(convexHull);

        // 直接使用中心值
        Coordinate c = geom.getCentroid().getCoordinate();
        System.out.println("==============旋转基点==============");
        System.out.println(new GeometryFactory().createPoint(c));
        System.out.println("==============旋转基点==============");
        Coordinate[] coords = convexHull.getExteriorRing().getCoordinates();

        double minArea = Double.MAX_VALUE;
        double minAngle = 0;
        Polygon ssr = null;
        Coordinate ci = coords[0];
        Coordinate cii;
        for (int i = 0; i < coords.length - 1; i++) {
            cii = coords[i + 1];
            double angle = Math.atan2(cii.y - ci.y, cii.x - ci.x);
            Polygon rect = (Polygon) Rotation.get(convexHull, c, -1 * angle, gf).getEnvelope();
            double area = rect.getArea();
//            此处可以将 rotationPolygon 放到list中求最小值
//            Polygon rotationPolygon = Rotation.get(rect, c, angle, gf);
//            System.out.println(rotationPolygon);
            if (area < minArea) {
                minArea = area;
                ssr = rect;
                minAngle = angle;
            }
            ci = cii;
        }

        return Rotation.get(ssr, c, minAngle, gf);
    }

测试类

  @Test
    public void test() throws Exception{
        GeometryFactory gf = new GeometryFactory();
        String wkt = "POLYGON ((87623.0828822501 73753.4143904365,87620.1073981973 73739.213216548,87629.1690996309 73730.4220136646,87641.882531493 73727.3112803367,87643.0997749692 73714.8683470248,87662.0346734872 73725.0120426595,87669.0676357939 73735.1557382941,87655.9484561064 73735.9672339449,87676.9120937514 73747.4634223308,87651.8909778525 73740.8362078495,87659.4649372597 73755.4431295634,87644.4522677204 73748.680665807,87645.5342619215 73760.7178512935,87635.2553170117 73750.9799034842,87630.5215923822 73760.3121034681,87623.0828822501 73753.4143904365))";
        Polygon read = (Polygon) new WKTReader().read(wkt);
        Polygon polygon = MinimumBoundingRectangle.get(read, gf);

//        System.out.println(polygon);
//        System.out.println(polygon.getArea());

    }

本文代码及可视化代码均放在 gitee 码云上 欢迎star & fork

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73422.html

相关文章

  • opencv python 轮廓特征/凸包/外接矩形/外接圆/拟合矩形/拟合直线/拟合圆

    摘要:因此,边界矩形的面积不会最小设,为矩形的左上角坐标,,为宽度和高度代码最小外接矩形返回一个结构,其中包含以下,,,,画上述矩形代码最小封闭圈拟合椭圆拟合直线 Contour Features 1 图像的矩 cv2.moments()图像的矩可以帮助计算物体的某些特征,如对象的质心,对象的区域等. 代码: import cv2 import numpy as np img = cv2...

    tulayang 评论0 收藏0
  • opencv python 轮廓属性/纵横比/Extent/Solidity/等效直径/掩模/极点

    摘要:请注意,和最大值和最小值及它们的位置我们可以使用掩模图像得到这些参数平均颜色或平均强度在这里,我们可以找到对象的平均颜色。我们再次使用掩模完成它极点目标最上面,最下面,最左边,最右边的点 Contour Properties 1 纵横比 它是对象的边界矩形的宽度与高度的比率. $$ Rspect Ratio = frac{Width}{Height} $$ x,y,w,h = cv2...

    AJie 评论0 收藏0
  • js中的各种宽高

    摘要:之前项目刚写了个判断触底自动加载更多的功能,发现自己对各种宽高的定义还是很模糊。嗯,就这样过程中还是有很大收获的 之前项目刚写了个判断触底自动加载更多的功能,发现自己对各种宽、高的定义还是很模糊。终于没有偷懒,写了个demo理解了一下。网上也有很多整理好的文章,为了加强下自身记忆,顺便也许能给些建议。 element的一些宽、高属性注:盒子模型: content+padding+mar...

    Thanatos 评论0 收藏0

发表评论

0条评论

qiangdada

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<