Как использовать синусоидальную / косинусную волну, чтобы вернуть колеблющееся число - PullRequest
1 голос
/ 08 сентября 2010

Я новичок в программировании на Java, я программирую на Java 1.6 с Android.

У меня есть простая функция, которая заставляет число увеличиваться и уменьшаться в диапазоне от 0 до 200. Я хотел бы поместить это вфункция синуса, но продолжаю получать ошибки с тем, что я пробовал.

Я хочу, чтобы моя программа обновляла int (Number1) через синусоидальную ось Y.

Какие-нибудь идеи меняют следующую логику в функцию синуса?(без учета 2-го числа)

код:

private int Number1 = 150;
private int Number2 = 0;
private int counter = 0;     

  public void updateNumbers() {   
            if (counter == 0) {
                if (Number1 < 200) {
                    Number1 = Number1 + 50;
                    Number2 = Number2 - 50;
                    if (Number1 >= 200) {
                        counter = 1;
                    }
                }               
            } else if (counter == 1) {
                if (Number2 < 200) {                                       
                    Number1 = Number1 - 50;
                    Number2 = Number2 + 50;               
                    if (Number2 >= 200) {
                        counter = 0;
                    }
                }
            }
        }           

Ответы [ 3 ]

2 голосов
/ 09 сентября 2010

Хорошо, так что вы хотите сделать, это построить синусоидальную волну, которая идет от 0 до 200, но с каким периодом? Вы хотели, чтобы это повторялось каждые 8 ​​звонков?

Как насчет этого, используя встроенную функцию Java Math.sin:

private static final double PERIOD = 8; // loop every 8 calls to updateNumber
private static final double SCALE = 200; // go between 0 and this

private int _pos = 0;
private int Number1 = 0;

public void updateNumber() {
    _pos++;
    Number1 = (int)(Math.sin(_pos*2*Math.PI/PERIOD)*(SCALE/2) + (SCALE/2));
}

По сути, мы сохраняем переменную, которая подсчитывает, сколько обновлений мы сделали, и масштабируем ее, чтобы она соответствовала периоду синусоидальной волны, 2 * PI. Это действует как вход в «настоящую» функцию греха, давая нам что-то, что идет между -1 и 1, но имеет правильную частоту. Затем, чтобы на самом деле установить число, мы просто масштабируем его в диапазоне от -100 до 100, а затем добавляем 100, чтобы переместить его в диапазон 0-200, который вы хотели с самого начала.

(Вам не нужно приводить число к целому, если у вас работает двойник, я просто придерживался духа того, что вы написали выше.)

1 голос
/ 08 сентября 2010

* Обновлен для создания синусоидальной волны **

Это должно делать то, что вы хотите.Первая часть просто колеблется от ввода ангела в функцию синуса.

// Number starts at middle val
private int Number1 = -180;
// and is shrinking
private int direction = -1;

public void updateNumber() {   
    // if the number is in the acceptable range, 
    //  keep moving in the direction you were going (up or down)
    if (Number1 < 180 && Number1 > -180) {
        Number1 = Number1 + (50 * direction);
    } else { 
        // otherwise, reverse directions
        direction = direction * -1;
        // and start heading the other way
        Number1 = Number1 + (50 * direction);
    }
} 

Эта часть использует осциллирующее значение и вводит его в функцию синуса, а затем выполняет некоторые вычисления, чтобы соответствовать значениям из 0до 200.

for (int i = 0; i < 200; i++){
    System.out.println((100 * (Math.sin((Number1* Math.PI)/180.0)))+100); 
    updateNumber();
}

Результаты будут выглядеть так:

0.0
0.38053019082543926
1.5192246987791975
3.4074173710931746
6.03073792140917
9.369221296335013
13.397459621556138
18.084795571100827
23.395555688102192
29.28932188134526
35.72123903134607
42.64235636489539
50.00000000000001
57.738173825930055
65.79798566743312
74.11809548974793
82.63518223330696
91.28442572523419
100.0
108.71557427476581
117.36481776669304
125.88190451025207
134.20201433256688
142.26182617406994
150.0
157.3576436351046
164.27876096865393
170.71067811865476
176.6044443118978
181.9152044288992
186.60254037844385
190.630778703665
193.96926207859082
196.59258262890683
198.4807753012208
199.61946980917457
200.0
0 голосов
/ 08 сентября 2010

Так вы смотрите на дискретные шаги?Синус / косинус - это непрерывные функции, поэтому, если вы попытаетесь реализовать их таким образом, вы фактически получите ступенчатую функцию, которая следует кривой синуса / консины.

Вы увеличиваете на 50 каждый раз черезфункция, так что вы получите только значения {1, 51, 101, 151} до ее циклирования (я предполагаю, что строка counter = 1 должна быть Number1 = 1).

Можете ли вы предоставить ещеинформация для нас, чтобы ответить?

...