Haskell的图像绘制库?

时间:2010-04-26 03:32:21

标签: image graphics haskell

我正在制作一个用于播放空间游戏的Haskell程序:我有一组“个人”玩囚徒困境的图表,但只有他们的近邻,并且复制了做得最好的人的策略。

我已经达到了一个我需要画出世界形象的地方,这就是我遇到问题的地方。两种可能的几何形状很容易:如果人们每个都有四个或八个邻居,那么我将每个几何表示为一个填充的正方形(颜色对应于策略)并用这些对齐平面。但是,我也有一种情况,人们有六个邻居(六边形)或三个邻居(三角形)。

我的问题是:什么是用于创建图像和在其上绘制形状的好Haskell库?我更喜欢它创建PNG,但我并不是非常挑剔。我最初使用Graphics.GD,但它只导出绑定到绘制点,线,弧,椭圆和非旋转矩形的函数,这对我的目的来说是不够的(除非我想逐像素地绘制六边形) *)。我研究了使用foreign import,但它证明有点麻烦(部分原因是多边形绘制函数需要一个gdPoint结构数组),并且考虑到我的要求可能会增长,这将是很好的使用in-Haskell解决方案而不必使用FFI(尽管如果推动推动,我愿意这样做)。有什么建议吗?

* 也是一个选项,实际上;关于如何做到这一点的任何提示也会受到赞赏,尽管我认为图书馆会更容易。

编辑:非常感谢您的建议。不幸的是,我无法获得所有gtk2hs所需的库来构建,这排除了很多解决方案。出于各种原因,在我尝试了所有答案之后,未能安装一些库并发现其他人无法做到我想要的,我最终决定只为libgd导出更多的FFI并使用它。 / p>

5 个答案:

答案 0 :(得分:11)

图表看起来很酷,但是如果你想避免提交并保持超轻量级,你可以直接生成svg。在http://www.lisperati.com/haskell/

从Conrad Barski偷窃
type Point     = (Float,Float)
type Color     = (Int,Int,Int)
type Polygon   = [Point]

writePoint :: Point -> String 
writePoint (x,y) = (show x)++","++(show y)++" "

writePolygon :: (Color,Polygon) -> String 
writePolygon ((r,g,b),p) = "<polygon points=\""++(concatMap writePoint p)++"\" style=\"fill:#cccccc;stroke:rgb("++(show r)++","++(show g)++","++(show b)++");stroke-width:2\"/>"

writePolygons :: [(Color,Polygon)] -> String 
writePolygons p = "<svg xmlns=\"http://www.w3.org/2000/svg\">"++(concatMap writePolygon p)++"</svg>"

colorize :: Color -> [Polygon] -> [(Color,Polygon)] 
colorize = zip.repeat

rainbow@[red,green,blue,yellow,purple,teal] = map colorize [(255,0,0),(0,255,0),(0,0,255),(255,255,0),(255,0,255),(0,255,255)]

t0 = writeFile "tut0.svg" $ writePolygons (blue [[(100,100),(200,100),(200,200),(100,200)],[(200,200),(300,200),(300,300),(200,300)]])

hexagon c r = translateTo c basicHexagon where
  basicHexagon =  top ++ (negate r, 0):bottom 
  top          =  [(r,0),(r * cos 1,(r * sin 1)),(negate (r * cos 1), r * (sin 1))]
  bottom       =  map (\(x,y)->(x,negate y)) (reverse top)

translateTo (x,y) poly = map f poly where f (a,b)= ((a+x),(b+y))

t1 = writeFile "t1.svg" $ writePolygons (blue [hexagon (100,100) 50] )

hexField r n m = let 
     mkHex n = hexagon (1.5*n*(r*2),(r*2)) r
     row n = map mkHex [1..n]
     aRow = row n
  in concat [map (offset (r*x)) aRow |x<-[1..m]]

offset r polys = map (oh r) polys where
  oh r pt@(x,y) = (x+(1.5*r),y+(r*sin 1))

t2 = writeFile "t2.svg" $ writePolygons (blue $ hexField 50 4 5 )

运行t2并将文件加载到Firefox或其他支持svg。

的程序中

t2.svg ,exported png http://img30.imageshack.us/img30/2245/93715707.png

答案 1 :(得分:6)

  

之前我曾经使用过HOpenGL,但是   问题是(据我所知)   它不能渲染到文件,只能渲染   屏幕;同样的(再次,...   我可以告诉)SDL似乎也是如此   和Wx。我会看看开罗,   虽然。

出于某种原因,我无法回复此帖,所以我必须引用它。你对GL和SDL不正确,你可以制作一个离屏表面/缓冲区或渲染到纹理。这些库不需要这样的功能(也没有多大意义),因为你可以通过访问缓冲区中的像素并自己编写它来自己轻松地完成它,即使屏幕缓冲区可以访问像素数据。

就在前几天,我向某人展示了如何使用Haskell SDL绑定:

http://hpaste.org/fastcgi/hpaste.fcgi/view?id=25047

使用可以写出.PNG文件的库,他们很可能会使用指向像素缓冲区的原始指针,您可以从SDL / GL获取或将其复制到库所需的格式。

我刚找到一个可以输出.PNG文件的Haskell binding for the library DevIL。查看名为writeImageFromPtr

的函数

答案 2 :(得分:5)

如果你想生成PNG,

Cairo是一个不错的选择。虽然我从未使用它,但Wumpus看起来也很有希望。如果您只是需要在屏幕上看到它,graphics-drawingcombinators是一个简单的OpenGL界面,它可以在几行中完成您所需的操作(请参阅发行版中的example.hs)。

答案 3 :(得分:3)

答案 4 :(得分:2)

  

用于创建图像和在其上绘制形状的Haskell库是什么?

你有很多选择,在我看来,以下都是used for games

这些是最常见的,您可能只是根据功能/熟悉程度进行选择。