小编Jus*_* L.的帖子

用于从原点迭代离散2D网格上的向外螺旋的算法

例如,这是预期螺旋的形状(以及迭代的每个步骤)

          y
          |
          |
   16 15 14 13 12
   17  4  3  2 11
-- 18  5  0  1 10 --- x
   19  6  7  8  9
   20 21 22 23 24
          |
          |
Run Code Online (Sandbox Code Playgroud)

线条是x和y轴.

这将是算法在每次迭代时"返回"的实际值(点的坐标):

[0,0],
[1,0], [1,1], [0,1], [-1,1], [-1,0], [-1,-1], [0,-1], [1,-1],
[2,-1], [2,0], [2,1], [2,2], [1,2], [0,2], [-1,2], [-2,2], [-2,1], [-2,0]..
Run Code Online (Sandbox Code Playgroud)

等等

我已经尝试过搜索,但我不确定要搜索什么,我尝试过的搜索结果是什么.

我甚至不确定从哪里开始,除了凌乱,不优雅和特殊的东西,比如为每一层创建/编码新的螺旋.

任何人都可以帮助我开始吗?

此外,有没有一种方法可以轻松地在顺时针和逆时针(方向)之间切换,以及从哪个方向"开始"螺旋?(轮换)

还有,有办法递归吗?


我的应用程序

我有一个填充了数据点的稀疏网格,我想在网格中添加一个新的数据点,并使其与给定的其他点"尽可能接近".

为此,我将调用grid.find_closest_available_point_to(point),它将迭代上面给出的螺旋并返回第一个空位且可用的位置.

首先,它会检查point+[0,0](只是为了完整性).然后它会检查point+[1,0].然后它会检查point+[1,1].然后point+[0,1],返回第一个网格中的位置为空(或者没有被数据点占用)的网格.

网格大小没有上限.

language-agnostic iteration algorithm recursion

29
推荐指数
6
解决办法
1万
查看次数

优雅/清洁(特殊情况)直线网格遍历算法?

我正在打扫我的一个旧项目.它必须做的事情之一是 - 给定一个笛卡尔网格系统,并在网格上有两个正方形,找到所有正方形的列表,连接这两个正方形的中心的线将通过.

这里的特殊情况是所有起点和终点都被限制在正方形/单元的确切中心.

以下是一些示例 - 包含样本起点和终点对.阴影方块是应由相应函数调用返回的方块

删除了死的ImageShack链接 - 例子

的起始和结束点由它们在方块表示.另外,在上述画面中,假定左下方是[1,1],在右下角的线将被识别为[6,2][9,5].

也就是说,从(的中心)正方形上从左边第六列,上(的中心)的第二行从底部上从左侧第九列,从底部起的第五行上

这真的不那么复杂.但是,我似乎在网上找到了一些复杂的算法并实现了它.

我记得它非常非常快.比如,每帧数百或数千倍的优化速度.

基本上,它沿着直线从边界跳到正方形的边界(线与网格线交叉的点).它知道下一个交叉点的位置是通过查看哪个交叉点更接近 - 水平的或垂直的 - 然后移动到下一个交叉点.

这在概念上是好的,但实际的实现结果非常不那么漂亮,而且我担心优化程度可能太高而不是我实际需要的(我称之为遍历)算法可能每分钟五到六次).

是否有简单易懂的透明直线网格遍历算法?

在计划方面:

def traverse(start_point,end_point)
  # returns a list of all squares that this line would pass through
end
Run Code Online (Sandbox Code Playgroud)

给定坐标识别方块本身.

一些例子:

traverse([0,0],[0,4])
# => [0,0], [0,1], [0,2], [0,3], [0,4]
traverse([0,0],[3,2])
# => [0,0], [0,1], [1,1], [2,1], [2,2], [3,2]
traverse([0,0],[3,3])
# => [0,0], [1,1], [2,2], [3,3]
Run Code Online (Sandbox Code Playgroud)

请注意,直接通过角落的线条不应包括线条"翼"上的方块.

(好的'Bresenham'可能会在这里工作,但它有点落后于我想要的东西.据我所知,为了使用它,我基本上必须将它应用到线上,然后扫描每个方块上的网格为真或假.对于大网格而言不可行 - 或者至少是不优雅的) …

language-agnostic algorithm math geometry raytracing

22
推荐指数
2
解决办法
1万
查看次数

