0

Processing 的新手,致力于理解此代码:

 import com.onformative.leap.LeapMotionP5;
    import java.util.*;

    LeapMotionP5 leap;
    LinkedList<Integer> values;

    public void setup() {
      size(800, 300);
      frameRate(120);  //Specifies the number of frames to be displayed every second
      leap = new LeapMotionP5(this);
      values = new LinkedList<Integer>();
      stroke(255);
    }

    int lastY = 0;

    public void draw() {
      **translate(0, 180)**; //(x, y, z)
      background(0);
      if (values.size() >= width) {
        values.removeFirst();
      }

      values.add((int) leap.getVelocity(leap.getHand(0)).y);
      System.out.println((int) leap.getVelocity(leap.getHand(0)).y);
      int counter = 0;
     ** for (Integer val : values)** {
        **val = (int) map(val, 0, 1500, 0, height);**
        line(counter, val, counter - 1, lastY);
        point(counter, val);
        lastY = val;
        counter++;
      }

     ** line(0, map(1300, 0, 1500, 0, height), width, map(1300, 0, 1500, 0, height)); //(x1, y1, x2, y2)**
}

它基本上绘制了使用 Leap Motion 传感器在 y 轴上检测到的运动图。输出如下所示:截屏

我最终需要做与此类似的事情,以同时检测所有 3 轴上的振幅而不是速度,而不仅仅是 y。

Map 和 Translate 的使用让我非常困惑。我已经在处理网站上阅读了这些函数的定义,所以我知道它们是什么以及语法,但我不明白为什么?!(这可以说是最重要的部分。

我在问是否有人可以提供简单的示例来解释使用这两个函数背后的原因。例如,给定一个程序需要使用数据 foo、y 和 x 执行 A、B 和 C,您将使用 Map 或 Translate,因为 A、B 和 C。

我认为编程指南经常忽略这个重要的事实,但对我来说,真正理解一个函数非常重要。

解释的奖励点:

for (Integer val : values) and LinkedList<Integer> values;(在这些处理网站上找不到任何文档)

谢谢!

4

1 回答 1

1

首先,我们将做最简单的一个。LinkedList是一种类似于 的数据结构ArrayList,大家可能比较熟悉。如果不是,那么它只是一个可以插入和删除的值列表(尖括号之间的类型,在本例中为整数)。它的内部有点复杂,但如果它没有出现在 Processing 文档中,那么可以肯定的是它内置于 Java 本身(java 文档)。

这一行:

for (Integer val : values)

被称为“for-each”或“foreach”循环,互联网上有很多很好的解释,但我会在这里做一个简短的解释。如果你有一些列表(可能是 LinkedList,也可能是 ArrayList,等等)并且想要对所有元素做一些事情,你可以这样做:

for(int i = 0; i < values.size(); i++){
    println(values.get(i)); //or whatever
    println(values.get(i) * 2);
    println(pow(values.get(i),3) - 2*pow(values.get(i),2) + values.get(i));
}

如果您对每个元素进行大量操作,那么每次写出来很快就会变得乏味values.get(i)。解决方案是在循环开始时捕获values.get(i)一些变量并在任何地方使用它。然而,这并不是 100% 优雅的,所以 java 有一个内置的方法来做到这一点,那就是 for-each 循环。编码

for (Integer val : values){
    //use val
}

相当于

for(int i = 0; i < values.size(); i++){
    int val = values.get(i);
    //use val
}

希望这是有道理的。

map() 在一个线性系统中取一个数并将其映射到另一个线性系统。想象一下,如果我是一个邪恶的教授,想给学生从 0 到 100 的随机分数。我有一个函数可以返回 0 到 1 之间的随机小数,所以我现在可以做map(rand(),0,1,0,100);,它会为我转换数字!在此示例中,您也可以乘以 100 并获得相同的结果,但这通常不是那么简单。在这种情况下,您的传感器读数在 0 到 1500 之间,但如果您只是直接绘制该值,有时它会消失在屏幕上!因此,您必须将其缩放到适当的比例,这就是这样做的。1500 是读数的最大值,大概我们希望最大图形高度位于屏幕边缘。

我不熟悉你的设置,但看起来读数可能是负数,这意味着它们也可能会从屏幕上显示出来。更好的解决方案是将读数从 -1500,1500 映射到 0,height,但看起来他们选择了不同的方式。每当您在处理(例如)中调用绘图函数时point(x,y),它会在 (x,y)偏移(0,0) 处绘制像素。有时您不希望它相对于 (0,0) 绘制它,因此该translate()函数允许您更改它相对于绘制事物的对象。在这种情况下,平移允许您在屏幕中间某处而不是边缘绘制某个点 (x,0)。

希望有帮助!

于 2013-12-10T21:03:58.547 回答