Скруглённые уголки на BlitzMax
Вложений: 3
Здравствуйте, дорогие друзья. На днях (а именно сегодня) мне понадобилась функция, рисующая прямоугольник с закруглёнными углами, которые я так люблю использовать в веб проектах. В последнее время вообще скругление уголков это стильно и молодёжно.
Современные тенденции не приемлют прямых углов! "DrawRect уже не торт!" - плачут блицеры.Я решил не делать как Фич лист: Управление отображением через SetColor, SetAlpha Минусы: Игнорирует установленные ранее режимы отрисовки: SetOrigin, SetViewport, SetRotation*, SetScale* Насчёт последних двух - спорный вопрос о необходимости. И собственно код функции: Код:
Function DrawRoundedRect(x:Float, y:Float, width:Float, height:Float, radius:Float = 10) Надеюсь кому-либо пригодится :) Семпл и скрины: |
Ответ: Скруглённые уголки на BlitzMax
|
Ответ: Скруглённые уголки на BlitzMax
Вопрос как твоё детище проглотит SetAlpha
Скорее всего будут видны не очень приятные куски овалов и прямоугольников. Я бы использовал, если бы не этот неприятный момент. Пардон, не увидел SetViewPort Я использую: Код:
Function DrawRoundRect(x:Int, y:Int, width:Int, height:Int, radius:Int = 10) |
Ответ: Скруглённые уголки на BlitzMax
Обычно используют элементы с текстурами, по сути те же углы - это квады, с текстурой на них (с маской или альфой).
Лучше использовать как раз квады, объединённые в один (3*3 квада), где лишь центральные и боковые будут скейлиться, а угловые нет. И натянуть текстуры из атласса как полагается. Так будет более производительно, и главное красивее. На основе этого можно уже дальше разрабатывать разные элементы и стили для них, меняя текстуру. Или хотя бы использовать текстуру в виде маски, а используя SetColor уже задавать сам цвет. |
Ответ: Скруглённые уголки на BlitzMax
Цитата:
|
Ответ: Скруглённые уголки на BlitzMax
Накатал ровно за 7 минут )
Много с чем еще не дружит,но с Cls уже подружил: Код:
Strict |
Ответ: Скруглённые уголки на BlitzMax
Нубско
Вот мое решение... ЗЫ Насчет констант не парьтесь, они для другой функции, и последний аргумент функции ни к чему не обязывает ))) ЗЗЫ Float2 - это вектор Код:
Const ROUND_LEFT_UP:Int = 1 |
Ответ: Скруглённые уголки на BlitzMax
Отличный пример который не работает. Браво, Diablo1909!
Хотя без злорадства скажу, что через DrawPoly решение действительно интересное, только вот быстрее ли выходит чем примитивами? И да: DrawRectRound - такое название ни куда не годится. "ОтрисоватьПрямогульникКруг" - не звучит и смыслом не блещет. |
Ответ: Скруглённые уголки на BlitzMax
2Randomize
Прежде чем, делать свои заключения - ты сначала в код вникни, а потом только высказывай свое фи. 1) Он и не будет работать, я же по русски написал что нужен тип вектора Float2, который содержит x и y - компоненты. Нормальный кодер опишет этот вектор без особых затруднений. 2) Насчет быстродействия, если тебе интересно - то проверь. В твоей функции происходит 8 (восемь!) вызовов функции DrawOval(), а затем погляди на исходник этой функции... сразу скажу моя функция минимум раз в 4-6 будет работать быстрее. 3) Насчет названия - это уже дело вкуса. Но позволю защитить свое название... название функции - полностью соответсвует мышлению программиста. DrawRectRound() [Draw] - отрисовать, [Rect] - Прямоугольник, [Round] - скругленный. Другими словами я название функции делю на 3 части : [Операция][Основное название функции][Модификатор функции] Кто со мной не согласен - те пусть пишут всякие басни в названиях функций. Не могу отказаться от соблазна покритиковать вышеописанный код : 1) GetClsColor() - заЧем ? 2) Любые операции с вьюпортами нежелательны, ибо не на всех видяхах работает. 3) Золотое правило : в любых функциях отрисовки чего-либо никогда нельзя менять аттрибуты отрисовки. Вы поглядите на официальные функции - там из атрибутов ничего не трогается. А если уж нужда заставляет менять то при завершении работы функции их всегда надо возвращать в исходное состояние (тоесть на момент, когда функция была вызвана). ЗЫ Для особо одаренных, ниже привожу полностью рабочий код : Код:
|
Ответ: Скруглённые уголки на BlitzMax
Diablo, стой, ты не верно истолковал.
Фи я высказал только по поводу названии функции и целостности твоего примера. На счёт производительности мне интересно вот что: Для DrawPoly же используется массив. Насколько быстро происходит его заполнение и создаётся геометрия по нему. Я вот тут подумал может можно куда-либо кешировать готовые собранные твоей функцией Poly или игра не стоит свеч, как считаешь? Цитата:
Цитата:
И да, я тебе очень признателен за проявленный интерес - твоя функция крута и это бесспорно. Возможно я возьму её на вооружение с некоторыми переделками ;) |
Ответ: Скруглённые уголки на BlitzMax
Особого прироста не будет, так как массив аллокируется в 24 байт, а это происходит быстро.
Основной тормоз функции - это расчеты синуса и косинуса. Как тебе известно, стандартная функция DrawOval() - прежде чем отрисовать круг 64 раза вызовет функцию Sin() и еще столько же вызовит функцию Cos(). А если рисовать 8 кружочков - то получается 64 * 8 = 512 вызовов на каждую функцию! В моей функции есть параметр "corner" который определяет количество ребер. Если ребер например 5 то получится 5 * 4 = 20 вызовов функций Sin() и Cos(). Можно это дело оптимизировать - занести в кэш результаты вычислений Sin и Cos а затем подставить их. Тоесть это дело можно довести до 5 вычислений Sin и Cos при 5 ребрах. А можно еще при этом использовать функцию SinCos() - тогда пролизводительность еще удвоится. Вобсчем, оптимизировать еще можно... =) |
Ответ: Скруглённые уголки на BlitzMax
Вложений: 1
Воть :3
DrawPoly вызывается 1 раз! Единственное косинусов/синусов много :C Код:
Function DrawRoundedRect(x:Float, y:Float, width:Float, height:Float, r:Float = 30, segs:Int = 4) |
Ответ: Скруглённые уголки на BlitzMax
нда, ребятки.
нашли чем меряться) в наши дни мерялись не этим. не вижу смысла махаться ненужными функциями, и выжимать из них лишние синусы мир вам |
Ответ: Скруглённые уголки на BlitzMax
Тама еще отрисовка будет черезжоперная - что тоже является тормозом, но это уже проблема офф-модулей.
Функция действительно бесполезная. переделать ее на отрисовку линий - куда больше проку. |
Ответ: Скруглённые уголки на BlitzMax
Цитата:
|
Ответ: Скруглённые уголки на BlitzMax
Рэнди, ты не обижайся, но тема выглядит как простой "проброс понтов" и вброс для холивара и срача. Круглоугольники это конечно круто... но и это не торт.
Хотя, вынужден согласиться с тем, что раздел БМ уже покрылся неприличным слоем плесени, и к сожалению он не дорблю, чтобы стать от этого лучше. А потому чтобы оживить и расшевелить раздел, надо как минимум впрыснуть адреналинчику, методом известным по криминальному чтиву. А для этого надо быть минимум Джоном Траволтой. ну короче, ты понял - все на баррикады - делать НОРМАЛЬНЫЕ проекты на БМ. |
Часовой пояс GMT +4, время: 08:49. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot