不规则多边形计算面积

问题描述:
坐标系中有一个不规则多边形,如图所示: 不规则多边形可能是凹多边形也可能是凸多边形。
计算不规则多边形面积。
要求:
使用Java或者C#代码

如图所示:

img

img

根据 Shoelace 公式来计算多边形面积

public class AreaTest {
    public static double calculateArea(double[] x, double[] y) {
        int n = x.length;
        double area = 0.0;

        for (int i = 0; i < n; i++) {
            int j = (i + 1) % n;
            area += x[i] * y[j];
            area -= y[i] * x[j];
        }

        area = Math.abs(area) / 2.0;
        return area;
    }

    public static void main(String[] args) {
        double[] x = {1.0, 2.0, 3.0, 2.0, 1.0};
        double[] y = {1.0, 2.0, 1.0, 0.0, 0.0};

        double area = calculateArea(x, y);
        System.out.println("多边形的面积为:" + area);
    }
}

【以下回答由 GPT 生成】

我可以为您提供一个基本的解决方案,用Java/C#代码来找出不规则多边形的顶点坐标。

解决方案如下:

  1. 首先,您需要定义一个表示点的对象,例如一个Point类,这个类包含x和y坐标属性。
class Point {
    int x;
    int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
  1. 然后,您需要定义一个方法来判断一个点是否是多边形的顶点。在这个方法中,您可以使用基于角度的方法来进行判断。思路是从当前点出发,计算与其他点的夹角,如果夹角是凸的,即两个相邻的边的夹角大于180度,则该点是多边形的顶点。
public static boolean isPolygonVertex(Point current, List<Point> points) {
    int n = points.size();
    int prevIndex = (points.indexOf(current) - 1 + n) % n;
    int nextIndex = (points.indexOf(current) + 1) % n;

    Point prevPoint = points.get(prevIndex);
    Point nextPoint = points.get(nextIndex);

    int prevAngle = calculateAngle(prevPoint, current, nextPoint);
    int nextAngle = calculateAngle(nextPoint, current, prevPoint);

    return prevAngle > 180 && nextAngle > 180;
}

public static int calculateAngle(Point a, Point b, Point c) {
    int dx1 = a.x - b.x;
    int dy1 = a.y - b.y;
    int dx2 = c.x - b.x;
    int dy2 = c.y - b.y;

    double angle1 = Math.atan2(dy1, dx1);
    double angle2 = Math.atan2(dy2, dx2);

    int angle = (int) Math.toDegrees(angle2 - angle1);

    if (angle < 0) {
        angle += 360;
    }

    return angle;
}
  1. 最后,您可以遍历所有的内部点,对每个点使用isPolygonVertex方法来判断是否是多边形的顶点。
public static List<Point> findPolygonVertices(List<Point> points, List<Point> innerPoints) {
    List<Point> polygonVertices = new ArrayList<>();

    for (Point innerPoint : innerPoints) {
        if (isPolygonVertex(innerPoint, points)) {
            polygonVertices.add(innerPoint);
        }
    }

    return polygonVertices;
}

以上就是一个基本的解决方案,通过遍历内部点,使用角度判断的方法来找出不规则多边形的顶点坐标。请注意,这个解决方案是基于简化的情况,对于更复杂的多边形形状可能需要更复杂的算法来处理。如果您有更多特定的需求,可以提供更多信息以便我提供更详细的解答。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

希望这篇文章可以帮到你
https://www.coder.work/article/968956

推荐一些工具库,Java可以参考下Geotools工具库,JavaScript可以参考下Turf.js工具库,希望能帮助到您。

使用Java代码:



import java.util.ArrayList;

public class PolygonAreaCalculator {
    
    public static class Point {
        double x;
        double y;
        
        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
    }
    
