首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要使用开放处理草图可视化某些数据的帮助

需要使用开放处理草图可视化某些数据的帮助
EN

Stack Overflow用户
提问于 2021-01-08 06:30:36
回答 1查看 46关注 0票数 2

我在这里放在一起的项目叫做Swellcloud。动画是从here派生出来的。这段代码连接到我当地海滩附近的一个波浪浮标,动画与现场条件相关。如果“膨胀”是高的,我希望峰值和低谷是大的,膨胀数据的范围是最小的0.1m =最小的膨胀所以低谷和峰值在动画中。最大10米的巨浪,如此大的波谷和波峰...然后冲浪“周期”数据的范围从0到20s将反映动画的“平滑度”,因此高周期在动画上很好的直线,而低周期将是起伏/参差不齐的线。

如果膨胀数据很大,但我不能控制动画上的波浪高度或周期,我已经设法获得了数据来“加速”动画。

有谁有什么建议吗?

我们将这些变量设置为全局变量,这样我们就可以知道它们何时加载: let surfheight,surfperiod;

代码语言:javascript
运行
复制
  fetch(
    "https://data.channelcoast.org/observations/waves/latest?key='my key"
  )
    .then(function (resp) {
      return resp.text();
    })
    .then(function (data) {
      //console.log(data);
      let parser = new DOMParser(),
        xmlDoc = parser.parseFromString(data, "text/xml");
      //console.log(xmlDoc.getElementsByTagName('ms:hs')[36].innerHTML); //76=Perran,36 Porthleven
      surfheight = xmlDoc.getElementsByTagName("ms:hs")[36].innerHTML;
      surfperiod = xmlDoc.getElementsByTagName("ms:tp")[36].innerHTML;

      // you can set the surf variable here, because the sketch will start only after the data loads,
      // also make sure to first convert it to a number like "Number(surfheight)" otherwise it won't work

      surfht = Number(surfheight);
      surfpd = Number(surfperiod);

      document.getElementById("surfheight").textContent = surfheight;
      document.getElementById("surfperiod").textContent = surfperiod;
    });

  var yoff = 0; // 2nd dimension of perlin noise

  var waveColor, waveColor2, waveColor3;
  var waveColorArr;
  var controls, waveSpeed;
  var canvas;

  let surfht;
  let surfpd;

  function setup() {
    canvas = createCanvas(windowWidth, windowHeight);

    waveColor = color(0, 50, 120, 100);
    waveColor2 = color(0, 100, 150, 100);
    waveColor3 = color(0, 200, 250, 100);
    noiseDetail(2, 0.2);

    waveColorArr = [waveColor, waveColor, waveColor2, waveColor2, waveColor3, waveColor3];
  }

  function draw() {
    // after these load, the sketch starts
    if (!surfperiod && !surfheight) {
      return;
    }
      
      

    background(0);
    noStroke();

    const amp = map(surfht, 0, 10, 0, 1);
    //const amp = map(surfpd, 0, 10, 0, 1);

    for (var i = 0; i <= 5; i++) {
      // We are going to draw a polygon out of the wave points
      beginShape();
      fill(waveColorArr[i]);
      var xoff = 0;

      for (var x = 0; x <= width + 500; x += 100) {
        var y = map(
          noise(xoff, yoff - 0.5 * i),
          0,
          1,
          (height / 10) * (i + 1),
          height - height / 10 + (height / 10) * i
        );
        vertex(x, y);

        // i've extracted this into a variable for cleaner code
        const inc = map(surfpd, 0, 20, 0.01, 0.5);
        xoff += inc + 0.5 / 10000.0;
      }

      vertex(width, height);
      vertex(0, height);
      endShape(CLOSE);
    }
      

    const inc = map(surfht, 0, 10, 0, 0.025);
    yoff += 0.007 + inc + 0.5 / 10000.0;
  }

  function windowResized() {
    resizeCanvas(window.innerWidth, window.innerHeight);
      
      
  }
EN

回答 1

Stack Overflow用户

发布于 2021-01-08 08:12:36

这是一小段代码,主要是绘制一个单独的波:

代码语言:javascript
运行
复制
// We are going to draw a polygon out of the wave points
      beginShape();
      fill(waveColorArr[i]);
      var xoff = 0;

      for (var x = 0; x <= width + 500; x += 100) {
        var y = map(
          noise(xoff, yoff - 0.5 * i),
          0,
          1,
          (height / 10) * (i + 1),
          height - height / 10 + (height / 10) * i
        );
        vertex(x, y);

        // i've extracted this into a variable for cleaner code
        const inc = map(surfpd, 0, 20, 0.01, 0.5);
        xoff += inc + 0.5 / 10000.0;
      }

      vertex(width, height);
      vertex(0, height);
      endShape(CLOSE);

您已经了解了如何对inc值执行map()操作。类似的注意y也被映射,从0.0 -> 1.0范围到(height / 10) * (i + 1)height - height / 10 + (height / 10) * i范围。

一种快速而老套的方法是将这些值乘以一个可以缩放波高的值。

更好的是,您可以将指令封装到一个可重用的函数中,该函数可以使用参数进行配置。

你也可以看看这个detailed answer on drawing sine waves,记住你可以将波相加/相乘得到不同的形状。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65620844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档