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

Разработка скриптов на lua. Создание виджетов, диалогов и т.д.
Ответить
Аватара пользователя
olgmen
Сообщения: 155
Зарегистрирован: 30 ноя 2012, 11:00
Темы: 32
Откуда: Санкт-Петербург
Статус: Не в сети

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

Сообщение olgmen » 15 янв 2014, 17:57

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

cr:rectangle(x, y, width, height)

Здесь:
x, y - координаты верхнего левого угла прямоугольника
width - ширина
height - высота

Например

x = 20
y = 20
width = 200
height = 150
line_width = 5

cr:set_source_rgb(0,0,0)
cr:set_line_width(line_width)
cr:rectangle(x, y, width, height)
cr:stroke()

Изображение

Второй способ, это вводить каждую сторону рисуя замкнутую ломаную линию

x = 20
y = 20
width = 200
height = 150
line_width = 5

cr:set_source_rgb(0,0,0)
cr:set_line_width(line_width)
cr:move_to(x, y)
cr:line_to(x+width, y)
cr:line_to(x+width, y+height)
cr:line_to(x, y+height)
cr:line_to(x, y)
cr:stroke()


Изображение

Как видно на рисунке, левый верхний угол не завершён. Это произошло из за того, что толщина линии увеличивается равномерно от центра линии. Для исправления необходимо добавить высоту левой вертикальной линии на половину толщины линии.

x = 20
y = 20
width = 200
height = 150
line_width = 5

cr:set_source_rgb(0,0,0)
cr:set_line_width(line_width)
cr:move_to(x, y)
cr:line_to(x+width, y)
cr:line_to(x+width, y+height)
cr:line_to(x, y+height)
cr:line_to(x, y-line_width/2)
cr:stroke()

Изображение

Здесь мы отнимаем половину толщины линии потому, что длина и ширина прямоугольника исчисляется влево и вниз от начала координат.

Закругляем углы. Для этого можно конечно воспользоваться командами

cr:set_line_join(1)
cr:set_line_join(2)


Изображение

Но тогда начальный угол не изменится, поэтому пойдем по другому пути. Используем команду вывода окружности, для этого введем переменную radius

x = 20
y = 20
width = 200
height = 150
line_width = 5

radius = 20

cr:set_source_rgb(0,0,0)
cr:set_line_width(line_width)
cr:move_to(x+radius, y)
cr:line_to(x+width-radius, y)
cr:arc(x+width-radius, y+radius, radius, 270*(math.pi/180), 0)
cr:line_to(x+width, y+height-radius)
cr:arc(x+width-radius, y+height-radius, radius, 0, 90*(math.pi/180))
cr:line_to(x+radius, y+height)
cr:arc(x+radius, y+height-radius, radius, 90*(math.pi/180), math.pi)
cr:line_to(x, y+radius)
cr:arc(x+radius, y+radius, radius, math.pi, 270*(math.pi/180))
cr:stroke()

Изображение

Ну и возможно последний способ рисования прямоугольников с помощью команды вывода кривых

x0 = 20
y0 = 20
width = 200
height = 200
radius = 100

x1 = x0 + width
y1 = y0 + height

cr:move_to(x0, y0+radius)
cr:curve_to(x0, y0, x0, y0, (x0-x1)/2, y0)
cr:curve_to(x1, y0, x1, y0, x1, y0+radius)
cr:line_to(x1, y1-radius)
cr:curve_to(x1, y1, x1, y1, (x1+x0)/2, y1)
cr:curve_to(x0, y1, x0, y1, x0, y1-radius)
cr:stroke()

Изображение
Кто ищет, тот всегда найдет

Arch Linux
Conky - 1.9

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей