|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
ветеран форума
|
Равномерное распределение объектов на спирали
Есть такой вот код для построения спирали
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("Остановите Землю, я сойду!!!"); |
|
|||||
step - длина дуги между объектами (Ваше расстояние, которое Вы хотите постоянным сделать). Т.е. правильнее бы было мерять расстояние (по прямой линии, а не по дуге), но может и так покатит
|
|
|||||
ветеран форума
|
Спасибо, работает, но изменяется вид спирали, т.е. она уже не похожа на Архимедову, расстояния между витками не постоянные.
Есть еще варианты именно для Архимедовой спирали?
__________________
trace("Остановите Землю, я сойду!!!"); |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Можно так попробовать.
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; }
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Всё там то, коэффициенты только подобрать надо. У подобных подходов и спирали Архимеда в 0 будут проблемы. Альтернатива - как я предлагал решать численно или гибрид, чтоб около 0 оно численно решало. Сейчас влом численное писать, ну и оно тяжелее вычислительно.
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; }
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
Часовой пояс GMT +4, время: 07:19. |
|
« Предыдущая тема | Следующая тема » |
|
|