canvas应用-思维导图

简介: canvas应用例子-思维导图效果图如下:函数说明: // 求圆上一点坐标,返回坐标点 function circlePoint(x, y, r, a) { var tmpx = x + r * Math.

canvas应用例子-思维导图

效果图如下:



函数说明:

// 求圆上一点坐标,返回坐标点
function circlePoint(x, y, r, a) {
    var tmpx = x + r * Math.cos(a * Math.PI / 180);
    var tmpy = y + r * Math.sin(a * Math.PI / 180);
    return {
        x: tmpx,
        y: tmpy
    }
}

 

//画正多边形
function polygon(context,x, y, n, r) {
    context.beginPath();
    context.fillStyle = "rgba(215,216,217,.3)"; 
    context.strokeStyle = "hsl(210,0%,50%)"; 
    context.lineWidth = 1; 
    for(var i=0;i<n;i++){
        var tmpPoint = circlePoint(x, y, r, (360 / n) * i);
        if(0===i){
            context.moveTo(tmpPoint.x, tmpPoint.y);
        } else{
            context.lineTo(tmpPoint.x, tmpPoint.y);
        }

    }
    context.closePath();
    context.stroke();
    context.fill();
}

 

//画圆形
function circle(context,x,y,n,r){
    context.beginPath();
    context.arc(x, y, r, 0, Math.PI * 2, true);
    context.strokeStyle = "hsl(210,0%,50%)";
    context.fillStyle = "rgba(215,216,217,.3)";
    context.lineWidth = 1; 
    context.stroke();
    context.fill();
}

 

// x坐标
// y坐标
// rnum 正多变行的边的个数, 至少为3个,否则为圆形
// cnum 同心图形个数
// radnum 圆形放射条数,只有圆形起作用
// R 最大半径
// rot 旋转角度
// arr 交点,交点个数与正多边形边数相同或与圆形放射条数相同
function drawGraph(ctx,x,y,rnum,cnum,radnum,R,rot,arr){
    var isCircle = rnum<3?true:false;
    var tmpNum = 0;
    if(isCircle){
        tmpNum = radnum;
    } else{
        tmpNum = rnum;
    }
    for(var i =0;i<cnum;i++){
        if(isCircle){
            circle(ctx,x, y, rnum, R-(R/cnum)*i);
        } else{
            polygon(ctx,x, y, rnum, R-(R/cnum)*i);
        }
    }


    for (var i = 0; i < tmpNum; i++) {
        ctx.beginPath();
        ctx.strokeStyle = "#99999";
        ctx.lineWidth = 1;
        ctx.moveTo(x, y);
        var tmpPoint = circlePoint(x, y, R, rot + (360 / tmpNum) * i);
        ctx.lineTo(tmpPoint.x, tmpPoint.y);
        ctx.stroke();
    }


    ctx.beginPath();
    ctx.strokeStyle = "#93c54f";
    ctx.lineWidth = 2;
    var grd = ctx.createRadialGradient(x, y, 0, x, y, R);
    grd.addColorStop(0, "rgba(255,255,255,0)");
    grd.addColorStop(1, "rgba(128,187,45,0.6)");
    ctx.fillStyle = grd;
    for (var i = 0; i < tmpNum; i++) {
        var tmpPoint = circlePoint(x, y, R * arr[i], rot + (360 / tmpNum) * i);
        if (0 === i) {
            ctx.moveTo(tmpPoint.x, tmpPoint.y);
        } else {
            ctx.lineTo(tmpPoint.x, tmpPoint.y);
        }
    }

    ctx.closePath();
    ctx.stroke();
    ctx.fill();
}

 

//使用方法
drawGraph(ctx,150,200,6,4,0,120,0,[1, 0.25, 0.75, 0.75, 1,0.5]);
drawGraph(ctx,450,200,0,4,5,120,-30,[1, 0.75, 0.75, 0.75, 0.5]);

 

例子:demo

 

参考:
https://developer.mozilla.org/zh-CN/docs/Web/Guide/HTML/Canvas_tutorial
http://www.w3schools.com/html/html5_canvas.asp

目录
相关文章
|
3月前
|
UED 容器
5.HarmonyOS Next开发宝典:掌握Flex布局的艺术
Flex布局(弹性布局)是HarmonyOS Next中最强大的布局方式之一,它提供了一种更加高效、灵活的方式来对容器中的子元素进行排列、对齐和分配空间。无论是简单的居中显示,还是复杂的自适应界面,Flex布局都能轻松应对。
143 0
|
前端开发 JavaScript API
在 Vue3 + Element Plus 中生成动态表格,动态修改表格,多级表头,合并单元格
在 Vue 中,表格组件是使用频率及复杂度排名第一的组件,前端经常需要根据后台返回的数据动态渲染表格,比如动态表格如何生成,因为表格的列并不是固定的,在未知表格具体有哪些列的场景下,前端如何动态渲染表格数据。又或者需要把表格单元格进行合并处理,比如第一列是日期,需要把相同的日期进行合并,这样表格看起来会更加清晰。 本文手把手教你如何在 Vue3 + Element Plus 中创建表格、生成动态表格、创建动态多级表头、表格行合并、列合并等问题。如果你正在搭建后台管理工具,又不想处理前端问题,推荐使用卡拉云 ,卡拉云是新一代低代码开发工具,可一键接入常见数据库及 API ,无需懂前端,仅需拖拽即
3455 0
|
10月前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
373 77
|
10月前
|
监控 JavaScript
选择适合自己的Node.js内存监控工具
选择合适的内存监控工具是优化 Node.js 应用内存使用的重要一步,它可以帮助你更好地了解内存状况,及时发现问题并采取措施,提高应用的性能和稳定性。
438 76
|
10月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
642 62
|
9月前
|
容器
【HarmonyOS】HMRouter使用详解(一)环境配置
在项目中使用官方推荐的Navigation时,需要在所有的页面上都添加一层NavDestination,在代码阅读上会增加多个层级,而且还要在主页面设置对应名字的跳转等问题,配置起来比较繁琐。看到大佬开发的HMRouter使用起来方便简洁,因此,写下这篇文章记录HMRouter的使用。
489 8
【HarmonyOS】HMRouter使用详解(一)环境配置
|
JavaScript 前端开发 安全
VUE——APP,后端,前端三端AES加密解密
VUE——APP,后端,前端三端AES加密解密
609 0
|
Ubuntu
修改虚拟机Ubuntu为桥接模式的静态IP
修改虚拟机Ubuntu为桥接模式的静态IP
729 0
聊天框(番外篇)—如何实现@功能的整体删除
上一篇文章中,我们已经初步实现了聊天输入框,但其@功能是不完善的,例如无法整体删除、无法获取除用户名以外的数据(假设用户名不是唯一的)。有问题就要想办法解决,在网上百度了一圈后,倒是有一些收获。本文就着重解决@的整体删除以及获取额外数据。
1381 0
聊天框(番外篇)—如何实现@功能的整体删除
|
JavaScript 前端开发 容器
Vue 3 中 <transition-group> 组件报错的非 props 属性传递问题
Vue 3 中 <transition-group> 组件报错的非 props 属性传递问题
294 1