在学习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] 删除。
我来说两句