2D проекционный генератор сферических волн не работает должным образом

Оба правильные, но они интерпретируются как даты с двумя разными часовыми поясами. Итак, вы сравнили яблоки и апельсины:

// local dates
new Date("Jul 8, 2005").toISOString()            // "2005-07-08T07:00:00.000Z"
new Date("2005-07-08T00:00-07:00").toISOString() // "2005-07-08T07:00:00.000Z"
// UTC dates
new Date("Jul 8, 2005 UTC").toISOString()        // "2005-07-08T00:00:00.000Z"
new Date("2005-07-08").toISOString()             // "2005-07-08T00:00:00.000Z"

Я удалил вызов Date.parse(), так как он автоматически используется для строкового аргумента. Я также сравнивал даты с использованием формата ISO8601 , чтобы вы могли визуально сравнивать даты между вашими местными датами и датами UTC. Время разговора составляет 7 часов, что является разницей в часовом поясе и почему ваши тесты показывают две разные даты.

Другим способом создания этих же локальных / UTC-дат будет:

new Date(2005, 7-1, 8)           // "2005-07-08T07:00:00.000Z"
new Date(Date.UTC(2005, 7-1, 8)) // "2005-07-08T00:00:00.000Z"

Но я по-прежнему настоятельно рекомендую Moment.js , который как простой, но мощный :

// parse string
moment("2005-07-08").format()       // "2005-07-08T00:00:00+02:00"
moment.utc("2005-07-08").format()   // "2005-07-08T00:00:00Z"
// year, month, day, etc.
moment([2005, 7-1, 8]).format()     // "2005-07-08T00:00:00+02:00"
moment.utc([2005, 7-1, 8]).format() // "2005-07-08T00:00:00Z"

-1
задан Saturn 15 January 2019 в 15:30
поделиться

1 ответ

Вышеуказанный код является способом слишком сложным.

Помните, что круговая волна является вращательно-симметричной, то есть нет необходимости повторяться по углу; только амплитуда зависит от расстояния от источника (и, конечно, частоты / фазы; предполагается, что вы моделируете зависимость от времени, изменяя последнее).

Просто переберите все ячейки сетки и рассчитайте их расстояние до источника:

for (int i = 0; i < w; i++) {
    for (int j = 0; j < h; j++) {
        // calculate Euclidean distance to source
        double dx = i - x, dy = j - y;
        double dist = Math.sqrt(dx * dx + dy * dy);

        // no need to check bounds explicitly here
        wave[i][j] = Math.sin(f * dist + phase);
    }
}

Примечание:

  • Было бы более целесообразно переименуйте "частоту" в волновой вектор (однако это не изменит код).

  • В отличие от линейных волн, круговые волны затухают с расстоянием из-за сохранения энергии.

0
ответ дан meowgoesthedog 15 January 2019 в 15:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: