Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rariel

Como reorganizar uma matriz

Recommended Posts

Bem eu inseri no palco vários objetos clicando em determinado botões que criei, esses objetos vão sendo incluídos dentro de uma matriz a medida que são criados, ou seja crio um objeto no placo através do botão e ele fica guardado na matriz, na ordem de inserção, até ai tudo bem.

 

Ai esse objetos inseridos no palco eu posso movimentar par ao lugar que eu quiser, e é claro quando eu movimentos eles no palco ele assumem um determinada coordenada certo.

 

Bem o problema é o seguinte eu preciso ordenar os objetos dentro da matriz pela ordem de menor coordenada dos objetos no placo, ex: se eu tenho um objeto no palco que estão nas coordenas (50,60) mas na matriz esse objeto esta na terceira posição e se esse objeto for o que esta na menor coordenada no palco eu tenho que passar ele por exemplo para a primeira posição da matriz, e assim por diante, o próximo com menor coordenada passar para segunda posição, o terceiro com menor coordenada no palco para o terceira posição na matriz e assim por diante.

 

Aqui esta o código que fiz, mas só consegui fazer para as coordenas y, ou seja, as verticais, quando faço para as coordenadas x do erro.

 

 

for (var l1 in ListaIdCopia) 
	{
		for (var l2 in ListaIdCopia) 
		{
			if (ListaIdCopia[l1].y < ListaIdCopia[l2].y) 
			{
				troca[0] =  ListaIdCopia[l2];
				ListaIdCopia[l2] = ListaIdCopia[l1];
				ListaIdCopia[l1] =  troca[0];

			}
		}
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra resolver esse problema eu preciso saber, qual sua prioridade?

 

Imagine, tenho o elemento a em (x:0, y:10) e o elemento b em (x:10,y:0).

 

Quer dizer, o elemento a está acima do elemento b mas está atrás dele, então neste caso quem é prioridade neste caso?

 

1 - A posição x é mais importante?

2 - A posição y é mais importante?

3 - Uma correlação entre as duas posições será sua referência?

 

Att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esquece o que eu disse antes, você já afirmou que quer uma correlação entre os dois então vamos fazer o seguinte.

 

Tomando como base o ponto (x:0,y:0) do palco, vamos calcular qual elemento está mais próximo desta posição para definir sua ordem na lista.

 

A ligação entre os ponto forma uma reta que pode ser fechada em um triângulo retângulo, sendo assim a hipotenusa representa a distância que temos de descobrir.

 

Então vamos ao cálculo:

 

var CO:Number; // Cateto Oposto
var CA:Number; // Cateto Adjacente
var H1:Number; // Hipotenusa do primeiro elemento
var H2:Number; // Hipotenusa do segundo elemento
var Contar:Number; //  Conta a posição onde o elemento vai ficar
var Lista:Array; // Quarda todos os elementos
var l1:Number; // Lista o primeiro grupo
var l2:Number; // Lista o segundo grupo

for(l1 in Lista)
{
	// Conta o total de elementos para definir a posição deste elemento.
	// Inicialmente ele fica na última posição.
	Contar = Lista.length;
	// Calculando a distância entre o ponto zero e a posição do primeiro elemento.
	CO = Math.abs(Lista[l1].y);
	CA = Math.abs(Lista[l1].x);
	H1 = Math.sqrt(Math.pow(CO,2)+Math.pow(CA,2));
	for(l2 in Lista)
	{
    	// Calculando a distância entre o ponto zero e a posição do segundo elemento.
		CO = Math.abs(Lista[l2].y);
		CA = Math.abs(Lista[l2].x);
		H2 = Math.sqrt(Math.pow(CO,2)+Math.pow(CA,2));
		// Comparando, se o primeiro elemento estiver mais próximo do ponto zero em relação ao segundo.
		if(H1 <= H2)
		{
			// Então ele ganha uma posição na lista.
			Contar --;
		}
	}
	// esta é a posição que ele deveria ocupar na lista
	trace(Contar);
}

 

Não cheguei a testar, mas acho que funciona.

 

Att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

var itens:Array = [m1, m2, m3]; // MovieClips no palco

 

function refreshOrder(array:Array, target:DisplayObject):Array { // a array a ser reorganizada e target sendo um MovieClip cujas coordenadas servem como base às distâncias dos outros

return array.sort(

function(a:Object, b:Object):Number {

var distanceA:Number = Math.sqrt(a.x - target.x) * Math.sqrt(a.y - target.y);

var distanceB:Number = Math.sqrt(b.x - target.x) * Math.sqrt(b.y - target.y);

 

if(distanceA < distanceB) {

return -1;

} else if(distanceA > distanceB) {

return 2;

} else {

return 0;

}

}

);

}

 

itens = refreshOrder(itens, B);

 

trace(itens.map(function(element:*, index:int, arr:Array){return element.name})); // Só para retornar o nome da instância de cada um

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.