在 canvas 中怎么计算不规则图形的面积?

在 canvas 中怎么计算不规则图形的面积?
在 canvas 中,用鼠标绘制了一个不规则图形,不要第三方js库,怎么计算这个不规则图形的面积?
要源码

阅读 2.5k
3 个回答

自己算需要分割三角形,遍历多边形的每个顶点,交叉相乘相应的坐标以找到包围该多边形的区域

高斯面积公式 wiki

image.png

image.png

公式翻译为代码

function getPolygonArea(points) {
  var numPoints = points.length;
  var area = 0;
  var i, j;

  for (var i = 0, j = numPoints - 1; i < numPoints; i++) {
    var pi = points[i];
    var pj = points[j];
    area += (pj.x - pi.x) * (pi.y + pj.y);
    j = i;
  }

  return Math.abs(area / 2);
}

// ex 以A为起点,顺时针。  逆时针也是可以的
var polygonPoints = [
  { x: 5, y: 0 },
  { x: -5, y: -6 },
  { x: -10, y: 2 },
  { x: -2, y: 15 },
  { x: 7, y: 10 },
];

var area = getPolygonArea(polygonPoints);
console.log('多边形的面积为:', area);

注意:方法中的点位必须是按照顺序传入,逆时针 顺时针都行,不能胡乱传入
注意:方法中的点位必须是按照顺序传入,逆时针 顺时针都行,不能胡乱传入
验算:
image.png


canvas库,基本都提供了计算多边形面积的方法

  1. Paper.jsPath 对象有 area 属性,可以用于获取面积。
var path = new Path([point1, point2, point3, ...]);
var area = path.area;
  1. Fabric.jsPolygon 对象可以用 getArea 方法来获取多边形的面积。
var polygon = new fabric.Polygon(points, {
    fill: 'red',
});
var area = polygon.getArea();

其他的库你可以自己找找看

在Canvas中计算不规则图形的面积,特别是通过鼠标绘制的图形,可以通过以下步骤实现:

记录鼠标点击位置:当用户在Canvas上点击鼠标时,记录下每个点的坐标。这些点将构成不规则图形的顶点。
使用多边形面积公式:对于不规则图形,可以使用多边形面积公式来计算面积。多边形面积公式是:[ \text{面积} = \frac{1}{2} \sum_{i=0}^{n-1} (x_i y_{i+1} - x_{i+1} y_i) ],其中(x_i)和(y_i)是多边形的顶点坐标,(n)是顶点的数量。
处理边界条件:在实际应用中,需要处理多边形的边界条件,例如当最后一个点与第一个点相同时,需要特别处理。
以下是一个简单的示例代码,展示了如何在Canvas上绘制不规则图形并计算其面积

<!DOCTYPE html>
<html>
<head>
<style>
canvas {
 border: 1px solid black;
}
</style>
</head>
<body>

<canvas id="myCanvas" width="500" height="500" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>

<script>
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');

var points = [];

canvas.onmousedown = function(e) {
 var rect = canvas.getBoundingClientRect();
 var x = e.clientX - rect.left;
 var y = e.clientY - rect.top;
 points.push({x: x, y: y});
 if (points.length > 1) {
    ctx.beginPath();
    ctx.moveTo(points[0].x, points[0].y);
    for (var i = 1; i < points.length; i++) {
      ctx.lineTo(points[i].x, points[i].y);
    }
    ctx.closePath();
    ctx.stroke();
 }
};

function calculateArea() {
 var area = 0;
 var j = points.length - 1;
 for (var i = 0; i < points.length; i++) {
    area += (points[j].x + points[i].x) * (points[j].y - points[i].y);
    j = i;
 }
 return Math.abs(area / 2);
}

canvas.onmouseup = function() {
 var area = calculateArea();
 alert("面积: " + area);
};
</script>

</body>
</html>

参考 3D 行业的算法, 将模型分割为多个三角形拼制而成
同样的,你也可以将这个不规则图形划分为多个三角形进行计算
只需要这个不规则图形的点坐标即可

// 定义不规则多边形的顶点坐标
const polygonPoints = [
    { x: 0, y: 0 },
    { x: 3, y: 0 },
    { x: 5, y: 2 },
    { x: 6, y: 4 },
    { x: 4, y: 5 },
    { x: 1, y: 3 }
];

// 计算两个向量的叉乘
function crossProduct(p1, p2) {
    return p1.x * p2.y - p1.y * p2.x;
}

// 计算不规则多边形的面积
function irregularPolygonArea(points) {
    let area = 0;
    // 计算每个三角形的面积并累加
    for (let i = 0; i < points.length - 1; i++) {
        area += crossProduct(points[i], points[i + 1]);
    }
    // 将最后一个顶点与第一个顶点组成的向量也考虑在内
    area += crossProduct(points[points.length - 1], points[0]);
    // 取绝对值并除以2得到面积
    return Math.abs(area / 2);
}

// 计算并输出面积
const area = irregularPolygonArea(polygonPoints);
console.log("不规则多边形的面积为:" + area);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题