Ruby:将嵌套数组的字符串表示解析为数组?

假设我有字符串

"[1,2,[3,4,[5,6]],7]"
Run Code Online (Sandbox Code Playgroud)

我如何将其解析为数组

[1,2,[3,4,[5,6]],7]
Run Code Online (Sandbox Code Playgroud)

在我的使用案例中,嵌套结构和模式完全是任意的.

我目前的临时解决方案是在每个时段之后添加一个空格并使用YAML.load,但是如果可能的话我想要一个更干净的空间.

(如果可能的话,不需要外部库)

ruby regex arrays parsing

17
推荐指数
3
解决办法
1万
查看次数

在haskell计算中"注入"进度记录/跟踪?

我正在挑选一个特定的任务来说明我在说什么

假设我想通过检查下面的每个数字(如果它是一个因子,然后将它们加在一起)来天真地找到大数的所有因子的总和.

在命令式编程语言中,IO和纯计算之间没有分离,你可能会做这样的事情

def sum_of_factors(n):
  sum = 0
  for i between 1 and n:
    if (n % i == 0):
      sum += i
  return sum
Run Code Online (Sandbox Code Playgroud)

但是如果我n很大,我最终会在计算完成之前长时间盯着空屏幕.所以我添加一些日志记录 -

def sum_of_factors(n):
  sum = 0
  for i between 1 and n:
    if (i % 1000 == 0):
      print "checking $i..."
    if (n % i == 0):
      print "found factor $i"
      sum += 1
  return sum
Run Code Online (Sandbox Code Playgroud)

实际上,这个增加是微不足道的.

现在,如果我要在教科书中使用haskell,我可能会这样做

sum_of_factors :: Int -> Int
sum_of_factors n = foldl' (+) 0 factors
  where
    factors …
Run Code Online (Sandbox Code Playgroud)

haskell referential-transparency

15
推荐指数
2
解决办法
580
查看次数

环形包裹(x和y包裹)地图上点之间的最短距离?

我有一个环形欧几里德地图.也就是说,曲面是一个平坦的欧几里德矩形,但是当一个点移动到右边界时,它将出现在左边界(在相同的y值处),由x_new = x_old%width给出

基本上,点基于以下绘制:*参见编辑

(x_new, y_new) = ( x_old % width, y_old % height)
Run Code Online (Sandbox Code Playgroud)

Think Pac Man - 走出屏幕的一边会让你出现在对面的边缘.

计算两点之间最短距离的最佳方法是什么?典型的实施方式表明地图对角处的点距离很大,而实际上,实际包裹的距离非常接近.

我能想到的最好的方法是计算经典Delta X和Wrapped Delta X,以及经典Delta Y和Wrapped Delta Y,并使用Sqrt(x ^ 2 + y ^ 2)距离公式中每对的较低者.

但这将涉及许多检查,计算和操作 - 我认为可能没有必要.

有没有更好的办法?


编辑

当一个物体移动时,它移动到位置(x_old,y_old),通过上面的公式运行它,并存储(x_new,y_new)作为它的位置.仅添加上述公式以阐明当物体越过边界时会发生什么; 实际上,每次只有一个(x,y)对存储在每个对象中.

language-agnostic algorithm math geometry distance

14
推荐指数
1
解决办法
3276
查看次数

结构上强制执行的自由选择,没有左派分布

这个伟大的免费套餐中有一个很好的免费替代品,它将Functor提升为左派分配.

也就是说,声称是:

runAlt :: Alternative g => (forall x. f x -> g x) -> Alt f a -> g a
Run Code Online (Sandbox Code Playgroud)

是一种替代同态,有liftAlt.事实上,它只是一个,但仅适用于左派分配的替代实例.

当然,实际上,很少有替代实例实际上是左分配的.大多数实际上重要的替代实例(解析器,对于大多数Monad f来说,MaybeT f等)都不是左分配的.这个事实可以通过一个例子来表示,其中runAltliftAlt不形成一个Alternative同态:

(writeIORef x False <|> writeIORef True) *> (guard =<< readIORef x)
-- is an IO action that throws an exception
runAlt id $ (liftAlt (writeIORef x False) <|> liftAlt (writeIORef True))
               *> liftAlt (guard =<< readIORef x)
-- is …
Run Code Online (Sandbox Code Playgroud)

haskell category-theory abstract-algebra free-monad

14
推荐指数
1
解决办法
269
查看次数

