Рисование плавных линий

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Рисование плавных линий

Сообщение lister » 12.03.2006 (Вс) 23:06

Подскажите, как можно нарисовать плавные выровненные линии без "лесенок" ? :oops:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.03.2006 (Вс) 23:08

Ты спрашиваешь о сплайнах или об антиальясинге?
Lasciate ogni speranza, voi ch'entrate.

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 12.03.2006 (Вс) 23:15

я даже не успел текст исправить... :)

нужны линии с плавным переходом от одного цвета к другому - от цвета линии к цвету фона... да, точно, антиальясинг.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 12.03.2006 (Вс) 23:46

http://forum.sources.ru/index.php?showt ... 191&st=330

LivePaint: Фильтр "Blur" или "Pixelization" с уровнем 1.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.03.2006 (Вс) 23:49

Ооо брат. Возможно я глючу, но помоему такая возможность обычными API добиться не получится.

Помоему в GDI+ была такая возможность.

Вот тут можешь про неё поглядеть разговор про неё
и там же описание её функций на Visual Basic

http://bbs.vbstreets.ru/viewtopic.php?t=23735

А тут описание функций, но правда на ссях

http://msdn.microsoft.com/library/defau ... latapi.asp

P.S Ещё раз скажу Tyomitch-у огромное спасибо за то, что он обёртку к ней сделал. :wink:

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 12.03.2006 (Вс) 23:51

2 ALX_2002

Посмотри ссылку, что я привёл.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.03.2006 (Вс) 23:51

2 BV: Ух. Был не прав. Спасибо за линк. Оказывается и на API это реализуемо. :shock:

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 13.03.2006 (Пн) 7:28

Что-то у меня в LivePaint'е линии вообще не рисуются :shock:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.03.2006 (Пн) 10:18

ALX_2002 писал(а):2 BV: Ух. Был не прав. Спасибо за линк. Оказывается и на API это реализуемо. :shock:

Там не API. Там BV собственными силами воспроизводит возможности GDI+ :-)


Мой пример антиалиасинга через GDI+ -- с полными исходниками -- уже почти два года лежит на http://vbrussian.com/Examples.asp?ID=102
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 13.03.2006 (Пн) 18:01

Сделал отдельным проектом.

http://bbs.vbstreets.ru/viewtopic.php?p=6590989#6590989
Последний раз редактировалось BV 13.03.2006 (Пн) 21:56, всего редактировалось 1 раз.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.03.2006 (Пн) 18:12

Прикрути описание, документируй и выкладывай, если он автономный.
Lasciate ogni speranza, voi ch'entrate.

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 13.03.2006 (Пн) 20:15

Спасибо за вариант, но... оооочень долгоиграющий. У меня фильтр применялся к этой линии 7 секунд :?

Я хочу попытаться с антиальясингом радиальный прогрессбар сделать.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.03.2006 (Пн) 20:28

lister, мой код не смотрел? или GDI+ запретен?
Изображение

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 13.03.2006 (Пн) 21:16

Смотрел-смотрел... То что нужно.
GDI+ не запретен. Я собираюсь делать прогрессбар, который со включенным стилем XP будет рисоваться с антиальясингом, а в классическом стиле - обычными линиями.

надеюсь, GDI+ в икспишках у все есть? :roll:

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 13.03.2006 (Пн) 21:55

2 lister

а) задай радиус 2
б) запускай только в скомпилированном виде
в) для полосы прогресса вставь обработку в цикл фильтра

Более автономная версия: http://bbs.vbstreets.ru/viewtopic.php?p=6590989#6590989


2 tyomitch

GDIPlus не запретен, он тяжел и редок, особенно в рядах 9x.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 14.03.2006 (Вт) 9:34

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

Может быть я не прав, но про 9х пора потихоньку начинать забывать. Братцы, уж 10 лет прошло как Win 95 выпустили. Она свое отжила. Да и 98 пора на свалку. Они обе и разработчиком уже не поддерживаются...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.03.2006 (Вт) 10:54

