[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(800, 800);

    $string = 'ANTICHAT';

    $bg = imagecolorallocate($im, 255, 255, 255);
    $black = imagecolorallocate($im, 0, 0, 0);

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

    for (
    $i=0;$i<strlen($string);$i++) {
      
      
    imagechar($im, 20, $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", 250, 250, 180, 0, 50, $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($im, 10, $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, у меня такой же суповой набор и все работает. Как вариант если точка есть, то возможно радиус выставлен большой и текстовая дуга находится за пределами изображения.

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