学习使用d3.arc()绘制图形

  d3.arc()是一个弧度生成器,该生成器在被调用时会返回一个字符串,可以赋值给path元素的d属性,用于生成圆弧、圆形和环形。其中0弧度位于12点钟方向,正弧度沿着顺时针方向设置路径。

  例如:

 const arc = d3.arc()({
                    innerRadius: 0,
                    outerRadius: 75,
                    startAngle: 0,
                    endAngle: Math.PI * 2
                })

  打印arc后,返回值为这样一个字符串

M4.592425496802574e-15,-75A75,75,0,1,1,-4.592425496802574e-15,75A75,75,0,1,1,4.592425496802574e-15,-75Z。然后按照上述文字赋值给path元素的d属性就可以绘制一个圆了
const leaves4 = maingroup
                .append('g')
                .attr('transform', `translate(283, 25)`)
                .append('path')
                .attr('d', arc)

  其中,比较常用的弧生成器方法有

    (1)arc.innerRadius([radius]) 内径,设置内径值>0的话,会是圆环

    (2)arc.outerRadius([radius]) 外径

    (3)arc.startAngle([angle]) 开始位置

    (4)arc.endAngle([angle]) 截止位置

为了加深d3.arc()的使用,下面给了一个案例。效果如下:

 

   代码如下所示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>greenTree</title>
    <script src="../../../../d3.min.js"></script>
</head>
<body>
    <div class="greenTree" id="greenTree"></div>
    <script>
        const dms = {
            width: 800,
            height: 800,
            margin: {
                top: 50,
                left: 50,
                bottom: 50,
                right: 50
            }
        }
        dms.innerWidth = dms.width - dms.margin.left - dms.margin.right;
        dms.innerHeight = dms.height - dms.margin.top - dms.margin.bottom;

        const svg = d3.select('#greenTree')
            .append('svg')
            .attr('width', dms.width)
            .attr('height', dms.height);

        const maingroup = svg.append('g')
            .attr('fill', '#006400')
            .attr('transform', `translate(${dms.innerWidth / 4}, ${dms.innerHeight / 2})`);

        // const circles = maingroup.append('circle')
        //     .attr('cx', 100)
        //     .attr('cy', 100)
        //     .attr('r', 75)
        //     .attr('fill', 'green')

            const leaves1 = maingroup
                .append('g')
                .append('path')
                .attr('d', d3.arc()({
                    innerRadius: 0,
                    outerRadius: 100,
                    startAngle: Math.PI,
                    endAngle: Math.PI * 3
                }))
            const leaves2 = maingroup
                .append('g')
                .attr('transform', `translate(100, -100)`)
                .append('path')
                .attr('d', d3.arc()({
                    innerRadius: 0,
                    outerRadius: 100,
                    startAngle: -Math.PI / 2,
                    endAngle: Math.PI * 2
                }))
                
            const leaves3 = maingroup
                .append('g')
                .attr('transform', `translate(240, -75)`)
                .append('path')
                .attr('d', d3.arc()({
                    innerRadius: 0,
                    outerRadius: 50,
                    startAngle: -Math.PI / 3,
                    endAngle: Math.PI * 2
                }))
            const leaves4 = maingroup
                .append('g')
                .attr('transform', `translate(283, 25)`)
                .append('path')
                .attr('d', d3.arc()({
                    innerRadius: 0,
                    outerRadius: 75,
                    startAngle: 0,
                    endAngle: Math.PI * 2
                }))
            
            const leaves6 = maingroup
                .append('circle')
                .attr('cx', 130)
                .attr('cy', 50)
                .attr('r', 130)
            
            // 树干
            const tree = maingroup
                .append('g')
                .append('rect')
                .attr('fill', 'rgb(150,75,0)')
                .attr('opacity', 0.85)
                .attr('x', 100)
                .attr('y', 150)
                .attr('width', 50)
                .attr('height', 200)

            const data = [['富强', '民主', '文明', '和谐'], 
                          ['自由', '平等', '公正', '法治'],
                          ['爱国', '敬业', '诚信', '友善']]

            const gEnter = maingroup
                    .append('g')
                    .selectAll('gClass')
                    .data(data)
                    .join('g')
                    .attr('transform', (d, i) =>`translate(0, ${-85 + 80 * i})`)
                    .attr('class', 'gClass')
                    .attr('fill', (d, i) => i === 0
                    ? 'yellow' : i === 1 
                    ? '#000000' : '#ffffff');
            gEnter.selectAll('circle')
                .data(d=>d)
                .join('circle')
                .attr('cx', (d, i) => 12 + 80 * i)
                .attr('r', 40)
                .attr('fill', 'green')

            gEnter.selectAll('text')
                .data(d=>d)
                .join('text')
                .attr('x', (d, i) => 12 + 80 * i)
                .attr('y', 5)
                .text(d=>d)
                .attr('text-anchor', 'middle')
                .attr('font-size', '20')
                
                    

    </script>
</body>
</html>

 

 

 

posted @ 2022-11-20 16:39  先起这个昵称  阅读(240)  评论(0编辑  收藏  举报