Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   [Q] функция текстовой дуги (PHP, GD) (https://forum.antichat.xyz/showthread.php?t=112031)

draliokero 19.03.2009 21:02

[Q] функция текстовой дуги (PHP, GD)
 
Помогите пожалуйста написать функцию: нужно вывести текст в виде дуги.

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 (http://forum.antichat.ru/)
 */

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]);
    }



scrat 19.03.2009 21:44

можно пример такой дуги? я не очень понял.

draliokero 19.03.2009 22:02

Да, пожалуйста:
http://s48.radikal.ru/i120/0903/27/360236be902b.jpg

Pashkela 19.03.2009 22:09

ну вот информация к размышлению:

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);

?>

результат:

http://s55.radikal.ru/i149/0903/55/da5e4bece065.jpg

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

scrat 19.03.2009 22:31

тут либо считать угол наклона каждой буквы либо искажать изображение

draliokero 19.03.2009 22:48

Pashkela, мне тоже в голову сначала пришло, что нужно через цикл для каждого символа менять координаты…. Из-за середины больше на знак крышки похоже, чем на дугу. Но думаю если количество символов в строке четное, например 6, то для 3го и 4го символа задавать специальные координаты, если нет, скажем 5, то для 3го символа.

scrat, я c GD только сейчас начал работать, подскажите, пожалуйста, как с искажением можно сделать?

Pashkela 19.03.2009 22:52

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

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

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

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

А итоговый результат зависит как и от РАЗМЕРА шрифта, так и от ТИПА шрифта, в общем чисто визуальное восприятие.

mailbrush 19.03.2009 23:31

Эм, а не легче будет найти/написать свой шрифт дугоподобный?

scrat 19.03.2009 23:32

если вы не видите что надпись на картинке по дуге,то вам надо срочно употребить LSD.
http://leprastuff.ru/data/img/200903...c4971173f7.jpg

ps ща доделаю.

draliokero 19.03.2009 23:44

mailbrush, каждый символ такого шрифта должен иметь несколько позиций и нужно будет вычислять когда использовать каждую позицию символа.

scrat 20.03.2009 00:06

Цитата:

Сообщение от draliokero
mailbrush, каждый символ такого шрифта должен иметь несколько позиций и нужно будет вычислять когда использовать каждую позицию символа.

да это элементарная тригонометрия,на листочке всё уже расписал,чёто только криво работает.

scrat 20.03.2009 00:39

http://leprastuff.ru/data/img/200903...d70f98f3bb.png

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

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);
?>


draliokero 20.03.2009 00:52

В сети по данному сабжу не чего не нашел…
Pashkela, scrat, спасибо Вам большое за помощь!!

PHP код:

//не ясен наклон букв(возможно зависит от шрифта) 

Нужно с $ang проиграться

scrat 20.03.2009 01:25

Цитата:

Сообщение от draliokero
В сети по данному сабжу не чего не нашел…
Pashkela, scrat, спасибо Вам большое за помощь!!

PHP код:

//не ясен наклон букв(возможно зависит от шрифта) 

Нужно с $ang проиграться

лол,думаешь я не поигрался...

Chaak 20.03.2009 01:35

scrat, скрипт не работает =\

draliokero 20.03.2009 01:44

Chaak, GD>=2, arial.ttf в текущей директории скрипта.

Chaak 20.03.2009 02:06

Все есть =\ скрипт генерирует черную точку по центру

Pashkela 20.03.2009 02:10

у меня работает

Chaak 20.03.2009 13:36

Кладу рядом arial.ttf
Php 5.3
Gd 2.1

draliokero 20.03.2009 14:01

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

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


Время: 13:03