Как вычислить угол возврата?

Используя GNU sed, (и bash):

F="my name is user from here not there."
sed -E 's/^./\u&/;s/([[:space:]])([[:alpha:]]{4})/\1\u\2/g' \ 
    <<< "${F,,}"

или:

sed -E 's/^./\u&/;s/(\s)(\w{4})/\1\u\2/g' <<< "${F,,}"

Выход:

My Name is User From Here not There.

Примечания:

"${F,,}" является расширением параметра модификации регистра bash , оно возвращает версию $F в нижнем регистре, которая становится входом для sed.

GNU sed предлагает некоторые полезные синонимы и сокращения для общих регулярных выражений классов символов. Класс символов [a-zA-Z0-9_] может быть сокращен до [[:alpha:]_], или еще проще \w.

Хотя \u выглядит как сокращение в регулярном выражении , это не так. Это «специальная последовательность» , используемая только в s текст замены команды ubstitute - \u означает «перевод следующего символа в верхний регистр» . [ 1139]

& относится к любому первому регулярному выражению в команде s ubstitute . Сравните следующее:

sed 's/./&/'          <<< foo  # outputs "f"
sed 's/./&/g'         <<< foo  # outputs "foo"
sed 's/./&&&&/g'      <<< foo  # outputs "ffffoooooooo"
sed 's/./\u&&&\u&/g'  <<< foo  # outputs "FffFOooOOooO"
sed 's/.*/&&&&/'      <<< foo  # outputs "foofoofoofoo"

См. GNU sed информационные страницы для получения более подробной информации.

62
задан Peter Mortensen 13 August 2011 в 19:21
поделиться

7 ответов

Я думаю более легкий способ сделать, это должно использовать скорость ракеты вместо того, чтобы вычислить углы. Скажите, что у Вас есть ракета, которая имеет xVelocity и yVelocity для представления ее перемещения горизонтально и вертикально. Те скорости могут быть положительными или отрицательными для представления оставленный, право, или вниз.

  • , Если ракета поражает вершину или нижнюю границу, инвертируют знак yVelocity.
  • , Если ракета поражает левый или правый реверс границы знак xVelocity.

Это сохранит перемещение в противоположной оси тем же.

Заимствование изображения от [1 113] ответ ChrisF , скажем, ракета начинается в положении I.

Angle of Reflection

С xVelocity и yVelocity и быть положительным (в 2D графическом праве, и вниз обычно положительны), ракета переместится в обозначенном направлении. Позвольте нам просто присвоить значения [1 121]

xVelocity = 3
yVelocity = 4

, Когда ракета врезается в стену в положении C , xVelocity не должен изменяться, но yVelocity должен быть инвертирован к-4 так, чтобы это переместилось, въезжают задним ходом направление, но продолжает идти направо.

преимущество для этого метода - то, что только необходимо отслеживать ракету xPosition, yPosition, xVelocity, и yVelocity. Используя просто эти четыре компонента и частоту обновления Вашей игры, ракета будет всегда перерисовываться в правильном положении. После того как Вы входите в более сложные препятствия, которые не являются под прямыми углами или перемещаются, будет намного легче работать со скоростями X и Y, чем с углами.

66
ответ дан Community 24 November 2019 в 16:30
поделиться

Вы могли бы думать, что, потому что Ваши стены выровненные осей координат, что имеет смысл писать код особого случая (для вертикальной стены, инвертируйте x-координату скорости; для горизонтальной стены инвертируйте y-координату скорости). Однако, после того как у Вас есть игра, работающая хорошо с вертикальными и горизонтальными стенами, вероятно, следующая вещь, Вы будете думать, "что относительно стен под произвольными углами?" Таким образом, это стоит думать об общем случае с начала.

В общем случае, предположите, что Ваша ракета имеет скорость v и врезается в стену с поверхностью, нормальной n.

Missile with vector v about to obliquely hit a wall with surface normal n.

Разделение v в компоненты перпендикуляр u к стене и w параллельны к нему.

Right-angled triangle with hypotenuse for v, short side u parallel to wall and long side w parallel to wall.

, Где:

u = ( В В v · В n / В В n · В n) n
w = v в€’ u

Здесь, В В v · В n скалярное произведение из векторов v и n. См. ссылку для объяснения того, как вычислить ее. Скалярное произведение В В n · В n оценивает к квадрату длины вектора нормали; если Вы всегда сохраняете свой normals в форме единичные векторы затем В В n · В n = 1 и можно опустить подразделение.

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

Так скорость после того, как коллизия v′ = f w в€’ r u. В пњ «совершенно эластичная, лишенная трения коллизия, v′ = w в€’ u; то есть, движение отражается о нормальном при коллизии, как в схеме, данной в ответе счета.

Этот подход работает все равно в трех измерениях также.

(Очевидно, это - очень упрощенное понятие возврата; это не уделяет внимания угловому моменту или деформации. Но для многих видов видеоигр отлично соответствует этот вид упрощения.)

188
ответ дан Gareth Rees 24 November 2019 в 16:30
поделиться

Для идеальных частиц (& свет), угол отражения равен углу падения, как проиллюстрировано этой схемой (с commons.wikimedia.org).

Angle of Reflection

Делают поиск "угла отражения" (без кавычек) в Google.

Это сложно при принятии во внимание эластичности и материалов объекта и препятствий ;)

9
ответ дан Community 24 November 2019 в 16:30
поделиться

Как в стороне к определенному вопросу о физике Вы спрашиваете, я рекомендовал бы книгу "Начинающаяся Математика и Физика для Игровых Программистов" Wendy Stahler. Я нашел это довольно полезным для моих проектов программирования игры/физики.

кодом, который сопровождает книгу, является C++, но если бы Вы знаете C#, было бы довольно легко сделать преобразование.

Имеют хороший!

5
ответ дан itsmatt 24 November 2019 в 16:30
поделиться

Не сложный вообще - псевдокод:

angleObjectHitWall = a;
bounceAngle = 180-a;

, Конечно, это - очень простое вычисление и полностью не важно, после того как Вы начинаете принимать во внимание факторы, такие как материал, сила тяжести, стены, которые не являются прямыми, и т.д.

3
ответ дан Yuval Adam 24 November 2019 в 16:30
поделиться

180-a не будет работать во всех экземплярах, если Вы просто не работаете возврат над главной поверхностью, когда X увеличивается.

Одно направление для заголовка является форумами XNA или погрузкой пример кода XNA. Это - C#, и это для создания игр. Я не заявляю, что Вы хотите создать свои игры в XNA, но это - большой инструмент, и это свободно.

3
ответ дан Gregory A Beamer 24 November 2019 в 16:30
поделиться

Это - действительно вопрос о физике, поэтому если Вы не физик (и так как Вы задаете этот вопрос, я собираюсь взять его, что Вы не), он потребует, чтобы большое чтение и мозговая атака разобралось в нем.

я предлагаю читать этот статья в Википедии для получения общего представления о глубине вопроса.

, Если бы Вы только хотите заставить его "выглядеть вероятным" затем, что я не волновался бы об этом слишком много и использование , тарифицируют Ящерицу ответ, однако если Вы захотите сделать это правом, то у Вас будет настоящее приключение. Не позволяйте этой панике Вы tho!Удачи!

0
ответ дан David Božjak 24 November 2019 в 16:30
поделиться
Другие вопросы по тегам:

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