独立旋转矩阵列的更好方法

合法性

在学习j的过程中,我实现了一种用于计算在Futility Closet中遇到的多边形面积的技术我想出了一个解决方案,但是它非常精致,所以我对更好的方法感兴趣:

   polyarea =: -:@((+/@((1&{&|:)*(0{&|:1&|.)))-(+/@((0&{&|:)*(1{&|:1&|.))))
   y =: 2 7 9 5 6,.5 7 1 0 4
   polyarea y
20

此技术旋转一列并获取列的点积,然后在旋转另一列后执行相同的操作。面积是这两个结果之差的一半。

有兴趣的建议!

鲍勃

我认为他们的技术归结为使用行列式找到多边形的面积http://mathworld.wolfram.com/PolygonArea.html

但是,使用Futility Closet技术,我将首先通过在末端添加第一个点来关闭多边形。

   y =: 2 7 9 5 6,.5 7 1 0 4
   close=: (, {.)  

close 是一个钩子,需要第一对并将其附加到末尾

然后一次将行列式取两点,这实际上是行列式和旋转式的作用

   dets=: 2 (-/ . *)\ close  

dets 接受每对点的行列式-如果这些点按顺时针顺序排列,则结果为负

然后采用这些值并进行解答。

   clean=: |@:-:@:(+/)   

clean 将行列式求和,除以2,然后返回结果的绝对值。

   clean @: dets y
20

要以完全默认的形式查看结果,我们可以依靠f.副词(Fix)来使我们的定义平坦。

   clean @: dets f.
|@:-:@:(+/)@:(2 -/ .*\ (, {.))

这只是查看他们正在做什么的另一种方式,但是它允许J使用.连词(点积)和\副词(Infix)来处理所有行列式旋转。

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章