Есть битовая матрица, допустим 400х400 пикселей. Необходимо разбить её на 4 сектора, каждый из которых заштриховать линиями под углами Ang1, Ang2, Ang3, Ang4. Соотношение расстояния между линиями и толщиной самих линий должны быть величиной постоянной, однако в процессе работы программы могут изменяться углы и количество линий. Дискретность углов наклона может изменяться в пределах 1,2 градуса.
Ничего лучшего пока не придумал, как заранее сделать заготовки всех возможных вариантов штриховки и хранить их в ресурсах программы, а затем методом Draw выресовывать требуемую в нужном месте. Однако, это далеко не лучший способ, т.к. занимает много ресурсов, а так же не позволяет оперативно изменять какие-то параметры (например, цвет линий, соотношение толщина линии - расстояние между линиями и т.п.)
Просмотрел всю доступную документацию с целью найти метод типа: DrawAngl(Точка_начала, Толщина_линии, Угол_наклона, .....), но увы...
Посоветуйте более оптимальный вариант. Может как-то попытаться "прикрутить" какие-то элементы векторной графики, но какие и как - не знаю.
Буду благодарен даже за самые "несуразные" идеи.
Штриховка под разным углом
Модератор: Модераторы
В чём проблема самостоятельно нарисовать все нужные линии? http://algolist.manual.ru/graphics/painting/line.php
Дож, спасибо!
Если самостоятельно рисовать каждую линию, то возникает ещё одна проблема - быстродействие. В примере я привёл размер матрицы 400х400 pix, а если эта матрица имеет размер 4000х4000 pix, а размеры секторов штриховки те же самые (200х200 pix). По идее можно обсчитать каждый сектор, а затем соединить точки ф-цией LineTo... Но штриховка - эта не сама цель программы и должна выполняться незаметно для пользователя (не более 0,5 - 1 сек).
Если самостоятельно рисовать каждую линию, то возникает ещё одна проблема - быстродействие. В примере я привёл размер матрицы 400х400 pix, а если эта матрица имеет размер 4000х4000 pix, а размеры секторов штриховки те же самые (200х200 pix). По идее можно обсчитать каждый сектор, а затем соединить точки ф-цией LineTo... Но штриховка - эта не сама цель программы и должна выполняться незаметно для пользователя (не более 0,5 - 1 сек).
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
shyub, так не выполняйте ее прямо на экране. Приготовьте все в буферной переменной (картинке), а потом накатите -- обновление будет казаться мгновенным.
>>По идее можно обсчитать каждый сектор, а затем соединить точки ф-цией LineTo...
Это не по идее, это так и надо))
>>Но штриховка - эта не сама цель программы и должна выполняться незаметно для пользователя (не более 0,5 - 1 сек).
А чему тут тормозить? Не рисуйте то что пользователю невидно и вполне уложитесь в милисекунды
Это не по идее, это так и надо))
>>Но штриховка - эта не сама цель программы и должна выполняться незаметно для пользователя (не более 0,5 - 1 сек).
А чему тут тормозить? Не рисуйте то что пользователю невидно и вполне уложитесь в милисекунды
-
Mirage
- энтузиаст
- Сообщения: 881
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
Проще всего использовать OpenGL. И работать будет быстрее всего.
Сперва на битмапе рисуем нужный узор с рассчетом, что повернуть его можно будет как угодно. Т.е. можно просто пару вертикальных линий (вернее прямоугольников) нарисовать.
Затем, используя эту битмапу как текстуру, рисуем поверх каждого сектора прямоугольники.
Угол наклона узора регулируется текстурными координатами.
Для текстуры выставить режим повторения.
Сперва на битмапе рисуем нужный узор с рассчетом, что повернуть его можно будет как угодно. Т.е. можно просто пару вертикальных линий (вернее прямоугольников) нарисовать.
Затем, используя эту битмапу как текстуру, рисуем поверх каждого сектора прямоугольники.
Угол наклона узора регулируется текстурными координатами.
Для текстуры выставить режим повторения.
shyub писал(а):Дож, спасибо!
Если самостоятельно рисовать каждую линию, то возникает ещё одна проблема - быстродействие. В примере я привёл размер матрицы 400х400 pix, а если эта матрица имеет размер 4000х4000 pix, а размеры секторов штриховки те же самые (200х200 pix). По идее можно обсчитать каждый сектор, а затем соединить точки ф-цией LineTo... Но штриховка - эта не сама цель программы и должна выполняться незаметно для пользователя (не более 0,5 - 1 сек).
4000x4000 = 16000000, т.е. 16 млн. пикселей.
Алгоритм штриховки закрашивает не более 16 млн. пикселей, там будет пара сложений и присваиваний на пиксель, соответственно на 1Ггц процессоре штриховка спокойно укладывается в 0.1 секунды.
