[Q] функция текстовой дуги (PHP, GD)

Discussion in 'PHP' started by draliokero, 19 Mar 2009.

  1. draliokero

    draliokero Member

    Joined:
    14 Mar 2009
    Messages:
    83
    Likes Received:
    6
    Reputations:
    0
    Помогите пожалуйста написать функцию: нужно вывести текст в виде дуги.

    textarc(“antichat”, x, y, start, end, r); - текстовая дуга с радиусом r, с центром в точке (x,y) от угла start до угла end выводит текст antichat



    Большое спасибо scrat!
    PHP:
    /**
     * @DESC: Функция вывода строки в виде дуги/круга
     * @HELP: textarc("string", 13, 250, 250, 180, 0, 50, $rImage, "arial.ttf", "000000");
     * @NEEDS: PHP 4.0.1 or higher & GD
     * @author: scrat (/)
     */

    function textarc($sText$fSize$fX$fY$fStart$fEnd$fRadius$rImage$sFontfile$iColor)
    {
        
    $a = ($fStart $fEnd) / strlen($sText);

        
    sscanf($iColor"%2x%2x%2x"$red$green$blue);

        
    imagecolorallocate($rImage,255,255,255); 
        
    $iColor imagecolorallocate($rImage$red$green$blue);

        
    imagesetpixel($rImage$fX$fY$iColor);

        
    $fAng $fStart $a;

        for(
    $i 0;$i strlen($sText);$i++) {
            
    $fAng -= $a;

            
    $iXt $fX $fRadius cos(deg2rad($fAng));
            
    $iYt $fY $fRadius sin(deg2rad($fAng));

            
    $fAngle $fStart $fEnd $fAng-90 $fAng 90;

            
    imagettftext($rImage$fSize$fAngle$iXt$iYt$iColor$sFontfile$sText[$i]);
        }
    }
     
    #1 draliokero, 19 Mar 2009
    Last edited: 20 Mar 2009
  2. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    можно пример такой дуги? я не очень понял.
     
  3. draliokero

    draliokero Member

    Joined:
    14 Mar 2009
    Messages:
    83
    Likes Received:
    6
    Reputations:
    0
    Да, пожалуйста:
    [​IMG]
     
  4. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    ну вот информация к размышлению:

    PHP:
    <?php

    $im 
    imagecreate(800800);

    $string 'ANTICHAT';

    $bg imagecolorallocate($im255255255);
    $black imagecolorallocate($im000);

    $x 200// Стартовая x позиция
    $y 200// Стартовая y позиция
    $flag false;

    for (
    $i=0;$i<strlen($string);$i++) {
      
      
    imagechar($im20$x$y$string{$i}, $black);
      if (
    $string{$i}=='I'$flag true
      if (!
    $flag) {
          
    $x $x+10;
          
    $y $y-10;
      } else { 
          
    $x $x+10;
          
    $y $y+10;   
      }
     
    }

    header('Content-type: image/gif');
    imagegif($im);

    ?>
    результат:

    [​IMG]

    дальше ломает чото:)
     
  5. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    тут либо считать угол наклона каждой буквы либо искажать изображение
     
  6. draliokero

    draliokero Member

    Joined:
    14 Mar 2009
    Messages:
    83
    Likes Received:
    6
    Reputations:
    0
    Pashkela, мне тоже в голову сначала пришло, что нужно через цикл для каждого символа менять координаты…. Из-за середины больше на знак крышки похоже, чем на дугу. Но думаю если количество символов в строке четное, например 6, то для 3го и 4го символа задавать специальные координаты, если нет, скажем 5, то для 3го символа.

    scrat, я c GD только сейчас начал работать, подскажите, пожалуйста, как с искажением можно сделать?
     
    #6 draliokero, 19 Mar 2009
    Last edited: 19 Mar 2009
  7. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Ну да, в этом ручье, и сдвиг не такой большой (+10), чтобы типо плавный переход. В общем этот алгоритм, этот. Просто начинать надо с центральной буквы (предварительно даже, вероятно, перегнав строку в массив), а потом уже плясать.

    тут главное вот оно, imagechar, остальное - дело техники.

    Если нечетное - центральная буква выше всех, четное - две средних буквы типо на одном уровне. В общем надо проверять

    А радиус вообще элемнтарно посчитать - y-первой буквы минус y-той буквы, что выше всех (или двух букв)

    А итоговый результат зависит как и от РАЗМЕРА шрифта, так и от ТИПА шрифта, в общем чисто визуальное восприятие.
     
    #7 Pashkela, 19 Mar 2009
    Last edited: 19 Mar 2009
  8. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Эм, а не легче будет найти/написать свой шрифт дугоподобный?
     
  9. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    если вы не видите что надпись на картинке по дуге,то вам надо срочно употребить LSD.
    [​IMG]

    ps ща доделаю.
     
    1 person likes this.
  10. draliokero

    draliokero Member

    Joined:
    14 Mar 2009
    Messages:
    83
    Likes Received:
    6
    Reputations:
    0
    mailbrush, каждый символ такого шрифта должен иметь несколько позиций и нужно будет вычислять когда использовать каждую позицию символа.
     
  11. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    да это элементарная тригонометрия,на листочке всё уже расписал,чёто только криво работает.
     
  12. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    [​IMG]

    До конца лень доделывать,сам разберёшься. Общий принцип такой. Если нужны пояснения - пиши в пм/аську.

    PHP:
    <?php
    header
    ("Content-type: image/jpeg");
    $im imagecreate(500,500); //создаём изображение

    textarc("antichat"250250180050$im"arial.ttf");

    function 
    textarc($s$x$y$start$end$r$im$ttf_file//textarc(строка,x центра,y центра,начальный угол,конечный угол,радиус,картинка,файл шрифта)
    {
        
    $a = ($start-$end) / strlen($s); 

        
    imagecolorallocate($im,255,255,255);
        
    $c imagecolorallocate($im,0,0,0);

        
    imagesetpixel($im,$x,$y,$c);

        
    $ang $start $a;

        for(
    $i=0;$i<strlen($s);$i++)
        {
            
    $ang -= $a;
            
            
    $xt $x $r*cos(deg2rad($ang));
            
    $yt $y $r*sin(deg2rad($ang));

            
    imagettftext($im10$ang$xt$yt$c$ttf_file$s[$i]); //не ясен наклон букв(возможно зависит от шрифта)

        
    }
    }
    imagepng($im);
    ?>
     
    #12 scrat, 19 Mar 2009
    Last edited: 19 Mar 2009
    1 person likes this.
  13. draliokero

    draliokero Member

    Joined:
    14 Mar 2009
    Messages:
    83
    Likes Received:
    6
    Reputations:
    0
    В сети по данному сабжу не чего не нашел…
    Pashkela, scrat, спасибо Вам большое за помощь!!

    PHP:
    //не ясен наклон букв(возможно зависит от шрифта)
    Нужно с $ang проиграться
     
    #13 draliokero, 19 Mar 2009
    Last edited: 20 Mar 2009
  14. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    лол,думаешь я не поигрался...
     
  15. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    scrat, скрипт не работает =\
     
  16. draliokero

    draliokero Member

    Joined:
    14 Mar 2009
    Messages:
    83
    Likes Received:
    6
    Reputations:
    0
    Chaak, GD>=2, arial.ttf в текущей директории скрипта.
     
    #16 draliokero, 20 Mar 2009
    Last edited: 20 Mar 2009
  17. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Все есть =\ скрипт генерирует черную точку по центру
     
    1 person likes this.
  18. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    у меня работает
     
  19. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Кладу рядом arial.ttf
    Php 5.3
    Gd 2.1
     
  20. draliokero

    draliokero Member

    Joined:
    14 Mar 2009
    Messages:
    83
    Likes Received:
    6
    Reputations:
    0
    Chaak, у меня такой же суповой набор и все работает. Как вариант если точка есть, то возможно радиус выставлен большой и текстовая дуга находится за пределами изображения.

    Я поправил функцию и отредактировал свой первый пост, теперь наклон букв нормальный стал.