2014-11-10 2 views
1

Я хочу, чтобы нарисовать треугольник и текст, используя C++ и Каир, как это:Cairo переворачивает рисунок

|\ 
| \ 
|PP\ 
|___\ 

Если добавить треугольник и текст с помощью Cairo я получаю:

___ 
| /
|PP/ 
|/
|/ 

Так ось y сверху вниз, но я хочу ее снизу вверх. Поэтому я попытался изменить матрицу точек обзора (cairo_transform (p, & mat);) или масштабировать данные (cairo_scale (p, 1.0, -1.0);). Я получаю:

|\ 
| \ 
|bb\ 
|___\ 

Теперь треугольник так, как я хочу его, но текст дублируется, что я не хочу быть зеркальным.

Любая идея, как справиться с этой проблемой?

+1

Почему вы не создать правильный треугольник с самого начала, имея в виду, что Cairo использует другую ориентацию оси, как мы делаем с ручкой и бумагой? Для меня преобразование кажется не таким, как предпочтительный путь. – lupz

+0

Благодарим вас за ответ. Во всяком случае, я не могу так поступать, потому что это не только один треугольник, но и сложный рисунок, созданный сложным для понимания алгоритмом. Этот алгоритм уже существует и его нельзя изменить. Конечно, я мог бы написать еще один алгоритм, который переворачивает y-координату каждого элемента чертежа, но перемещает текст. Ну, я просто надеялся, что есть способ рисовать с Каиром обычным способом, но, вероятно, нет. – user3144699

+0

Ну ... Перенесем y-координату выхода алгоритма. Текст может быть более сложным. При добавлении текста к результату алгоритма -> ok. Когда это часть результата, она тоже может быть перевернута. Вам нужно будет различать рисование и текст. Но вам, возможно, придется пересчитать положение текста. Возможно, можно будет подавать алгоритм itselft с перевернутыми координатами, чтобы получить желаемый результат. – lupz

ответ

4

Я был в аналогичной ситуации с ОП, которая потребовала от меня изменить различные координаты в декартовой системе координат с началом в левом нижнем углу. (Мне пришлось перенести старую видеоигру, которая была разработана с системой координат, отличной от Каира, и из-за ограничений по времени/возможных ошибок расчета/точности портов я решил, что лучше не переписывать всю группу) К счастью, я нашел в порядке подход к изменению системы координат Каира. Этот подход основан на внутренней матрице преобразования Каира, которая преобразует вклад Каира в пользовательское устройство. Решение было изменить эту матрицу на матрицу отражения, матрицу, которая отражает его вход через ось х, например, так:

cairo_t *cr; 
cairo_matrix_t x_reflection_matrix; 
cairo_matrix_init_identity(&x_reflection_matrix); // could not find a oneliner 
/* reflection through the x axis equals the identity matrix with the bottom 
left value negated */ 
x_reflection_matrix.yy = -1.0; 
cairo_set_matrix(cr, &x_reflection_matrix); 
// This would result in your drawing being done on top of the destination 
// surface, so we translate the surface down the full height 
cairo_translate(cr, 0, SURFACE_HEIGHT); // replace SURFACE_HEIGHT 
// ... do your drawing 

Там есть один улов, однако: текст будет также получить зеркальное отображение. Чтобы решить эту проблему, можно изменить матрицу преобразования шрифтов.Необходимый код для этого будет:

cairo_matrix_t font_reflection_matrix; 
// We first set the size, and then change it to a reflection matrix 
cairo_set_font_size(cr, YOUR_SIZE); 
cairo_get_font_matrix(cr, &font_reflection_matrix); 
// reverse mirror the font drawing matrix 
font_reflection_matrix.yy = font_reflection_matrix.yy * -1; 
cairo_set_font_matrix(cr, &font_reflection_matrix); 
+0

Спасибо, rien333, я не знал о функции cairo_set_font_matrix. Я согласен, это насколько я знаю лучшее решение. – user3144699

+0

, похоже, работает для нескольких пользователей, может быть, примите ответ? – rien333

1

Ответ:

Пересмотрите свои координаты и передавать их правильно Каир. Если ваш источник координат имеет инвертированную ось, предварительно обработайте их, чтобы перевернуть геометрию. Это будет называться кодом клея, и это необходимо.

Материал:

Это очень распространенная вещь с 2D компьютерной графики, чтобы начало координат (0,0) в верхнем левом углу и оси у заголовка вниз (см каркасную/Photoshop, позиционирование в html, холст webgl). Как всегда, есть и другие примеры (PDF). Я не уверен, в чем причина, но я бы предположил направление чтения на бумаге (сверху вниз) и/или процесс рендеринг/рисование изображения на экране. Мне кажется, что это самый простой способ обработать изображение в определенном положении от первого до последнего пикселя (вам не нужно предварительно вычислять его размер).

Я не думаю, что вы наедине с вашим противником. Но я не думаю, что есть стандартная математическая система координат. Даже самая распространенная система клеточной системы координат является неполной, когда стрелки, указывающие направление оси, отсутствуют.

+0

Спасибо за ваш ответ. Я понимаю необходимость системы компьютерной графики. Я просто удивляюсь, почему Каир не предлагает другие системы координат, потому что это не будет большой проблемой для его реализации. Так или иначе, так оно и есть! – user3144699

1

Реферат: Из обсуждения я предполагаю, что существует только одна система координат, используемая Каиром: ось x вправо, ось y вниз. Если нужна стандартная математическая система координат (ось x вправо, ось y вверх), необходимо предварительно обработать данные.