Как предотвратить сглаживание или деформирование 3-точечной полигонной дуги при изменении размера/масштабирования в GDI+C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как предотвратить сглаживание или деформирование 3-точечной полигонной дуги при изменении размера/масштабирования в GDI+

Сообщение Anonymous »

Я разрабатываю приложение C ++ с GDI+, где пользователь может масштабировать геометрические фигуры, в частности, «пользовательский самополигон», который представляет собой дугу, определенную три точки (начало, контроль/кривая, конец).
Проблема: когда я изменяю цифру вертикально (т.е., когда высота не будет достигнута, пока не достигнут. Узел «1», кривизна центральной дуги имеет тенденцию «сгладить» или деформировать неестественно, иногда даже с «горбами» или нереалистичными прямыми линиями. Если я не выпускаю узел и не масштабируется вверх и вниз, масштабирование нормальное. Я попробовал как простую технику масштабирования, так и реконструкцию, используя квадратичную формулу Bézier, но ни один из них не полностью не избегает общего сглаживания или «горба» на кривую.

Код: Выделить всё

if (dynamic_cast(&polygon) != nullptr && originalPoints_.size() == 3) {
// Scale the endpoints normally.
POINT p0, p2;
p0.x = static_cast(anchor_.x + (originalPoints_[0].x - anchor_.x) * scaleX_);
p0.y = static_cast(anchor_.y + (originalPoints_[0].y - anchor_.y) * scaleY_);
p2.x = static_cast(anchor_.x + (originalPoints_[2].x - anchor_.x) * scaleX_);
p2.y = static_cast(anchor_.y + (originalPoints_[2].y - anchor_.y) * scaleY_);

// Base vector and normal
double dx = originalPoints_[2].x - originalPoints_[0].x;
double dy = originalPoints_[2].y - originalPoints_[0].y;
double length = std::sqrt(dx * dx + dy * dy);
double nx = -dy / length;
double ny = dx / length;

// Center of the original and scaled base
double cx0 = (originalPoints_[0].x + originalPoints_[2].x) * 0.5;
double cy0 = (originalPoints_[0].y + originalPoints_[2].y) * 0.5;
double cx = (p0.x + p2.x) * 0.5;
double cy = (p0.y + p2.y) * 0.5;

// Perpendicular distance from the original control
double px = originalPoints_[1].x - cx0;
double py = originalPoints_[1].y - cy0;
double signedDist = px * nx + py * ny;

// Minimum curvature option
double distEscalada = signedDist * scaleY_;
const double minDist = 8.0; // I try to avoid complete flattening.
if (fabs(distEscalada) < minDist)
distEscalada = (distEscalada >= 0) ? minDist : -minDist;

POINT p1;
p1.x = static_cast(cx + nx * distEscalada);
p1.y = static_cast(cy + ny * distEscalada);

newPts.clear();
newPts.push_back(p0);
newPts.push_back(p1);
newPts.push_back(p2);
}
Как я могу гарантировать, что кривиза центральной точки (дуга) моего трехточечного пользовательского самополигона оставалась естественной и визуально правильной при масштабировании/изменении размера, без полностью выравнивания или создания горбов, даже когда форма очень мала или перевернута? Масштабирование, независимо от отношения сторон?
Пример изображения

Подробнее здесь: https://stackoverflow.com/questions/796 ... ng-when-re
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»