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));
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.