Как задать ширину линии, чтобы линии в gif отображались как на экране?

Pixilang по русски
Post Reply
turok1997
Posts: 2
Joined: Mon Feb 19, 2018 4:35 am

Как задать ширину линии, чтобы линии в gif отображались как на экране?

Post by turok1997 » Mon Feb 19, 2018 4:46 am

Здравствуйте. Когда я сохраняю анимацию с экрана в gif, все линии почти не заметны, особенно в чате фейсбука. Например я создал нечто подобное первой анимации:
Image
Мой gif:
Image

Как можно увеличить толщину линий, кроме как set_pixel_size()? И еще интереусует как поставить более жирные точки в местах пересечения линий.
Last edited by turok1997 on Wed Feb 21, 2018 7:45 am, edited 1 time in total.

User avatar
NightRadio
Site Admin
Posts: 3016
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Как задать ширину линии, чтобы линии в gif отображались как на экране?

Post by NightRadio » Mon Feb 19, 2018 5:22 pm

Добрый день!
В Pixilang нет готовых функций для рисования более жирных линий/точек со сглаживанием.

Для точки со сглаживанием можно использовать вот такую функцию:

Code: Select all

fn draw_antialiased_dot( $x, $y, $color )
{
    $t = get_transp()
    $xx = ( $x + 1024 ) * 256
    $xc = $xx & 255
    $yy = ( $y + 1024 ) * 256
    $yc = $yy & 255
    $ycc = 255 - $yc
    $tx1 = 255 - $xc
    $tx2 = $xc
    $x = ( $xx >> 8 ) - 1024
    $y = ( $yy >> 8 ) - 1024
    transp( ( ( ( $tx1 * $ycc ) >> 8 ) * $t ) >> 8 )
    dot( $x, $y, $color )
    transp( ( ( ( $tx2 * $ycc ) >> 8 ) * $t ) >> 8 )
    dot( $x + 1, $y, $color )
    transp( ( ( ( $tx1 * $yc ) >> 8 ) * $t ) >> 8 )
    dot( $x, $y + 1, $color )
    transp( ( ( ( $tx2 * $yc ) >> 8 ) * $t ) >> 8 )
    dot( $x + 1, $y + 1, $color )
    transp( $t )
}
Жирную точку можно составить из нескольких точек рядом.
Линию, опять же, можно составить из тех же самых точек. Я сам так делаю в примере modulation.pixi
Или можно воспользоваться вот таким алгоритмом: https://ru.wikipedia.org/wiki/%D0%90%D0 ... 0%92%D1%83

turok1997
Posts: 2
Joined: Mon Feb 19, 2018 4:35 am

Re: Как задать ширину линии, чтобы линии в gif отображались как на экране?

Post by turok1997 » Mon Feb 19, 2018 9:21 pm

Спасибо за ответ! А на чем основана логика этой функции? Где можно почитать принцип её работы, ну или хотя бы как называется эта техника рисования точки? Ведь если это рисование соседних точек, то можно было бы просто ограничиться вызовами dot(x, y+1), dot(x+1, y) и т.д. Что за вычисления в функции?

Edit: читаю про anti-aliasing, и как я понял это коррекция яркости цвета?

User avatar
NightRadio
Site Admin
Posts: 3016
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Как задать ширину линии, чтобы линии в gif отображались как на экране?

Post by NightRadio » Tue Feb 20, 2018 10:36 am

Логика такая: точка XY не попадает ровно в один пиксель, а находится где-то между четырьмя соседними (прямоугольник 2x2 пикселя). Поэтому рисуем четыре пикселя вместо одного. А непрозрачность каждого пикселя зависит от того, насколько он близок к координатам точки XY.
Грубо говоря, anti-aliasing сглаживает контуры объектов (в том числе и простых точек, как в моем примере), добавляя дополнительные полупрозрачные точки по краям.

Post Reply