Замкнутые полилинии
От: DEMIAN_8  
Дата: 20.11.12 11:16
Оценка:
Привет всем!

В общем , есть фигуры созданные с помощью замкнутых полилиний.
Задача следующая, нужно заштриховать фигуры созданные с помощью полилиний.

Есть вектор, который хранит пары координат созданных фигур.
Не могу понять, как посчитать угол наклона сторон, делаю следующее:
    double angle = 0;

    for(int i = 1; i < number_of_points(); ++i)
    {
        angle = atan2(double(point(i).y-point(i-1).y),double(point(i).x-point(i-1).x));
        a.push_back(angle);
        angle = double();
    }
   
    angle = atan2(double(point(0).y-point(number_of_points()-1).y),double(point(0).x-point(number_of_points()-1).x)); // Подсчитываю угол последней "замыкающей" полилинии. 
    a.push_back(angle);


В итоге получаются совершенно другие углы...
closed_polyline замкнутые_полилинии закрытые_полилинии полилинии штриховка
Re: Замкнутые полилинии
От: Centaur Россия  
Дата: 20.11.12 12:13
Оценка:
Здравствуйте, DEMIAN_8, Вы писали:

DEM>Есть вектор, который хранит пары координат созданных фигур.

DEM>Не могу понять, как посчитать угол наклона сторон, делаю следующее:
DEM>    double angle = 0;

DEM>    for(int i = 1; i < number_of_points(); ++i)
DEM>    {
DEM>        angle = atan2(double(point(i).y-point(i-1).y),double(point(i).x-point(i-1).x));
DEM>        a.push_back(angle);
DEM>        angle = double();
DEM>    }
   
DEM>    angle = atan2(double(point(0).y-point(number_of_points()-1).y),double(point(0).x-point(number_of_points()-1).x)); // Подсчитываю угол последней "замыкающей" полилинии. 
DEM>    a.push_back(angle);


DEM>В итоге получаются совершенно другие углы...


Код выглядит правильным, считает углы между каждой стороной полигона и положительной полуосью Ox, в радианах против часовой стрелки. Зануление angle в самом начале и в последней строке цикла избыточно. Какие такие «совершенно другие углы» получаются?
Re: Замкнутые полилинии
От: swame  
Дата: 20.11.12 14:32
Оценка:
Здравствуйте, DEMIAN_8, Вы писали:

DEM>Привет всем!


DEM>В общем , есть фигуры созданные с помощью замкнутых полилиний.

DEM>Задача следующая, нужно заштриховать фигуры созданные с помощью полилиний.

По идее, для этой задачи не нужно вычислять углы.
Re[2]: Замкнутые полилинии
От: DEMIAN_8  
Дата: 21.11.12 23:01
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, DEMIAN_8, Вы писали:


DEM>>Есть вектор, который хранит пары координат созданных фигур.

DEM>>Не могу понять, как посчитать угол наклона сторон, делаю следующее:
C>
DEM>>    double angle = 0;

DEM>>    for(int i = 1; i < number_of_points(); ++i)
DEM>>    {
DEM>>        angle = atan2(double(point(i).y-point(i-1).y),double(point(i).x-point(i-1).x));
DEM>>        a.push_back(angle);
DEM>>        angle = double();
DEM>>    }
   
DEM>>    angle = atan2(double(point(0).y-point(number_of_points()-1).y),double(point(0).x-point(number_of_points()-1).x)); // Подсчитываю угол последней "замыкающей" полилинии. 
DEM>>    a.push_back(angle);
C>


DEM>>В итоге получаются совершенно другие углы...


C>положительной полуосью Ox

Спасибо, теперь понятно, что углы верны.

Но все-равно в голове не укладывается, как с правильно с полученными углами работать.
Есть например фигура из коллекции точек:
1) [200;100]
2) [150;150]
3) [170;200]
4) [250;200]
5) [270;150]
6) [290;130]

Сначала думал вычислить углы, как в случае с окружность, но ничего из этого не вышло. Сейчас попробовал решить задачу с помощью определения наклона линии:


    for(int i = 1; i < number_of_points(); ++i)
    {
        double m = double(point(i).y-point(i-1).y)/double(point(i).x-point(i-1).x);
        a.push_back(m);
    }

    double m = double(point(0).y-point(number_of_points()-1).y)/double(point(0).x-point(number_of_points()-1).x); // Подсчитываю наклон последней "замыкающей" полилинии. 
    a.push_back(m);


Далее, создал вектор для коллекционирования точек, чтобы потом произвести горизонтальную штриховку по точкам. Вычисляю первые точки для левой стороны:

for(int i=0, n=1; a[i]!=0; ++i, ++n)
    {
        double angle = a[i]; // Выбираю угол наклона для стороны
        if(angle < 0) angle*=-1;

        for(Point begin = point(n); begin.y-angle > point(n-1).y; angle+=5) // Выбираю последнюю точку полилинии до следующего угла
        {
            if(begin.x < point(n-1).x)
            {
                l.push_back(new Point(begin.x+angle, begin.y-angle)); // И иду назад до начальной точки полилинии, помещая точки для штриховки
            }
            else if(begin.x > point(n-1).x)
            {
                l.push_back(new Point(begin.x-angle, begin.y-angle));
            }
            else l.push_back(new Point(begin.x, begin.y-angle));
        }
                
    }


Ну и тоже самое, но только для правой стороны. Но получается следующий результат маркировки точек, чисто для проверки.
Не пойму, что я делаю не так...
Re[3]: Замкнутые полилинии
От: DEMIAN_8  
Дата: 21.11.12 23:50
Оценка:
Здравствуйте, DEMIAN_8, Вы писали:

