LINUX.ORG.RU

[cairo] толщина линии, как лечить?

 


0

0

Доброго времени суток, рисую с помощью каиро линию и устанавливаю её толщину с помощью функции cairo_set_line_width (cr, 1), но это не помогает, линиия всё равно остаётся толстой, мож кто сталкивался с таким, как лечить?

★★★★★

сначала устанавливаете параметры, затем рисуете, да?

pseudo-cat ★★★
()
Ответ на: комментарий от vertexua

РЕШЕНО :)

Код можно взять любой, это в данном случае не важно, покажу на этом:

cairo_set_source_rgb(cr,0.85,0.85,1);
cairo_set_line_width(cr, 1);
cairo_move_to(cr, 20, 0);
cairo_line_to(cr, 20, 50);
cairo_stroke(cr);
Для решения этой проблемы нужно в функции смещения и рисования чуть чуть сдвинуть координату Х, на 0.5 будет достаточно, т.е сделать так:
 
cairo_move_to(cr, 20.5, 0);
cairo_line_to(cr, 20.5, 50); 

xterro ★★★★★
() автор топика
Ответ на: РЕШЕНО :) от xterro

У кайро все надо сдвигать на 0,5. С пикселами у них нелюбовь

bioreactor ★★★★★
()
Ответ на: комментарий от vertexua

Скрины выложите если не лень со сдвигом и без.

vertexua ★★★★★
()
Ответ на: РЕШЕНО :) от xterro

я коненчо понимаю, в школе приучили, что экран состоит из пикселей. да и винда этому учит. но в нормальных вещах рисуются не пикселями, а логическими единицами. и 0-0 находится в УГЛУ экрана, а не по середине первого пикселя

namezys ★★★★
()
Ответ на: комментарий от vertexua

cairo_move_to(cr, 20, 0); cairo_line_to(cr, 20, 50);

это рисует линию, проходящую между пикселями.

значит для ее отображения придется использовать 2 пикселя, а не 1

namezys ★★★★
()
Ответ на: комментарий от namezys

Вот именно, что странно у каиро сделана работа с пикселями, если координаты линии (20, 0) - начало и (20, 50) - конец, то логично, что линия должна быть проведена по 20-му пикселю, не между 20 и 21-м пикселем, почему в каиро нужно сдвигать(т.е линия будет проведена по 21-му пикс.) не понятно.

xterro ★★★★★
() автор топика
Ответ на: комментарий от xterro

логично, что линия должна быть проведена по 20-му пикселю,

нет, логично вот это -

0-0 находится в УГЛУ экрана, а не по середине первого пикселя

pseudo-cat ★★★
()

Как только вы будете рисовать с разными толщинами и разными увеличениями и с разными масштабами, то все станет логично и понятно. Т.к. при масштабировании середины пикселей здорово едут, а узлы сетки - нет.

dmitry_vk ★★★
()
Ответ на: комментарий от xterro

Вот именно, что странно у каиро сделана работа с пикселями, если координаты линии (20, 0) - начало и (20, 50) - конец, то логично, что линия должна быть проведена по 20-му пикселю, не между 20 и 21-м пикселем, почему в каиро нужно сдвигать(т.е линия будет проведена по 21-му пикс.) не понятно.

namezys всё правильно говорит. И в cairo всё правильно, в OpenGL (для двухмерного случая) с координатами «та же фигня» =). Просто пиксель - это не точка, как ты считаешь, а квадрат (а в случаях, когда DPI монитора по ширине и высоте не равны - вообще прямоугольник). Чтобы было понятнее:

             (0, 1)    (0, 2)
(0, 0) *--------*--------*--------* (0, 3)
       |        |        |        |
       |   A    |   B    |   C    |
       |        |        |        |
(1, 0) *--------*--------*--------* (1, 3)
       |        |        |        |
       |   D    |   E    |   F    |
       |        |        |        |
(2, 0) *--------*--------*--------* (2, 3)
       |        |        |        |
       |   G    |   H    |   J    |
       |        |        |        |
(3, 0) *--------*--------*--------* (3, 3)
             (3, 1)    (3, 2)
Квадраты, помеченные буквами, - это пиксели, звёздочки - углы пикселей. Координаты в скобках - это именно координаты углов, а не пикселей. Когда ты говоришь cairo, что нужно нарисовать линию (1, 0) - (1, 3), cairo приходится рисовать по пикселям ABCDEF, т.к. линию между этими пикселями (как ты задал координатами) нарисовать физически невозможно, ибо монитор не позволяет рисовать между пикселями =).

Deleted
()
Ответ на: комментарий от Deleted

в OpenGL (для двухмерного случая) с координатами «та же фигня» =).

А ещё то же самое с текстурными координатами. И не только в OpenGL, но и в DirectX.

Deleted
()
Ответ на: комментарий от Deleted

Теперь становится понятней, спасибо :)

xterro ★★★★★
() автор топика
Ответ на: комментарий от vertexua

> Алиасинг должен сводить эфект на нет. Это же не MSPaint

Это заметно только на линиях тольщиной отличной от 1 пикселя.

Или не дисплеях типа iPhone. Но там ты в пикселях же рисовать не будешь - будешь рисовать в см или в другой логической единице

namezys ★★★★
()
Ответ на: комментарий от namezys

Искуственно сделал вертикальную линию и анимацию с половинным шагом. Таки да, в этом случае или тонкая черная или толстая серая

vertexua ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.