método para detectar assimetria

Para "abobrinhas" use o " Boteco"

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor jeanfernandes » 22 Abr 2009 11:44

Mas Joao
Num poligono regular e no seu caso um Quadrado isso eh verdade.
Porem nao confunda quadrado com retangulo (retangulo eh um quadrado com os lados iguais). No retangulo voce pode ter simetria pelas diagonais e pelas retas que cortam o centro da imagem em x e y portanto num simples e mizero retangulo eu tenho basciamente 4 tipos de simetrias. Porem se voce foge dos angulos multiplos de 90 graus tipo 30 graus voce vai ter simetria...entao eh estranho voce pensar numa figura irregular e tentar a char a simetria....

Creio que esse tipo de resolucao tem que passar por analises por camadas de busca da solucao. Fazer uma generica por angulo pode dar mais trabalho embora possa resolver todos os casos se existirem. Existem alguns sites de matematicos inclusive por video aula que ensinam a geometria analitica avancada por plano. Eh de se procurar.
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor joao » 22 Abr 2009 12:27

Ola Djalma,

EU ainda nao entendi a sua resposta. Tem como vc explicar melhor, por favor? Eu tenho o P1, P2 e P, apenas isso. Como eu acharia o espelhado? Pois pelo o que vc escreveu, eu to imainando que se trata sempre de um reta de 45graus, como no exemplo citado, mas era soh um exemplo. Na real aplicacao a reta podera ser de qualquer maneira.


Ola Jean,

Eu ainda nao entendi o seu ponto. Estamos tratando de retangulos e nao quadrados, pois a imagem, como dito antes, eh uma celula, logo, ela pode ser oval e podera entao ser um retangulo a imagem dela. Na verdade, estou sempre imaginando ser um retangulo.
Agora, o que me intriga eh voce me falar que podera ter ateh 4 simetrias. O que para mim nao faz diferenca, pois a minha funcao tem que ter apenas um retorno do tipo bool, dizendo se a imagem eh simetrica ou nao.
Por isso, eu faco uma varredura ao redor do centro do retangulo. Comeco com uma linha horizontal que passa pelo centro do retangulo, depois vou girando, passando por ela em um angulo de 45, depois 90 ateh finalmente chegar a 180 graus, que dah novamente em uma linha horizontal, passando pelo centro.
Se a melhor simetria tiver uma porcentagem X(ainda to imaginando qual seria esse X) de igualdade com o outro lado eu retorno true senao, false.

Por isso que eu digo: A jogada estah em achar o centro da imagem. Neste caso, aparentemente para mim, num retangulo gerado pelos minimos e maximos da imagem, eu acredito que sempre teremos uma linha passando por ele que cortara a imagem de forma simetrica. Por isso de perguntar se voce(s) conseguem imaginar uma imagem simetrica que anule essa minha hipotese.
Assimetrica eu sei que eh bem facil de achar. :)

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor jeanfernandes » 22 Abr 2009 13:05

Bom, chefe, eu realmente nao entendi eehehehehehe
Mas se voce tomar todo e qualquer retangulo, sempre ira encontrar simetrias ne eeheheheheh
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor joao » 22 Abr 2009 20:10

Olha,

Estou a pelo menos 8 horas tentando achar essa bagaça e não acho!
O que eu consegui é achar como achar a equação da reta com os pontos P1 e P2.
Mas fazer a reta perpendicular e depois achar o ponto simetrico nao tive sorte ainda.

A equação da reta é
Ax +By = C, onde:
A = P2.y - P1.y;
B = P1.x - P2.x;
C = A*P1.x + B*P1.y;

Agora, como usar isso para achar o ponto P' que é simétrico ao ponto P, eu ainda nao consegui fazer de jeito nenhum. :(

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Renie » 22 Abr 2009 22:32

Olá João,

Não sei se pode lhe ajudar, mas, no meu site tem um utilitário que fiz
para migrar placas do Eagle para o Kicad .ULP (é formato texto),
nele tem vários cálculos para rotacionar componentes em relação a
um ponto âncora e qualquer ângulo.

[]'s
Renie
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor msamsoniuk » 22 Abr 2009 23:13

daih tah facil... duas retas sao perpendiculares se m1.m2 = -1, portanto, se vc tem y = m1.x + k1, temos a perpendicular y = m2.x + k2, donde m2 = -1/m1... certo ? mas eu francamente acho mais simples tratar imagens vetorialmente.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor joao » 23 Abr 2009 04:23

Ola Marcelo,

O problema é que eu até posso achar a a equacao da reta 2, mas como eu acho o ponto espelho? Teria que fazer algo relacionado a distancia do ponto até a reta 1 e dai usar a mesma ideia para achar o ponto P', pois ele terá a mesma distância? Entende o problema? Não existe nada mais simples para fazer isso que nao precise que eu faça o calculo de:
1 - Equação da reta 1;
2 - Equação da reta 2;
3 - Distancia do ponto até a reta 1;
4 - Achar o ponto P' que esteja na reta 2 e que tenha a mesma distancia do ponto P até a reta 1.(Isso eu nem tenho ainda de como fazer).

