例如,这是预期螺旋的形状(以及迭代的每个步骤)
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]
,返回第一个网格中的位置为空(或者没有被数据点占用)的网格.
网格大小没有上限.
我正在打扫我的一个旧项目.它必须做的事情之一是 - 给定一个笛卡尔网格系统,并在网格上有两个正方形,找到所有正方形的列表,连接这两个正方形的中心的线将通过.
这里的特殊情况是所有起点和终点都被限制在正方形/单元的确切中心.
以下是一些示例 - 包含样本起点和终点对.阴影方块是应由相应函数调用返回的方块
删除了死的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'可能会在这里工作,但它有点落后于我想要的东西.据我所知,为了使用它,我基本上必须将它应用到线上,然后扫描每个方块上的网格为真或假.对于大网格而言不可行 - 或者至少是不优雅的) …
假设我有字符串
"[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
,但是如果可能的话我想要一个更干净的空间.
(如果可能的话,不需要外部库)
我正在挑选一个特定的任务来说明我在说什么
假设我想通过检查下面的每个数字(如果它是一个因子,然后将它们加在一起)来天真地找到大数的所有因子的总和.
在命令式编程语言中,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) 我有一个环形欧几里德地图.也就是说,曲面是一个平坦的欧几里德矩形,但是当一个点移动到右边界时,它将出现在左边界(在相同的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)对存储在每个对象中.
这个伟大的免费套餐中有一个很好的免费替代品,它将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等)都不是左分配的.这个事实可以通过一个例子来表示,其中runAlt
和liftAlt
不形成一个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) 似乎要在每个新IDE中安装Clojure,我必须完全重新安装它并创建它的副本.运行REPL似乎正在运行Java程序.
我来自Ruby背景,运行Ruby程序ruby program.rb
,ruby是从一个地方执行的程序到文件上(我知道这类似于java,python等的工作方式)好).
clojure"解释器"只是一个编译的Java文件,它将.clj文件作为参数,并对其进行处理吗?
假设我想要一个呼叫运行,如果它失败了,那没什么大不了的; 程序可以继续没有问题.(我知道这通常是不好的做法,但想象一个假设的,快速的一次性脚本,而不是一个大项目)
我被教导这样做的方式是:
begin
thing_to_try
rescue
# awkward blank rescue block
end
next_thing
Run Code Online (Sandbox Code Playgroud)
当然,还有其他方法可以做到这一点,包括使用ensure
和类似的东西.但有没有办法让方法调用/阻止静默失败而没有一个凌乱的空白块?
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) 以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 ×4
algorithm ×3
arrays ×2
geometry ×2
haskell ×2
math ×2
audio ×1
clojure ×1
distance ×1
enumerable ×1
for-loop ×1
free-monad ×1
interpreter ×1
iteration ×1
iterator ×1
jvm ×1
midi ×1
parsing ×1
raytracing ×1
recursion ×1
regex ×1
syntax ×1
synthesizer ×1
vst ×1