1. 程式人生 > >d3.js 實現svg 縮放 平移 旋轉

d3.js 實現svg 縮放 平移 旋轉

使用d3.js的時候,可能會需要對生成svg物件進行平移,旋轉,縮放等操作

可以使用矩陣變換來進行座標系下的轉化,但是矩陣運算相對複雜。d3提供了相應的svg變換介面。

包括:

translate() , scale() , rotate() , skewX() , and skewY()

一、translate()

平移操作

2個引數,第一個引數是向右平移的畫素,第二個是向下平移的畫素。

跟svg的座標走向是一樣的。

二 、scale()

縮放

引數是放大的倍數

三、rotate()

旋轉,引數是旋轉的度數(順時針)

下面給出畫出點線佈局的具體d3程式碼

    // 資料
    var coordinateset = [
      { x :8265.07 , y: 14813.2 } ,
{ x :27679.7 , y: -35.9653 } ,
{ x :50374.9 , y: -35.9653 } ,
{ x :39717.5 , y: -26830.5 } ,
{ x :-16142.4 , y: -35.9653 } ,
{ x :-16142.4 , y: -8090.26 } ,
{ x :37074.9 , y: -26830.5 } ,
{ x :-33544.5 , y: -35.9653 } ,
{ x :46808.2 , y: -35.9653 } ,
{ x :39687.6 , y: -6299.66 } ,
{ x :-29210.6 , y: -35.9653 } ,
{ x :53905 , y: -35.9653 } ,
{ x :-20469.5 , y: -35.9653 } ,
{ x :8265.07 , y: 5271.22 } ,
{ x :47534.6 , y: -10179 } ,
{ x :42605.4 , y: -23316.7 } ,
{ x :-2805.6 , y: -13759.4 } ,
{ x :-2805.6 , y: -11026.9 } ,
{ x :-48445.9 , y: 30007.4 } ,
{ x :-55117.1 , y: 14209 } ,
{ x :8265.07 , y: 22592.5 } ,
{ x :8265.07 , y: 18841.9 } ,
{ x :-33544.5 , y: 5315.09 } ,
{ x :8265.07 , y: 29568.7 } ,
{ x :-33544.5 , y: 14209 } ,
{ x :-16142.4 , y: -19955.1 } ,
{ x :15227.5 , y: -35.9653 } ,
{ x :8265.07 , y: 39236.7 } ,
{ x :-2805.6 , y: -8370.48 } ,
{ x :42605.4 , y: -12633 } ,
{ x :31744.7 , y: -35.9653 } ,
{ x :47534.6 , y: -12633 } ,
{ x :14073.7 , y: 3079.04 } ,
{ x :34590.2 , y: -26830.5 } ,
{ x :8265.07 , y: 36078.7 } ,
{ x :8265.07 , y: 42455.6 } ,
{ x :8265.07 , y: 32870.9 } ,
{ x :42605.4 , y: -18008.6 } ,
{ x :8265.07 , y: 26148.6 } ,
{ x :8265.07 , y: -35.9653 } ,
{ x :-39127.2 , y: -35.9653 } ,
{ x :53905 , y: 2980.53 } ,
{ x :39687.6 , y: -35.9653 } ,
{ x :23662.9 , y: -35.9653 } ,
{ x :49815.7 , y: -23316.7 } ,
{ x :-2805.6 , y: -35.9653 } ,
{ x :-48445.9 , y: 27092.9 } ,
{ x :-43558.9 , y: 14209 } ,
{ x :39687.6 , y: -12633 } ,
{ x :19606.8 , y: -35.9653 } ,
{ x :-16142.4 , y: -16170.5 } ,
{ x :-48445.9 , y: 38562.4 } ,
{ x :49815.7 , y: -26197 } ,
{ x :11127.1 , y: 42455.6 } ,
{ x :-48445.9 , y: 20978.4 } ,
{ x :-16142.4 , y: -12191.1 } ,
{ x :-38561.5 , y: 14209 } ,
{ x :-48445.9 , y: 35689.8 } ,
{ x :2652.33 , y: -35.9653 } ,
{ x :-33544.5 , y: 9826.69 } ,
{ x :-48445.9 , y: 17697.4 } ,
{ x :-24804.4 , y: -35.9653 } ,
{ x :35889.2 , y: -35.9653 } ,
{ x :35889.2 , y: 5686.45 } ,
{ x :-48445.9 , y: 32841.5 } ,
{ x :-9471.73 , y: -35.9653 } ,
{ x :42605.4 , y: -26830.5 } ,
{ x :-48445.9 , y: 14209 } ,
{ x :-48445.9 , y: 24113.3 } ,
{ x :-19036.1 , y: -19955.1 } ,
{ x :14073.7 , y: 6130.39 } ,
{ x :-2805.6 , y: -5414.12 } ,
{ x :11545.2 , y: 6062.08 } ,
{ x :10994.9 , y: 45904.9 } ,
{ x :50207.7 , y: -12633 } ,
{ x :57487.8 , y: 2908.98 } ,
{ x :-16142.4 , y: -26116 } ,
{ x :55772.1 , y: -23316.7 } ,
{ x :42605.4 , y: -32924.7 } ,
{ x :35889.2 , y: 11015.1 } ,
{ x :-58367 , y: 11539.6 } ,
{ x :-42006.3 , y: -3410.41 } ,
{ x :782.51 , y: -11126.8 } ,
{ x :-51359.1 , y: 41548.3 } ,
{ x :-2805.6 , y: -2683.82 } ,
{ x :15227.5 , y: 3079.04 } ,
{ x :11545.2 , y: 3079.04 } ,
{ x :-16142.4 , y: -4025.28 } ,
{ x :-48445.9 , y: 41548.3 } ,
{ x :52941.3 , y: -23316.7 } ,
{ x :35889.2 , y: 2855.22 } ,
{ x :35889.2 , y: 8399.93 } ,
{ x :43240.8 , y: -35.9653 } ,
{ x :-29210.6 , y: -2494.8 } ,
{ x :-58367 , y: 14209 } ,
{ x :8265.07 , y: 45904.9 } ,
{ x :8265.07 , y: 10343.7 } ,
{ x :-42006.3 , y: -35.9653 } ,
{ x :-36298.2 , y: -35.9653 } ,
{ x :44817.2 , y: -12633 } ,
{ x :57487.8 , y: -35.9653 } ,
{ x :-51840.7 , y: 14209 } ,
{ x :-35453.1 , y: 5315.09 } ,
{ x :42605.4 , y: -30042.1 } ,
{ x :-16142.4 , y: -23245.1 } ,
{ x :46170.1 , y: -23316.7 } ,
{ x :782.51 , y: -8370.48 } ,
{ x :-29210.6 , y: -5021.53 } ,
{ x :-37744.2 , y: 5315.09 }
    ];

    edges = [
       {source:44, target:105},
{source:16, target:17},
{source:31, target:99},
{source:2, target:8},
{source:57, target:64},
{source:13, target:39},
{source:38, target:20},
{source:6, target:33},
{source:28, target:71},
{source:59, target:22},
{source:9, target:48},
{source:45, target:58},
{source:23, target:38},
{source:37, target:15},
{source:60, target:67},
{source:35, target:53},
{source:11, target:2},
{source:42, target:9},
{source:67, target:47},
{source:56, target:24},
{source:66, target:3},
{source:62, target:42},
{source:26, target:39},
{source:51, target:57},
{source:25, target:69},
{source:27, target:34},
{source:1, target:30},
{source:24, target:59},
{source:26, target:49},
{source:3, target:6},
{source:66, target:15},
{source:35, target:27},
{source:55, target:50},
{source:98, target:40},
{source:21, target:0},
{source:43, target:1},
{source:61, target:12},
{source:71, target:84},
{source:10, target:7},
{source:47, target:56},
{source:4, target:65},
{source:64, target:18},
{source:41, target:11},
{source:52, target:44},
{source:65, target:45},
{source:90, target:63},
{source:96, target:0},
{source:58, target:39},
{source:14, target:31},
{source:48, target:29},
{source:50, target:25},
{source:32, target:85},
{source:68, target:54},
{source:12, target:4},
{source:34, target:36},
{source:5, target:87},
{source:30, target:62},
{source:5, target:55},
{source:10, target:61},
{source:8, target:92},
{source:32, target:70},
{source:54, target:60},
{source:29, target:37},
{source:49, target:43},
{source:36, target:23},
{source:46, target:68},
{source:28, target:17},
{source:22, target:7},
{source:20, target:21},
{source:101, target:19},
{source:18, target:46},
{source:103, target:78},
{source:29, target:99},
{source:31, target:74},
{source:42, target:92},
{source:51, target:88},
{source:45, target:84},
{source:88, target:83},
{source:86, target:32},
{source:106, target:28},
{source:26, target:85},
{source:94, target:19},
{source:11, target:100},
{source:67, target:101},
{source:44, target:89},
{source:72, target:86},
{source:91, target:79},
{source:98, target:7},
{source:10, target:93},
{source:104, target:76},
{source:97, target:40},
{source:95, target:35},
{source:62, target:90},
{source:103, target:66},
{source:108, target:102},
{source:89, target:77},
{source:15, target:105},
{source:107, target:93},
{source:4, target:87},
{source:91, target:63},
{source:100, target:75},
{source:97, target:81},
{source:96, target:13},
{source:25, target:104},
{source:94, target:80},
{source:82, target:106},
{source:22, target:102},
{source:95, target:73}
    ];


    // 建立SVG容器
    var svg = d3.select("body")
                .append("svg")
                .attr("width", 40000)
                .attr("height", 40000);

    // 建立圓
    var circles = svg.selectAll("circle")
        .data(coordinateset)
        .enter()
        .append("circle");

    // 根據資料設定每個圓的屬性
    circles.attr("cx", 
                    function(d) {return d.x;}
                )
       .attr("cy", 
                function(d) {return d.y;}
            )
       .attr("r", 200)
       .attr("fill",'red');

    var lines = svg.selectAll("line")
                   .data(edges)
                   .enter()
                   .append("line");

    lines.attr("x1",
                    function(d) {return coordinateset[d.source].x}
              )
         .attr("y1",
                    function(d) {return coordinateset[d.source].y}
            )
         .attr("x2",
                    function(d) {return coordinateset[d.target].x}
            )
         .attr("y2",
                    function(d) {return coordinateset[d.target].y}
            )
         .attr({stroke: 'blue',
                'stroke-width': 40});

    var texts = svg.selectAll("text")
        .data(coordinateset)
        .enter()
        .append("text");

    texts.attr("x",
                    function(d) {return d.x}
              )
         .attr("y",
                    function(d) {return d.y}
              )
         .attr("dx", 20)
         .attr("dy", 80)
         .style("fill", "black")
         .text(
                    "HH"
              );

//function(d,i) {return i}

    lines.attr('transform','translate(80000,60000)');
    circles.attr('transform','translate(80000,60000)');
    texts.attr('transform','translate(80000,60000) scale(30)');

    svg.attr('transform','scale(0.03)');