DEM>Здравствуйте, Centaur, Вы писали:


C>>Здравствуйте, DEMIAN_8, Вы писали:


DEM>>>Есть вектор, который хранит пары координат созданных фигур.

DEM>>>Не могу понять, как посчитать угол наклона сторон, делаю следующее:
C>>
DEM>>>    double angle = 0;

DEM>>>    for(int i = 1; i < number_of_points(); ++i)
DEM>>>    {
DEM>>>        angle = atan2(double(point(i).y-point(i-1).y),double(point(i).x-point(i-1).x));
DEM>>>        a.push_back(angle);
DEM>>>        angle = double();
DEM>>>    }
   
DEM>>>    angle = atan2(double(point(0).y-point(number_of_points()-1).y),double(point(0).x-point(number_of_points()-1).x)); // Подсчитываю угол последней "замыкающей" полилинии. 
DEM>>>    a.push_back(angle);
C>>


DEM>>>В итоге получаются совершенно другие углы...


C>>положительной полуосью Ox

DEM>Спасибо, теперь понятно, что углы верны.

DEM>Но все-равно в голове не укладывается, как с правильно с полученными углами работать.

DEM>Есть например фигура из коллекции точек:
DEM>1) [200;100]
DEM>2) [150;150]
DEM>3) [170;200]
DEM>4) [250;200]
DEM>5) [270;150]
DEM>6) [290;130]

DEM>Сначала думал вычислить углы, как в случае с окружность, но ничего из этого не вышло. Сейчас попробовал решить задачу с помощью определения наклона линии:



DEM>
DEM>    for(int i = 1; i < number_of_points(); ++i)
DEM>    {
DEM>        double m = double(point(i).y-point(i-1).y)/double(point(i).x-point(i-1).x);
DEM>        a.push_back(m);
DEM>    }

DEM>    double m = double(point(0).y-point(number_of_points()-1).y)/double(point(0).x-point(number_of_points()-1).x); // Подсчитываю наклон последней "замыкающей" полилинии. 
DEM>    a.push_back(m);
DEM>


DEM>Далее, создал вектор для коллекционирования точек, чтобы потом произвести горизонтальную штриховку по точкам. Вычисляю первые точки для левой стороны:


DEM>
DEM>for(int i=0, n=1; a[i]!=0; ++i, ++n)
DEM>    {
DEM>        double angle = a[i]; // Выбираю угол наклона для стороны
DEM>        if(angle < 0) angle*=-1;

DEM>        for(Point begin = point(n); begin.y-angle > point(n-1).y; angle+=5) // Выбираю последнюю точку полилинии до следующего угла
DEM>        {
DEM>            if(begin.x < point(n-1).x)
DEM>            {
DEM>                l.push_back(new Point(begin.x+angle, begin.y-angle)); // И иду назад до начальной точки полилинии, помещая точки для штриховки
DEM>            }
DEM>            else if(begin.x > point(n-1).x)
DEM>            {
DEM>                l.push_back(new Point(begin.x-angle, begin.y-angle));
DEM>            }
DEM>            else l.push_back(new Point(begin.x, begin.y-angle));
DEM>        }
                
DEM>    }
DEM>


DEM>Ну и тоже самое, но только для правой стороны. Но получается следующий результат маркировки точек, чисто для проверки.

DEM>Не пойму, что я делаю не так...

Сделал.


    Striped_closed_polyline c2;
    Marks m("x");

    c2.add(Point(200,100));
    c2.add(Point(150,150));
    c2.add(Point(170,200));
    c2.add(Point(250,200));
    c2.add(Point(270,150));
    c2.add(Point(290,130));

    c2.calc_vertex();
        
        // Тестирую теорию промаркировав точки

    double dx = (200 - 150) * 0.1;
    double dy = (170 - 150) * 0.1;

    const double cdx1 = dx;
    const double cdy1 = dy;

    for(int x = 170, y = 200; y-dy > 150; dx+=cdy1, dy+=cdx1)
    {
        m.add(Point(x-dx, y-dy));
    }

    dx = (270 - 290) * -0.1;
    dy = (150 - 130) * 0.1;

    const double cdx2 = dx;
    const double cdy2 = dy;

    for(int x = 270, y = 150; y-dy > 130; dx+=cdy2, dy+=cdx2)
    {
        m.add(Point(x+dx, y-dy));
    }
Re[4]: Замкнутые полилинии
От: DEMIAN_8  
Дата: 22.11.12 00:04
Оценка:
Впопыхах запостить перепутал пары координат, так правильнее:

    double dx = (170 - 150) * 0.1;
    double dy = (200 - 150) * 0.1;

    const double cdx1 = dx;
    const double cdy1 = dy;

    for(int x = 170, y = 200; y-dy > 150; dx+=cdx1, dy+=cdy1)
    {
    }
Re: Замкнутые полилинии
От: newillusion  
Дата: 23.11.12 09:36
Оценка:
Здравствуйте, DEMIAN_8, Вы писали:

DEM>Задача следующая, нужно заштриховать фигуры созданные с помощью полилиний.


Мне кажется, Вы это как-то слишком своеобразно делаете. Стандартный способ — берем линию штриховки, и вычисляем все точки пересечения её и кусков полилинии. Поскольку полилиния у Вас замкнутая, то получите чётное количество точек пересечения Т. И попарно чертите куски линии штриховки: Т1-Т2, Т3-Т4, .... Тпредпоследняя-Тпоследняя. Никаких углов там вычислять не нужно. Формулу пересечения линии и отрезка можно легко найти, если самому выводить лень.

Потом берём другую линию штриховки и процесс повторяем...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.