52700.fb2
display
loop
display = do
clear [ColorBuffer]
color black
line (-w2) (-h2) (-w2) h2
line (-w2) h2
w2
h2
line w2
h2
w2
(-h2)
line w2
(-h2)
(-w2) (-h2)
color red
circle 0 0 10
swapBuffers
vertex2f :: GLfloat -> GLfloat -> IO ()
vertex2f a b = vertex (Vertex3 a b 0)
-- colors
white = Color4 (0::GLfloat)
black = Color4 (0::GLfloat) 0 0 1
red
= Color4 (1::GLfloat) 0 0 1
-- primitives
line :: GLfloat -> GLfloat -> GLfloat -> GLfloat -> IO ()
Основные библиотеки | 291
line ax ay bx by = renderPrimitive Lines $ do
vertex2f ax ay
vertex2f bx by
circle :: GLfloat -> GLfloat -> GLfloat -> IO ()
circle cx cy rad =
renderPrimitive Polygon $ mapM_ (uncurry vertex2f) points
where n = 50
points = zip xs ys
xs = fmap (\x -> cx + rad * sin (2*pi*x/n)) [0 .. n]
ys = fmap (\x -> cy + rad * cos (2*pi*x/n)) [0 .. n]
Рис. 20.1: Начальное положение
Мы рисуем с помощью функции renderPrimitive. Она принимает метку элемента, который мы собира-
емся рисовать и набор вершин. Так метка Lines обозначает линии, а метка Polygon – закрашенные много-
угольники. В OpenGL нет специальной операции для рисования окружностей, поэтому нам придётся предста-
вить окружность в виде многоугольника (circle). Функция ortho устанавливает область видимости рисунка,
шесть аргументов функции обозначают пары диапазонов по каждой из трёх координат. При этом вершины
передаются не списком а в специальном do-блоке. За счёт этого мы можем изменить какие-нибудь парамет-
ры OpenGL во время рисования. Обратите внимание на то, как мы изменяем цвет примитива. Перед тем как
рисовать примитив мы устанавливаем значение цвета (color).