【发布时间】:2021-04-06 03:19:47
【问题描述】:
我刚刚开始使用 haskell 光泽。我对它的功能有所了解。我正在尝试在 haskell 中绘制棋盘。主要问题是一切都被绘制在中心。如果我使用translate 函数,则该板将在随机位置绘制。这可能是因为 translate 从当前位置给定的距离移动,而不是给定的确切点。
gloss haskell 中有没有一种方法可以移动到特定点,例如 setTransform 或 translateTo。或者是否有任何函数可以告诉我们当前所在点的坐标。
module Main where
import Graphics.Gloss
import Lib (someFunc)
blockSize :: Float
blockSize = 50
board :: [[Int]]
board = replicate 8 (replicate 8 0)
drawTile :: Float -> Float -> Color -> Picture
drawTile a b col = translate a b $ color col $ rectangleSolid blockSize blockSize
-- drawRow :: Int -> Pictur
-- drawRow =
toInt :: Float -> Integer
toInt = round
getColor :: Float -> Float -> Color
getColor i j = if even $ toInt ((i * 8) + j) then red else blue
screenHeight = 700
screenWidth = 1000
drawing :: Picture
drawing = pictures [drawTile (row * blockSize) (e * blockSize) (getColor row e) | row <- [0 .. 8], e <- [0 .. 8]]
-- moveToStart = viewPortTranslate
main :: IO ()
main = display (InWindow (show board) (screenWidth, screenHeight) (10, 10)) white (translate 0 0 drawing)
编辑:我不想通过使用一些数学技巧来解决这个特定问题。我想知道的是我怎样才能翻译到一个特定的位置。就像我做someFunc 0 0时一样,位置应该转到右上角0 0。
如果不可能,请告诉获取当前变换点的方法。
【问题讨论】:
-
请分享您的尝试。
-
@WillemVanOnsem 我发布了我的代码。请检查一下。
-
我无法重现:如果我用
even $ toInt (i + j)替换getColor,我会得到 imgur.com/a/vuqYe8d -
@WillemVanOnsem 我猜你无法理解我的问题。板的顺序不是问题。问题是它在中心绘制。虽然我希望它从左上角开始。
-
那么您也应该查看窗口大小,因此
translate (fromIntegral screenWidth/2-8.5*blockSize) (fromIntegral screenHeight/2-8.5*blockSize) $ pictures ...(这是针对 9x9 板,因为您使用了[0 .. 8],或者您可以将translate (fromIntegral screenWidth/2-7.5*blockSize) (fromIntegral screenHeight/2-7.5*blockSize) $ pictures用于 8x8 板。