【问题标题】:Bounding Rectangle of a Polygon - Android /Java多边形的边界矩形 - Android /Java
【发布时间】:2023-12-19 06:46:02
【问题描述】:

我正在创建一个 Android 应用程序,在这里我想制作多边形形状的边界矩形(凹/凸)。我有每个多边形的坐标,我对此一无所知,我尝试过但不满意。我将如何创建一个通用代码来制作每个多边形的边界矩形。

【问题讨论】:

    标签: java android


    【解决方案1】:

    如果你遍历所有点并计算每个坐标轴上的最小和最大点,然后你可以取极值并形成一个矩形。

    void CalculateBoundingBox( Polygon p, Point lowerRight, Point upperLeft )
    {
        //Method to calculate the bounding box of this polyline
        int size = p.size();
        double xmin = /*infinity*/;
        double xmax = /*negative infinity*/;
        double ymin = xmin, ymax = xmax;
    
        for ( int i = 0; i < size; ++i )
        {
            if ( p[i].x < xmin )
                xmin = p[i].x;
    
            if ( p[i].y < ymin )
                ymin = p[i].y;
    
            if ( p[i].x > xmax )
                xmax = p[i].x;
    
            if ( p[i].y > ymax )
                ymax = p[i].y;
        }
    
        lowerRight.set( xmax, ymin );
        upperLeft.set( xmin, ymax );
    }
    

    【讨论】:

    • 如果您将 min/max 设置为第一个点,然后使用 Math.min 和 max,此代码会更简洁、更快。从而删除 if 语句。
    • 你描述的方法当然是等价的,但是为什么会更快呢?
    • 快速回答是因为它减少了 CPU 停顿。当一遍又一遍地重复相同的指令时,这在图形处理中很常见,那么任何 CPU 停顿都可能非常昂贵。条件分支(if 语句)值得避免,因为它们可能导致 CPU 缓存未命中。 Math.min/max 通常在现代 JVM 上使用内在函数实现,即 JVM 将该方法的 java 实现换成平台特定版本,该版本可以使用 Java 语言不可用的 CPU 指令。
    • Math.min 和 Math.max 都使用条件。
    最近更新 更多