我正在尝试实现用于在JavaScript中模拟流体的Clavet方法,因此调试是一个噩梦,这就是为什么我在这里问,希望有人经历过同样的事情会告诉我我做错了什么.
到目前为止,我有工作OKAY:
但我有两个问题:
1)因为在这种方法中,所有东西都被"偏移"了半步,我不确定如何正确地将粒子从墙上弹开.现在我取出粒子的位置和先前的位置并将它们绕过交叉的墙壁,然后通过反弹因子围绕交叉点进行缩放.
我的逻辑告诉我这应该有效.算法的下一步是更新粒子速度,所以我也反映了之前的位置.但在实践中,这给了我一个我不明白的结果:
这显示了粒子上的"力".墙壁反射过多的力量,使一切都保持永久运动.
公式4.58在本文中 明显显示了一种方法,以防止这一点,但我一直没能得到它的工作.
还有我没有得到的论文中的内容,例如"我们只想反映碰撞中省略的速度"的意思.为什么?请问ELI5这个东西给我好吗?
2)即使不涉及墙壁,模拟也会定期"爆炸".更高的压力会发生这种情况:
这是 JavaScript,所以就是这样,但是我已经完成了代码,并且没有任何划分零或者我可以想象NaN正在发生的情况.
我在论文中看到过关于SIM卡不稳定性的一些话题,我想知道是不是这样.这篇文献中的大部分内容都超出了我的范围.
根据我的理解(我认为),消除不稳定性的方法之一是粘度,但我添加它并且它对爆炸没有帮助:
我可以发布代码,但是在开始工作的第一阶段,它现在很难阅读.
最后一个问题:我如何弄清楚如何将此方法中的伪常量转换为物理单位?
编辑:我发现SIM卡偶尔会冻结,看起来它确实在某个地方产生了NaN,但是Chrome却抓得太晚了.
到目前为止我在网上找不到任何ELI5.对于学习项目,我想实现自己的is_constructible.有人可以解释它是如何工作的吗?
要处理8位像素,在不丢失信息的情况下执行伽马校正等操作,我们通常会对值进行上采样,以16位或其他方式工作,然后将它们下采样到8位.
现在,这对我来说是一个新的领域,请原谅不正确的术语等.
根据我的需要,我选择在"非标准"Q15中工作,其中我只使用范围的上半部分(0.0-1.0),而0x8000代表1.0而不是-1.0.这使得用C计算事物变得更加容易.
但我遇到了SSSE3的问题.它有PMULHRSW指令乘以Q15数字,但它使用Q15的"标准"范围是[-1,1-2 - 19],所以乘以(我的)0x8000(1.0)乘以0x4000(0.5)给出0xC000( - 0.5),因为它认为0x8000是-1.这很烦人.
我究竟做错了什么?我应该将像素值保持在0000-7FFF范围内吗?难道这种失败的目的是它是一种定点格式吗?有没有解决的办法?也许有些诡计?
在Q15上是否有某种明确的论文讨论了所有这些?
我从这里实现了元组:https : //voidnish.wordpress.com/2013/07/13/tuple-implementation-via-variadic-templates/
可以使用NATVIS对其进行可视化吗?我到了
<Type Name="tuple">
<DisplayString>()</DisplayString>
</Type>
<Type Name="tuple<*>">
<DisplayString>({_Myfirst})</DisplayString>
</Type>
Run Code Online (Sandbox Code Playgroud)
如何获取多个类型的_Myfirst值,以获取
<Type Name="tuple<*,*>">
<DisplayString>({_Myfirst}, {???})</DisplayString>
</Type>
<Type Name="tuple<*,*,*>">
<DisplayString>({_Myfirst}, {???}, {???})</DisplayString>
</Type>
Run Code Online (Sandbox Code Playgroud)
等等?
assembly ×1
c++ ×1
c++11 ×1
fixed-point ×1
javascript ×1
natvis ×1
simulation ×1
sse ×1
type-traits ×1