首页 > 解决方案 > D3plus最大矩形需要什么格式的多边形?

问题描述

我在这里找到了一个有趣的演示,演示了如何使用 D3plus 在不规则形状的多边形中找到最大的矩形。

我正在尝试为我正在处理的多边形重新创建它,但目前代码不起作用。它似乎无休止地运行。我正在使用的代码如下:

d3.csv("data/polyPoints.csv", function(error, polyPoints) {
  if (error) return console.error(error);
  
  // coerce string values to numbers
  polyPoints.forEach(function(d) {
  	d3.keys(d).forEach(function(k) {
  		d[k] = +d[k]
  	})
  });
  
  // settings for geom.largestRect
  var rectOptions = {
  	angle: 0,
  	maxAspectRatio: 5,
  	nTries: 1

  };
  
  console.log(rectOptions);
  console.log(polyPoints);

   var lRect = d3plus.geom.largestRect(polyPoints, rectOptions);
  console.log(lRect); 
  
});

我怀疑我的多边形格式不正确。

更新

我正在取得进展。我的原始多边形对象取自 csv 并创建了一个键值对数组数组(例如 {"x": 0 "y": 1},{"x": 2, "y": 1}... .)

我将其转换为数组数组(例如 [[1,0],[2,0]....])

现在代码正在运行,但输出定义了跨越原始多边形边界的矩形。

标签: javascriptd3.jspolygond3plus

解决方案


对于任何使用此功能的人。最大的矩形文档是https://d3plus.org/docs/#largestRect并且可以使用以下代码运行。

const d3p = require('d3plus');
const polygon = [[x,y],[x,y],[x,y]...]

const rectOptions = {
    maxAspectRatio: 5,
    nTries: 20
};

let lRect = d3p.largestRect(rdp, rectOptions);

使用的算法是一个近似值,并选择多边形内的随机点进行计算。因此,盒子的边缘不会总是接触边缘,但应该“足够接近”。

options.tolerance 值也可能会影响这一点,但我并没有玩太多。这是一个很老的问题,但希望它可以帮助某人。


推荐阅读