2013-12-10 5 views
0

Новое в обработке работает на понимании этого кода:Использование карты и функции Перевести в обработке

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. Выходной сигнал выглядит так: screenshot

В конечном итоге мне нужно сделать что-то похожее на это, которое будет определять амплитуду вместо скорости одновременно на всех трех осях, а не только на y.

Использование карты и перевода - вот что меня пугает. Я прочитал определения этих функций на веб-сайте Processing, поэтому я знаю, что это такое и синтаксис, но что я не понимаю, почему? (что, возможно, является самой важной частью.

Я спрашиваю, может ли кто-нибудь предоставить простые примеры, объясняющие ПОЧЕМУ за этими двумя функциями. Например, с учетом программы, которая должна выполнять A, B и C, с Foo данные, у и х, можно использовать карту или Перевести потому что A, B и C.

Я думаю, что программирование гиды часто упускают этот важный факт, но для меня это очень важно, чтобы действительно понять функцию.

Бонусные баллы за пояснение:

for (Integer val : values) and LinkedList<Integer> values; (не может найти документацию по процессам петь сайт для них)

Спасибо!

ответ

1

Во-первых, мы сделаем самый простой. LinkedList - это структура данных, аналогичная ArrayList, с которой вы можете ознакомиться. Если нет, то это всего лишь список значений (типа между угловыми скобками, в данном случае целым числом), которые вы можете вставить и удалить. Это немного сложно с внутренней стороны, но если он не отображается в документации по обработке, это безопасная ставка, что он встроен в саму Java (java documentation).

Эта линия:

for (Integer val : values) 

называется «Еогеасп» или «Еогеасп» цикл, который имеет множество очень хорошее объяснение в Интернете, но я дам краткое объяснение здесь. Если у вас есть список (возможно, 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, высоту, но похоже, что они решили сделать это по-другому. Всякий раз, когда вы вызываете функцию рисования при обработке (например, point(x,y)), она рисует пиксели в (x, y) смещение из (0,0). Иногда вы не хотите, чтобы он рисовал ее относительно (0,0), поэтому функция translate() позволяет вам изменить то, что она рисует. В этом случае перевод позволяет выстроить некоторую точку (x, 0) где-то посередине экрана, а не по краю.

Надеюсь, что это поможет!

+0

@ kevinas5, Это было здорово! Таким образом, перевод и 2 линейные функции объединяются, что дает иллюзию движущейся линии в основном? –

+0

Я не уверен, что строка 'line (0, карта (1300, 0, 1500, 0, высота), ширина, карта (1300, 0, 1500, 0, высота)); // (x1, y1, x2, y2) 'должен делать. Это рисует горизонтальную линию (но я не вижу ее, может быть, она отключена от экрана). Фактическое перемещение выполняется путем удаления первого элемента списка (который сдвигает все остальные элементы, оставленные одним). :) – kevinsa5

+0

Я удалил первую строку(), и только 2-й там все, что она делает, это ничья прямая. Я предполагаю, что это делается, чтобы поддерживать линию даже в том случае, когда обнаружено движение. –

Смежные вопросы