在 MacOS X 上的 GHCi 中工作的 Haskell 图形库

2024-03-14

是否存在满足以下要求的 Haskell 图形库或绑定到外部库:

  1. 可以使用从ghci,即我不必链接并重新启动程序。
  2. 适用于 MacOS X。(与 1 结合使用很棘手!)
  3. 可以制作简单的矢量图形(线条、多边形、简单的填充和描边)。
  4. 可以将位图图像放在屏幕上。示例:blit 17x12 .bmp 图像。

?

请包含一个最小的源代码示例或对其的引用(只是屏幕上的一个窗口,可能在里面画了一条绿线),以便我可以特别检查第 1 点和第 2 点。另外,如果这些功能请求之一更详细(例如 OpenGL + 4),请提供一份很好的参考。


PS:关于1和2,我知道enableGUI我愿意使用它。但是,大多数库都存在无法运行的问题main多次运行,因此不符合资格。


Edit:为了避免浪费您的时间,这里列出了我尝试过的软件包:

  • wx http://hackage.haskell.org/package/wx- ghci 窒息libstdc++
  • sdl http://hackage.haskell.org/package/SDL- 重新定义main成为一个宏。仅编译时。
  • GLFW http://hackage.haskell.org/package/GLFW(OpenGL) - 无法运行main两次,关于“失败,因为它无法安装鼠标事件处理程序”。

编辑:实际上,我不再确定。几个版本之后,GLFW 似乎不再在 OS X 上的 GHCi 中工作。

事实证明,GLFW+OpenGL 满足了所有四个要求!

  1. 您需要调用 ghcighci -framework Carbon.
  2. 你需要EnableGUI.hs文件,您可以获得here https://hackage.haskell.org/package/Euterpea-1.1.0/src/Euterpea/Examples/EnableGUI.hs。请注意,您无法将其直接加载到 GHCi 中,您必须首先对其进行编译。
  3. OpenGL 有一个 2D 投影模式,您可以在其中绘制直线和多边形。
  4. 位图可以作为纹理加载并放置在多边形上。

这是一个将位图放到屏幕上的小示例。位图有一些限制:它的尺寸必须是 2 的幂(这里是 256)并且它必须是.tga文件(此处"Bitmap.tga")。但由于支持透明度,所以这不是什么大问题。

你应该可以打电话main多次没有问题。关键是你不应该打电话GLFW.terminate.

import Graphics.Rendering.OpenGL as GL
import qualified Graphics.UI.GLFW as GLFW
import Graphics.Rendering.OpenGL (($=))

import Control.Monad
import EnableGUI

main = do
    enableGUI
    GLFW.initialize
    -- open window
    GLFW.openWindow (GL.Size 400 400) [GLFW.DisplayAlphaBits 8] GLFW.Window
    GLFW.windowTitle $= "Bitmap Test"

    -- enable alpha channel
    GL.blend         $= GL.Enabled
    GL.blendFunc     $= (GL.SrcAlpha, GL.OneMinusSrcAlpha)
    -- set the color to clear background
    GL.clearColor    $= GL.Color4 0.8 0.8 0.8 0

    -- set 2D orthogonal view inside windowSizeCallback because
    -- any change to the Window size should result in different
    -- OpenGL Viewport.
    GLFW.windowSizeCallback $= \ size@(GL.Size w h) ->
      do
        GL.viewport   $= (GL.Position 0 0, size)
        GL.matrixMode $= GL.Projection
        GL.loadIdentity
        GL.ortho2D 0 (realToFrac w) (realToFrac h) 0

    render <- initialize
    loop render

    GLFW.closeWindow

loop render = do
    -- draw the entire screen
    render
    -- swap buffer
    GLFW.swapBuffers
    -- check whether ESC is pressed for termination
    p <- GLFW.getKey GLFW.ESC
    unless (p == GLFW.Press) $ do
        -- sleep for 1ms to yield CPU to other applications
        GLFW.sleep 0.001
        -- only continue when the window is not closed
        windowOpenStatus <- GLFW.getParam GLFW.Opened
        unless (windowOpenStatus == False) $
            loop render

-- rendering
initialize = do
    -- load texture from file
    GL.texture GL.Texture2D $= Enabled
    [textureName] <- GL.genObjectNames 1
    GL.textureBinding GL.Texture2D $= Just textureName
    GL.textureFilter  GL.Texture2D $= ((GL.Nearest, Nothing), GL.Nearest)
    GLFW.loadTexture2D "Bitmap.tga" []

    return $ do
        GL.clear [GL.ColorBuffer]
        GL.renderPrimitive GL.Quads $ do
            GL.texCoord $ texCoord2 0 0
            GL.vertex   $ vertex3 (0) 256 0
            GL.texCoord $ texCoord2 0 1
            GL.vertex   $ vertex3 (0) (0) 0
            GL.texCoord $ texCoord2 1 1
            GL.vertex   $ vertex3 256 (0) 0
            GL.texCoord $ texCoord2 1 0
            GL.vertex   $ vertex3 256 256 0

