查看: 7851|回复: 13

[原创发布] 雷达图绘制函数

[复制链接]
梦石
0
星屑
4623
在线时间
1207 小时
注册时间
2016-4-7
回帖
944

开拓者

发表于 2017-5-25 16:36:04 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 shitake 于 2017-5-25 16:35 编辑

VA 时期就见过角色属性雷达图这种东西了。
不过VA还得自己实现画线算法。mv相比就简单多了。
脚本里提供一个 drawRadarMap(data, labels) 这样的函数。
两个参数分别是绘制时的数据和对应的标签。
返回值是个bitmap对象。
十分方便使用。无论是blt还是直接挂到某个sprite下都行。
整个函数可以当做个API来用。

然后要注意的是函数里的conf部分。用来控制绘制效果。
前四个都是颜色相关。fontName也很哈好理解。
mCount 是指维度。要注意data和label的size要和该值相同。
maxValue 指data的最大值。绘制雷达图的时候,按data和maxValue的比率来绘制。
size 自然就是整个雷达图的大小了。

在使用的时候,可以根据自己需要来修改conf里的值。

[fold=脚本][pre lang="javascript"]/**
* draw radar map.
* @param data [Array<Number>] data.
* @param labels [Array<String>] labels.
*/
function drawRadarMap(data, labels) {
  var conf = {
    lineColor: 'rgba(250, 250, 250, 0.6)',
    bgColor: 'rgba(200, 200, 200, 0.6)',
    fgColor: 'rgba(230, 230, 230, 0.8)',
    fontColor: 'rgba(255, 255, 255, 1)',
    fontName: 'Microsoft Yahei',
    mCount: 8,
    maxValue: 100,
    size: 300
  };

  if (data.length != conf.mCount || labels.length != conf.mCount) {
    Error('radar map: error data!');
  }
  var angle = Math.PI * 2 / conf.mCount;
  var center = conf.size / 2;
  var mRadius = center - 40;
  var bitmap = new Bitmap(conf.size, conf.size);
  var ctx = bitmap._context;
  
  ctx.save();
  //draw border
  ctx.strokeStyle = conf.lineColor;
  ctx.fillStyle = conf.bgColor;
  for (var i = 1; i <= conf.mCount; i++) {
    ctx.beginPath();
    var r = mRadius / conf.mCount * i;
    for (var j = 0; j < conf.mCount; j++) {
      var x = center + r * Math.cos(angle * j);
      var y = center + r * Math.sin(angle * j);
      ctx.lineTo(x, y);
    }
    ctx.closePath();
    if (i == conf.mCount) {
      ctx.fill();
    }
    ctx.stroke();
  }

  //draw line
  ctx.beginPath();
  for (var i = 0; i < conf.mCount; i++) {
    var x = center + mRadius * Math.cos(angle * i);
    var y = center + mRadius * Math.sin(angle * i);
    ctx.moveTo(center, center);
    ctx.lineTo(x, y);
  }
  ctx.closePath();
  ctx.stroke();

  //fill data
  ctx.fillStyle = conf.fgColor;
  ctx.beginPath();
  for (var i = 0; i < conf.mCount; i++) {
    var r = mRadius * data / conf.maxValue;
    var x = center + r * Math.cos(angle * i);
    var y = center + r * Math.sin(angle * i);
    ctx.lineTo(x, y);
  }
  ctx.closePath();
  ctx.fill();

  //draw label
  let fontSize = center / 12
  ctx.font = fontSize + 'px ' + conf.fontName;
  ctx.fillStyle = conf.fontColor;
  for (let j = 0; j < conf.mCount; j++) {
    let x = center + mRadius * Math.cos(angle * j);
    let y = center + mRadius * Math.sin(angle * j);
    if (angle * j >= 0 && angle * j < Math.PI / 2) {
      ctx.fillText(labels[j], x, y + fontSize)
    } else if (angle * j == Math.PI / 2) {
      ctx.fillText(labels[j], x - ctx.measureText(labels[j]).width / 2, y + fontSize);
    } else if (angle * j > Math.PI / 2 && angle * j <= Math.PI) {
      ctx.fillText(labels[j], x - ctx.measureText(labels[j]).width, y + fontSize);
    } else if (angle * j > Math.PI && angle * j < Math.PI * 3 / 2) {
      ctx.fillText(labels[j], x - ctx.measureText(labels[j]).width, y);
    } else if (angle * j == Math.PI * 3 / 2) {
      ctx.fillText(labels[j], x - ctx.measureText(labels[j]).width / 2, y);
    } else {
      ctx.fillText(labels[j], x, y);
    }
  }
  ctx.restore();
  return bitmap;
}[/pre][/fold]

效果图:

评分

参与人数 3星屑 +852 收起 理由
鑫晴 + 66 塞糖
fux2 + 666 塞糖
garfeng + 120 塞糖

查看全部评分

附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing

老黄鸡

