Показать сообщение отдельно
  #1 (permalink)  
Старый 03.02.2014, 23:54
Аспирант
Отправить личное сообщение для Synov_son Посмотреть профиль Найти все сообщения от Synov_son
 
Регистрация: 02.08.2013
Сообщений: 74

Элемнты не двигаются по кругу дальше угла pi/2
Доброго времени суток. Ребята помогите пожалуйста. Написал скрипт для сайта с продуктом. В чем его суть. Продукт задал фоновой картинкой блока а в блоке по кругу движутся всякие возможные ингредиенты к этому продукту. Ну в общем:
-php выстраивает мой круг из продуктов по такой логике. Блоку квадратный 400х400 пикселей, он берет центр блока за точку 0(200;200) -начало координат. Ну и я беру радиус круга(r) за 200 и элементам даю стиль left и top, x и y соответственно. Таким образом у меня
Код:
x=r+r*cosA - el_width; y=r-r*sinA - el_height
, где A - такой угол что A=0; A0=2*pi/(кол-во элементов) и при каждом новом элементе я A увеличиваю на A0.
Так я построил свой круг из элементов.
$this->csize = 400;//Размер квадратного блока с кругом внутри
		$this->iwidth = 60;//Ширина картинок с папки images/flavors
		$this->iheight = 42;//Высота картинок с папки images/flavors
		$this->images = glob('images/flavors/*.png');
		$a = 2*M_PI/(count($this->images));//шаг круга
		$a0 = M_PI*1.5;//градус начала отсчета
		$r = $this->csize/2;
		foreach($this->images as $key=>$value){
			$this->images[$key] = str_replace(array('images/flavors/','.png'), '', $value);
			$this->top[$key]= ( $r*(1 - sin($a0)) ) + ($this->iheight/2);//от центра квадратного блока берем отсчет
			$this->left[$key]= ( $r*(1 + cos($a0)) ) + ($this->iwidth/2.6);//и смещаем елементы по кругу
			$a0 += $a;
		}
<?php foreach ($this->images as $key=>$value){?>
				<img id="<?=$key?>" src="<?=BASE?>images/flavors/<?=$value?>.png" alt="<?=$value?>" width="<?=$this->iwidth?>" height="<?=$this->iheight?>" style="top:<?=$this->top[$key]?>px;left:<?=$this->left[$key]?>px">
			<?php }?>


-ну а дальше вне нужно сделать так что бы круг вращался с анимацией. Сначала я сделал так:
var css = $('#next').css(['top','left']);
$('current').animate({'top':css['top'],'left':css['left']}),slow);

То есть я брал координаты следующего элемента и перемещал в их предыдущий, но это оказалось неправильным вариантом. Так как js брал координаты следующего элемента до того как тот окончательно закончил движение и получался маленький круг.
По этому я повторил тоже что и было в php коде, только за угол начального отсчета я брал угол на котором лежит нулевой элемент.
function rotate(){
	var images = $('#menu img').length;
	var a = 2*Math.PI/images;
	var r = $('#menu').height()/2;
	var iheight = $('#menu img').height();
	var iwidth = $('#menu img').width();
	var y0 = +$('#menu #0').css('top').replace( 'px', '');
	var y = y0 - iheight/2;
	var a0 = Math.asin( 1 - y/r );
	for(var i=0;i<images;i++){
		a0 += a;
		itop = ( r*(1 - Math.sin(a0)) ) + (iheight/2);
		ileft = ( r*(1 + Math.cos(a0)) ) + (iwidth/2.6);
		$('#menu #'+i).animate({'top':itop,'left':ileft}, 1200, 'easeOutQuart');
	}
}

Проблема в том что нулевой элемент (при каком бы первичном положении он не был A=0 или A=-p/2 или A=p/2) далее угла pi/2 не перемещается. А если я ставлю его изначально на угол pi/2 он перемещается на один шаг вперед и на один назад (циклично).
Подскажите, пожалуйста, в чем проблема, если смогли понять о чем я (писал на быструю руку). Благодарю.
Ответить с цитированием