Como seria a sua idéia de tratar a imagem vetorialmente?

[]'s
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor MOR_AL » 23 Abr 2009 12:34

João.
Pelo que eu entendi, não seria suficuente achar apenas a perpendicular. Teria que variar o ângulo das retas delta-teta em delta-teta (incrementos angulares até 180 graus).
Com a dica que lhe passei, você já tem como chegar ao ponto central de uma imagem, qualquer que seja o seu formato.
A partir deste ponto, você cria uma reta que passa pelo ponto central.
Se o seu ponto central possuir as coordenadas x0 e y0 --> P0 (x0,y0), então a equação da reta é:
(y - y0) = m (x - x0), onde:

m é o coeficiente angular da reta, ou a tangente, ou a inclinação da reta. É dado por delta y / delta x.

A equação fica escrita de outra forma:
y = m.x + (y0 - m.x0) (reta que passa pelo ponto P0(x0,y0) e que tem uma inclinação m. O ângulo da reta é: teta = arco cuja tangente é (m), ou ArcTan(m). É a menor determinação do ângulo. Você teria que descobrir em qual diedro o ângulo se encontra.

Para esta reta passar também pelo ponto P1 (x1,y1), faz-se:
m = (y1 - y0) / (x1 - x0), fornecendo a reta:
y = [(y1 - y0) / (x1 - x0)].x + (y0 - [(y1 - y0) / (x1 - x0)].x0)
Note que:
a = [(y1 - y0) / (x1 - x0)] ... e que
b = (y0 - [(y1 - y0) / (x1 - x0)].x0)
O ponto simétrico P1sim(x1s,y1s) em relação a P0(x0,y0), tem que possuir a mesma distância tanto em relação a x, como a y, ou:
x1s = x0 - x1 e y1s = y0 - y1.
Varie P1 para a reta sugerida.
Depois varie o ângulo para outra reta. Nesta, teste para outros pontos simétricos.
Boa sorte.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor msamsoniuk » 23 Abr 2009 18:19

bom, vamos comecar com um exemplo bem simples... imagine um quadrado inclinado com pontos espalhados em qq lugar do espaco:

2 5
5 4
4 1
1 2

parece meio aleatorio... o que vc acha ? bom, o primeiro problema eh achar o centro, para isso usei um pequeno script em awk:

awk '{ A+=$1; B+=$2 } END { print A/NR,B/NR }' pontos

e obtenho a coordenada do centro em 3,3. em essencia, somatoria dos pontos x,y dividido pelo numero de pontos. obviamente tem uma certa facilidade o centro de nosso sistema de coordenadas for no centro da figura, entao eu uso o seguinte script:

awk '{ print $1-3,$2-3 }' pontos

e obtenho uma nova lista de pontos, relativo ao centro:

-1 2
2 1
1 -2
-2 -1

agora tem uma aparencia bem melhor, de olho vc percebe que existe alguma simetria em relacao ao centro. de quebra, fica facil para aplicar matematica vetorial nisso... por exemplo, vamos pegar um ponto qualquer, o ponto 2,1 para simplificar... como vc pega um vetor qualquer e inverte a direcao dele? invertendo os sinais. sera que funfa?

vamos testar com a lista original:

awk '{ x[NR]=$1-3; y[NR]=$2-3 } END { for(i=1;i<=NR;i++) { for(j=1;j<=NR;j++) { if(x[i]==-x[j] && y[i]==-y[j]) print x[i],y[i],"ok"; } } }' pontos

bom, para cada vetor ele encontrou o vetor na direcao contraria atraves do centro. uma melhora adicional seria considerar uma margem de erro nos pontos durante a comparacao. o que fizemos foi uma simetria em relacao ao centro. isso vai funcionar com qq figura cujo angulo de simetria forme pares.

no caso de um triangulo ou pentagono, por exemplo, isso nao funciona e tem que partir para abordagens mais especificas e talvez tentar outras formas de simetria.

um bonus que facilita a vida eh rotacionar os pontos:

x' = x cos a - y sen a
y' = y cos a + x sen a

mas para isso vc precisa determinar o angulo de inclinacao. nao eh complexo, por exemplo, no caso do quadrado temos um vetor qq 2,1. eu posso calcular o angulo desse vetor em relacao ao vetor ideal (1,1) e assim eu sei quantos graus devo rotacionar para que meu quadrado fique alinhado. bom, eu sei que tenho que voltar uns 26 graus:

awk '{ x=$1-3; y=$2-3; a=-26*3.14/180 ; print int(x*cos(a)-y*sin(a)),int(y*cos(a)+x*sin(a)) }' pontos

assim obtenho uma nova lista de pontos rotacionados:

0 2
2 0
0 -2
-2 0

obviamente pode nao ser simples achar o angulo correto, mas vc pode aplicar ideias variadas para isso, enfim, continuando... neste caso posso testar simetrias diferentes. a reflexao da direta para a esquerda fica bem simples quando a figura esta rotacionada! basta testar x,y com x,-y, algo como:

awk '{ x=$1-3; y=$2-3; a=-26*3.14/180 ; print int(x*cos(a)-y*sin(a)),int(y*cos(a)+x*sin(a)) }' pontos | awk '{ x[NR]=$1; y[NR]=$2 } END { for(i=1;i<=NR;i++) { for(j=1;j<=NR;j++) { if(x[i]==x[j] && y[i]==-y[j]) print x[i],y[i],"ok"; } } }'

e nesse caso acho que funciona com triangulos, pentagonos e outras figuras que possuem simetria de reflexao.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor joao » 11 Jun 2009 07:30

Ola a todos!

Desculpem a demora em responder a este assunto novamente.
É que eu realmente não estava achando tempo para poder implementar esta idéia.
Agradeço a todos pela ajuda que me deram, tive ajuda por MSN até! E como tinha prometido para alguns e para mim mesmo, estou entregando o código que eu fiz para achar o ponto inverso.
Infelizmente não posso colocar todo o código para achar a assimetria, mas estou disponibilizando a função que retorna o ponto inverso, que foi a parte mais difícil para mim.
Alguns pontos caso alguém esteja pensando em fazer:
- Não esqueça que para a simetria vc precisa apenas verificar metade dos pontos da borda, já que se ela for simétrica, o outro lado irá ser igual.
- Eu estou rotacionando uma reta imaginária que acha o ponto central da imagem e vai girando em sentindo horário. Ou seja, começa na linha horizontal e vai rotacionando até atingir 180graus.
- eu estou trabalhando com Imagens e não com plano cartesiano. O que acontece? é que a imagem vai aumentando o Y de cima para baixo. Enquanto que no plano cartesiano, vai de baixo para cima. Qual foi a solução mais simples que eu achei? Simplesmente trabalhei no segundo quadrante e depois voltei o valor encontrado de Y para o primeiro quadrante. Vocês vão entender isso olhando o código.
- Quanto ao resultado: Se você conseguir achar o ponto simetrico em toda a metada da imagem, você pode dizer que ela é simétrica. Caso contrário, é só fazer uma regra de 3.

De modo geral, agradeço a todos e pode ser que eu volte com outras perguntinhas chatas logo, logo! :)

