Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Столкновение объектов (https://javascript.ru/forum/misc/23373-stolknovenie-obektov.html)

Isaac 21.11.2011 18:56

Столкновение объектов
 
Здравсвуйте.
Подскажите пожалуйста
Есть ф-я, которыя считает расстояние от одного объекта до другого
function getDistance(x1, y1, x2, y2)
	{
		var dx = x1 - x2;
		var dy = y1 - y2;		
		
		return Math.floor(Math.sqrt((dx * dx) + (dy * dy)));		
		
	};

Как можно переписать эту ф-ю, если объектов будет 5 или 10?

trikadin 21.11.2011 19:00

Не очень понятно, как при этом должна работать данная функция. Возвращать среднее расстояние? Возвращать массив расстояний? Сумму расстояний?

Isaac 21.11.2011 19:03

Цитата:

Сообщение от trikadin (Сообщение 138178)
Не очень понятно, как при этом должна работать данная функция. Возвращать среднее расстояние? Возвращать массив расстояний? Сумму расстояний?

Ф-я возврацает расстояние от 2-х объектов.
Потом я сравниваю это расстояние с суммой их радиусов и если дистанция(то, что возвращает ф-я) меньше, чем сумма радиусов, то произошло столкновение.

trikadin 21.11.2011 19:06

Цитата:

Сообщение от Isaac
Ф-я возврацает расстояние от 2-х объектов.
Потом я сравниваю это расстояние с суммой их радиусов и если дистанция(то, что возвращает ф-я) меньше, чем сумма радиусов, то произошло столкновение.

Молодец. Но ты спросил
Цитата:

Сообщение от Isaac
Как можно переписать эту ф-ю, если объектов будет 5 или 10?

Вот в этом случае, она, по-твоему, что должна делать?

Isaac 21.11.2011 19:09

Цитата:

Сообщение от trikadin (Сообщение 138181)
Вот в этом случае, она, по-твоему, что должна делать?

Проверять x и y 5 или 10 других объектов?
Но я не знаю, как правильно написать условие внутри ф-и...

trikadin 21.11.2011 19:15

Просто при движении циклом проверяй расстояние для каждой пары объектов. И всё.

Isaac 21.11.2011 19:19

Цитата:

Сообщение от trikadin (Сообщение 138185)
Просто при движении циклом проверяй расстояние для каждой пары объектов. И всё.

Я не совсем понял.
Допустим я имею 5 объектов.
И мне проверять для о1 с о2, о1 с о3, о1 с о4, о1 с о5, потом о2 с о3, о2 с о4 и ...
Вроде, как-то не серьезно как-то получается :(

trikadin 21.11.2011 19:21

Ну да, факториал n действий будет. По другому не выйдет.

Вы только это циклом сделайте, руками не пишите...

Isaac 21.11.2011 19:24

Цитата:

Сообщение от trikadin (Сообщение 138188)
Ну да, факториал n действий будет. По другому не выйдет.

Вы только это циклом сделайте, руками не пишите...

А как примерно должен выглядеть цикл, можете подсказать?

trikadin 21.11.2011 19:28

Мда. Как же вы игру с такими познаниями пишете.

//храните объекты в массиве, тогда можно будет сделать так:
for (var i=0; i!= arr.length; ++i) //arr - наш теоретический массив
  for (var j= i; j!= arr.length; ++j)
    if (getDistance(arr[i][0], arr[i][1], arr[j][0], arr[j][1]) < someValue) { // если взрыв
      alert("Ба-бах!");
    }

Isaac 21.11.2011 19:30

Цитата:

Сообщение от trikadin (Сообщение 138191)
Мда. Как же вы игру с такими познаниями пишете.

//храните объекты в массиве, тогда можно будет сделать так:
for (var i=0; i!= arr.length; ++i) //arr - наш теоретический массив
  for (var j= i; j!= arr.length; ++j)
    if (getDistance(arr[i][0], arr[i][1], arr[j][0], arr[j][1]) < someValue) { // если взрыв
      alert("Ба-бах!");
    }

А рекурсией можно это записать? Или лучше сделать циклом ?

trikadin 21.11.2011 19:33

Цитата:

Сообщение от Isaac
Или лучше сделать циклом ?

Лучше циклом. Быстрее и памяти жрёт меньше.

Isaac 21.11.2011 19:38

Цитата:

Сообщение от trikadin (Сообщение 138194)
Лучше циклом. Быстрее и памяти жрёт меньше.

В данном случае координаты у меня хранятся в объекте
var Coords = {
		x: [x1, x2, x3],
		y: [y1, y2, y3]	
	}

Тогда мне нужно записать так ?
//храните объекты в массиве, тогда можно будет сделать так:
	for (var i = 0; i!= Coords.x.length; ++ i) //arr - наш теоретический массив
		for (var j = i; j!= Coords.y.length; ++ j)
		    if (getDistance(Coords.x[i][0], Coords.y[i][0], Coords.x[i][1], Coords.y[i][1]) < someValue) { // если взрыв
      alert("Ба-бах!");
    }

trikadin 21.11.2011 19:50

Нет)

for (var i = 0; i!= Coords.x.length; ++ i)
        for (var j = i; j!= Coords.y.length; ++ j)
            if (getDistance(Coords.x[i], Coords.y[i], Coords.x[j], Coords.y[j]) < someValue) { // если взрыв
      alert("Ба-бах!");
    }

Isaac 21.11.2011 20:00

Цитата:

Сообщение от trikadin (Сообщение 138200)
Нет)

for (var i = 0; i!= Coords.x.length; ++ i)
        for (var j = i; j!= Coords.y.length; ++ j)
            if (getDistance(Coords.x[i], Coords.y[i], Coords.x[j], Coords.y[j]) < someValue) { // если взрыв
      alert("Ба-бах!");
    }

Что-то не то, у меня всегда срабатывает if :(
А ф-я возвращает 0
function getDistance(x1, y1, x2, y2)
	{
		var dx = x1 - x2;
		var dy = y1 - y2;		
		
		return needDist =  Math.floor(Math.sqrt((dx * dx) + (dy * dy)));
	};

trikadin 21.11.2011 20:20

Поставьте себе firebug. Посмотрите, что он говорит. Это ваша игра, вы должны в ней разбираться, а не я.

Isaac 21.11.2011 20:24

Цитата:

Сообщение от trikadin (Сообщение 138205)
Поставьте себе firebug. Посмотрите, что он говорит. Это ваша игра, вы должны в ней разбираться, а не я.

Стоит фаирбаг, он то и показывает 0

trikadin 21.11.2011 21:15

Могу предложить подумать над этим.

Isaac 21.11.2011 21:28

Цитата:

Сообщение от trikadin (Сообщение 138220)
Могу предложить подумать над этим.

Уже все решил, спасибо большое! Яростно плюсую :)


Часовой пояс GMT +3, время: 02:02.