123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- let width = 750; // canvas的宽
- let height = 750; // canvas的高
- let angleNum = 0; // 角数,即多少个数据项 【3,10】
- let angleAvg = 0; // 分角度平均值
- let angleOffset = 13; // 角度偏移量
- let layerNum = 10; // 层数,即环层数量
- let layerWidth = 0; // 层宽
- let bgLineColor = '#aaa'; // 背景线条颜色
- let bgLineWidth = 0; // 背景线条宽度
- let centerPoint = [0, 0]; // 中心点坐标
- let layerPoints = []; // 各层上的点
- let wordColor = '#aaa'; // 字体颜色
- let fontSize = 0; // 字体大小
- // let wordArr = ['定向搜索能力', '专项技能', '学习记忆能力', '抗挫力', '销售技能', '领导力', '人际沟通','111','2222','3333']; // 字体数组
- let wordArr = [];
- let wordOffset = [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]];
- let circleWidth = 0; // 圆点宽度
- // 绘制的雷达比例数据
- // let dataArr = [10, 8, 9, 10, 10, 10, 4, 7, 10, 4, 7, 10, 4, 7, 10, 4, 7];
- let dataArr = [];
- let context =null;
- let windowWidth = 0;
- let radar = {
- init: function(data) {
- centerPoint = [rpx(375), rpx(320)];
- layerWidth = rpx(24);
- bgLineWidth = rpx(1.6);
- fontSize = rpx(26);
- circleWidth = rpx(8);
- if(angleNum == 9){
- wordOffset = [
- [rpx(30), rpx(40)],
- [rpx(40), rpx(40)],
- [rpx(110), rpx(40)],
- [rpx(100), rpx(0)],
- [rpx(60), rpx(15)],
- [rpx(15), rpx(-5)],
- [rpx(10), rpx(15)],
- [rpx(-10), rpx(15)],
- [rpx(15), rpx(-5)],
- [rpx(10), rpx(15)],
- [rpx(-10), rpx(15)]
- ];
- }else if(angleNum == 10){
- wordOffset = [
- [rpx(30), rpx(40)],
- [rpx(40), rpx(40)],
- [rpx(110), rpx(40)],
- [rpx(100), rpx(0)],
- [rpx(100), rpx(15)],
- [rpx(95), rpx(-5)],
- [rpx(40), rpx(15)],
- [rpx(-10), rpx(15)],
- [rpx(15), rpx(-5)],
- [rpx(10), rpx(15)],
- [rpx(-10), rpx(15)]
- ];
- }else if(angleNum == 11){
- wordOffset = [
- [rpx(30), rpx(40)],
- [rpx(40), rpx(40)],
- [rpx(110), rpx(40)],
- [rpx(90), rpx(0)],
- [rpx(125), rpx(15)],
- [rpx(75), rpx(-5)],
- [rpx(30), rpx(15)],
- [rpx(-10), rpx(15)],
- [rpx(15), rpx(-5)],
- [rpx(10), rpx(15)],
- [rpx(-10), rpx(15)]
- ];
- }else{
- wordOffset = [
- [rpx(30), rpx(40)],
- [rpx(40), rpx(40)],
- [rpx(110), rpx(40)],
- [rpx(90), rpx(0)],
- [rpx(-25), rpx(15)],
- [rpx(15), rpx(-5)],
- [rpx(10), rpx(15)],
- [rpx(-10), rpx(15)],
- [rpx(15), rpx(-5)],
- [rpx(10), rpx(15)],
- [rpx(-10), rpx(15)]
- ];
- }
-
-
- },
- draw: function(data,canvasId,grades) {
- var obj_grades = {};
- if(grades){
- obj_grades = JSON.parse(grades);
- wordArr = Object.keys(obj_grades);
- angleNum = wordArr.length;
- angleAvg = 360 / angleNum;
- dataArr = data;
- }
-
- let n = 0, m = 0, k = 0;
- this.init(data);
- //画背景线条
- context = wx.createContext();
- context.setLineWidth(bgLineWidth);
- context.setStrokeStyle(bgLineColor);
- context.beginPath();
- context.setFontSize(fontSize);
- context.setFillStyle(wordColor);
- for(n = 0; n < layerNum; n++) {
- layerPoints[n] = [];
- for(k = 0; k < angleNum; k++) {
- context.moveTo(centerPoint[0], centerPoint[1]);
- let offsetX = layerWidth * (n + 1) * getXParam(angleAvg * (k + 1) + angleOffset);
- let offsetY = layerWidth * (n + 1) * getYParam(angleAvg * (k + 1) + angleOffset);
- let distX = centerPoint[0] + offsetX;
- let distY = centerPoint[1] + offsetY;
- if(n == layerNum - 1) {
- context.lineTo(distX, distY);
- if(wordArr[k]) {
- // console.log(k,offsetX)
- let wordOffsetX = offsetX >= 0 ? 1 : -1;
- wordOffsetX = distX + wordOffsetX * wordOffset[k][0];
- // console.log('wordOffsetX',wordOffsetX)
- let wordOffsetY = offsetY >= 0 ? 1 : -1;
- wordOffsetY = distY + wordOffsetY * wordOffset[k][1];
- context.fillText(wordArr[k], wordOffsetX, wordOffsetY);
- }
- }
- layerPoints[n][k] = [distX, distY];
- }
- }
- for(m = 0; m < layerPoints.length; m++) {
- for(n = 0; n < layerPoints[m].length; n++) {
- context.moveTo(layerPoints[m][n][0], layerPoints[m][n][1]);
- if(n < layerPoints[m].length - 1) {
- context.lineTo(layerPoints[m][n + 1][0], layerPoints[m][n + 1][1]);
- } else {
- context.moveTo(layerPoints[m][n][0], layerPoints[m][n][1]);
- context.lineTo(layerPoints[m][0][0], layerPoints[m][0][1]);
- }
- }
- }
- context.stroke();
- // 绘制比例:
- context.beginPath();
- context.setStrokeStyle("rgba(238,58,67,0.7)");
- context.setFillStyle("rgba(238,58,67,0.7)");
- let isFirstPoint = true;
- let tmpPoints = [];
- for(m = 0; m < angleNum; m++) {
- tmpPoints = centerPoint;
- if(dataArr[m] > 0) {
- for(n = 0; n < layerNum; n++) {
- if(dataArr[m] == (n + 1)) {
- tmpPoints = layerPoints[n][m];
- break;
- }
- }
- }
- if(isFirstPoint) {
- context.moveTo(tmpPoints[0], tmpPoints[1]);
- isFirstPoint = false;
- } else {
- context.lineTo(tmpPoints[0], tmpPoints[1]);
- }
- }
- context.fill();
- context.stroke();
- context.closePath();
- // 绘制圆点:
-
- for(m = 0; m < angleNum; m++) {
- tmpPoints = centerPoint;
- if(dataArr[m] > 0) {
- for(n = 0; n < layerNum; n++) {
- if(dataArr[m] == (n + 1)) {
- tmpPoints = layerPoints[n][m];
- break;
- }
- }
- }
- context.beginPath();
- context.setStrokeStyle("rgba(238,58,67,0.9)");
- context.setFillStyle("rgba(238,58,67,0.9)");
- context.closePath();
- context.arc(tmpPoints[0], tmpPoints[1], circleWidth, 0, 2 * Math.PI, false);
- context.closePath();
- context.fill();
- context.stroke();
- }
- wx.drawCanvas({
- canvasId: canvasId,
- actions: context.getActions()
- });
- },
-
- };
- let rpx = (param) => {
- if(windowWidth == 0) {
- wx.getSystemInfo({
- success: function (res) {
- windowWidth = res.windowWidth - 60 / (750 / res.screenWidth);
- }
- });
- }
- return Number((windowWidth / 750 * param).toFixed(2));
- };
- let getXParam = (angle) => {
- let param = 1;
- if(angle >= 0 && angle < 90) {
- param = 1;
- } else if(angle >= 90 && angle < 180) {
- param = -1;
- angle = 180 - angle;
- } else if(angle >= 180 && angle < 270) {
- param = -1;
- angle = angle - 180;
- } else if(angle >= 270 && angle <= 360) {
- param = 1;
- angle = 360 - angle;
- }
- let angleCos = Math.cos(Math.PI / 180 * angle);
- if(angleCos < 0) {
- angleCos = angleCos * -1;
- }
- return angleCos * param;
- };
- let getYParam = (angle) => {
- let param = 1;
- if(angle >= 0 && angle < 90) {
- param = 1;
- } else if(angle >= 90 && angle < 180) {
- param = 1;
- angle = 180 - angle;
- } else if(angle >= 180 && angle < 270) {
- param = -1;
- angle = angle - 180;
- } else if(angle >= 270 && angle <= 360) {
- param = -1;
- angle = 360 - angle;
- }
- let angleSin = Math.sin(Math.PI / 180 * angle);
- if(angleSin < 0) {
- angleSin = angleSin * -1;
- }
- return angleSin * param;
- };
- module.exports = {
- radar
- };
|