Похоже, вы уже проделали большую часть тяжелой работы с полярной системой координат. Имейте в виду, однако, что углы указаны в радианах, а не в градусах, поэтому вместо использования 360
следует использовать PI * 2
. Теперь все, что вам нужно сделать, это одновременно увеличить distance
и theta
, чтобы создать спираль, а phi
остается близким к 0, чтобы создать плоскость эклиптики галактики.
distance
будет расти с 0
до galaxySize
theta
будет расти с 0
до Math.PI
(или PI * 2
, если вы хотите более плотные спирали) phi
остается близким к 0 // Temp variables to assign new values inside loop
var norm, theta, phi, thetaVar, distance;
// Generate particles for spiral galaxy:
for (let i = 0; i < 1000; i++) {
// Norm increments from 0 to 1
norm = i / 1000;
// Random variation to theta [-0.5, 0.5]
thetaVar = THREE.Math.randFloatSpread(0.5);
// Theta grows from 0 to Math.PI (+ random variation)
theta = norm * Math.PI + thetaVar;
// Phi stays close to 0 to create galaxy ecliptic plane
phi = THREE.Math.randFloatSpread(0.1);
// Distance grows from 0 to galaxySize
distance = norm * galaxySize;
// Here I need generate spiral arms instead of sphere.
geometry.vertices.push(new THREE.Vector3(
distance * Math.sin(theta) * Math.cos(phi),
distance * Math.sin(theta) * Math.sin(phi),
distance * Math.cos(theta)
));
}
Вы можете создать одну петлю для каждой руки. Обратите внимание, что вместо деления на 10 в конце, как вы делали в своем примере, я просто ограничил диапазон phi до [-0.1, 0.1]
. Вы можете увидеть это в действии в этой скрипке
Спасибо за парней комментариев. Я пошел со следующим:
var EntriesRegistry = (function(){
var instance = null;
function __constructor() {
var
self = this,
observations = {};
this.set = function(n,v)
{
self[n] = v;
if( observations[n] )
for( var i=0; i < observations[n].length; i++ )
observations[n][i].apply(null, [v, n]);
}
this.get = function(n)
{
return self[n];
}
this.observe = function(n,f)
{
if(observations[n] == undefined)
observations[n] = [];
observations[n].push(f);
}
}
return new function(){
this.getInstance = function(){
if (instance == null)
{
instance = new __constructor();
instance.constructor = null;
}
return instance;
}
}
})();
var entries = EntriesRegistry.getInstance();
var test = function(v){ alert(v); };
entries.set('bob', 'meh');
entries.get('bob');
entries.observe('seth', test);
entries.set('seth', 'dave');
Принятие Ваших комментариев, я буду использовать делегацию события на объектах формы, чтобы обновить реестр и инициировать зарегистрированные методы наблюдения.
Это работает хорошо на меня, до сих пор... может Вы парни видеть какие-либо проблемы с этим?
Вы могли присоединить слушателя контейнера (тело или форма) и затем использовать параметр события для реакции на изменение. Вы получаете все совершенство слушателя, но только должны присоединить один для контейнера вместо одного для каждого элемента.
$('body').change(function(event){
/* do whatever you want with event.target here */
console.debug(event.target); /* assuming firebug */
});
event.target содержит элемент, на который нажали.
SitePoint имеет хорошее объяснение здесь делегации события:
делегация события JavaScript является простой техникой, которой Вы добавляете единственный обработчик событий к родительскому элементу, чтобы избежать необходимости добавлять обработчики событий к нескольким дочерним элементам.
Поддержка браузеров с мотором Mozilla Object.watch, но я не знаю о перекрестном браузере совместимый эквивалент.
Вы представили страницу с Firebug для понимания точно, что вызывает замедление или "много обработчиков событий" предположение?
jQuery просто удивителен. Хотя Вы могли смотреть к Предварительному просмотру Ajax ASP.NET.
функциями Some являются просто .js файлы, никакая зависимость с.NET. Можете быть Вы, мог найти полезным реализация шаблона "наблюдатель".
var o = { foo: "Change this string" };
Sys.Observer.observe(o);
o.add_propertyChanged(function(sender, args) {
var name = args.get_propertyName();
alert("Property '" + name + "' was changed to '" + sender[name] + "'.");
});
o.setValue("foo", "New string value.");
кроме того, Клиентские шаблоны готовы использовать для некоторых интересных сценариев.
примечание финала А, это полностью совместимо с jQuery (не проблема с $)
Ссылки: Домашняя страница , Версия я в настоящее время использую
Насколько я знаю, нет никаких событий, стрелял в изменения Атрибута объекта (редактирование: кроме, по-видимому, для Object.watch
).
, Почему бы не использовать делегацию события везде, где возможный? Таким образом, события на форме, а не на отдельных элементах формы, получая события, поскольку они пузырятся?
, Например (мой jQuery ржав, простите мне за использование Прототипа вместо этого, но я уверен, что Вы будете в состоянии адаптировать его легко):
$(form).observe('change', function(e) {
// To identify changed field, in Proto use e.element()
// but I think in jQuery it's e.target (as it should be)
});
можно также получить input
и keyup
и paste
события, если Вы хотите, чтобы он стрелял в текстовые поля, прежде чем они потеряют фокус. Мое решение для этого обычно:
input
относительно form
. keyup
и paste
события на textarea
с (они не стреляют input
в [1 111] с по некоторым причинам). keyup
, и paste
на form
change
относительно form
(это стреляет select
с. paste
события, сравните текущее значение поля с его значением по умолчанию (чем было его значение, когда страница была загружена) путем сравнения текстового поля value
с defaultValue
Редактирование: вот пример кода, который я разработал для предотвращения неизмененного представления формы и т.п.:
, Что лучший способ состоит в том, чтобы отследить изменения в форме с помощью JavaScript?