    public static double calculateArea(ArrayList<Point> points) {
        int numPoints = points.size();
        double area = 0;
        
        for (int i=0; i<numPoints; i++) {
            Point currentPoint = points.get(i);
            Point nextPoint = points.get((i+1) % numPoints);
            
            area += currentPoint.x * nextPoint.y - currentPoint.y * nextPoint.x;
        }
        
        area /= 2;
        return Math.abs(area);
    }
    
    public static void main(String[] args) {
        ArrayList<Point> points = new ArrayList<>();
        points.add(new Point(1,1));
        points.add(new Point(3,1));
        points.add(new Point(4,2));
        points.add(new Point(3,4));
        points.add(new Point(1,3));
        
        double area = calculateArea(points);
        System.out.println("Polygon area: " + area);
    }
}

这段代码中,我们首先定义了一个Point类来表示坐标点。然后,我们使用ArrayList来存储不规则多边形的所有点。calculateArea方法根据行列式求解多边形的面积。最后,我们在main方法中创建一个示例多边形,并计算其面积。

C语言的代码实现:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    double x;
    double y;
} Point;

double calculateArea(Point* points, int numPoints) {
    double area = 0;
    
    for (int i=0; i<numPoints; i++) {
        Point currentPoint = points[i];
        Point nextPoint = points[(i+1) % numPoints];
        
        area += currentPoint.x * nextPoint.y - currentPoint.y * nextPoint.x;
    }
    
    area /= 2;
    return abs(area);
}

int main() {
    Point points[] = { {1, 1}, {3, 1}, {4, 2}, {3, 4}, {1, 3} };
    int numPoints = sizeof(points) / sizeof(points[0]);
    
    double area = calculateArea(points, numPoints);
    printf("Polygon area: %.2f\n", area);
    
    return 0;
}

在这段代码中,我们首先定义了一个Point结构体来表示坐标点。然后我们使用数组来存储不规则多边形的所有点。calculateArea函数根据行列式求解多边形的面积。最后,在main函数中创建一个示例多边形,并计算其面积。

根据不规则多边形顶点切割为三角形这种可以直接计算的图形,如果高数学得不错的话,还可以考虑建立直角坐标系然后积分求面积

要使用 Java 计算不规则多边形的面积,可以使用 Shoelace 公式或 Java AWT 库中的 Polygon 类。以下是使用 Shoelace 公式的示例实现:

public class IrregularPolygonArea {
    public static void main(String[] args) {
        // Coordinates of the polygon vertices
        int[] x = {1, 4, 6, 4, 2};
        int[] y = {1, 3, 7, 9, 5};
         double area = calculateArea(x, y);
        System.out.println("Area of the irregular polygon: " + area);
    }
     public static double calculateArea(int[] x, int[] y) {
        int n = x.length;
        double sum = 0.0;
         for (int i = 0; i < n - 1; i++) {
            sum += (x[i] * y[i + 1]) - (x[i + 1] * y[i]);
        }
         sum += (x[n - 1] * y[0]) - (x[0] * y[n - 1]);
         return Math.abs(sum / 2.0);
    }
}

🟢 你参考下看看,JAVA根据多边形坐标点,求面积


/**
 * 计算多边形面积公式
 */
public class PolygonArea {
 
