2016-06-03 4 views
1

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

До сих пор я мог поворачивать прямоугольники, применяя transformation matrix I got from Wikipedia к каждой вершине. Я не знаю, как их перевести, чтобы каждый прямоугольник сохранял свое положение относительно холста.

Вот быстрый рисунок для иллюстрации того, что я хочу добиться: enter image description here

Мне нужно сделать это с C и Xlib, но я не обязательно ищет код, но был бы признателен некоторые общие советы/алгоритмы.

+0

Матрица преобразования вы применили вращает точки относительно начала координат. Вы должны убедиться, что контрольная точка, по которой вы вращаетесь, одинакова для прямоугольника и pixmap. Кроме того, пожалуйста, включите все ссылки и изображения в самом вопросе. Нам не нужно переходить на внешние ссылки. –

+0

Невозможно, чтобы я мог включать изображения с менее чем 10 точками реплики. Если вы посмотрите на фоновой pixmap (т. Е. Черный прямоугольник на иллюстрации), какова будет опорная точка вращения? – user6419081

+0

Очень сложно догадаться, пока мы не увидим ваш код. –

ответ

1

Чтобы получить переведенное положение для дочернего объекта, вам нужно повернуть вектор относительной позиции для дочернего объекта, а затем добавить его в начало координат:

Notice that the relative vector is rotated

псевдокод будет:

public static Vector2 OffsetByRotation(Vector2 childPos, Vector2 parentPos, float angle) 
{ 
    var relativeVector = childPos - parentPos; 
    relativeVector = Rotate(relativeVector, angle); 
    return parentPos + relativeVector; 
} 

Обратите внимание, что образ вашего примера не только вращает родительский объект, но и переводит его: ваше левое изображение вращается вокруг (0, 300), но затем эта точка переводится на (0, 0).

enter image description here

+1

Спасибо, последняя часть, которую мне не хватало, после применения поворота мне нужно было перевести (по высоте, 0) для положительного и (0, ширина) для отрицательных углов. – user6419081

-1

Запрашиваемого преобразование

X' = 300 - Y 
Y' = X 
+0

Можно ли это выразить в целом, а не только для моего 90-градусного примера? Я также благодарен за любые хитофонические материалы, объяснения. Благодарю. – user6419081

+0

Почему, черт возьми, это downvote ??? –

Смежные вопросы