lister писал(а):GDI+ не запретен. Я собираюсь делать прогрессбар, который со включенным стилем XP будет рисоваться с антиальясингом, а в классическом стиле - обычными линиями.

Если стиль XP включён, значит это уже не Win9x :-D

lister писал(а):надеюсь, GDI+ в икспишках у все есть? :roll:

Да.
Изображение

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 14.03.2006 (Вт) 11:06

lister писал(а):GDI+ не запретен. Я собираюсь делать прогрессбар, который со включенным стилем XP будет рисоваться с антиальясингом, а в классическом стиле - обычными линиями.


А в остальных ОС - тоже обычными линиями.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 14.03.2006 (Вт) 17:30

lister писал(а):У меня фильтр применялся к этой линии 7 секунд :?



Специально сделал тест...

P IV 1.8 GHz

Радиус сглаживания 2:

Из IDE - 1.8 сек.
Из скомпилированного EXE - 0.7 сек.

Радиус сглаживания 4:

Из IDE - 4.9 сек.
Из скомпилированного EXE - 1.2 сек.

Радиус сглаживания 8:

Из IDE - 18.1 сек.
Из скомпилированного EXE - 3.1 сек.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.03.2006 (Вт) 18:10

BV, будь так добр, сравни скорость твоего кода с GDI+
(исключительно из спортивного интереса)
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 14.03.2006 (Вт) 18:37

У меня нет примеров Blur через GDIPlus. Почему - сам знаешь :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 14.03.2006 (Вт) 20:05

BV писал(а):
lister писал(а):P IV 1.8 GHz


У меня celeron 1.2 :roll:

7 сек применялся твой первый пример с радиусом 4. В exe.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.03.2006 (Вт) 21:40

BV писал(а):У меня нет примеров Blur через GDIPlus. Почему - сам знаешь :)

ОК, я проверил сам. Радиус=2.
Код: Выделить всё
Под IDE:
    Blur = 1.49
    GDI+ = 0.02

В EXE:
    Blur = 0.24
    GDI+ = 0.00


Кроме того, линия при помощи GDI+ получается видимо более ровной.
См. http://users.isnet.ru/tyomitch/Blur.png
Линия справа -- твоя, слева -- моя.


Выводы очевидны.
Изображение

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 14.03.2006 (Вт) 21:55

Где же они очевидны-то? :?

Сам факт того, что мой метод не требует библиотеки в полтора мегабайта, уже перекрывает большую часть преимуществ GDIPlus. Качество - ставь радиус 4, скорость - оптимизация кода фильтра.
Вот это выводы.


Кстати, можно исходник теста?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.03.2006 (Вт) 22:59

У тебя, если радиус ставить большой, линия не становится глаже: она размывается к краям. А в GDI+ линия всегда равномерно выкрашена.

Ещё, если можешь, приведи пример, как нарисовать твоим методом гладкую линию, не размывая фон. (Представь себе, что там текст. И ты поверх него рисуешь линии.) А через GDI+ возможно и это.

Разница в скорости, по меньшей мере, в 10 раз. Если ставить больший радиус, разница вырастет ещё.

Вот вся содержательная часть кода моей кнопки:
Код: Выделить всё
    With CreateGraphics(hdc)
        .SmoothingMode = SmoothingModeHighQuality
        .DrawLine CreatePen(ARGB(vbRed), 2.3), 12, 20, frmMain.ScaleWidth - 42, frmMain.ScaleHeight - 20
    End With
    frmMain.Refresh

Ещё я в твоём примере ScaleMode поменял на пикселы. Вряд ли это имеет значение для скорости.
Изображение

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 15.03.2006 (Ср) 1:56

скачайте вот это, там есть сглаживание линий и эллипсов при рисовании (как в Flash)

http://vt.biophysicist.net/vb/smb/smbinst.exe прога
http://vt.biophysicist.net/vb/smb/source.exe исходники

и делается намного качественнее эффекта Blur от BV, и быстрее

тест на 451 МГц, без тупняков


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот, SemrushBot, Yandex-бот и гости: 54

    TopList