    public static void main(String[] args) {
 
        //多边形面积
        double sum = 0;
 
        //临时变量
        double xTmp = 0;
        double yTmp = 0;
 
        //无论从哪开始第一个坐标的x,y必须是0,0 如果不从0,0 那么会出现误差
        double xFirst = 0.0;
        double yFirst = 0.0;
        // 坐标必须封闭 从哪开始 到哪结束
        String[] arrs = {"10,10", "40,10", "40,40", "10,40", "10,10"};
        for (String s : arrs) {
            // 读取当前坐标的x和y
            String[] arr = s.split(",");
            double xCurrent = Double.parseDouble(arr[0]);
            double yCurrent = Double.parseDouble(arr[1]);
 
            /**
             * 计算面积:
             * (xTmp,yTmp)代表上一行的坐标值
             * (xCurrent,yCurrent)代表当前这一行的坐标值
             */
             // 公式 sum += ((xTmp - xCurrent) * (yTmp + yCurrent)) * 0.5;
             BigDecimal sub = new BigDecimal(xTmp).subtract(new BigDecimal(xCurrent));
             BigDecimal add = new BigDecimal(yTmp).add(new BigDecimal(yCurrent));
             BigDecimal mul = sub.multiply(add).multiply(new BigDecimal("0.5"));
             sum = mul.add(new BigDecimal(sum)).doubleValue();
 
             //计算完面积后,进入下一次循环前需要将“当前坐标”交换为“上一行的坐标”
             xTmp = xCurrent;
             yTmp = yCurrent;
        }
        //用最后读取的坐标与第一次读取的坐标进行一次面积运算
        BigDecimal sub = new BigDecimal(xTmp).subtract(new BigDecimal(xFirst));
        BigDecimal add = new BigDecimal(yTmp).add(new BigDecimal(yFirst));
        BigDecimal mul = sub.multiply(add).multiply(new BigDecimal("0.5"));
        sum = mul.add(new BigDecimal(sum)).doubleValue();
        
        System.out.println(sum);
    }
}

要获取不规则多边形的顶点坐标,可以使用以下步骤:

  1. 创建一个表示多边形的数据结构,可以使用数组或链表来存储顶点的坐标。每个顶点的坐标可以使用一个二维整数数组或一个包含两个整数的自定义类来表示。

  2. 遍历所有内部点的坐标。对于每个内部点,判断它是否在多边形内部。可以使用射线法或点在多边形边界上的投影法来判断点是否在多边形内部。

  3. 如果一个内部点在多边形内部,将其添加到顶点数组或链表中。

  4. 最后,顶点数组或链表中存储的坐标即为不规则多边形的顶点坐标。

以下是一个示例的Java代码,用于获取不规则多边形的顶点坐标:

import java.util.ArrayList;
import java.util.List;

public class PolygonVertices {
    public static void main(String[] args) {
        // 假设已知的多边形内部点的坐标
        int[][] internalPoints = {{2, 3}, {4, 5}, {6, 7}, {8, 9}};

        // 假设已知的多边形顶点的坐标
        int[][] vertexPoints = {{1, 1}, {1, 10}, {10, 10}, {10, 1}};

        List<int[]> polygonVertices = new ArrayList<>();

        for (int[] vertex : vertexPoints) {
            boolean isInternal = true;

            for (int[] internalPoint : internalPoints) {
                if (!isPointInsidePolygon(internalPoint, vertexPoints)) {
                    isInternal = false;
                    break;
                }
            }

            if (isInternal) {
                polygonVertices.add(vertex);
            }
        }

        // 输出多边形顶点坐标
        for (int[] vertex : polygonVertices) {
            System.out.println("Vertex: (" + vertex[0] + ", " + vertex[1] + ")");
        }
    }

    // 判断点是否在多边形内部
    private static boolean isPointInsidePolygon(int[] point, int[][] polygon) {
        int i, j;
        boolean isInside = false;
        int n = polygon.length;

        for (i = 0, j = n - 1; i < n; j = i++) {
            if (((polygon[i][1] > point[1]) != (polygon[j][1] > point[1])) &&
                    (point[0] < (polygon[j][0] - polygon[i][0]) * (point[1] - polygon[i][1]) / (polygon[j][1] - polygon[i][1]) + polygon[i][0])) {
                isInside = !isInside;
            }
        }

        return isInside;
    }
}

请注意,这只是一个简单的示例代码,仅适用于凸多边形。对于凹多边形,可能需要使用更复杂的算法来判断点是否在多边形内部。

