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

Processing结合CSV实现文字悬停显示频率关联椭圆的技术求助

实现单词悬停显示频率椭圆的Processing解决方案

我来帮你搞定这个hover效果!问题的核心在于你需要先判断鼠标是否落在每个单词的文本区域内,然后根据对应的频率绘制椭圆。咱们一步步修改你的代码:

关键思路

  1. 计算每个单词文本的边界范围:因为你是居中绘制文本,所以要根据文本宽度和高度确定鼠标能触发hover的区域。
  2. 在draw()循环中,先绘制所有单词,再检查鼠标是否在某个单词的区域内,如果是,就绘制和频率成正比的椭圆。

修改后的完整代码

Table table;

void setup() {
  table = loadTable("tabletest.csv", "header");
  size(600, 1000);
  textAlign(CENTER); // 把textAlign提到这里,不用重复设置
  fill(8, 114, 105);
  textSize(10);
}

void draw() {
  background(252, 245, 224);
  
  for (int i = 0; i < table.getRowCount(); i++) {
    TableRow row = table.getRow(i);
    String w = row.getString("Word");
    int f = row.getInt("Frequency");
    
    // 计算当前单词的绘制位置
    float x = width/2;
    float y = 15 * i;
    
    // 绘制单词
    text(w, x, y);
    
    // 计算文本的边界范围:x方向从中心向左/右延伸文本宽度的一半,y方向考虑文本的上下高度
    float textHalfWidth = textWidth(w) / 2;
    float textTop = y - textAscent(); // 文本顶部的y坐标
    float textBottom = y + textDescent(); // 文本底部的y坐标
    
    // 判断鼠标是否悬停在当前单词的区域内
    if (mouseX > x - textHalfWidth && mouseX < x + textHalfWidth && 
        mouseY > textTop && mouseY < textBottom) {
      // 设置椭圆的填充色,和文本区分开
      fill(219, 68, 55);
      // 椭圆直径和频率成正比,这里乘以2是为了让效果更明显,你可以调整这个系数
      float ellipseSize = f * 2;
      // 在单词位置绘制椭圆
      ellipse(x, y, ellipseSize, ellipseSize);
      // 别忘了把填充色改回文本的颜色,避免影响后续绘制
      fill(8, 114, 105);
    }
  }
}

代码解释

  • 文本边界计算:用textWidth(w)获取文本的宽度,textAscent()和textDescent()分别获取文本基线到顶部和底部的距离,这样能准确判断鼠标是否在文本区域内,而不是只靠粗略的坐标范围。
  • hover判断逻辑:通过mouseX和mouseY是否落在文本的矩形区域内,来触发椭圆绘制。
  • 椭圆大小控制:用f * 2让椭圆大小和频率成正比,你可以根据自己的需求调整这个乘数;如果频率数值差距极大,还可以用map()函数把频率映射到固定范围(比如map(f, minFreq, maxFreq, 10, 100)),避免椭圆超出画布。

内容的提问来源于stack exchange,提问作者Sarah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:18:47