понедельник, 25 апреля 2011 г.

Рисуем циферблат

На небольших примерах хочу показать как можно вывести изображения часовых и минутных делений, а также цифр на циферблат часов.

В предыдущем сообщении я рассказал как можно вывести простые часы с помощью lua+cairo. Для рисования циферблата буду использовать выложенный ранее скрипт.

Для добавления часовых делений добавим следующие строки

-- добавляем часовые деления
-- сбрасываем счетчик делений на 0
    local i = 0
-- задаем расстояние между делениями
    local winkel = math.rad(30)
-- выводим 12 делений
    for i= 0, 11, 1 do
-- расчет начальных точек для часовых делений
        cairo_move_to(cr, t.x - math.sin(winkel * i) * t.radius, t.y - math.cos(winkel * i) * t.radius)
-- длину делений берем равной 0.15 от длины радиуса
        cairo_line_to(cr, t.x - math.sin(winkel * i) * (t.radius * 0.85), t.y - math.cos(winkel * i) * (t.radius*0.85))
-- выводим изображение
    cairo_stroke (cr)
    end


Получаем такое изображение


Теперь добавим минутные деления. Кроме длины делений и их количества, вывод минутных делений ничем не отличается от вывода часовых делений.

-- добавляем минутные деления
-- сбрасываем счетчик делений на 0
    local i = 0
-- задаем расстояние между делениями
    local winkel = math.rad(6)
-- выводим 12 делений
    for i=0, 59, 1 do
        cairo_move_to(cr, t.x - math.sin(winkel * i) * t.radius, t.y - math.cos(winkel * i) * t.radius)

-- длину делений берем равной 0.1 от длины радиуса
        cairo_line_to(cr, t.x - math.sin(winkel * i) * (t.radius * 0.9), t.y - math.cos(winkel * i) * (t.radius*0.9))
    end

-- выводим изображение
    cairo_stroke (cr)
 Получаем такое изображение


 Теперь добавим цифры

-- добавляем цифры
-- запоминаем данные
    cairo_save (cr)
-- переносим значения координат
    cairo_translate(cr, t.x, t.y)
-- сбрасываем координаты цифр
    mx, my = 0, 0
-- сбрасываем счетчик делений на 0
    local i = 0
-- задаем расстояние между цифрами
    local winkel = math.rad(30)
-- необходимо вывести цифра начиная с 1 и заканчивая 12
    for i = 1, 12, 1 do
-- расчитываем координаты цифр
    mov_x = math.sin(winkel*i)*(t.radius*0.73)
    mov_y = math.cos(winkel*i)*(t.radius*0.73)

-- расчитываем ширину и высоту цифр
    te=cairo_text_extents_t:create()
    cairo_text_extents (cr, i, te)

-- вносим поправку на половину ширины и половину высоты цифр
    mx = -te.width/2
    my = -te.height/2-te.y_bearing

-- задаем координаты цифр
    cairo_move_to(cr, mx + mov_x, my - mov_y)
-- выводим цифры
    cairo_show_text(cr, i)
    end

-- восстанавливаем данные
    cairo_restore (cr)

 Окончательное изображение часов


Все приведенные примеры необходимо добавлять до вывода стрелок
Готовый скрипт с показанными изменениями можно взять здесь

Комментариев нет:

Отправить комментарий