参考gpt:
结合自己分析给你如下建议:
以下是一些关于如何使用Java代码计算不规则多边形面积的教程和示例:
Draw polygon and calculate area in Java - Stack Overflow:这是一个问答网站,有一个用户提出了如何使用Java绘制多边形并计算其面积的问题,有两个回答给出了不同的方法和代码。其中一个回答使用了一个扩展函数来计算java.awt.Polygon类的面积,另一个回答使用了一个叫做“鞋带”公式的数学方法来计算任意多边形的面积。
How to calculate the area of polygon in Java - CodeSpeedy:这是一个编程教程网站,有一篇文章介绍了如何使用Java代码计算正多边形的面积。正多边形是指所有边长相等的多边形,例如三角形、正方形、五边形等。文章给出了一个数学公式来计算正多边形的面积,以及一个完整的Java代码示例。
Area of an irregular polygon - Code Review Stack Exchange:这是一个代码审查网站,有一个用户提交了一段使用Java代码计算不规则多边形面积的代码,并请求其他用户给出改进意见。有两个回答给出了一些优化和重构的建议,以及一些测试用例。

提供一个思路
把图形分成一个个小的正方形,然后根据顶点看是占了一半还是占据了一个单元格,最后相加;判断小的正方形的四个顶点在不在你的图形列表里面,有四个就是说明占据一个单元格,三个就是一半

java计算不规则多边形的面积



/**
 * 计算多边形面积
 */
public class JisuanMianji {
    /**
     * 求出多边形的面积
     * @param xy
     * @return
     */
    public static float mianji(String xy)
    {
        int i=0;
        float temp=0;
        //进行循环计算,
        for(;i<xy.split(";").length-1;i++)
        {
            temp+=(Float.valueOf(xy.split(";")[i].split(":")[0])-Float.valueOf(xy.split(";")[i+1].split(":")[0]))*
                    (Float.valueOf(xy.split(";")[i].split(":")[1])+Float.valueOf(xy.split(";")[i+1].split(":")[1]));
        }
        //最后在对尾点坐标和首点坐标进行计算
        temp+=(Float.valueOf(xy.split(";")[i].split(":")[0])-Float.valueOf(xy.split(";")[0].split(":")[0]))*
                (Float.valueOf(xy.split(";")[i].split(":")[1])+Float.valueOf(xy.split(";")[0].split(":")[1]));
        return temp/2;
    }
    /**
     * 求出多边形的周长
     * @param xy
     * @return
     */
    public static double zhouchang(String xy)
    {
        int i=0;
        double temp=0;
        //进行循环计算,
        for(;i<xy.split(";").length-1;i++)
        {
            //采用两两坐标进行勾股定理的方式计算,添加了绝对值的方式,避免负数,再用开根号的方式获取两点距离,
            temp+=Math.sqrt(Math.pow(Math.abs(
                    Double.valueOf(xy.split(";")[i].split(":")[0])-
                            Double.valueOf(xy.split(";")[i+1].split(":")[0])
                    ),2)+
                  Math.pow(Math.abs(
                          Double.valueOf(xy.split(";")[i].split(":")[1])-
                                  Double.valueOf(xy.split(";")[i+1].split(":")[1])
                  ),2));
        }
        //最后在对尾点坐标和首点坐标进行计算
        temp+=Math.sqrt(Math.pow(Math.abs(
                Double.valueOf(xy.split(";")[i].split(":")[0])-
                        Double.valueOf(xy.split(";")[0].split(":")[0])
        ),2)+
                Math.pow(Math.abs(
                        Double.valueOf(xy.split(";")[i].split(":")[1])-
                                Double.valueOf(xy.split(";")[0].split(":")[1])
                ),2));
        return temp/2;
    }
    public void main(String args[])
    {
      //多边形坐标字符串,每一个分号代表一个点的多边形的坐标。每一个冒号代表一个横坐标和一个纵坐标
        String xy="12:23;24:35;56:67;78:89;45:67";//多边形最少三个点,示例数据仅供参考。
        System.out.println("多边形面积是:"+mianji(xy));
        System.out.println("多边形周长是:"+zhouchang(xy));
    }
}

