gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:30:33 25 4
gpt4 key购买 nike

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

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

  • ?

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

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

    编辑:为避免浪费您的时间,这里列出了我尝试过的软件包:
  • wx - ghci 阻塞 libstdc++
  • sdl - 重新定义 main成为一个宏。仅编译时。
  • GLFW (OpenGL) - 无法运行 main两次,关于“失败,因为它无法安装鼠标事件处理程序”。
  • 最佳答案

    编辑:实际上,我不再确定。几个版本之后,GLFW 似乎不再适用于 OS X 上的 GHCi。

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

  • 您需要使用 ghci -framework Carbon 调用 ghci .
  • 您需要 EnableGUI.hs文件,你可以得到here .请注意,您不能将其直接加载到 GHCi 中,您必须首先对其进行编译。
  • OpenGL 具有 2D 投影模式,您可以在其中绘制线条和多边形。
  • 位图可以作为纹理加载并放在多边形上。

  • 这是一个将位图放到屏幕上的小例子。位图有一些限制:它的尺寸必须是 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 )。

    Sample bitmap

    关于macos - 在 MacOS X 上的 GHCi 中工作的 Haskell 图形库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5868916/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com