-- type signatures to avoid ambiguity
vertex3 :: GLfloat -> GLfloat -> GLfloat -> GL.Vertex3 GLfloat
vertex3 = GL.Vertex3

texCoord2 :: GLfloat -> GLfloat -> GL.TexCoord2 GLfloat
texCoord2 = GL.TexCoord2

color3 :: GLfloat -> GLfloat -> GLfloat -> GL.Color3 GLfloat
color3 = GL.Color3

这是一个示例位图(您需要将其转换为.tga).

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

在 MacOS X 上的 GHCi 中工作的 Haskell 图形库 的相关文章

  • 适用于 C/C++ 和 Java 的 Eclipse IDE

    我正在尝试在运行 El Capitan 的 Mac 上设置 Java IDE 但是我找到的安装程序要求我为 C C 和 Java 安装单独的 IDE Eclipse Neon Eclipse 有什么选项可以让我拥有一个支持多种语言的 IDE
  • 从 Java 执行 .app 文件夹?

    有没有一种合理的方法可以直接从 Java 执行 app 目录 而不是深入查找二进制文件 我有一个带有一些首选项的应用程序 其中包括用于打开各种内容的外部程序 如果在 OSX 上用户可以只选择 app 文件夹 那就太好了 我可以查找 app
  • VS Code 即使关闭也使用 100% CPU

    即使未打开 VS Code 也会占用 100 的 CPU 使用率 我跑了ps aux grep PID命令查看详细信息但什么也看不懂 这是输出 tawhid 27099 100 0 0 1 447352160 11856 R 7 18PM
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • 如何在haskell中获取变量名称

    我来到 haskell 时有一些 c 背景知识 想知道是否有类似的 define print a printf s d n a a int a 5 print a 应该打印 a 5 这是 augustss 提到的 TH 解决方案 LANGU
  • 开发者可以在 Windows 应用程序中使用 iCloud 吗?

    开发人员可以使用 Apple 的 iCloud API 在 Mac OS X 和 iOS 上的不同版本的应用程序之间同步应用程序数据 如果开发人员拥有 Windows 版本的应用程序 该版本是否也可以使用 iCloud 将应用程序数据与 M
  • 导入 matplotlib.pyplot 时出错

    当我跑步时import matplotlib pyplot as plt 我收到以下错误消息 ImportError Traceback most recent call last
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • “pdo_mysql”已禁用,我无法启用它。我在 iMac 7.1 OSX 10.6.8 上安装了 MAMP v. 3.0.4

    pdo mysql 已禁用 我无法启用它 我在 iMac 7 1 OSX 10 6 8 上安装了 MAMP v 3 0 4 在我的 phpinfo 页面上 我可以看到唯一启用的 PDO 是 sqlite 如果我查看 php 5 5 10 扩
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 使用 MacPorts 在 Mac OS X 10.5 上安装 PostgreSQL 时出错

    我已经使用 MacPorts 在几台不同的计算机上安装了 PostgreSQL 没有问题 但是当涉及到我自己的笔记本电脑时 我无法构建它 当我执行此命令时 sudo port install postgresql83 我收到此错误 chec
  • 在 macOS 上为 MoviePy 安装 ffmpeg 失败并出现 SSL 错误

    我正在尝试编写一个 Python 程序 在 Mac OS 10 11 16 上使用 MoviePy 将 MP4 文件转换为 GIF 我用 import moviepy editor as mp 我收到一条错误消息 说我需要打电话imagei
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 将签名位图转换为签名字符串(很奇怪的一个)

    基本上我需要将位图图像转换为字符串 但这不是常见的 困境在于该字符串由两部分组成 1 积分 2 线路 我需要将图像转换为由 分隔的两个部分 我得到的一个例子是 221A 221A270A270A25032503200720071716171