看一楼的回答,顶点坐标是未知的,那感觉你的题目没描述清楚啊,是在已知什么条件的情况下求多边形面积呢?

要实现这种列表控件,需要进行以下步骤:

  1. 设计列表控件的外观和基本功能

首先,需要设计列表控件的外观和基本功能。这包括列表的宽度、高度、边框样式、背景颜色、字体样式、排列方式、滚动条样式等。同时还需要确定列表中每个项的布局方式、样式、字体大小、颜色、对齐方式等。

  1. 构建列表控件的数据结构

在设计列表控件时,需要构建一个数据结构来保存列表中的数据。这个数据结构可以是一个数组、链表、树等形式,需要根据实际情况来选择。在数据结构中,需要定义每个项的属性,如文本内容、图像等。

  1. 编写列表控件的逻辑代码

在构建好数据结构之后,需要编写列表控件的逻辑代码。这包括初始化列表、添加、删除、修改、排序等操作。在编写代码时,需要考虑列表数据的有效性、错误处理、并发访问等问题。

  1. 绑定列表控件与数据源

为了实现动态显示列表数据,列表控件需要与数据源进行绑定。数据源可以是数组、数据库、文件等。绑定时需要指定数据源的路径、访问方式和数据格式。

  1. 实现列表控件的交互功能

列表控件还需要实现一些交互功能,如鼠标选择、双击、拖拽等。这些功能需要编写事件处理程序,并在事件触发时执行相应的操作。

  1. 进行测试和调试

在实现列表控件之后,需要进行测试和调试。测试时需要检查控件的功能是否正常,样式是否符合设计要求等。如果发现问题,需要进行调试、修复并重新测试。

  1. 文档编写

最后,为了方便控件的使用,需要编写相应的使用文档,包括控件的基本使用方法、特殊功能的实现方法、常见问题的解决方法等。

【以下回答由 GPT 生成】


import java.awt.geom.Point2D;

public class IrregularPolygonAreaCalculator {
    public static void main(String[] args) {
        // 定义不规则多边形的顶点坐标
        Point2D.Double[] vertices = {
                new Point2D.Double(1.0, 2.0),
                new Point2D.Double(3.0, 5.0),
                new Point2D.Double(6.0, 3.0),
                new Point2D.Double(4.0, 1.0)
        };

        // 计算不规则多边形的面积
        double area = calculateArea(vertices);

        System.out.println("不规则多边形的面积为:" + area);
    }

    public static double calculateArea(Point2D.Double[] vertices) {
        int numVertices = vertices.length;

        // 初始化面积为0
        double area = 0.0;

        // 遍历多边形的每个顶点
        for (int i = 0; i < numVertices; i++) {
            // 获取当前顶点和下一个顶点的坐标
            Point2D.Double currentVertex = vertices[i];
            Point2D.Double nextVertex = vertices[(i + 1) % numVertices];

            // 计算当前顶点和下一个顶点构成的小三角形的面积
            double triangleArea = currentVertex.getX() * nextVertex.getY() - nextVertex.getX() * currentVertex.getY();

            // 将当前小三角形的面积累加到总面积中
            area += triangleArea;
        }

        // 取绝对值,因为面积可能是正数或负数,但绝对值表示的是不规则多边形的实际面积
        area = Math.abs(area) / 2.0;

        return area;
    }
}

在这个示例中,假设顶点按顺时针或逆时针方向排列。

计算不规则多边形的面积可以使用矢量叉积法,具体步骤如下:

  1. 将不规则多边形分解成若干个三角形;
  2. 计算每个三角形的面积;
  3. 将所有三角形的面积相加。

具体实现代码如下(Java语言):

