Помогите пожалуйста написать функцию: нужно вывести текст в виде дуги. 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]); } }
ну вот информация к размышлению: 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); ?> результат: дальше ломает чото
Pashkela, мне тоже в голову сначала пришло, что нужно через цикл для каждого символа менять координаты…. Из-за середины больше на знак крышки похоже, чем на дугу. Но думаю если количество символов в строке четное, например 6, то для 3го и 4го символа задавать специальные координаты, если нет, скажем 5, то для 3го символа. scrat, я c GD только сейчас начал работать, подскажите, пожалуйста, как с искажением можно сделать?
Ну да, в этом ручье, и сдвиг не такой большой (+10), чтобы типо плавный переход. В общем этот алгоритм, этот. Просто начинать надо с центральной буквы (предварительно даже, вероятно, перегнав строку в массив), а потом уже плясать. тут главное вот оно, imagechar, остальное - дело техники. Если нечетное - центральная буква выше всех, четное - две средних буквы типо на одном уровне. В общем надо проверять А радиус вообще элемнтарно посчитать - y-первой буквы минус y-той буквы, что выше всех (или двух букв) А итоговый результат зависит как и от РАЗМЕРА шрифта, так и от ТИПА шрифта, в общем чисто визуальное восприятие.
mailbrush, каждый символ такого шрифта должен иметь несколько позиций и нужно будет вычислять когда использовать каждую позицию символа.
До конца лень доделывать,сам разберёшься. Общий принцип такой. Если нужны пояснения - пиши в пм/аську. 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); ?>
В сети по данному сабжу не чего не нашел… Pashkela, scrat, спасибо Вам большое за помощь!! PHP: //не ясен наклон букв(возможно зависит от шрифта) Нужно с $ang проиграться
Chaak, у меня такой же суповой набор и все работает. Как вариант если точка есть, то возможно радиус выставлен большой и текстовая дуга находится за пределами изображения. Я поправил функцию и отредактировал свой первый пост, теперь наклон букв нормальный стал.