随机推荐

  • 删除列表中间的项目时,React 渲染错误的数据

    我有一个嵌套字段数组设置使用react hook form here https codesandbox io s compassionate galileo nkz71 请注意 我的实际代码有点复杂 但问题在这里显示是一样的 我遇到的问题
  • 在 Node.js 中反序列化后重新将对象与其类关联

    我正在为一些特定于应用程序的对象编写一个简单的序列化 反序列化框架 考虑以下 use strict function Dog name this name name Dog prototype constructor Dog Dog pro
  • 为什么用 MSVC 构建的 Python DLL 不能用 mod_wsgi 加载?

    我最近从 Python 2 5 更新到 2 7 在麻烦期间尝试了 2 6 虽然从命令行或 Django runserver 中一切正常 但 mod wsgi 无法加载任何包含使用 MSVC 构建的 DLL pyd 的模块 例如 如果我构建自
  • 删除指定目录中所有大小为零的文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 提前致谢 我想删除指定目录中的所有零大小文件 你能告诉我如何在 Ubuntu 操作系统上执行此操作的命令吗 谢谢 穆克蒂亚尔 find size 0c
  • for循环中断内的Javascript切换;冲突

    我在 JavaScript 中使用循环嵌套了 switch 如下所示 for var i 0 i lt checkBoxIds length i if checkBoxIds i prop checked var id checkBoxId
  • 使用knitr和latex在Beamer中代码块字体大小

    我正在尝试获取一些 R 代码以适合我的投影仪幻灯片 似乎无法通过更改字体大小size代码块的参数 就像您对其他knitr类型文档所做的那样 唯一的方法似乎是与 footnotesize在每个代码块之前 这让人沮丧 因为我有很多代码块 在很多
  • 请求的资源 () 不可用。 (下载 JSF 2.0 项目后运行 Tomcat 7.0 时)

    我在 eclipse 3 6 中创建了一个新的动态 Web 项目 我添加了 Tomcat 7 0 服务器并在 jsf 文件上选择 在服务器上运行 工作正常 我将其添加到 SVN 存储库以与其他人共享 我关闭 Eclipse 我创建了一个新的
  • 如何使用 blas 以最佳方式转置矩阵?

    我正在做一些计算 并对不同 BLAS 实现的优势和弱点进行一些分析 但是我遇到了一个问题 我正在测试 cuBlas 在 GPU 上执行 linAlg 似乎是一个好主意 但有一个问题 cuBlas 实现使用列主格式 并且由于这不是我最终需要的
  • 推入数组后变量值发生变化[重复]

    这个问题在这里已经有答案了 所以我正在测试这段代码 我在网络控制台中得到以下输出 value 0 Array Object value 1 Array Object Object 数组中的所有对象都具有完全相同的值 name value 1
  • UdpClient 在广播地址上接收

    在 c 中 我使用 UdpClient Receive 函数 public void StartUdpListener Object state try udpServer new UdpClient new IPEndPoint IPAd
  • 在启动时运行 R 脚本

    首先 这可能需要移至超级用户 我无法决定哪个场地更好 我正在尝试编写一个将在启动 重新启动时运行的 R 脚本 并将该计算机添加到池中doRedis http cran r project org web packages doRedis i
  • 角度指令 - 文件读取器在文件加载时未触发

    我正在尝试读取 angularjs 中上传的图像文件的数据 但正如预期的那样 文件读取器onload功能不起作用 任何人都可以帮助我解决此问题并读取图像文件以获取其数据 这是我的代码 app directive uploadImageFil
  • boost::计算流压缩

    如何使用 boost compute 进行流压缩 例如 如果您只想对数组中的某些元素执行繁重的操作 首先 生成掩码数组 其中包含与要执行操作的元素相对应的元素 mask 0 0 0 1 1 0 1 0 1 然后对掩码数组进行排它扫描 前缀和
  • Unity 从脚本创建 UI 控件

    我通过代码创建了一个切换 但它不会显示 此外 我无法更改文本字段的位置 我尝试了很多 但没有任何效果 这是我当前的版本 也许你看到了错误 我是 Unity 的新手 这非常困难 public class Game MonoBehaviour
  • Posix 线程问题

    我试图通过示例来理解 pthreads 我编写了以下代码 每次运行时都会给出不同的答案 有人可以解释一下这个错误吗 TIA 斯维亚 代码在这里 include
  • 如何从现有的 Azure 服务主体获取客户端密钥

    我已经创建了启用 RBAC 的服务主体 https learn microsoft com en us cli azure ad sp view azure cli latest在 Azure 中使用环境变量在我的操作系统中配置 Key V
  • 当我单击可扩展子元素时,如何获取 EditBox 和 RadioButton 的每个值?

    我有一个可扩展的 ListView 其中每个父视图都有一个子视图 在子视图中 我有一个子子元素 EditText TextView 和 RadioButton 子元素在单选按钮上单击时具有不同的值 并且在输入后编辑文本值 类别活动 java
  • ACCESS/SQL:如何同时插入/更新?

    这是我的情况 首先 我不是在关系数据库上工作 我只是使用访问作为操作数据的简单方法 目前 我有很多桌子 一个主表 我们称之为 MAIN 还有大约 10 个其他表 我们可以称之为 X1 X2 X3 等 X1 表包含具有 X1 属性的项目 X2
  • 在.NET v4.0中解析MP3文件

    如何解析 MP3 文件以获取其所有属性 另外如何编辑MP3文件的属性 NET v4 0 中有可用的类吗 这些属性称为 ID3 标签 我认为 NET 框架不负责提供对它们的阅读 这是来自 SourceForge 的一些代码 http sour
  • 在 MacOS X 上的 GHCi 中工作的 Haskell 图形库

    是否存在满足以下要求的 Haskell 图形库或绑定到外部库 可以使用从ghci 即我不必链接并重新启动程序 适用于 MacOS X 与 1 结合使用很棘手 可以制作简单的矢量图形 线条 多边形 简单的填充和描边 可以将位图图像放在屏幕上