Штриховка под разным углом

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Штриховка под разным углом

Сообщение shyub » 23.02.2016 10:36:00

Есть битовая матрица, допустим 400х400 пикселей. Необходимо разбить её на 4 сектора, каждый из которых заштриховать линиями под углами Ang1, Ang2, Ang3, Ang4. Соотношение расстояния между линиями и толщиной самих линий должны быть величиной постоянной, однако в процессе работы программы могут изменяться углы и количество линий. Дискретность углов наклона может изменяться в пределах 1,2 градуса.
Ничего лучшего пока не придумал, как заранее сделать заготовки всех возможных вариантов штриховки и хранить их в ресурсах программы, а затем методом Draw выресовывать требуемую в нужном месте. Однако, это далеко не лучший способ, т.к. занимает много ресурсов, а так же не позволяет оперативно изменять какие-то параметры (например, цвет линий, соотношение толщина линии - расстояние между линиями и т.п.)
Просмотрел всю доступную документацию с целью найти метод типа: DrawAngl(Точка_начала, Толщина_линии, Угол_наклона, .....), но увы...
Посоветуйте более оптимальный вариант. Может как-то попытаться "прикрутить" какие-то элементы векторной графики, но какие и как - не знаю.
Буду благодарен даже за самые "несуразные" идеи.
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

Re: Штриховка под разным углом

Сообщение Дож » 23.02.2016 10:54:05

В чём проблема самостоятельно нарисовать все нужные линии? http://algolist.manual.ru/graphics/painting/line.php
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Штриховка под разным углом

Сообщение shyub » 23.02.2016 11:31:13

Дож, спасибо!
Если самостоятельно рисовать каждую линию, то возникает ещё одна проблема - быстродействие. В примере я привёл размер матрицы 400х400 pix, а если эта матрица имеет размер 4000х4000 pix, а размеры секторов штриховки те же самые (200х200 pix). По идее можно обсчитать каждый сектор, а затем соединить точки ф-цией LineTo... Но штриховка - эта не сама цель программы и должна выполняться незаметно для пользователя (не более 0,5 - 1 сек).
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

Re: Штриховка под разным углом

Сообщение Лекс Айрин » 23.02.2016 11:41:12

shyub, так не выполняйте ее прямо на экране. Приготовьте все в буферной переменной (картинке), а потом накатите -- обновление будет казаться мгновенным.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Штриховка под разным углом

Сообщение zub » 23.02.2016 14:19:06

>>По идее можно обсчитать каждый сектор, а затем соединить точки ф-цией LineTo...
Это не по идее, это так и надо))

>>Но штриховка - эта не сама цель программы и должна выполняться незаметно для пользователя (не более 0,5 - 1 сек).
А чему тут тормозить? Не рисуйте то что пользователю невидно и вполне уложитесь в милисекунды
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Штриховка под разным углом

Сообщение Mirage » 23.02.2016 15:09:53

Проще всего использовать OpenGL. И работать будет быстрее всего.
Сперва на битмапе рисуем нужный узор с рассчетом, что повернуть его можно будет как угодно. Т.е. можно просто пару вертикальных линий (вернее прямоугольников) нарисовать.
Затем, используя эту битмапу как текстуру, рисуем поверх каждого сектора прямоугольники.
Угол наклона узора регулируется текстурными координатами.
Для текстуры выставить режим повторения.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Штриховка под разным углом

Сообщение Дож » 24.02.2016 13:37:46

shyub писал(а):Дож, спасибо!
Если самостоятельно рисовать каждую линию, то возникает ещё одна проблема - быстродействие. В примере я привёл размер матрицы 400х400 pix, а если эта матрица имеет размер 4000х4000 pix, а размеры секторов штриховки те же самые (200х200 pix). По идее можно обсчитать каждый сектор, а затем соединить точки ф-цией LineTo... Но штриховка - эта не сама цель программы и должна выполняться незаметно для пользователя (не более 0,5 - 1 сек).

4000x4000 = 16000000, т.е. 16 млн. пикселей.

Алгоритм штриховки закрашивает не более 16 млн. пикселей, там будет пара сложений и присваиваний на пиксель, соответственно на 1Ггц процессоре штриховка спокойно укладывается в 0.1 секунды.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47


Вернуться в Общее

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

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

Рейтинг@Mail.ru