梦石
4
星屑
45694
在线时间
7948 小时
注册时间
2009-7-6
回帖
13337

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2017-5-25 22:13:02 | 显示全部楼层
猜到会使用fill,2333,不得不说h5提供了太多方便的函数。
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

梦石
0
星屑
15291
在线时间
720 小时
注册时间
2011-7-16
回帖
1373

开拓者

发表于 2017-5-27 13:22:24 | 显示全部楼层
666,楼主太强大了
RMMV网络插件,开源免费,内含服务器端,无需强制登录,云数据,弹幕,云存档,排名,兑换码,版本检测,可自由上架下架删除。q群399090587
免打包运行MV游戏,云游戏,安卓App雷神游戏厅,在线玩游戏,上传下载游戏
开源游戏:重装机兵之重装归来【RMMV制作】全球首款按照美剧分季分集的方式发布的游戏
体素画 -- MV画3D像素图的画板
RMMV显示3D模型和场景的插件
RMMV显示spine骨骼动画的插件
RMMV秘密通道插件
突破敌群数量上限8个的插件
在rmmv中显示gif动态图片的插件
一款可以在mv游戏界面的任意位置显示任意文字的插件
RMMV Toast 插件 带物品得失提示,可以设置开启关闭 兼容yep itemcore
制作一个改名卡道具插件、调整标题页面菜单的插件、在标题页面之前显示大段文字的插件、标题页面显示版本号的插件
物品得失自动提示自动上色自动换行插件
我的Q群 663889472
另外,我的插件、范例、游戏都在这里
回复

使用道具 举报

梦石
0
星屑
299
在线时间
141 小时
注册时间
2010-10-16
回帖
31
发表于 2017-6-13 04:27:20 | 显示全部楼层
还是没有弄明白 楼主能不能举个例子{:2_249:}

点评

因为这个单纯是个api函数而不是一个完整的插件脚本。懂js的话自然就会调用。  发表于 2017-6-13 16:24
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2017-6-13 11:02:12 | 显示全部楼层


0.2.0         2016/12/24         RPG ツクール MV 1.3 ベースのプロジェクトに対応
0.1.0         2016/01/01         初版
http://ytomy.sakura.ne.jp/tkool/ ... d_status_scene.html

点评

链接访问不能。开代理亦不行。另外这是发布帖,不是汇总贴。我觉得还是单独开一个贴会好点。  发表于 2017-6-13 16:22
回复

使用道具 举报

梦石
0
星屑
299
在线时间
141 小时
注册时间
2010-10-16
回帖
31
发表于 2017-6-17 06:42:44 | 显示全部楼层
tseyik 发表于 2017-6-13 11:02
0.2.0         2016/12/24         RPG ツクール MV 1.3 ベースのプロジェクトに対応
0.1.0         2016/01/01         初版
http://y ...

非常感谢! 国外可以打开网页 {:2_249:}我好好研究下
回复

使用道具 举报

梦石
0
星屑
303
在线时间
46 小时
注册时间
2020-4-11
回帖
12
发表于 2020-4-17 22:05:35 | 显示全部楼层
想问一下大佬,用bitmap的blt方法画这个返回的bitmap的时候sx和sy参数应该怎么填呢?我画出来的五边形是歪的就很难受
回复

使用道具 举报

梦石
0
星屑
646
在线时间
120 小时
注册时间
2019-12-7
回帖
58
发表于 2020-4-17 22:41:17 | 显示全部楼层
本帖最后由 gg123wtf 于 2020-4-17 22:43 编辑
sigmaWZF 发表于 2020-4-17 22:05
想问一下大佬,用bitmap的blt方法画这个返回的bitmap的时候sx和sy参数应该怎么填呢?我画出来的五边形是歪 ...


conf里面有size,雷达图返回的bitmap宽高都是这个值,可以自己配置


呃。。一开始没看清,以为是sw和sh
sx和sy不就是bitmap左上角的坐标吗,也就是(0,0)啊
新账号chyj4747,这个账号是我刚来论坛时随便填的,当时没想着要发帖
回复

使用道具 举报

梦石
0
星屑
303
在线时间
46 小时
注册时间
2020-4-11
回帖
12
发表于 2020-4-18 01:13:49 | 显示全部楼层
gg123wtf 发表于 2020-4-17 22:41
conf里面有size,雷达图返回的bitmap宽高都是这个值,可以自己配置

呃。。一开始没看清,以为是sw和sh

这个后来我弄懂了,但是五边形还是歪了,(用我已经忘干净了的三角函数知识)一顿改,加了个判断,奇数边的要把sin和cos反过来订xy才会不歪(但是还是倒着的),要是有更好的方法就好了,谢谢大佬回复。
回复

使用道具 举报

梦石
0
星屑
16
在线时间
1 小时
注册时间
2020-6-1
回帖
3
发表于 2020-6-3 19:05:00 | 显示全部楼层
感谢分享,下了研究看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部