2016-02-29 82 views
2

如何在一般情况下定义向量旋转和反射,其中函数将在Haskell中的n维中工作?如何在haskell中定义n维矢量旋转和反射?

目前我有点积,标准化和投影完成,但坚持反射和旋转。

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好几天,但似乎使用哈斯克尔理解数学有时会引起问题时,没有明确的代码(或根本不会产生代码)和n维向量的唯一教程过去我的数学知识。

+0

做这些甚至编译?现在,如果您查看'dot'的定义,我不会在范围内看到* sum-symbol *和'x' - 还有:仅仅是关于实现还是难以找到所述操作的数学计算?如果是的话,你可以添加预期的签名? – Carsten

+0

应该是: 总和。 zipWith(*)(fromVector v).∘fromVector 我的编辑器默认它为unicode对不起 – SANK

+0

好吧,你应该说服你的编辑有一个更好的复制和粘贴行为 - 仍然:你是否正在寻找数学或翻译有困难? – Carsten

回答

-1

数学应该能够让我们在这里大部分的方式;在n维空间中的旋转可以被认为是基于n-2维对象(即平面上的点或者3维空间中的线)的变换。类似地,反射可以被认为是变换基于一个n-1维的对象

对于小于3d矢量的任何事物,以及任何小于2d矢量的反射,你都会遇到困难,一般的方法可能是定义两个参数:一个用于旋转的矢量和一个“轴”表示(一个2d矢量的点)

由于矢量(和它正在转换的对象)的长度在确定是否重要一个旋转或反射甚至是有意义的,这对依赖类型来说是一个很好的用例您可以指定类型签名中向量的相对长度)。不幸的是,Haskell没有支持全面,但(虽然喜欢伊德里斯一些实验性语言一样),所以你的选择量:

  • 实施反射和旋转时,矢量的大小是错误失败的部分功能,
  • 实施任何小维“轴”转换一个更一般的功能(实际上并不知道这是可能的),
  • 尝试用相关类型语言(如果你想要的类型安全的这些保障,或
  • 实现您的创意

我想说的是,在大多数情况下,Haskell的学术系谱使它对探索性数学很有用,但它还不完美。

1

关于n维旋转的数学方面,我可能会推荐印第安纳大学计算机科学系的Andrew J. Hanson的出版物。特别是:

“轮作对于N三维计算机图形” https://www.cs.indiana.edu/pub/techreports/TR406.pdf

该论文是“几何N个三维计算机图形” https://classes.soe.ucsc.edu/cmps161/Winter14/papers/pv/ggndgeom.pdf

数学需要载体的知识接班人算术和线性代数,但是如果你打算进行N维变换,这是推荐数学运算的方法。