C ++ Как масштабировать фигуру и создать функцию if, чтобы не печатать, если она слишком велика после масштабирования?

заданная форма orignal centroid + вершины .. т.е. если это треугольник, я знаю все координаты трех вершин. Как я мог тогда создать функцию масштабирования с коэффициентом масштабирования в качестве параметра, как показано ниже … однако мой текущий код с ошибкой, и в результате получаются огромные формы, гораздо больше, чем то, по которому я масштабируюсь (требуется только коэффициент масштабирования 2).

void Shape::scale(double factor)
{
int x, y, xx, xy;
int disx, disy;
for (itr = vertices.begin(); itr != vertices.end(); ++itr) {
//translate obj to origin (0,0)
x = itr->getX() - centroid.getX();
y = itr->getY() - centroid.getY();

//finds distance between centroid and vertex
disx = x + itr->getX();
disy = y + itr->getY();

xx = disx * factor;
xy = disy * factor;

//translate obj back
xx = xx + centroid.getX();
xy = xy + centroid.getY();

//set new coord
itr->setX(xx);
itr->setY(xy);
}
}

0

Решение

Первое, что вам нужно сделать, это найти центр масс вашего набора точек. Это среднее арифметическое координат ваших точек. Затем для каждой точки вычислите линию между центром масс и этой точкой. Теперь остается только поставить точку на этой линии, но в factor * current_distance прочь, где current_distance — расстояние от центра масс до заданной точки до масштабирования.

void Shape::scale(double factor)
{

Vertex mass_center = Vertex(0., 0.);

for(int i = 0; i < vertices.size(); i++)
{
mass_center.x += vertices[i].x;
mass_center.y += vertices[i].y;
}

mass_center.x /= vertices.size();
mass_center.y /= vertices.size();

for(int i = 0; i < vertices.size(); i++)
{
//this is a vector that leads from mass center to current vertex
Vertex vec = Vertex(vertices[i].x - mass_center.x, vertices[i].y - mass_center.y);
vertices[i].x = mass_center.x + factor * vec.x;
vertices[i].y = mass_center.y + factor * vec.y;
}
}
1

Другие решения

Если вы уже знаете, что центр тяжести фигуры и вершины — это расстояние от этой точки, то масштабирование в прямоугольных координатах просто умножает компоненты x и y каждой вершины на соответствующий коэффициент масштабирования (с отрицательным значением, переворачивающим фигуру вокруг оси ,

void Shape::scale(double x_factor, double y_factor){
for(auto i=0; i < verticies.size();++i){
verticies[i].x *= x_scale;
verticies[i].y *= y_scale;
}
}

Затем вы можете просто перегрузить эту функцию той, которая принимает один параметр и вызывает эту функцию с тем же значением для x а также y,

void Shape::scale(double factor){
Shape::scale(factor, factor);
}

Если ваши значения вершин не центрированы в начале координат, вам также придется умножить эти значения на ваш коэффициент масштабирования.

0

По вопросам рекламы [email protected]