Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.10.2012, 14:00
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 1  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
По умолчанию Равномерное распределение объектов на спирали

Есть такой вот код для построения спирали

Код AS3:
import flash.display.Shape;
import flash.display.Graphics;
 
function getSpiral(radius:Number, coils:Number, sides:uint):Shape
{
	var s:Shape = new Shape();
	var canvas:Graphics = s.graphics;
 
	var awayStep:Number = radius/sides;
	var aroundStep:Number = (coils/sides) * 2 * Math.PI;
	var angle:Number = 0;
	var radius:Number = 0;
	var xPoint:Number = 0;
	var yPoint:Number = 0;
 
	for (var i:uint = 0; i < sides; i++)
	{
		radius = i * awayStep;
		angle = i * aroundStep;
 
		xPoint = radius * Math.cos(angle);
		yPoint = radius * Math.sin(angle);
 
		canvas.beginFill(0xFF0000);
		canvas.drawCircle(xPoint, yPoint, 5);
		canvas.endFill();
	}
 
	return s;
}
 
var spiral1:Shape = getSpiral(200, 3, 100);
spiral1.x = int(stage.stageWidth * .5);
spiral1.y = int(stage.stageHeight * .5);
addChild(spiral1);
Получается чем дальше объекты по витку, тем больше между ними (объектами или точками на витке) расстояние. Оно и понятно.

Как разместить объекты равномерно на такой спирали, чтоб все расстояния между объектами были равны?
Т.е. начиная от центра, отмеряем равные расстояния и помещаем в эту точку объект. Понимаю что нужно компенсировать угол в меньшую сторону с каждым витком, но не понимаю как.
__________________
trace("Остановите Землю, я сойду!!!");

Старый 03.10.2012, 14:13
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Код AS3:
var angle:Number = 0;
for (var i:uint = 0; i < sides; i++)
{
	radius = i * awayStep;
	xPoint = radius * Math.cos(angle);
	yPoint = radius * Math.sin(angle);
 
	// Добавляем объект в xPoint, yPoint
 
	angle += step / radius;
}
step - длина дуги между объектами (Ваше расстояние, которое Вы хотите постоянным сделать). Т.е. правильнее бы было мерять расстояние (по прямой линии, а не по дуге), но может и так покатит

Старый 03.10.2012, 14:40
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 3  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Спасибо, работает, но изменяется вид спирали, т.е. она уже не похожа на Архимедову, расстояния между витками не постоянные.

Есть еще варианты именно для Архимедовой спирали?
__________________
trace("Остановите Землю, я сойду!!!");

Старый 03.10.2012, 16:25
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 4  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Можно так попробовать.
Код AS3:
var angle:Number = 0.01;//c 0 нельзя начать в общем, если что отдельно поставить
const spiralCoeff:Number = 1;
const stepCoeff:Number = 0.1;
for (var i:uint = 0; i < sides; i++)
{
	radius = spiralCoeff * angle;
	xPoint = radius * Math.cos(angle);
	yPoint = radius * Math.sin(angle);
 
	// Добавляем объект в xPoint, yPoint
 
	angle += stepCoeff / radius;
}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 03.10.2012, 17:14
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 5  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Цитата:
Сообщение от -De- Посмотреть сообщение
Можно так попробовать.
не, совсем не то что нужно получается, даже на спираль не похоже
__________________
trace("Остановите Землю, я сойду!!!");

Старый 03.10.2012, 18:32
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 6  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Всё там то, коэффициенты только подобрать надо. У подобных подходов и спирали Архимеда в 0 будут проблемы. Альтернатива - как я предлагал решать численно или гибрид, чтоб около 0 оно численно решало. Сейчас влом численное писать, ну и оно тяжелее вычислительно.

Код AS3:
var angle:Number = 1.0;//c 0 нельзя начать в общем, если что отдельно поставить
			const spiralCoeff:Number = 5;
			const stepCoeff:Number = 10;
			graphics.lineStyle(0);
			for (var i:uint = 0; i < 5000; i++)
			{
				var radius:Number = spiralCoeff * angle;
				var xPoint:Number = radius * Math.cos(angle) + 300;
				var yPoint:Number = radius * Math.sin(angle) + 300;
				graphics.drawCircle(xPoint, yPoint, 2);
				// Добавляем объект в xPoint, yPoint
 
				angle += stepCoeff / radius;
			}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 03.10.2012, 18:49
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 7  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Цитата:
Сообщение от -De- Посмотреть сообщение
Всё там то, коэффициенты только подобрать надо.
спасибо, то что нужно, идею понял.
__________________
trace("Остановите Землю, я сойду!!!");

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:53.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.