<?php
function imagerotate(&$img, $ang, $bg=false, $width=false, $height=false, $bench=false) {
if($bench) $time = microtime();
if(!$bg) $bg = imagecolorallocate($img, 255,255,255);
// size of the image
$src_w = imagesx($img);
$src_h = imagesy($img);
// reduce angle
while($ang > 180) $ang = $ang-360;
while($ang < -180) $ang = $ang+360;
// угол > 90°
if($ang > 90) {
imagerotate($img, 90, $bg, $src_h,$src_w);
$ang = $ang - 90;
}
elseif($ang < -90) {
imagerotate($img, -90, $bg, $src_h,$src_w);
$ang = $ang + 90;
}
// размер изображения
$src_w = imagesx($img);
$src_h = imagesy($img);
if($ang != 0) {
// перевод градусов в радианы
if($ang > 0) $wrad = deg2rad($ang);
else $wrad = deg2rad((-1*$ang));
$sin = sin($wrad); if($sin < 0) $sin*=-1;
$cos = cos($wrad); if($cos < 0) $cos*=-1;
// размер изображения, после поворота
$dst_w = (int) ( $sin*$src_h + $cos*$src_w );
$dst_h = (int) ( $cos*$src_h + $sin*$src_w );
if($dst_w < 0) $dst_w *= -1;
if($dst_h < 0) $dst_h *= -1;
$scale_x = (int) ( $width/$dst_w );
$scale_y = (int) ( $height/$dst_h );
// создаем изображение и устанавливаем цвет фона
$dst_img = imagecreatetruecolor($dst_w, $dst_h);
imagefill($dst_img, 0,0, $bg);
for($i=0; $i<$src_h; $i++) {
for($j=0; $j<$src_w; $j++) {
// получаем новую позицию пикселя
if($ang > 0) {
$dst_x = (int) ( $sin*($src_h-$i) + $cos*$j );
$dst_y = (int) ( $sin*$j + $cos*$i );
}
else {
$dst_x = (int) ( $sin*$i + $cos*$j );
$dst_y = (int) ( $sin*($src_w-$j) + $cos*$i );
}
if($scale_x != 0) $dst_x = $dst_x*$scale_x;
if($scale_y != 0) $dst_y = $dst_y*$scale_y;
// получаем цвет данного пикселя
$col = imagecolorat($img, $j, $i);
// рисуем пиксель (рисуем два пикселя за раз чтобы избежать появления брешей/окон)
imagefilledrectangle($dst_img, $dst_x,$dst_y, $dst_x+1,$dst_y, $col);
}
}
// необходимо взять пробу
if($width!==false && $height!==false && ($width!=$dst_w || $height!=$dst_h)) {
$new_img = imagecreatetruecolor($width, $height);
imagefill($new_img, 0,0, $bg);
imagecopyresampled($new_img, $dst_img, 0,0,0,0, $width,$height, $dst_w,$dst_h);
imagedestroy($dst_img);
$img = $new_img;
}
else $img = $dst_img;
}
// не надо поворачивать, только взять пробу
elseif($width!==false && $height!==false && ($width!=$dst_w || $height!=$dst_h)) {
$dst_img = imagecreatetruecolor($width, $height);
imagefill($dst_img, 0,0, $bg);
imagecopyresampled($dst_img, $img, 0,0,0,0, $width, $height, $src_w, $src_h);
$img = $dst_img;
}
// ничего не надо делать
else $img = $dst_img;
if(!$bench) return;
// необязательная часть модуля, которая выводит данные работы функции
elseif($bench == "IMAGE") {
list($usec, $sec) = explode(" ",microtime());
$etime = (float)$usec + (float)$sec;
list($usec, $sec) = explode(" ",$time);
$etime -= (float)$usec + (float)$sec;
$etime = substr($etime, 0, 7);
imagefilledrectangle($img, 0,0, 42,12, imagecolorallocate($img, 255,255,255));
imagestring($img, 2, 0,0, $etime, imagecolorallocate($img, 0,0,0));
}
elseif($bench == "STRING") {
list($usec, $sec) = explode(" ",microtime());
$etime = (float)$usec + (float)$sec;
list($usec, $sec) = explode(" ",$time);
$etime -= (float)$usec + (float)$sec;
return $etime;
}
}
?>
Код анимирования. Крутящееся колесо
Спасибо за ответы!
X:=15*cos(ugl*180/pi);
Y:=15*sin(ugl*180/pi);
Где Х и Y - координаты точки; ugl- угол; 15-произвольно взятое число, которое обозначает радиус окружности.
Естественно это все надо заточить в цикл и постоянно изменять угол.
P.S. Думаю крутиться колесо заствить таким образом, привязав линии к этим точкам, не составит большого труда.
Цитата: Salamansar
Ну, на счет самого колеса- не знаю но чтобы точка крутилась по окружности обычно применяют такие формулы:
X:=15*cos(ugl*180/pi);
Y:=15*sin(ugl*180/pi);
Где Х и Y - координаты точки; ugl- угол; 15-произвольно взятое число, которое обозначает радиус окружности.
Естественно это все надо заточить в цикл и постоянно изменять угол.
P.S. Думаю крутиться колесо заствить таким образом, привязав линии к этим точкам, не составит большого труда.
X:=15*cos(ugl*180/pi);
Y:=15*sin(ugl*180/pi);
Где Х и Y - координаты точки; ugl- угол; 15-произвольно взятое число, которое обозначает радиус окружности.
Естественно это все надо заточить в цикл и постоянно изменять угол.
P.S. Думаю крутиться колесо заствить таким образом, привязав линии к этим точкам, не составит большого труда.
А например средствами JS или PHP это дело вожможно осуществить?
Цитата: real_kas
Хотелось бы посмотреть как может выглядеть код крутящегося колеса (рисующийся тригонометрическими формулами). Кто знает как это осуществить? Язык программирования значения не имеет. Подойдёт любой.
Могу подсказать на VB6. Надо создать PictureBox и Timer. Дальше следующий код:
Код:
Dim Ugl, CenterX, CenterY, Rad
'Угол, координаты центра колеса, радиус
Private Sub Timer1_Timer()
Ugl = Ugl + 1 / 180 * 3.14 'Прибавляем 1 радиан
X = Rad * Cos(Ugl) 'Это координаты для одного диаметра
Y = Rad * Sin(Ugl)
Picture1.Cls
Picture1.Circle (CenterX, CenterY), Rad 'Построение круга
Picture1.Line (CenterX, CenterY)-(CenterX + X, CenterY + Y) 'Построение диаметра
Picture1.Line (CenterX, CenterY)-(CenterX - X, CenterY - Y)
X = Rad * Cos(Ugl + 1.57) 'Это координаты для другого диаметра
Y = Rad * Sin(Ugl + 1.57)
Picture1.Line (CenterX, CenterY)-(CenterX + X, CenterY + Y) ''Построение диаметра
Picture1.Line (CenterX, CenterY)-(CenterX - X, CenterY - Y)
End Sub
'Угол, координаты центра колеса, радиус
Private Sub Timer1_Timer()
Ugl = Ugl + 1 / 180 * 3.14 'Прибавляем 1 радиан
X = Rad * Cos(Ugl) 'Это координаты для одного диаметра
Y = Rad * Sin(Ugl)
Picture1.Cls
Picture1.Circle (CenterX, CenterY), Rad 'Построение круга
Picture1.Line (CenterX, CenterY)-(CenterX + X, CenterY + Y) 'Построение диаметра
Picture1.Line (CenterX, CenterY)-(CenterX - X, CenterY - Y)
X = Rad * Cos(Ugl + 1.57) 'Это координаты для другого диаметра
Y = Rad * Sin(Ugl + 1.57)
Picture1.Line (CenterX, CenterY)-(CenterX + X, CenterY + Y) ''Построение диаметра
Picture1.Line (CenterX, CenterY)-(CenterX - X, CenterY - Y)
End Sub
Можно менять координаты центра - имитировать качение колеса. Вместо процедуры с таймером можно использовать и цикл.