| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/03/2008 22:37:57
|
eclipso
JavaEvangelist
Membro desde: 07/12/2006 12:57:04
Mensagens: 446
Offline
|
Primeiramente olá...
Estou trabalahndo em uma simulação computacional onde podemos visualizar a emergência do comportamento global de uma sociedade de seres em função das restrições nos comportamentos locais.
A simulação já está funcionando, estou representando os seres em questão através de pontos vermelhos que se deslocam pela tela. Para que possamos melhor visualizar a direção que cada um dos agentes/seres toma em seu deslocamento pensei em representá-los através de triângulos isóceles que apontariam na mesma direção do vetor de deslocamento do agente/ser.
A seguinte imagem tesnta ilustrar o que procuro:
http://img70.imageshack.us/my.php?image=exemplodesenhotringulojl0.jpg
Na imagem podemos ver um sistema de coordenadas no qual está situado um ponto PM que representa o ponto em que o ser/agente está localizado. Este ser se move na direção do vetor também representado na figura. Minha dúvia é: Como calcular os pontos A, B e C em função do ponto PM e do vetor, de modo que eu possa desenhar um triângulo para representar meu agente/ser...O triângulo teria que possuir uma ponta evidente (a que estaria apontando na direção do vetor).Poderia ser algo como 70,70 e 40 graus, por exemplo...
Fiz da seguinte forma:
Supondo que PM deve ficar "no meio" do triangulo.
Seja v=(a,b) o tal vetor, e alfa o angulo CAB=CBA.
Calcule um vetor w=(c,d), ortogonal a v e de norma=1. (a.c+b.d=0 e c^2+d^2=1)
Agora é encontrado k, a metade do lado AB, em função do ângulo alfa e da altura h (constante, usei o valor 10) do triangulo: k=(2.h)/tg(alfa)
Assim:
C=PM+1/2.v
A=PM-1/2.v+k.w
B=PM-1/2.v-k.w
Para calcular numericamente o vetor w (ortogonal a v) baseado nesse raciocínio, fiz algumas manipulações e cheguei ao seguinte:
d = sqrt( a^2 / (a^2 + b^2) )
c = -b.d/a
Tendo os vetores v e w, consigo calcular os pontos A,B e C. Calculando esses pontos, posso plotar o triângulo usando o método:
fillPolygon(int[] xPoints, int[] yPoints, int nPoints) da classe java.awt.Graphics.
Todavia, o que consigo na tela, são uma série de riscos que não lembram em nada triângulos. Queria saber se alguém consegue ver um possível erro no meu raciocínio. Sei que tem um pessoal que trabalha direto com desenvolvimento de jogos em Java e, portanto, com manipulação "pancada" de java2D. Se puderem me dar uma mão nisso.
|
CV: http://lattes.cnpq.br/0044387433155250 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2008 14:40:52
|
eclipso
JavaEvangelist
Membro desde: 07/12/2006 12:57:04
Mensagens: 446
Offline
|
Ninguém?
|
CV: http://lattes.cnpq.br/0044387433155250 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2008 17:21:44
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Você quer desenhar e girar os triângulos na mão usando vetores, é isso?
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2008 17:25:35
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
1. Crie uma classe para representar o seu vetor2d; 2. Associe um vetor de direção ao seu triângulo; 3. Associe um vetor de posição ao seu triângulo; O vetor da seta pode ser facilmente desenhado a partir do vetor direção e do vetor posição. Basta: 1. Desenhar a flecha; 2. Rotaciona-la no mesmo ângulo do vetor direção; 3. Soma-la ao vetor posição + offset para que ela caia no meio do triângulo. Trabalhe para que todos os seus desenhos sejam feitos "de pé" e todas as rotações e translações sejam feitas posteriormente, através de objetos como o affineTransform (alguns métodos fazem isso automaticamente). Eu fiz algo similar para o meu engine de ia, mas usando C++ e OpenGL: http://sofiaia.wordpress.com
This message was edited 2 times. Last update was at 19/03/2008 17:26:12
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2008 00:50:33
|
eclipso
JavaEvangelist
Membro desde: 07/12/2006 12:57:04
Mensagens: 446
Offline
|
Nossa...Isso é que é domínio da API...
Se não me engano vi uma explanação a respeito dessas transformações afins em um material de Java2d que você indicou em um dos tópicos deste fórum...Tentarei encontrar esse material e entender esse processo, qualquer coisa volto a falar com você...
Agradeço desde já...
|
CV: http://lattes.cnpq.br/0044387433155250 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2008 00:53:38
|
eclipso
JavaEvangelist
Membro desde: 07/12/2006 12:57:04
Mensagens: 446
Offline
|
Só mais uma coisa...Como você segure que eu define a estrutura do meu objeto Triangulo2D?
Extendo um Polygon? Além dos vetores associados, relaciono também os pontos que definem seus vértices?
Como você faria isso?
|
CV: http://lattes.cnpq.br/0044387433155250 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2008 09:22:17
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Eu não me incomodaria em criar um filho de Shape. Na verdade, além da classe Vector2D já mencionada, eu criaria uma classe propria, chamada Triangle. Aí sim, nela usaria um Polygon2D para fazer o desenho do centro. Também criaria um objeto "Arrow" que desenha a seta. Por fim, criaria uma classe "Agent" que encapsularia a lógica do agente, teria sua posição e usaria as duas classes anteriores para desenha-los, aplicando as devidas transformações. Por isso que eu gosto de usar OpenGL para esse tipo de simulação, já que por lá os triângulos são uma primitiva e as rotações são feitas por um simples comando (glRotate). A API do Java 2D está aqui: http://java.sun.com/j2se/1.5.0/docs/guide/2d/spec/j2d-bookTOC.html Ok... agora que vimos a maneira mais "vetorialmente correta", vamos ver a mais fácil: O jeito mais trivial de fazer o desenho dos agentes seria criar uma imagem bitmap e rotaciona-la. O java já tem diversos comandos prontos para isso, e são bastante rápidos, embora não seja possível usar isso com milhares de agentes. Foi o que utilizei no caça à bandeira, que você pode baixar em http://vinigodoy.wordpress.com/meus-jogos, para fazer a flechinha que fica embaixo das peças. Talvez essa técnica (que é realmente trivial) já seja suficiente para o seu caso. O seu comportamento emergente é baseado em Steering Behaviors? Nos fontes do Caça a Bandeira, você também vai encontrar a classe Vector2D implementada. Se precisar, também escrevi um artigo falando sobre como funciona uma classe de vetores bidimensionais e posso passar para você. Ë em C++ e está aqui em Anexo. O artigo é mais focado em programadores, que não gostam muito daquela "matematicagem" toda de um livro de matemática (se gostassem, já teriam lido o livro). E também tenta mostrar algumas aplicações práticas do uso de vetores em jogos de computadores.
| Nome do arquivo |
ViniGodoy - Artigo Vetores.pdf |
Download
|
| Descrição |
Artigo que explica a implementação de Vetores matemáticos 2D em C++. |
| Tamanho |
63 Kbytes
|
| Baixado: |
808 vez(es) |
This message was edited 1 time. Last update was at 20/03/2008 09:23:59
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2008 13:13:08
|
eclipso
JavaEvangelist
Membro desde: 07/12/2006 12:57:04
Mensagens: 446
Offline
|
Putz, agora que vi o número exacerbado de erros no meu post anterior, hehe...Foi mal, tinha acabado de voltar do bar
A classe que você referencia como Vector2D seria realmente a representação de um vetor em um plano bidimencional? Ou seja, uma dupla de valores que definem direção, sentido e intensidade? Se for o caso, já utilizo uma na minha simulação atual. O mesmo ocorre com a classe Agent...
Pois é...Não havia pensado em utilizar uma bitmap. De fato, tornaria as coisas mais simples, do ponto de vista da programação. Todavia, creio que a performance ficaria prejudicada em relação à utilização da abordagem baseada em desenhos de polígonos 2D...O que você acha?
Até agora o máximo que consegui na minha simulação foi rodar dois ambientes multiagentes (implementados inteiramente por mim, por isso otimizados para a tarefa específica) com 200 agentes cada, em uma mesma máquina. Agora estou, ao mesmo tempo que cuidando da estética, buscando reduzir a complexidade de certos algoritmos...
O comportamento dos meus agentes é baseado em Steering Behaviors sim. Todavia, por enquanto implementei um comportamento de forma intuitiva, para teste. Mas pretendo estudar mais esses comportamentos e analisar qual seria o mais adequado ao meu ambiente, ou ainda pensar em uma forma de instanciar um comportamento específico para os agentes na simulação, dinamicamente...Entrei em um link que você passou ontem (acho que é seu blog) e vi que você explicou alguns deles. Este material vai me ajudar bastante no futuro...Você poderia me passar a referência de onde obteve aquelas informações?
Eu até gosto bastante de matemática e meu impulso inicial, para desenhar os tais triângulos, foi fazer toda aquela geringonça matemática que eu falei no início do tópico, hehehe...Não tinha me tocado que poderia usar transformações afins e todas essas facilidades da API. Você expandiu consideravelmente minhas possibilidades
Bem, vou meter a mão na massa agora. Assim que eu tiver resultados (que podem demorar, visto que estou trabalhando em muitos projetos ao mesmo tempo) volto aqui para comentar...
Valeu pela força. Muito sucesso.
|
CV: http://lattes.cnpq.br/0044387433155250 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2008 13:14:24
|
eclipso
JavaEvangelist
Membro desde: 07/12/2006 12:57:04
Mensagens: 446
Offline
|
Ah, acabo de ver que no PDF que você anexou ao último post você coloca a referência dos comportamentos...Valeu.
|
CV: http://lattes.cnpq.br/0044387433155250 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2008 13:48:02
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Eu me baseei no livro Programming Game AI By Example, do Mat Buckland. O autor também mantém o site:
http://www.ai-junkie.com
E também no próprio trabalho do Reynolds, de onde retirei algumas figuras:
http://www.red3d.com/cwr/steer/
O Buckland implementou esse interessante simulador de cardumes, no anexo (tive de fazer um idêntico para a minha disciplina de IA).
Uma outra maneira de você desenhar um triângulo é calcular os três pontos, sendo cada um um deslocamento em relação a um ponto central. Ou seja, você calcula 3 vetores em relação ao centro do triângulo, um para cada ponta do triângulo, representando a distância e a direção do ponto em relação ao centro. Aí, para girar o triângulo, basta girar os três vetores juntos. É mais intuitivo do que partir para matrizes de transformação... e mais lento também.
| Nome do arquivo |
Another Big_Shoal.zip |
Download
|
| Descrição |
Um interessante simulador de cardumes usando Steering Behaviors e OpenGL. Os fontes podem ser baixados daqui: http://www.wordware.com/files/ai/ |
| Tamanho |
114 Kbytes
|
| Baixado: |
123 vez(es) |
This message was edited 1 time. Last update was at 20/03/2008 13:48:26
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2008 13:53:25
|
eclipso
JavaEvangelist
Membro desde: 07/12/2006 12:57:04
Mensagens: 446
Offline
|
E aquela minha forma de já calcular os pontos diretamente em função do vetor (já rotacionados). O que você acha dela? Implementei desta forma porque parti do pressuposto de que, de qualquer forma eu teria que calcular os três pontos para plotar o triângulo. Assim, pensei, porque já não calcular os pontos nas coordenadas finais? Intuitivamente pensei que seria a forma menos custosa...Só que, como disse, acho que errei uma parte do raciocínio, porque não consegui triângulos, hehe...
Vou dar uma olhada com mais profundidade nesse material todo que você me passou. Gosto bastante da programação gráfica, apensar de estar ainda angatinhando nela, hehe
|
CV: http://lattes.cnpq.br/0044387433155250 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2008 15:16:21
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Na verdade, não tenho tempo de parar e ler a calculeira aqui no meu trabalho. O raciocínio, pelo que vc descreveu, me parece fazer sentido. Mas tenho que parar e olhar as contas.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/03/2008 00:50:54
|
eclipso
JavaEvangelist
Membro desde: 07/12/2006 12:57:04
Mensagens: 446
Offline
|
Olá, tudo bem...
Estou testando a possibilidade de carregar uma imagem PNG de um triângulo e plotá-la na tela, para cada um dos meus agentes, rotacionando-a em função do vetor direção de cada agente e transladando-a em função da posição de cada agente. Para tanto, bolei um método que desenha um único agente que é chamado para desenhar cada um deles. Segue o método abaixo. Detalhe: TRIANGULO é uma static BufferedImage carregada na inicialização do programa.
Todavia, aparece um único triângulo na tela (quando deveriam aparecer N), rotacionado, mas não em função da direção em que se desloca. Você saberia qual poderia ser o problema? Eu utilizei direito o AffineTransform?
O ideal seria ter um AffineTransform para cada Agente (sendo um atributo do Triangulo2D que, por sua vez, é atributo do Agente)?
|
CV: http://lattes.cnpq.br/0044387433155250 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/03/2008 01:09:22
|
eclipso
JavaEvangelist
Membro desde: 07/12/2006 12:57:04
Mensagens: 446
Offline
|
Esqueci de mencionar...Chamo este método dentro do método paintComponent(Graphics g) de um JPanel. Dentro de um laço, onde o chamo para desenhar cada um dos meus agentes.
|
CV: http://lattes.cnpq.br/0044387433155250 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/03/2008 08:53:53
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline
|
Geralmente eu faço assim:
Se isso não der certo, tente primeiro inverter a ordem da translação e da rotação. Não me lembro ao certo a ordem no java 2D. Esse artigo do meu blog explica o fenômeno do que ocorre quando a ordem das matrizes é invertida (basicamente, ao invés do objeto girar no próprio eixo, ele vai "orbitar" em torno da posição dele já deslocada):
http://vinigodoy.wordpress.com/2008/02/17/transformacoes/
Mas ele é para o OpenGL, a ordem é inversa no DirectX e pode ser que seja aqui também.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
|
|