public class IrregularPolygonArea {
    public static void main(String[] args) {
        // 坐标点数组
        int[][] points = {{0, 0}, {2, 0}, {2, 3}, {1, 2}, {0, 3}};
        // 不规则多边形点数
        int n = points.length;
        // 计算面积
        double area = 0;
        for (int i = 1; i < n - 1; i++) {
            double x1 = points[i][0] - points[0][0];
            double y1 = points[i][1] - points[0][1];
            double x2 = points[i + 1][0] - points[0][0];
            double y2 = points[i + 1][1] - points[0][1];
            double crossProduct = x1 * y2 - x2 * y1;
            area += crossProduct / 2;
        }
        System.out.println("不规则多边形的面积为:" + Math.abs(area));
    }
}

代码中的points数组为不规则多边形的各个顶点坐标,n为不规则多边形的点数。在循环中,我们以第一个点为基准点,计算基准点和其他两个相邻点组成的三角形面积,并将所有三角形的面积相加。由于矢量叉积的结果为带正负号的,所以最后要取绝对值。



public static LatLng getCenterOfGravityPoint(List<LatLng> mPoints) {  
    double area = 0.0;//多边形面积  
    double Gx = 0.0, Gy = 0.0;// 重心的x、y  
    for (int i = 1; i <= mPoints.size(); i++) {  
        double iLat = mPoints.get(i % mPoints.size()).latitude;  
        double iLng = mPoints.get(i % mPoints.size()).longitude;  
        double nextLat = mPoints.get(i - 1).latitude;  
        double nextLng = mPoints.get(i - 1).longitude;  
        double temp = (iLat * nextLng - iLng * nextLat) / 2.0;  
        area += temp;  
        Gx += temp * (iLat + nextLat) / 3.0;  
        Gy += temp * (iLng + nextLng) / 3.0;  
    }  
    Gx = Gx / area;  
    Gy = Gy / area;  
    return new LatLng(Gx, Gy);  
} 

其中area 为多边形的面积计算结果,Gx 和Gy为多边形的重心计算结果。可以参考:
https://blog.csdn.net/qq_38567039/article/details/118672400

这个只用皮克公式就行,

#include<bits/stdc++.h>
using namespace std;
int main(){
    double a,b;
    cin>>a>>b;
    cout<<"面积为:"<<a-1+b/2;
}

要计算一个不规则多边形的面积,你可以使用“梯形法”或者称为“Shoelace formula”(鞋带公式)。这种方法适用于凹多边形和凸多边形。
以下是使用这种方法的Java代码:

public class PolygonAreaCalculator {

    public static void main(String[] args) {
        Point[] points = {
            new Point(0, 0),
            new Point(4, 0),
            new Point(4, 4),
            new Point(0, 4)
        };

        double area = calculateArea(points);
        System.out.println("Area: " + area);
    }

    public static double calculateArea(Point[] points) {
        int n = points.length;
        double area = 0.0;

        // Calculate value of shoelace formula
        int j = n - 1;
        for (int i = 0; i < n; i++) {
            area += (points[j].x + points[i].x) * (points[j].y - points[i].y);
            j = i;  // j is previous vertex to i
        }

        // Return absolute value
        return Math.abs(area / 2.0);
    }

    static class Point {
        double x, y;

        Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
    }
}
 这是一个简单的例子,你可以根据需要调整。如果你使用C#,代码结构和逻辑会非常相似,只需进行少量的语法调整。  

不觉得一楼的能解决,这更像是一个数学问题,如果你数学很不错的话,是可以看懂的

https://math.stackexchange.com/questions/492407/area-of-an-irregular-polygon   
https://www.mathsisfun.com/geometry/area-irregular-polygons.html

给你举个例子,我想求多边形线段值

img


img


这是具体的计算过程

img

用geotools或者gdal计算

计算不规则多边形面积的思路是将多边形划分为三角形,计算每个三角形的面积,并将所有三角形的面积相加得到总面积

geotools或者gdal库都可以