You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于D3.js开发生物医学人体区域交互上色应用的技术问询

D3.js生物医学人体标记应用解决方案

1. 伤口状态标记与数据导出实现

核心逻辑实现

先定义状态与颜色的映射关系,维护部位状态的存储对象,再通过点击事件切换状态并更新视觉:

// 状态-颜色映射
const stateColors = {
  severe: '#ff3333',
  amber: '#ffcc00',
  default: '#e0e0e0'
};
// 存储部位状态,key为部位code
const partStates = {};

// 为所有人体部位绑定点击事件
d3.selectAll('.body-part')
  .on('click', function(event, d) {
    const code = d.code;
    // 循环切换状态:无→严重→轻微→无
    if (!partStates[code]) {
      partStates[code] = 'severe';
    } else if (partStates[code] === 'severe') {
      partStates[code] = 'amber';
    } else {
      delete partStates[code];
    }
    // 更新填充色
    d3.select(this)
      .attr('fill', partStates[code] ? stateColors[partStates[code]] : stateColors.default);
  });

数据导出功能

添加按钮触发数据导出,按要求生成结构化数组:

// 绑定导出按钮事件
d3.select('#export-wound-btn')
  .on('click', function() {
    const result = Object.entries(partStates).map(([code, state]) => ({ code, state }));
    console.log(result);
    // 可选:直接下载为JSON文件
    const blob = new Blob([JSON.stringify(result, null, 2)], {type: 'application/json'});
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'wound-status.json';
    a.click();
    URL.revokeObjectURL(url);
  });

2. 对称人体部位的镜像绘制

针对半身模型生成对称区域,通过坐标镜像计算解决定位问题:

  1. 先确定SVG画布的对称轴(比如画布宽度的一半,假设为centerX = 400)
  2. 对原始图形的每个坐标点做水平镜像:镜像x坐标 = 2*centerX - 原始x坐标

多边形镜像示例

const centerX = 400;
// 左手臂原始顶点数据
const leftArmPoints = [[300, 200], [320, 300], [280, 350], [260, 250]];
// 生成右手臂镜像顶点
const rightArmPoints = leftArmPoints.map(([x, y]) => [2*centerX - x, y]);

// 绘制左手臂
d3.select('svg')
  .append('polygon')
  .attr('class', 'body-part')
  .attr('points', leftArmPoints.join(' '))
  .attr('fill', stateColors.default)
  .datum({code: 'LA123'});

// 绘制右手臂
d3.select('svg')
  .append('polygon')
  .attr('class', 'body-part')
  .attr('points', rightArmPoints.join(' '))
  .attr('fill', stateColors.default)
  .datum({code: 'RA123'});

Path路径镜像示例

解析Path指令,将所有x坐标替换为镜像值即可:

const centerX = 400;
// 原始左大腿Path指令
const leftThighPath = 'M 320 360 L 340 480 L 300 480 Z';
// 拆分指令并镜像x坐标
const mirroredPath = leftThighPath.split(' ')
  .map(item => {
    if (!isNaN(Number(item))) {
      const num = Number(item);
      // 判断是否为x坐标(偶数位的数值,对应M/L后的坐标对)
      return (leftThighPath.split(' ').indexOf(item) % 2 === 1) ? (2*centerX - num).toString() : num.toString();
    }
    return item;
  })
  .join(' ');

// 绘制镜像后的右大腿
d3.select('svg')
  .append('path')
  .attr('class', 'body-part')
  .attr('d', mirroredPath)
  .attr('fill', stateColors.default)
  .datum({code: 'RT456'});

3. 曲线路径绘制与SVG提取方案

VectorMagic转SVG提取路径的可行性

完全可行,步骤如下:

  1. 将人体模特图片上传至VectorMagic生成矢量SVG文件
  2. 用文本编辑器打开SVG,提取<path>元素的d属性值
  3. 将d属性值直接用于D3的Path绘制

曲线Path使用示例

// 从VectorMagic生成的SVG中提取的胸部曲线Path数据
const chestPathD = 'M 350 180 C 380 160, 420 160, 450 180 C 480 220, 480 280, 450 320 C 420 360, 380 360, 350 320 C 320 280, 320 220, 350 180 Z';

d3.select('svg')
  .append('path')
  .attr('class', 'body-part')
  .attr('d', chestPathD)
  .attr('fill', stateColors.default)
  .datum({code: 'CH789'});

提取后可微调坐标值,确保整体模型在SVG画布中定位准确。

内容的提问来源于stack exchange,提问作者The Old County

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:22:40