пятница, 4 марта 2011 г.

Рисуем простые фигуры

Рисование прямоугольников и кругов.

Рисовать прямоугольники можно двумя способами.

Первый способ, наиболее простой, с помощью команды

cairo_rectangle (cr, координата_x, координата_y, ширина, высота)

Нарисуем красную рамку шириной 250 пикселей и высотой 200 пикселей

cairo_set_source_rgba (cr, 1, 0.2, 0.2, 1)
cairo_set_line_width (cr, 3)
cairo_rectangle (cr, 30, 30, 250, 200)
cairo_stroke (cr)

Если необходимо закрасить прямоугольник, то добавляем команду

cairo_fill (cr)
Например рисуем желтый квадрат с синей рамкой

Сначала выводим желтый квадрат
cairo_set_source_rgba (cr, 1, 1, 0.3, 0.7)
cairo_rectangle (cr, 30, 30, 200, 200)
cairo_fill (cr)

 и накладываем на него рамку
cairo_set_line_width (cr, 6)
cairo_rectangle (cr, 30, 30, 200, 200)
cairo_set_source_rgba (cr, 0.3, 0.5, 1, 1)
cairo_stroke (cr)


Второй способ заключается в вводе всех угловых точек. При этом конец первой линии является начальной точкой следующей линии и т.д. Таким способом можно нарисовать любой рисунок состоящий из прямых линий.

Нарисуем синий квадрат со стороной в 200 пикселей.

cairo_move_to (cr, 30, 30)
cairo_line_to (cr, 230, 30)
cairo_line_to (cr, 230, 230)
cairo_line_to (cr, 30, 230)

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

cairo_line_to (cr, 30, 30)



-- или вводом команды

cairo_close_path (cr)

cairo_set_line_width (cr, 10)
cairo_set_source_rgba (cr, 0.3, 0.5, 1, 1)
cairo_stroke (cr)


Теперь перейдем к рисованию окружностей, кругов и дуг. Всё это производится с помощью двух команд, одна рисует окружность по часовой стрелке, вторая - против часовой стрелки. Центр окружности задаётся координатами "x" и "y". Хоть и говорят, что у кольца нет начала и конца, но при рисовании с помощью CAIRO они есть. Начало окружности или дуги, по умолчанию, находится справа по горизонтали от заданной точки на расстоянии радиуса. Все углы, при рисовании и всех вычислениях в LUA и CAIRO, задаются в радианах. Это конечно неудобно. Для перевода градусов в радианы необходимо значение в градусах умножить на переводной коэффициент

2*math.pi/360  или после сокращения math.pi/180

Рисование окружности по часовой стрелке производится командой

cairo_arc (cr, координата x, координата y, радиус, начальный угол, конечный угол)

Например

x = 100
y = 150
radius = 75
start_angle = 0   
finish_angle = 360

cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6)
cairo_set_line_width (cr, 6.0)
cairo_arc (cr, x, y, radius, start_angle, finish_angle * math.pi/180)
cairo_stroke (cr)


Рисование окружности против часовой стрелке производится с помощью команды

cairo_arc_negative (cr, x, y, radius, start_angle, finish_angle)

Окрасить круг можно так же как и квадрат командой

cairo_fill (cr)

Так как дуга является частью окружности, то и рисование её производится этими же командами.

Например нарисуем две дуги, но одна дуга, красная, будет выведена по часовой стрелке, а вторая, синяя - против. Остальные данные одинаковые.

x = 100
y = 150
radius = 75
start_angle = 0  
finish_angle = 90

cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6)
cairo_set_line_width (cr, 6.0)
cairo_arc (cr, x, y, radius, start_angle, finish_angle * math.pi/180)
cairo_stroke (cr)

cairo_arc_negative (cr, x, y, radius, start_angle, finish_angle * math.pi/180)
cairo_set_source_rgba (cr, 0.2, 0.2, 1, 0.6)
cairo_stroke (cr)



Здесь имеется одно правило, соблюдение которого обязательно. Начальный угол должен обязательно быть меньше конечного угла. Но бывают случаи когда необходимо провести дугу например от 240 градусов через 360 градусов до 120 градусов. Это можно сделать двумя способами.

Первый способ, прибавить конечный угол к 360 градусам

starn_angle = 240
finish_angle = 480    -- ( 360 + 120 )

Второй способ - присвоить начальному углу отрицательное значение

start_angle = -120
finish_angle = 120

О других приёмах рисования я расскажу позже, в следующем сообщении я попробую описать окраску объектов рисования.

2 комментария:

  1. Вы похоже о коньках всё знаете.
    У меня такая проблема... его почему-то нет в репозитории.
    Не может найти пакет.
    Может подскажете отдельный конки репозиторий?

    ОтветитьУдалить
  2. Скорее всего в "Источниках приложений" у вас не подключены дополнительные репозитарии. CONKY не поддерживается компанией Canonical. Подключите "Программы, ограниченные патентами и законами" и спокойно загружайте Conky. О Conky всё знает только его автор Cesare Tirabassi

    ОтветитьУдалить