gpt4 book ai didi

graphics - Haskell 像素绘图库 Linux

转载 作者:行者123 更新时间:2023-12-02 19:11:38 33 4
gpt4 key购买 nike

我希望在窗口或其他东西的屏幕上绘制单个像素,以便在 haskell 中实时显示。

我刚刚开始使用 haskell(但不是函数式编程,也不是图形),所以我尝试用它创建一些基本的图形东西。

我尝试使用 SDL,但以下代码给我一个空白屏幕:

import Prelude
import Graphics.UI.SDL as SDL

createColor screen r g b = SDL.mapRGB (SDL.surfaceGetPixelFormat screen) r g b

drawGrad screen = SDL.setColors screen [SDL.Color x y 255 | x <- [0..255], y <- [0..255]] 800

main = do
SDL.init [InitEverything]
setVideoMode 256 256 32 []
screen <- getVideoSurface
drawGrad screen
SDL.flip screen
quitHandler

quitHandler :: IO ()
quitHandler = do
e <- waitEvent
case e of
Quit -> return ()
otherwise -> quitHandler

最佳答案

在我看来,你实际上并没有在那里任何东西。您确定 setColors 能实现您认为的功能吗?如果我没记错的话,它是为 8 位表面设置调色板,而您是明确设置 32 位视频模式。

顺便说一句,如果您之前做过图形编程,我相信您知道其中的区别,但为了其他人阅读本文的利益:8 位视频模式将像素颜色存储为从更大的一组潜在颜色中选择的 256 种颜色表的 8 位索引;在更高的颜色深度中,调色板表被省略,每个像素颜色直接存储为打包的 RGB 三元组,通常每个 8 位(32 位像素也有一个 8 位 alpha channel ,或者只有 8 位填充以获得更好的内存对齐,我不记得了)。

无论哪种方式,如果我正确地猜测您正在尝试做什么,请尝试将其添加到您的程序中:

import Ix

-- Given coordinates, create a 1x1 rectangle containing that pixel
getPix x y = SDL.Rect (fromIntegral x) (fromIntegral y) 1 1

-- Draw a pixel on a surface with color determined by position
drawPixel surf (x, y) = do
let pixRect = Just (getPix x y)
pixColor <- createColor surf x y 255
SDL.fillRect surf pixRect pixColor

-- Apply drawPixel to each coordinate on the screen
drawGrad screen = mapM_ (drawPixel screen) $ range ((0,0),(255,255))

警告:这几乎肯定是可怕且低效的代码,并且仅在 Win32 环境中进行了测试。我不是一名合格的 Haskell 程序员,我的建议不应被视为正确使用该语言的指示。仅限于外用。不要 mock Happy Fun IO Monad。

无论哪种方式,我认为你的问题在于使用 SDL,而不是 Haskell。 Graphics.UI.SDL 非常原始,只不过是将 C API 包装在适当的 Haskell 类型中。如果您以前没有使用过 SDL,或者仅将其用于稍微复杂的绑定(bind)(例如 PyGame),您可能需要考虑寻找 C 语言的 SDL 示例作为引用 Material 。

关于graphics - Haskell 像素绘图库 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1857075/

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