2013-08-03 4 views
0

Для этого требуется немного визуализации, поэтому извините, если мое объяснение сосет.Нанесение точек на сегмент окружности

Итак, у меня есть центральная точка в 0,0. С этого момента я рисую случайные точки по его окружности в радиусе 350 пикселей (случайное число). Для этого я использую этот код:

var angle = Math.random()*Math.PI*2; 
var x = Math.cos(angle)*radius; 
var y = Math.sin(angle)*radius; 

x+=parent.position.x; 
y+=parent.position.y; 

parent.position это потому, что каждая точка, которая построена также выступает в качестве центрального узла, который имеет детей, которые действуют как узлы и так далее. Это просто устанавливает положение нового узла относительно позиции его родителя.

Таким образом, этот код отлично работает для центрального узла. Проблема в том, что как только вы отделитесь от центра, вы хотите продолжить движение в определенном направлении, чтобы избежать столкновения большого узла узлов. Итак, в то время как этот код называет точку на окружности, мне нужно иметь возможность нарисовать точку на сегменте окружности. Я думаю, возможно, около трети окружности должны быть доступны. Другое препятствие состоит в том, что это должен быть ПРАВИЛЬНЫЙ сегмент окружности. Если узлы разветвляются вверх, я не хочу, чтобы сегмент был нижней половиной окружности, ветвь должна продолжать двигаться в направлении вверх.

Я могу установить общее направление, основанное на позиции нового родительского узла относительно положения его родителя. Но есть ли у кого-нибудь идеи о том, как использовать эти данные, чтобы уменьшить поле в сегменте в этом направлении?

Сообщите мне, если это не имеет смысла, его трудно объяснить без диаграмм.

+0

Выбор по случайности кажется немного проблемой. –

ответ

2

Я думаю, что одним из простых способов сделать это было бы разделить круг на n сегментов (каждое покрытие 2 * PI/n угол). Вы можете настроить n на все, что захотите, в зависимости от того, насколько вы точны. Затем, когда вы вычисляете новую точку x, сначала получите сегмент, в котором x.parent (относительно собственного родителя), и используйте это, чтобы поместить x в тот же раздел по x.parent. Тогда у вас могло бы быть что-то вроде этого:

var getSection = function(point) { 
    var parent = point.parent; 
    var angle = Math.acos((point.x - parent.x)/radius) % (Math.PI*2); 
    var section = Math.floo(angle/(Math.PI * 2/n)) 
    return section; 
} 

var section = getSection(parent); // return the index of the section 
var angle = (Math.random() + section) * Math.PI * 2/n 
var x = Math.cos(angle)*radius; 
var y = Math.sin(angle)*radius; 

x+=parent.position.x; 
y+=parent.position.y; 
+0

Извините за поздний ответ и спасибо за помощь. Однако я не могу заставить код работать. Я сузил проблему до вычисления угла с помощью функции Math.acos(). Прошло много времени с тех пор, как я выполнил настоящую математику, поэтому я мог бы уйти, но не нужна ли функция acos от -1 до 1? По этой же причине я также не знаю, как решить эту проблему. Спасибо :) – user1537360

+0

Увы, вы правы, я забыл разделить радиус. Исправлено сейчас – axelcdv

+0

Код не полностью завершен, но это всего лишь лидерство. Вам понадобится способ доступа к родительскому объекту (например, добавление родительского свойства в ваш точечный объект), и у меня может быть что-то еще. У меня нет времени прямо сейчас, но если он по-прежнему не работает, я немного поработаю сегодня. – axelcdv

Смежные вопросы