gpt4 book ai didi

Haskell 的图像绘图库?

转载 作者:行者123 更新时间:2023-12-03 11:26:16 28 4
gpt4 key购买 nike

我正在开发一个用于玩空间游戏的 Haskell 程序:我有一张图表,显示一群“个人”在玩囚徒困境,但仅限于他们的近邻,并复制最擅长的人的策略。

我已经到了需要绘制世界图像的地步,这就是我遇到问题的地方。两种可能的几何形状很简单:如果每个人有四个或八个邻居,那么我将每个人都表示为一个实心正方形(颜色对应于策略)并用这些平铺平面。但是,我也有一个人有六个邻居(六边形)或三个邻居(三角形)的情况。

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

* 实际上,这也是一种选择;任何有关如何做到这一点的提示也将不胜感激,尽管我认为图书馆会更容易。

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

最佳答案

Diagrams 看起来很酷,但如果你想避免提交并保持超轻量级,你可以直接生成 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

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

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