Привет всем!
В общем , есть фигуры созданные с помощью замкнутых полилиний.
Задача следующая, нужно заштриховать фигуры созданные с помощью полилиний.
Есть вектор, который хранит пары координат созданных фигур.
Не могу понять, как посчитать угол наклона сторон, делаю следующее:
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);
В итоге получаются совершенно другие углы...
Здравствуйте, 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 в самом начале и в последней строке цикла избыточно. Какие такие «совершенно другие углы» получаются?
Здравствуйте, DEMIAN_8, Вы писали:
DEM>Привет всем!
DEM>В общем , есть фигуры созданные с помощью замкнутых полилиний.
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
Спасибо, теперь понятно, что углы верны.
Но все-равно в голове не укладывается, как с правильно с полученными углами работать.
Есть например фигура из коллекции точек:
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));
}
}
Ну и тоже самое, но только для правой стороны. Но получается следующий
результат маркировки точек, чисто для проверки.
Не пойму, что я делаю не так...
Здравствуйте, 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));
}
Впопыхах запостить перепутал пары координат, так правильнее:
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)
{
}