Código: Selecionar todos
typedef struct _position
{
   int x;
   int y;
}position;

//Parametros:
// point - Ponto a ser invertido
// initial_line - ponto inicial da reta
// final_line - ponto final da reta
position inversePoint(position point, position initial_line, position final_line)
{
    position result;

       //Mudando o plano cartesiano. Do primeiro para o segundo.
       // Isso é necessário porque a imagem tem o Y aumentando de cima para baixo
       // Enquanto que no plano cartesiano é de baixo para cima.
   point.y *= -1;
   initial_line.y *= -1;
   final_line.y *= -1;

   //Primeiro, verifica se está numa linha vertical ou horizontal
   if((initial_line.x - final_line.x != 0) &&
      (initial_line.y - final_line.y != 0)   )
   {
       //Primeiro acha a equacao da reta y = ax + k
       float a = (float)(initial_line.y - final_line.y) / (initial_line.x - final_line.x);
       float k = (float)(initial_line.y) - (float)(a*initial_line.x);

       //Sabe-se que a reta perpendicular é A*a = -1
       float A = -1/a;
 
       //Calculando-se o K da reta Perpendicular, usando o ponto dado.
       float K = point.y - (A * point.x);

       //Calculando o X de onde as retas se cruzam
       float X = (K - k)/(a - A);

       //Calculando a distancia entre o ponto e o cruzamento das retas.
       float distance = X - point.x;

       //Finalmente, calcula-se o ponto inverso.
       result.x = (int)(distance + X);
       result.y = (int)((A * (distance + X)) + K);
   }
   else if( initial_line.x - final_line.x == 0)
   {
               //Estamos usando uma linha vertical, apenas x vai mudar.
      result.x = (int)(point.x + 2*(initial_line.x - point.x));
      result.y = point.y; 
   }
   else
   {
               //Estamos usando uma linha horizontal, apenas y vai mudar.
      result.y = (int)(point.y - 2*(initial_line.y - point.y));
      result.x = point.x;
   }
   
   //Retornando o ponto para o primeiro quadrante
   result.y *= -1;
        return result;
}
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Anterior

Voltar para Assuntos Gerais

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x