Привет!
Я создаю графический редактор типа AutoCAD или Компас. И проблема возникла в штриховке. А именно в том, что нужен алгоритм, который бы позволял определять границы штрихуемого контура, а затем собственно заштризовывал контур проверяя на наличие в нем дырок и прочих тонкостей. Алгоритм заливки, который приведен в книге "Е.В. Шикин А.В. Боресков "Компьютерная графика Полигональные модели"" не подойдет поскольку в нет просто каждая точка в контуре зажигается нужным цветом. У меня же штриховка выполняется отрезками (в общем случае). т.е нужно расчитывать координаты начала и конца. Подскажите какую-нибудь книжку, статью где можно было бы найти информацию по этой проблеме
Здравствуйте, _MadMax_, Вы писали:
_MM>Привет! _MM>Я создаю графический редактор типа AutoCAD или Компас. И проблема возникла в штриховке. А именно в том, что нужен алгоритм, который бы позволял определять границы штрихуемого контура, а затем собственно заштризовывал контур проверяя на наличие в нем дырок и прочих тонкостей. Алгоритм заливки, который приведен в книге "Е.В. Шикин А.В. Боресков "Компьютерная графика Полигональные модели"" не подойдет поскольку в нет просто каждая точка в контуре зажигается нужным цветом. У меня же штриховка выполняется отрезками (в общем случае). т.е нужно расчитывать координаты начала и конца. Подскажите какую-нибудь книжку, статью где можно было бы найти информацию по этой проблеме
Когда то давно я делал так — поворачивал фигуру на угол штриховки, а далее тривиально — определение точек пересечения контура с горизонтальной линией в цикле. Обратный поворот результирующего массива точек давал искомое.
Здравствуйте, _MadMax_, Вы писали:
_MM>Я создаю графический редактор типа AutoCAD или Компас. И проблема возникла в штриховке. А именно в том, что нужен алгоритм, который бы позволял определять границы штрихуемого контура, а затем собственно заштризовывал контур проверяя на наличие в нем дырок и прочих тонкостей.
Общая идея — создаем много узких длинных прямоугольников, гарантированно покрыващих фигуру, а потом применяем операцию пересечения. Корректность результата гарантирована.
Ну а если не хочется таких сложностей, то надо пользоваться методом, предложенным migel — повернуть фигуру, чтобы штриховка была горизонтальной, результат штриховки повернуть обратно.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Есть идея. Сделать темплейт штриховки квадратным битмапом, таим,чтобы при соприкасновении сторон темплейта целостность штриховки сохранялась (можно небольшого размера). Условно заполняем все бесконечное пространство этими квадратиками.
Теперь применяем, упомянутый Вами алгоритм, только вместо нужного цвета берем цвет с соответственной точки темплейта. Таким образом можно штриховку любой сложности сделать.
Здравствуйте, defrag, Вы писали: D>Есть идея. Сделать темплейт штриховки квадратным битмапом, таим,чтобы при соприкасновении сторон темплейта целостность штриховки сохранялась (можно небольшого размера). Условно заполняем все бесконечное пространство этими квадратиками. D>Теперь применяем, упомянутый Вами алгоритм, только вместо нужного цвета берем цвет с соответственной точки темплейта. Таким образом можно штриховку любой сложности сделать.
Эта идея называется "паттерн" и задачу штриховки в растровом представлении, она в общем решает. Проблема в том, что иногда требуется все-таки чисто векторная штриховка. Например, для плоттера. Да даже и для принтера с 1600dpi — гораздо эффективнее "накормить" его векторными PostScript командами, чем растеризовать все самому, а потом гнать этот жирный битмап через всю сеть на принтер.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Может я не правильно понял, но сначала я подумал, он знает алгоритм заливки, а если это так, то в условии "if( точку нужно закрасить )" нет ничего непонятного.
Растровый алгоритм заливки (если точка принадлежит контуру, то установить ее цвет равный такому-то) явно не подойдет. Штриховка является, если так можно выразиться векторной. Она состоит из отрезков. Нужно вычислять начало и конец отрезка. Ну у размется отслеживать разные там дырки. Эту задачу в принципе можно решить воспользовшишь алгоритмом удаления невидимых ребер. (Там для каждого ребра делается то ли 6 то ли 8 тестов). Задача состоит еще и в том, чтобы правильно обойти контур. У меня есть штриховка ("естественный грунт") так вот он штрихует область находящюся на теле на раастоянии, например 5 см, от контура.
У меня имеется алгоритм векторной штриховки. По этому алгоритму была разработана программа. Работает без каких-либо проблем.
P.S. У меня есть еще много алгоритмов для CADа, готовые куски программ Если Вы дадите ссылку на описание своего CADа, то я, ознакомившись, смогу сообщить Вам, чем я смогу помочь Вам и на каких условиях.
Здравствуйте, _MadMax_, Вы писали:
_MM>Привет! _MM>Я создаю графический редактор типа AutoCAD или Компас. И проблема возникла в штриховке. А именно в том, что нужен алгоритм, который бы позволял определять границы штрихуемого контура, а затем собственно заштризовывал контур проверяя на наличие в нем дырок и прочих тонкостей. Алгоритм заливки, который приведен в книге "Е.В. Шикин А.В. Боресков "Компьютерная графика Полигональные модели"" не подойдет поскольку в нет просто каждая точка в контуре зажигается нужным цветом. У меня же штриховка выполняется отрезками (в общем случае). т.е нужно расчитывать координаты начала и конца. Подскажите какую-нибудь книжку, статью где можно было бы найти информацию по этой проблеме
Box (curve, p0, p1); // нахожу границы контура (прямоугольник, опред. двумя точками слева внизу, справа вверху)
p_check.x = p0.x — (p1.x — p0.x) ; // cтартовая точка штриховки должна лежать за пределами прямоугольника и пересекать всю плосокость box(a)
p_check.y = p0.y — (p1.y — p0.y) ;
while (p_check.y < p1.y + ((p1.y — p0.y)) ){
CreateСLine (p_check, hatch_angle, c_line ); // создаю бесконечную линию через точку p_check и под углом штриховки
if (Itersection(curve , c_line, points) ){// линия пересекается с 2D контуром
while (1){
if (i >= points.GetSize()) break;
get_p = points.GetAt(i) ;
if (i > 0 && !i%2 ){
CreateFLine(old_p, get_p, f_line); //создаю ограниченную линию штриховки
AddCADObject (f_line); // актуализирую СAD