使用 Reactive Banana 进行一些基本微积分

2023-11-27

Setup:

我正在使用 Reactive Banana 和 OpenGL,并且我有一个想要旋转的齿轮。我有以下信号:

bTime :: Behavior t Int -- the time in ms from start of rendering
bAngularVelosity :: Behavior t Double -- the angular velocity
                                      -- which can be increase or
                                      -- decreased by the user
eDisplay :: Event t ()     -- need to redraw the screen
eKey :: Event t KeyState   -- user input

最终,我需要计算bAngle然后传递给绘图函数:

reactimate $ (draw gears) <$> (bAngle <@ eDisp)

角度很容易计算:a = ∫v(t) dt

Question:

I think我想做的是将这个积分近似为a = ∑ v Δt对于每个 eDisplay 事件(或者如果需要的话更频繁)。这是解决这个问题的正确方法吗?如果是这样,我该如何获得Δt from bTime?

See Also: 我怀疑答案使用mapAccum功能。如果是这样,还请参阅我的另一个问题以及。


编辑:要回答这个问题,是的,您使用您正在使用的近似值是正确的,它是求解一阶微分方程的欧拉方法,并且对于您的目的来说足够准确,特别是因为用户没有周围角速度的绝对值可以用来判断你。减少时间间隔会使它更准确,但这并不重要。

您可以用更少、更大的步骤来完成此操作(见下文),但这种方式对我来说似乎是最清晰的,我希望对您来说也是如此。

为什么要费心这个更长的解决方案呢?即使当eDisplay以不规则的间隔发生,因为它计算eDeltaT.

让我们给自己一个时间事件:

eTime :: Event t Int
eTime = bTime <@ eDisplay

为了获得 DeltaT,我们需要跟踪经过的时间间隔:

type TimeInterval = (Int,Int) -- (previous time, current time)

所以我们可以将它们转换为增量:

delta :: TimeInterval -> Int
delta (t0,t1) = t1 - t0

当我们得到一个新的时间间隔时,我们应该如何更新时间间隔t2?

tick :: Int -> TimeInterval -> TimeInterval
tick t2 (t0,t1) = (t1,t2)

因此,让我们将其部分应用到时间上,为我们提供一个间隔更新器:

eTicker :: Event t (TimeInterval->TimeInterval)
eTicker = tick <$> eTime

然后我们就可以accumE- 在初始时间间隔上累积该函数:

eTimeInterval :: Event t TimeInterval
eTimeInterval = accumE (0,0) eTicker

由于 eTime 是从渲染开始后开始测量的,因此初始(0,0)是合适的。

最后我们可以通过应用 (fmapping) delta关于时间间隔。

eDeltaT :: Event t Int
eDeltaT = delta <$> eTimeInterval

现在我们需要使用类似的想法来更新角度。

我将制作一个角度更新器,只需转动bAngularVelocity代入乘数:

bAngleMultiplier :: Behaviour t (Double->Double)
bAngleMultiplier = (*) <$> bAngularVelocity

然后我们可以用它来制作eDeltaAngle:(编辑:改为(+)并转换为Double)

