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

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

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

Ответить
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

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

Сообщение shyub »

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

Сообщение Дож »

В чём проблема самостоятельно нарисовать все нужные линии? http://algolist.manual.ru/graphics/painting/line.php
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

Сообщение shyub »

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

Сообщение Лекс Айрин »

shyub, так не выполняйте ее прямо на экране. Приготовьте все в буферной переменной (картинке), а потом накатите -- обновление будет казаться мгновенным.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

>>Но штриховка - эта не сама цель программы и должна выполняться незаметно для пользователя (не более 0,5 - 1 сек).
А чему тут тормозить? Не рисуйте то что пользователю невидно и вполне уложитесь в милисекунды
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Проще всего использовать OpenGL. И работать будет быстрее всего.
Сперва на битмапе рисуем нужный узор с рассчетом, что повернуть его можно будет как угодно. Т.е. можно просто пару вертикальных линий (вернее прямоугольников) нарисовать.
Затем, используя эту битмапу как текстуру, рисуем поверх каждого сектора прямоугольники.
Угол наклона узора регулируется текстурными координатами.
Для текстуры выставить режим повторения.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

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

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

Алгоритм штриховки закрашивает не более 16 млн. пикселей, там будет пара сложений и присваиваний на пиксель, соответственно на 1Ггц процессоре штриховка спокойно укладывается в 0.1 секунды.
Ответить