Страница 1 из 1

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

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

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

СообщениеДобавлено: 23.02.2016 10:54:05
Дож
В чём проблема самостоятельно нарисовать все нужные линии? http://algolist.manual.ru/graphics/painting/line.php

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

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

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

СообщениеДобавлено: 23.02.2016 11:41:12
Лекс Айрин
shyub, так не выполняйте ее прямо на экране. Приготовьте все в буферной переменной (картинке), а потом накатите -- обновление будет казаться мгновенным.

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

СообщениеДобавлено: 23.02.2016 14:19:06
zub
>>По идее можно обсчитать каждый сектор, а затем соединить точки ф-цией LineTo...
Это не по идее, это так и надо))

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

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

СообщениеДобавлено: 23.02.2016 15:09:53
Mirage
Проще всего использовать OpenGL. И работать будет быстрее всего.
Сперва на битмапе рисуем нужный узор с рассчетом, что повернуть его можно будет как угодно. Т.е. можно просто пару вертикальных линий (вернее прямоугольников) нарисовать.
Затем, используя эту битмапу как текстуру, рисуем поверх каждого сектора прямоугольники.
Угол наклона узора регулируется текстурными координатами.
Для текстуры выставить режим повторения.

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 секунды.