eDeltaAngle :: Event t (Double -> Double)
eDeltaAngle = (+) <$> (bAngleMultiplier <@> ((fromInteger.toInteger) <$> eDeltaT)

并累加得到角度:

eAngle :: Event t Double
eAngle = accumE 0.0 eDeltaAngle

如果你喜欢单行本,可以这样写

eDeltaT = delta <$> (accumE (0,0) $ tick <$> (bTime <@ eDisplay)) where
    delta (t0,t1) = t1 - t0
    tick t2 (t0,t1) = (t1,t2)

eAngle = accumE 0.0 $ (+) <$> ((*) <$> bAngularVelocity <@> eDeltaT) = 

但我不认为这很有启发性,而且说实话,我不确定我的固定性是否正确,因为我还没有在 ghci 中测试过这一点。

当然,既然我做了eAngle代替bAngle, 你需要

reactimate $ (draw gears) <$> eAngle

而不是你原来的

reactimate $ (draw gears) <$> (bAngle <@ eDisp)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Reactive Banana 进行一些基本微积分 的相关文章

随机推荐

  • 计算 C# 中 XmlNode 的总数

    我试图找到一种方法来递归地从 XmlNode 获取子节点的总数 这就是说我想计算所有的孩子 孙子等 我认为它就像 node SelectNodes
  • 带有域字段的 CORS cookie 仅在 Firefox 中使用 jQuery AJAX 设置

    我无法设置 cookiedomain使用跨站点请求添加归档 我试图通过 jquery ajax 调用 request 来实现这一点 是否可以在除 Firefox 之外的其他浏览器中使用它 一些请求标头 Accept application
  • 从 JSON 字符串创建 Hashmap

    从java中的json字符串创建hashmap 我有 json 字符串 例如 phonetype N95 cat WP 并想转换成标准的Hashmap 我该怎么做 解析 JSONObject 并创建 HashMap public stati
  • Android 按钮背景选择器

    我想使用以下按钮选择器
  • 在 Angular JS 中动态应用 CSS 样式属性

    这应该是一个简单的问题 但我似乎找不到解决方案 我有以下标记 div style width 20px height 20px margin top 10px border solid 1px black background color
  • 如何将按钮添加到settings.bundle?

    我正在开发一个 iPhone 应用程序 默认情况下用户保持登录状态 如果他想注销 他应该打开 设置 并单击 注销 按钮 这将删除他的数据并在下次打开应用程序时要求登录 如何添加这样的按钮 就像 Twitter 设置中一样 正如 CodaFi
  • vb.net 从创建它的线程以外的线程访问

    我正在尝试将文本设置为标签Label caller Text phone number我收到此错误 System InvalidOperationException 跨线程操作无效 从创建它的线程以外的线程访问控制 Label caller
  • 如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法

    我用 Spring Boot 开发了一个应用程序 运行良好 有一个安静的控制器 我尝试向某些页面添加 spring security 其余控制器的端点是 api greetings 我在下面的类中配置了安全设置 Configuration
  • 解析 xml 时出错:与 Facebook SDK 未绑定前缀

    我的项目无法识别 xml 中的 com facebook widget ProfilePictureView 或其他小部件 我导入了 facebook sdk 甚至用它来登录并与 open graph 交互 这一切都有效 我只是想添加一个个
  • 如何用D3添加简单的圆弧

    我想在图表部分添加一个简单的弧线 如圆 vis append circle style stroke gray style fill white attr r 40 attr cx 50 attr cy 50 所提供的D3的例子正在处理数据
  • 如何在for循环中使用setInterval函数

    我正在尝试在给定可变项目列表的情况下运行多个计时器 代码看起来像这样 var list Array for var x in list setInterval function list x 10 console log x gt list
  • 在堆栈跟踪中获取 VB.NET 行号

    我有一个 VB NET 2010 Winforms 应用程序 我想在堆栈跟踪中包含行号 我已阅读以下问题和答案 如何在VB net中运行应用程序时打印行号 其中提到 您始终需要在代码中包含 PDB 文件 其中包含在此类情况下使用的调试信息
  • Git 中的 commit-ish 和 tree-ish 是什么?

    问题 Git 中 commit ish 和 tree ish 的具体例子有哪些 堆栈溢出问题 git 中的 tree ish 是什么意思 交易 特别是树型 但我想了解更多both 背景 文档中的用法 Git 文档多次提到 commit is
  • Microsoft Edge window.open() 不支持宽度高度,并在后台打开

    我使用的是 Windows 10 预览版 Build 10130 并且window open新 Edge 浏览器中的方法的行为不符合规范 如果您使用示例代码https msdn microsoft com en us library ms5
  • 如何设置 Filezilla Pro 来访问我的 s3 存储桶?

    我购买了支持 Amazon S3 的 Filezilla Pro 请问如何设置 Filezilla Pro 访问我的存储桶 谢谢 对上述答案的一个重要补充 我的 S3 用户名和密码是什么 用户名 访问密钥 最好是仅具有访问特定 S3 存储桶
  • iPhone SDK 与静态库链接错误

    我已经构建了自己的静态库 其中包含要在项目中重用的组件 最近需要更新一堆类 具体来说 由于某些类更改了名称 某些方法的签名也发生了更改 现在发生的情况是 该库本身可以正常编译 但是 当添加到应用程序项目时 该项目无法链接 Ld build
  • javascript - 获取函数内异步函数的返回数据

    我遇到问题 因为 chrome api 函数是异步的 我无法获取其返回值 考虑以下代码 我正在使用 AngularJS scope storageGet function param var returnData chrome storag
  • 使用 itextsharp 阅读 PDF,其中 PDF 语言为非英语

    我正在尝试阅读thisPDF 使用 C 中的 itextsharp 将此 pdf 转换为 word 文件 它还需要维护Word中的表格格式和字体 当我尝试使用英语 pdf 时 它会完美工作 但使用一些印度语言 如印地语 马拉地语 时 它不起
  • jqgrid 添加行并将数据发送到 webservice 进行插入

    我已经能够使用 jQuery Ajax 将数据从 Web 服务中提取到 jQGrid 中 现在我想将添加 编辑的数据发送回网络服务 我已经看过一些使用 PHP 和 editurl 命令的示例 这也适用于网络服务吗 就像我最初提取数据的方式一
  • 使用 Reactive Banana 进行一些基本微积分

    Setup 我正在使用 Reactive Banana 和 OpenGL 并且我有一个想要旋转的齿轮 我有以下信号 bTime Behavior t Int the time in ms from start of rendering bA