实现思路: 第一层:圆形展开 第N层:限制最小和最大的半径,生成固定但随机的坐标,在当前父级的周围,无限极别 备注:想要和echarts的示例一样的那种,最好的方式,数据库存储坐标和渲染大小,而不是这样去生成;
工具类里的参数可根据实际情况做调整
工具类
/**
* @Author: tan
* @Date: 2023/6/30 16:01
* @Description: 悲惨世界人物关系图 xy坐标计算
*/
public class LesMiserablesUtils {
/**
* 第一层半径
*/
private static final int ONE_LEVEL = 250;
/**
* 第N层半径
*/
private static final int TWO_LEVEL = 150;
/**
* 第一层icon渲染范围
*/
private static final Integer SYMBOL_SIZE = 30;
/**
* 第N层的icon渲染范围:根据第一层累减
*/
private static final Integer SYMBOL_SIZE_SUB = 10;
/**
* 入口
*/
public static LesMiserablesVO xy(List<NodeDto> dataList) {
//判断数据不为空
if (!CollectionUtils.isEmpty(dataList)) {
//把数据装进MAP中
HashMap<Long, NodeDto> map = new HashMap<>(dataList.size());
dataList.forEach(d -> map.put(d.getId(), d));
//封装成树级:用于计算XY轴和SIZE
List<NodeDto> nodesList = tree(map, dataList);
if (!CollectionUtils.isEmpty(nodesList)) {
//创建一个空的容器装树级,指定一个初始坐标,为后面计算xy轴
NodeDto nodeNull = new NodeDto();
nodeNull.setX(0.0);
nodeNull.setY(0.0);
//设置节点集合
nodeNull.setChildren(nodesList);
//封装方法
encapsulation(nodeNull, SYMBOL_SIZE);
//返回对象
return returnObj(dataList, map);
}
}
return null;
}
/**
* 设置返回对象
*
* @param dataList 数据
* @param map xy轴数据
*/
public static LesMiserablesVO returnObj(List<NodeDto> dataList, HashMap<Long, NodeDto> map) {
LesMiserablesVO vo = new LesMiserablesVO();
List<KvVO> categories = new ArrayList<>();
List<LinkVO> links = new ArrayList<>();