Показать сообщение отдельно
Старый 28.11.2011, 09:25   #1
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,853 пользователей)
Скруглённые уголки на BlitzMax

Здравствуйте, дорогие друзья. На днях (а именно сегодня) мне понадобилась функция, рисующая прямоугольник с закруглёнными углами, которые я так люблю использовать в веб проектах. В последнее время вообще скругление уголков это стильно и молодёжно.
Современные тенденции не приемлют прямых углов! "DrawRect уже не торт!" - плачут блицеры.
Я решил не делать как хрены профессионалы из Blitz Community и не стал наследовать класс от TMax2DGraphics ради единственной функции. Я просто написал свою глобальную функцию.

Фич лист:
Управление отображением через SetColor, SetAlpha

Минусы:
Игнорирует установленные ранее режимы отрисовки: SetOrigin, SetViewport, SetRotation*, SetScale*
Насчёт последних двух - спорный вопрос о необходимости.

И собственно код функции:
Function DrawRoundedRect(x:Float, y:Float, width:Float, height:Float, radius:Float = 10)
	Local diametr:Float = (radius + radius)
	Local oldScale:Float[2] ' 0..1 x,y
	Local oldAngle:Float
	Local oldViewport:Int[4] ' 0..3 x,y,width,height
	
	'--- Store old settings
	oldAngle:Float = GetRotation()
	GetScale(oldScale[0], oldScale[1])
	GetViewport(oldViewport[0], oldViewport[1], oldViewport[2], oldViewport[3])
	
	SetRotation(0) ' no rotation
	SetScale(1, 1) ' no scale
	
	'--- Draw corners:
	' left top
	SetViewport(x, y, radius, radius)
	DrawOval(x, y, diametr, diametr)
	' right top
	SetViewport(x + width - radius, y, radius, radius)
	DrawOval(x + width - diametr, y, diametr, diametr)
	' right bottom
	SetViewport(x + width - radius, y + height - radius, radius, radius)
	DrawOval(x + width - diametr, y + height - diametr, diametr, diametr)
	' left bottom
	SetViewport(x, y + height - radius, radius, radius)
	DrawOval(x, y + height - diametr, diametr, diametr)
	
	'--- Restore viewport
	SetViewport(oldViewport[0], oldViewport[1], oldViewport[2], oldViewport[3])
	
	'--- Draw rects	
	DrawRect(x + radius, y, width - diametr, radius)' top
	DrawRect(x + width - radius, y + radius, radius, height - diametr)' right
	DrawRect(x + radius, y + height - radius, width - diametr, radius)' bottom
	DrawRect(x, y + radius, radius, height - diametr)' left
	DrawRect(x + radius, y + radius, width - diametr, height - diametr)' middle
	
	'--- Restore Scale, Rotation
	SetScale(oldScale[0], oldScale[1])
	SetRotation(oldAngle)
EndFunction
Немного комментариев помогут разобраться.


Надеюсь кому-либо пригодится
Семпл и скрины:
Миниатюры
Нажмите на изображение для увеличения
Название: screenshot - копия.png
Просмотров: 970
Размер:	2.9 Кб
ID:	15598  Нажмите на изображение для увеличения
Название: screenshot.png
Просмотров: 939
Размер:	3.3 Кб
ID:	15599  
Вложения
Тип файла: 7z [BMX]_RoundedRect.7z (134.9 Кб, 680 просмотров)
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 7 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
Android (06.12.2011), baton4ik (28.11.2011), Dzirt (28.11.2011), Greymem (28.11.2011), Harter (28.11.2011), Reks888 (28.11.2011), St_AnGer (28.11.2011)