Функция ImgArc или аналог ей...

SergOk

Guest
Функция ImgArc или аналог ей...

Доброго дня.

Хотелось бы узнать кто и как решает проблему с насечками в прорисовке круга при помощи ImgArc(); ?



Видел не однократно круговые крафики и элипсом на РНР без засечек как на рисунке 2:



Можно это решить стандартными средствами графики РНР или нужно писать свою функцию прорисовки?

Спасибо.
 

Cid

...двинутый новичок
Стандартными алгоритмами можно решить только проблему с устранением засечек в прямой линии. GD это позволяет (см. [m]imageantialias[/m])

Для эллипсов это, увы, не прокатывает, т.к. в случае линии достаточно обычной линейной (сорри :) ) интерполяции.

В мане была ссылка на скрипт "от товарища", в котором сглаживание реализовывалось вручную (правда, к эллипсам все равно не подходило).
 

SergOk

Guest
Cid, увы...

для круга это действительно не канает...
такое впечатление, что прорисоку "ровного" круга и элипса делают через собственную пользовательскую функцию...
 

ForJest

- свежая кровь
1. делаешь изображение в 10 раз больше необходимого
2. рисуешь все что надо
3. уменьшаешь.
 

SergOk

Guest
ForJest, привет!
Как добрался? :)

Дык ведь img выводится в поток для браузера...
думаешь после прорисовки сжать всё в 10 раз и пропадут засечки??? :)

Прикол в том, что я видел как реализована прорисовка в Инете, взять тот же HotLog с круговыми диаграммами, но не пойму чем именно...
 

ForJest

- свежая кровь
SergOk
Нормально, спасибо.
trent об этом говорил на конференции. В поток ты выдаёшь результат. Т.е. уменьшение ты делаешь до, того как выдаёшь в браузер. Ну я думаю это не сложно представить. Картинку с масшатбом в 10 раз большую, которую ты рисуешь, а потом уменьшаешь.
 

SergOk

Guest
ForJest, представить не сложно и уменьшить тоже... :)
но помнишь как в том кино? "Где же у него кнопка?"
Результат процесса уменьшения будет значительно отличаться от того, как прорисовывается без засечек вообще!

-~{}~ 13.10.04 19:42:

Доброго дня.

А вот и решение задачи... Сам спросил и сам ответил...

PHP:
    $x = 600;
    $y = 500;

    $myImg = ImageCreate ($x, $y);      
    $ColFon = ImageColorAllocate ($myImg, 220, 250, 250);  
    $ColArc = ImageColorAllocate ($myImg, 22, 25, 25); 

    $hw1=401;
    $hw2=401;

    $cx=300;
    $cy=250;

    for ($gr=0;$gr<=359;$gr++) {

        $cc[$gr] = cos (pi()*$gr/180) * $hw1/2;   
        $cs[$gr] = sin (pi()*$gr/180) * $hw2/2;   
        $cc[$gr+1] = cos (pi()*($gr+1)/180) * $hw1/2;  
        $cs[$gr+1] = sin (pi()*($gr+1)/180) * $hw2/2;  

        ImageLine ($myImg, $cc[$gr+1]+$cx, $cs[$gr+1]+$cy, $cc[$gr]+$cx, $cs[$gr]+$cy, $ColArc);
        ImageLine ($myImg, $cc[$gr+1]+$cx, $cs[$gr+1]+$cy, $cc[$gr]+$cx, $cs[$gr]+$cy, $ColArc);
    }
если кто оптимиирует, мыльте...

УДАЧИ!
 

SiMM

Новичок
SergOk, поищи в гугле реализацию алгоритма Брезнехема для окружностей - думаю, работать будет на порядок быстрее, чем sin/cos, да и аппроксимация поточнее.
 

SergOk

Guest
SiMM, гугль говорит, что такого мужика не найдено!
 

SiMM

Новичок
Пардон, в спешке пропустил одну букву. Алгоритм Брезенхема рисования окружности (до кучи - при желании можно так же обойтись и без умножений в цикле). Подобный алгоритм так же существует и для эллипса.

-~{}~ 15.10.04 14:42:

Ещё до кучи можно глянуть http://helper10.narod.ru/alg17.htm
 
Сверху