2016-02-29 3 views
2

Как определить векторное вращение и отражение вообще, где функция будет работать в n размеры в Haskell?Как определить n-мерное вращение и отражение вектора в haskell?

В настоящее время у меня есть точечный продукт, нормализация и проецирование сделаны, но застряли на отражении и вращении.

data Vector s a = Vector {len::s,arr::a} 

normalize :: Vector s a → Vector s a 
normalize = toVector . uncurry (zipWith (/)) 
         . (id&&&(repeat . sqrt . sum . map (^2))) 
         . fromVector 

dot  :: Vector s a → Vector s a → a 
dot v = sum ∘ zipWith (*) (fromVector v) ∘ fromVector 

project :: Vector s a → Vector s a → Vector s a 
project v = toVector ∘ uncurry (zipWith (*)) 
        ∘ (fromVector&&&(repeat ∘ (v`dot`))) 

Я SEARHING в течение нескольких дней в настоящее время, но это, кажется, что использование Haskell, чтобы понять математику иногда может вызвать проблемы, когда нет четкого кода (или нет кода вообще) и только учебники по п-мерных векторов Пройдите мимо моих знаний по математике.

+0

они даже скомпилируются? Прямо сейчас я не вижу ни символа * sum-symbol *, ни «x» в области видимости, если вы смотрите на определение «точка» - также: это только о реализации или у вас есть проблемы с поиском математики указанных операций ?Если это так, вы можете добавить ожидаемые подписи? – Carsten

+0

это должно быть: сумма. zipWith (*) (fromVector v) .∘ fromVector Мой редактор по умолчанию использует его для unicode извините – SANK

+0

ну, вы должны убедить своего редактора иметь более приятное поведение для копирования и вставки - все еще: ищете математику или у вас есть трудности с ее переводом? – Carsten

ответ

-1

Математика должна быть в состоянии получить от нас большую часть пути; поворот в n-мерном пространстве можно рассматривать как преобразование, основанное на n-2-мерном объекте (т. е. точке на плоскости или линии в 3-пространстве. Аналогично, отражение можно рассматривать как преобразование основанный на n-мерном объекте

У вас возникнут проблемы с определением поворотов для чего-либо меньшего, чем трехмерный вектор, и отражений в чем-либо меньшем, чем вектор 2d. Общий подход может заключаться в определении функции два параметра: один для вектора, который вы вращаете, и одно «осевое» представление (точка для вектора 2d).

Поскольку длина вектора (и объекта, который он преобразует), важна для определения того, поворот или отражение даже имеют смысл, это было бы хорошим прецедентом для зависимой типизации (вы можете указать относительную длину векторов в сигнатурах типа). К сожалению, Haskell не поддерживает, что в полном мере пока (хотя некоторых экспериментальных языках, как Идрис делать), поэтому ваши варианты составляют:

  • Реализовать отражения и вращения как частичные функции, которые терпят неудачу, когда размеры векторов неверны ,
  • Внедрение единой более общая функции для преобразований относительно любых меньших габаритных «осей» (на самом деле не уверен, если это возможно),
  • Попробуйте язык с зависимыми типами (если вы хотите, чтобы эти гарантии безопасности типа, или
  • Получите креатив с вашими реализациями

Я бы сказал, что в большинстве случаев академическая родословная Хаскелла делает ее полезной для поисковой математики, но она еще не совершенна.

1

Что касается математических аспектов n-мерных вращений, я мог бы рекомендовать публикации Эндрю Дж. Хансона из отдела компьютерных наук Университета штата Индиана. В частности:

«Вращения для N-мерной компьютерной графики» https://www.cs.indiana.edu/pub/techreports/TR406.pdf

Этот документ является преемником «Геометрия для N-мерной компьютерной графики» https://classes.soe.ucsc.edu/cmps161/Winter14/papers/pv/ggndgeom.pdf

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

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

  • Нет связанных вопросов^_^