使用D3.js SVG的2D多边形布尔运算

瑞安·金(Ryan King)

我有两个使用D3.js使用下面的数据和代码创建的简单区域图-称它们为Graph AGraph B我想使用它们根据它们的相交方式创建3个新路径/多边形。

  • Path 1= Graph A-Graph B
  • Path 2= Graph B-Graph A
  • Path 3= Graph B-Path 2Graph AGraph B交集

大多数可视化编辑器都允许您执行这些布尔操作,请参见:https : //en.wikipedia.org/wiki/Boolean_operations_on_polygons

是否可以在D3.js中执行此操作?


jsfiddle:https ://jsfiddle.net/jvf1utmx/

图形定义:

// data
var dataA = [
    { x: 0, y: 100, },
    { x: 100, y: 150, },
    { x: 200, y: 350, },
    { x: 300, y: 200, },
];

var dataB = [
    { x: 0, y: 200, },
    { x: 100, y: 100, },
    { x: 200, y: 250, },
    { x: 300, y: 150, },
];

// Graph shapes
    var graphA = svg.append("path")
    .datum(dataA)
    .attr("class", "area")
    .attr("d", area)
    .style({fill: '#bbbb00', opacity: 0.8});

    var graphB = svg.append("path")
    .datum(dataB)
    .attr("class", "area")
    .attr("d", area)
    .style({fill: '#666666', opacity: 0.8});

我对剪切路径的尝试:

// Clipping attempts
    var graphBClip = svg.append("clipPath")
        .attr('id','graphBClip')

    graphBClip.append(graphB);

    graphA.attr("clip-path","url(#graphBClip)");
标记

作为我的评论的后续行动;我刚刚尝试了链接GreinerHormann库。它的作用非常好d3(它以相同的方式接受输入,对象数组)。

这是您A - B的快速示例B - A

<!DOCTYPE html>
<html>

<head>
  <script data-require="[email protected]" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script>
  <script src="https://rawgit.com/w8r/GreinerHormann/master/dist/greiner-hormann.min.js"></script>
</head>

<body>
  <script>
    // data
    var dataA = [{
      x: 0,
      y: 100,
    }, {
      x: 100,
      y: 150,
    }, {
      x: 200,
      y: 350,
    }, {
      x: 300,
      y: 200,
    }, ];

    var dataB = [{
      x: 0,
      y: 200,
    }, {
      x: 100,
      y: 100,
    }, {
      x: 200,
      y: 250,
    }];
    
    var area = d3.svg.line()
      .x(function(d){
        return d.x;
      })
      .y(function(d){
        return d.y;
      });
      
    var svg = d3.select('body')
      .append('svg')
      .attr('width', 500)
      .attr('height', 500);

    // Graph shapes
    var graphA = svg.append("path")
      .datum(dataA)
      .attr("class", "area")
      .attr("d", area)
      .style({
        fill: 'none'
      });

    var graphB = svg.append("path")
      .datum(dataB)
      .attr("class", "area")
      .attr("d", area)
      .style({
        fill: 'none'
      });
      
    var AminusB = greinerHormann.diff(dataA, dataB);
    var BminusA = greinerHormann.diff(dataB, dataA);
    
    // Graph shapes
    AminusB.forEach(function(d){
      svg.append("path")
      .datum(d)
      .attr("class", "area")
      .attr("d", area)
      .style({
        fill: 'steelblue',
        opacity: 0.8
      });
    });
    
    // Graph shapes
    BminusA.forEach(function(d){
      svg.append("path")
      .datum(d)
      .attr("class", "area")
      .attr("d", area)
      .style({
        fill: 'orange',
        opacity: 0.8
      });
    });
      
  </script>

</body>

</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用CGAL,是否可以在开放的多边形网格上执行布尔运算?

来自分类Dev

在D3 JS中为给定的数据点附加随机选择的多边形

来自分类Dev

在D3 JS中为给定的数据点附加随机选择的多边形

来自分类Dev

从d3.js中的GeoJson多边形获取每个多边形的质心

来自分类Dev

D3js在多边形内单击

来自分类Dev

D3js在多边形内单击

来自分类Dev

使用d3 js的水平条形图

来自分类Dev

使用Package JS的Dart D3系列

来自分类Dev

如何使用D3插件设置rollup.js?

来自分类Dev

使用Package JS的Dart D3系列

来自分类Dev

使用d3 js在phant中绘制json数据

来自分类Dev

如何使用D3.js限制Voronoi图中的多边形文本?

来自分类Dev

如何使用D3.js限制Voronoi图中的多边形文本?

来自分类Dev

绘制多边形并将其用作 cocos2d js 中的精灵

来自分类Dev

解决2D游戏碰撞(多边形)

来自分类Dev

如何计算任何2D多边形的重力?

来自分类Dev

在openGL中绘制2D多边形

来自分类Dev

通过矢量扩展2D多边形

来自分类Dev

Unity 2D 多边形碰撞器

来自分类Dev

无法在leaflet.js上以d3.js“格式”绘制多边形

来自分类Dev

最佳实践,以检测点是否在2D多边形内(多边形的顶点在表上)

来自分类Dev

Boost :: Geometry-在3D空间中查找2D多边形的区域?

来自分类Dev

从3D对象获取2D凹面多边形

来自分类Dev

d3从csv绘制多边形

来自分类Dev

如何在D3.js中放大多边形

来自分类Dev

D3js:小正方形多边形渲染了一半的地图

来自分类Dev

D3.js甜甜圈图标签获取多边形而不是折线

来自分类Dev

D3 js线重叠节点

来自分类Dev

D3 js正交标记旋转