我正在做一个关于思考和记忆过程的模拟,我有一些图片(例如:奶牛、飞机、橘子)需要在屏幕上以类似思维导图的风格展示。每个对象都与其他三个对象相连,并且看起来应该像一张网。
我可以使用什么算法?另外,我正在使用 JS,但伪代码或解释也行。
回答:
- 首先,将您的数据放入一个可用的结构中:
- 按顺序绘制您的节点,同时也绘制 ID 大于当前节点的兄弟节点。
- 您需要在当前节点周围以 120 度的偏移量绘制您的兄弟节点,以形成您的网络(3 个兄弟节点,360/3 = 120)。
一些 JavaScript 代码来展示:
// 初始化你的数据var nodes = { 1: {src: "imageA", siblings: [2,3,4]}, 2: {src: "imageB", siblings: [1,5,6]}, 3: {src: "imageC", siblings: [1,7,8]}, 4: {src: "imageD", siblings: [1,9,10]}, 5: {src: "imageE", siblings: [2]}, 6: {src: "imageF", siblings: [2]}, 7: {src: "imageG", siblings: [3]}, 8: {src: "imageH", siblings: [3]}, 9: {src: "imageI", siblings: [4]}, 10: {src: "imageJ", siblings: [4]},}// 初始化我们将要用到的一些常量var DIST = 200; // 图像之间的像素距离var IMGW = 64; // 图像宽度var IMGH = 64; // 图像高度var SCX = 400; // 屏幕中心 x 坐标var SCY = 400; // 屏幕中心 y 坐标var DEGSSTART = 90; // 起始角度偏移var DEGFLIP = 180; // 添加以翻转方向var DEGSTEP = 120; // 圆 360 / 3// 注意:如果你的兄弟节点多于 3 个,请适当更改 DEGSTEP// 主函数function drawWeb(nodes, id, cx, cy, prevDeg) { var node = nodes[id]; // 绘制当前节点/图像 var xOff = cx - (IMGW / 2); var yOff = cy - (IMGH / 2); drawImage(node.src, Math.round(xOff), Math.round(yOff)); // 递归地绘制兄弟节点 var newDeg = prevDeg + DEGFLIP + DEGSTEP; for(var i=0; i<node.siblings.length; i++) { var newId = node.siblings[i]; if(newId > id) { // 转换为弧度并计算新位置 var rad = newDeg * Math.PI / 180; var newCX = cx + DIST * Math.cos(rad); var newCY = cy + DIST * Math.sin(rad); drawWeb(nodes, newId, newCX, newCY, newDeg); newDeg += DEGSTEP; } }}// 你可以自定义的绘制函数// 使用 jquery 或其他方法function drawImage(src, x, y) { // 填充代码以将图像放在屏幕上 console.log(src + ': ' + x + ', ' + y);}// 测试drawWeb(nodes, 1, SCX, SCY, 90);