Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript计算不规则多边形的面积_Javascript_Polygon_Area - Fatal编程技术网

使用JavaScript计算不规则多边形的面积

使用JavaScript计算不规则多边形的面积,javascript,polygon,area,Javascript,Polygon,Area,这是我的任务,但我一直在执行区域部分。作业已交(完成约80%)。不过,我还是想知道如何实现这一点。我被困在84-86线。这是提示 提示:使用JS计算不规则形状多边形的面积 输入:3-6个坐标的嵌套数组,表示为[x,y](顺时针顺序) 输出:面积计算为2位有效数字 伪代码: 循环输入并检查错误情况: A.数组长度6 B数组不是空的 C在-10和10范围内的数字 循环到每个内部数组,并按以下公式乘以x和y: sum_x_to_y = (X0 *Y1) + (X1* Y2)...X(n-1)* Yn

这是我的任务,但我一直在执行区域部分。作业已交(完成约80%)。不过,我还是想知道如何实现这一点。我被困在84-86线。这是提示

提示:使用JS计算不规则形状多边形的面积

输入:3-6个坐标的嵌套数组,表示为[x,y](顺时针顺序)
输出:面积计算为2位有效数字

伪代码:

  • 循环输入并检查错误情况:
    A.数组长度<3或数组长度>6
    B数组不是空的
    C在-10和10范围内的数字

  • 循环到每个内部数组,并按以下公式乘以x和y:

    sum_x_to_y = (X0 *Y1) + (X1* Y2)...X(n-1)* Yn
    sum_y_to_x = (Y0 * X1) + (Y1-X2)...Y(n-1)* Xn
    
    例:

  • area=(求和到x-求和到y)/(2.00)

    例如:
    area=-70-(-56)=57/2=7

  • 返回
    区域。返回精度(2)
    以获得一个sig图

    function PaddockArea(array_coords) {
        var sum_x_to_y = 0;
        var sum_y_to_x = 0;
        var arr_size = array_coords.length;
    
        if (arr_size === 0) {
            //check for empty array
            console.log("Invalid input.  Coordinates cannot be empty.");
        }
        if (arr_size < 3 || arr_size > 7) {
            //check input outside of 3-6 range
            console.log("Input out of range.");
        }
    
        for (var i = 0; i < arr_size; i++) {
            for (var j = 0; j < array_coords[i].length; j++) {
    
                //test for inner coordinates -10 to 10 range
                if (array_coords[i][j] < -10 || array_coords[i][j] > 10) {
                    console.log("Coordinates outside of -10 to 10 range.");
                }
    
                // I NEED TO IMPLEMENT TO calc for AREA here
                sum_x_to_y += array_coords[i][j] * array_coords[j][i];
                sum_y_to_x += array_coords[j][i] * array_coords[i][j];
                var area = (sum_y_to_x - sum_x_to_y) / 2;
    
                console.log(area.toPrecision(2) + "acres");
            }
        }
    }
    
    功能围场区域(阵列坐标){
    var sum_x_to_y=0;
    var sum_y_to_x=0;
    var arr_size=数组坐标.length;
    如果(arr_size==0){
    //检查是否存在空数组
    console.log(“输入无效。坐标不能为空”);
    }
    如果(arr|U大小<3 | arr|U大小>7){
    //检查输入是否超出3-6范围
    log(“输入超出范围”);
    }
    对于(变量i=0;i10){
    log(“坐标在-10到10范围之外”);
    }
    //我需要为这里的区域执行计算
    和x到y+=数组坐标[i][j]*数组坐标[j][i];
    求和到x+=数组坐标[j][i]*数组坐标[i][j];
    风险值面积=(总和x到总和x到总和y)/2;
    控制台。原木(面积。最高精度(2)+“英亩”);
    }
    }
    }
    

  • 如果您只是使用辛普森规则来计算面积,那么下面的函数将完成这项工作。只要确保多边形是闭合的。如果没有,只需在末端重复第一个坐标对

    此函数使用单个值数组,假设它们成对(偶数索引为x,奇数索引为y)。它可以转换为使用包含坐标对的数组数组

    该函数不会对输入值执行任何越界或其他测试

    function areaFromCoords(coordArray) {
    
        var x = coordArray,
            a = 0;
    
        // Must have even number of elements
        if (x.length % 2) return;
    
        // Process pairs, increment by 2 and stop at length - 2
        for (var i=0, iLen=x.length-2; i<iLen; i+=2) {
           a += x[i]*x[i+3] - x[i+2]*x[i+1];
        }
        return Math.abs(a/2);
    }
    
    console.log('Area: ' + areaFromCoords([1,1,3,1,3,3,1,3,1,1])); // 4
    
    console.log('Area: ' + areaFromCoords([0,-10, 7,-10, 0,-8, 0,-10,])); // 7
    

    不是多边形,它是Z形线,即使转换为单位多边形也无法解析为“7英亩”,除非单位不是标准单位(例如1=184英尺左右)。

    (主题外)那是什么IDE?它是崇高的文本,设置为日光(暗)我建议您删除屏幕截图,并将代码的实际文本放入问题中。在您的
    if
    检查输入是否正确时,您可以调用
    控制台.log()
    ,但不退出该函数,向其添加
    return
    将解决前两个测试用例。按照建议添加实际代码,以便有人更好地帮助其他七个,将代码放在a中,以便人们可以直接使用它。没有人希望重新键入您的代码。没错,答案是0。我使用嵌套数组将坐标表示为[[x1,y1],[x2,y2],…,[xn,yn]]。我不想把它展平,然后像你一样使用[x1,y1,x2,y2…,xn,yn]的顺序。也许这会使事情更简单。如果你关闭“Z”,我的答案是0。这是一个关于多边形的老问题,关于如何编程,肯定有很多信息(GIS和CAD已经做了几十年了)。
    function areaFromCoords(coordArray) {
    
        var x = coordArray,
            a = 0;
    
        // Must have even number of elements
        if (x.length % 2) return;
    
        // Process pairs, increment by 2 and stop at length - 2
        for (var i=0, iLen=x.length-2; i<iLen; i+=2) {
           a += x[i]*x[i+3] - x[i+2]*x[i+1];
        }
        return Math.abs(a/2);
    }
    
    console.log('Area: ' + areaFromCoords([1,1,3,1,3,3,1,3,1,1])); // 4
    
    console.log('Area: ' + areaFromCoords([0,-10, 7,-10, 0,-8, 0,-10,])); // 7
    
    [[1,0],[1,1],[0,0],[0,1]]