Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
[Q] функция текстовой дуги (PHP, GD) |

19.03.2009, 21:02
|
|
Познающий
Регистрация: 14.03.2009
Сообщений: 86
Провел на форуме: 385811
Репутация:
12
|
|
[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]);
}
}
Последний раз редактировалось draliokero; 20.03.2009 в 14:24..
|
|
|

19.03.2009, 21:44
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
можно пример такой дуги? я не очень понял.
|
|
|

19.03.2009, 22:02
|
|
Познающий
Регистрация: 14.03.2009
Сообщений: 86
Провел на форуме: 385811
Репутация:
12
|
|
Да, пожалуйста:

|
|
|

19.03.2009, 22:09
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
ну вот информация к размышлению:
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);
?>
результат:
дальше ломает чото 
|
|
|

19.03.2009, 22:31
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
тут либо считать угол наклона каждой буквы либо искажать изображение
|
|
|

19.03.2009, 22:48
|
|
Познающий
Регистрация: 14.03.2009
Сообщений: 86
Провел на форуме: 385811
Репутация:
12
|
|
Pashkela, мне тоже в голову сначала пришло, что нужно через цикл для каждого символа менять координаты…. Из-за середины больше на знак крышки похоже, чем на дугу. Но думаю если количество символов в строке четное, например 6, то для 3го и 4го символа задавать специальные координаты, если нет, скажем 5, то для 3го символа.
scrat, я c GD только сейчас начал работать, подскажите, пожалуйста, как с искажением можно сделать?
Последний раз редактировалось draliokero; 19.03.2009 в 22:53..
|
|
|

19.03.2009, 22:52
|
|
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме: 9220514
Репутация:
3338
|
|
Ну да, в этом ручье, и сдвиг не такой большой (+10), чтобы типо плавный переход. В общем этот алгоритм, этот. Просто начинать надо с центральной буквы (предварительно даже, вероятно, перегнав строку в массив), а потом уже плясать.
тут главное вот оно, imagechar, остальное - дело техники.
Если нечетное - центральная буква выше всех, четное - две средних буквы типо на одном уровне. В общем надо проверять
А радиус вообще элемнтарно посчитать - y-первой буквы минус y-той буквы, что выше всех (или двух букв)
А итоговый результат зависит как и от РАЗМЕРА шрифта, так и от ТИПА шрифта, в общем чисто визуальное восприятие.
Последний раз редактировалось Pashkela; 19.03.2009 в 22:57..
|
|
|

19.03.2009, 23:31
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме: 6075534
Репутация:
2731
|
|
Эм, а не легче будет найти/написать свой шрифт дугоподобный?
|
|
|

19.03.2009, 23:32
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
если вы не видите что надпись на картинке по дуге,то вам надо срочно употребить LSD.
ps ща доделаю.
|
|
|

19.03.2009, 23:44
|
|
Познающий
Регистрация: 14.03.2009
Сообщений: 86
Провел на форуме: 385811
Репутация:
12
|
|
mailbrush, каждый символ такого шрифта должен иметь несколько позиций и нужно будет вычислять когда использовать каждую позицию символа.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|