clojure程序/编译器/解释器如何实际"工作"?

似乎要在每个新IDE中安装Clojure,我必须完全重新安装它并创建它的副本.运行REPL似乎正在运行Java程序.

我来自Ruby背景,运行Ruby程序ruby program.rb,ruby是从一个地方执行的程序到文件上(我知道这类似于java,python等的工作方式)好).

clojure"解释器"只是一个编译的Java文件,它将.clj文件作为参数,并对其进行处理吗?

compiler-construction interpreter jvm clojure

13
推荐指数
1
解决办法
1883
查看次数

如果没有空白的"rescue"块,Ruby块/命令会无声地失败

假设我想要一个呼叫运行,如果它失败了,那没什么大不了的; 程序可以继续没有问题.(我知道这通常是不好的做法,但想象一个假设的,快速的一次性脚本,而不是一个大项目)

我被教导这样做的方式是:

begin
  thing_to_try
rescue
  # awkward blank rescue block
end
next_thing
Run Code Online (Sandbox Code Playgroud)

当然,还有其他方法可以做到这一点,包括使用ensure和类似的东西.但有没有办法让方法调用/阻止静默失败而没有一个凌乱的空白块?

ruby syntax

12
推荐指数
2
解决办法
5597
查看次数

清洁解决这个红宝石迭代器的诡计?

k = [1,2,3,4,5]
for n in k
  puts n
  if n == 2
    k.delete(n)
  end
end
puts k.join(",")

# Result:
# 1
# 2
# 4
# 5
# [1,3,4,5]

# Desired:
# 1
# 2
# 3
# 4
# 5
# [1,3,4,5]
Run Code Online (Sandbox Code Playgroud)

其他数组迭代器,k.each也会发生同样的效果:

k = [1,2,3,4,5]
k.each do |n|
  puts n
  if n == 2
    k.delete(n)
  end
end
puts k.join(",")
Run Code Online (Sandbox Code Playgroud)

具有相同的输出.

这种情况发生的原因非常清楚...... Ruby实际上并没有迭代存储在数组中的对象,而只是将它变成一个漂亮的数组索引迭代器,从索引0开始,每次都增加索引直到它结束.但是当你删除一个项目时,它仍然会增加索引,所以它不会两次评估相同的索引,这是我想要的.

可能不是正在发生的事情,但这是我能想到的最好的.

有干净的方法吗?是否已有可以执行此操作的内置迭代器?或者我是否需要弄脏并执行数组索引迭代器,并且在删除项目时不会增加?(或遍历数组的克隆,并从原始数组中删除)


澄清

我不只是想从数组中删除项目; 对不起,如果那是清楚的.我想要做的是遍历每个元素,并"处理"它; 此过程有时可能会删除它.为了更准确:

class Living_Thing

  def initialize tracker,id
    @tracker = …
Run Code Online (Sandbox Code Playgroud)

ruby arrays iterator for-loop enumerable

10
推荐指数
2
解决办法
1072
查看次数

我将如何以编程方式与VST交互(i)插件来合成音频?

Tweakbench的VSTi Triforce为例.当加载到市场上的任何VST主机中时,它允许主机向VSTi发送(可能是MIDI)信号.然后,VSTi将处理该信号并输出​​由VSTi内的软件仪器创建的合成音频.

例如,向VSTi发送A4(我相信的MIDI音符)将使其合成中间C上方的A.它将音频数据发送回VST主机,然后VST主机可以在我的扬声器上播放或保存它.wav或其他一些音频文件格式.

假设我有Triforce,并且我试图用我选择的语言编写一个程序,可以通过发送要合成的A4音符与VSTi进行交互,并自动将其保存到系统上的文件中?

最后,我希望能够解析整个单轨MIDI文件(使用已经可用于此目的的已建立的稳定库)并将其发送到VSTi以"渲染"/合成为音频文件.

我将如何解决这个问题,我应该用什么语言来构建核心框架?

最终,它将用于基于Ruby的项目,因此任何指向特定Ruby资源的指针都会很好.

但是,我只是想了解一下VSTi的API是如何工作的.(我已经意识到这个问题与构建VST主机的问题非常相关,尽管只能将VST输出保存到文件中而不能播放它们,并且范围要小得多)

在此先感谢任何帮助=)

ruby audio midi synthesizer vst

10
推荐指数
1
解决办法
2680
查看次数