Mostrando postagens com marcador Juliana. Mostrar todas as postagens
Mostrando postagens com marcador Juliana. Mostrar todas as postagens

sexta-feira, 29 de outubro de 2010

Mudanças na execução da lógica

>Por Juliana

Olá,
Uma semana já se passou desde que apresentamos a prévia na aula de Aplicativos e na feira do SESI. Durante esse tempo fizemos várias alterações, inclusive na forma como o usuário deverá interagir com o programa para executar sua lógica. Essa execução se dará através de um Painel de Controle, que irá controlar Simulador e Robô Real. Mais tarde, provevelmente, algum integrante do grupo lhes apresentará tal tela.
Até ontem a noite ainda estavamos com alguns problemas na execução. Ao pausar a simulação, o Eclipse acusava java.net.SocketTimeoutException. O problema foi resolvido ao percebermos que a variável executando do Simulador apenas deveria ser alterada para false ao se fechar a janela de simulação.
Assim, temos:

PainelControle.java
if (Evento.getSource() == btPausar) {
Funcoes.executando = 0;
rbSimulador.setEnabled(true);
rbReal.setEnabled(true);
btExecutar.setEnabled(true);
btAbrir.setEnabled(true);
}

Simulador.java
public void windowClosing(WindowEvent arg0) {
Funcoes.executando = 0;
Funcoes.menu.simulador.arena.executando = false;

arg0.getWindow().setVisible(false);
Funcoes.menu.painelControle.btAbrir.setEnabled(true);
Funcoes.menu.painelControle.btExecutar.setEnabled(true);
caminho = null;
Prog1.llMinis.removeAll(Prog1.llMinis);
Prog1.pnArea.removeAll();
}

Até a semana que vem,
Juliana

sexta-feira, 22 de outubro de 2010

Desenvolvimento em Java: Cadastro de lógica

>Por Juliana

Boa tarde,
Ontem, enquanto dávamos uma conferida pré-feira em todo o projeto GoGoBots, notamos um erro na exclusão de comportamentos ao fazer o cadastro. O comportamento excluído era sempre o primeiro. Após algumas tentativas, chegamos ao seguinte trecho de código, que, de forma simples, resolveu nosso problema.

btRemover.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
Mini m = (Mini) ((JButton)(e.getSource())).getParent().getParent();
Prog1.llMinis.remove(m);
Prog1.pnArea.removeAll();
for (int i = 0; i < Prog1.llMinis.size(); i++) {
Prog1.pnArea.add(Prog1.llMinis.get(i));
}
Prog1.pnArea.updateUI();
Prog1.pnArea.validate();
if (!(Funcoes.existeComportamento(Prog1.llMinis))) {
Prog1.btSalvarComoLogica.setEnabled(false);
Prog1.btSalvarLogica.setEnabled(false);
}

}

});


Até semana que vem,
Juliana

sexta-feira, 15 de outubro de 2010

Layout da janela Configurações

>Por Juliana

Bom dia,
Como já foi dito aqui no blog, fizemos uma tela para configuração do Simulador 2D pelo usuário. Por enquanto, ela tem duas finalidades: selecionar o IP da máquina onde a lógica será executada e escolher as posições dos objetos no início da execução.

Até a semana que vem,
Juliana

sexta-feira, 8 de outubro de 2010

Botão executar

>Por Juliana

Olá
Como já foi comentado anteriormente mudamos o layout da tela do simulador, trouxe então o código do botão adicionado, confira:

btExecutar.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
try {
String caminho = Funcoes.arquivo();
Funcoes.carregarArquivo(caminho, Prog1.llMinis);
new SimuladorCliente(caminho);// "C:\\Documents and Settings\\mariana.shimabukuro\\Desktop\\APPARATUS\\Projeto\\dir.ggb");

} catch (Exception e1) {

e1.printStackTrace();
}

}

});



Boa semana,
Juliana

quinta-feira, 30 de setembro de 2010

Robô real

>Por Juliana

Olá

Como pode ser percebido, nos últimos meses nós dedicamos a maior parte do tempo ao desenvolvimento do Simulador. Embora este ainda não esteja 100% pronto, planejamos começar ainda essa semana a programar o robô real. Esta parte deve ser bem menos complicada já que boa parte da lógica será reaproveitada do Simulador.
Antes de iniciarmos a programação, queremos nos encontrar com o prof. Renê afim de resolver alguns pontos.

Boa semana para todos,
Juliana

sexta-feira, 24 de setembro de 2010

Relação Simulador - SimuladorCliente

>Por Juliana

Bom dia,
Eu e a Mariana viemos lhes relatando há algum tempo a respeito dos problemas com o Simulador. Mais recentemente temos tentado consertar a relação entre o Simulador e o SimuladorCliente. Essas duas classes já funcionam em conjunto quando estão sozinha em um mesmo projeto. No entanto, quando tentamos integrá-las ao Menu algo dá errado. Já tentamos algumas formas diferentes para resolver isso, e continuaremos tentando até alcançar o funcionamento desejado. Esperamos que seja logo.

Até semana que vem,
Juliana

sexta-feira, 17 de setembro de 2010

Site da Empresa

>Por Juliana

Olá,
Como solicitado pelo prof. Rodrigo da disciplina de aplicativos II, no dia da prova bimestral, estou aqui para postar a página inicial do site. Confira:

Clique sobre a imagem para acessar o site!

Boa semana
Juliana

sexta-feira, 10 de setembro de 2010

Robô Michelângelo

>Por Juliana

Bom dia,
Desde o início do desenvolvimento do projeto, sabemos que o robô real que utilizaremos será um dos da UNESP, mas conhecido como Michelângelo. Abaixo, apresento imagens que representam os movimentos que ele consegue realizar.

























Até semana que vem,
Juliana

sexta-feira, 3 de setembro de 2010

Desenvolvimento técnico: Colisão

>Por Juliana

Olá,
Pensando em prováveis recursos futuros, foi desenvolvido o método verificaColisaoRoboRobo. Ele executa basicamente as mesmas funções que o método verificaColisaoBolaRobo. Para este ano, não pretendemos adicionar um segundo robô ao projeto. No entanto, estamos desde já preparando para que isso seja possível.
Veja o código:
void verificaColisaoRoboRobo(BufferedImage imageRobo1,
BufferedImage imageRobo2) {
Ponto p = verificaColisaoBolaRoboI(imageRobo1,
(int) (robo1.x * escalaCmPixel),
(int) (robo1.y * escalaCmPixel), robo2, imageRobo2,
(int) (robo2.x * escalaCmPixel),
(int) (robo2.y * escalaCmPixel));
if (p != null) {
getGraphics().drawOval((int) ((p.x * escalaCmPixel) - 20),
(int) (((-(p.y - tamYCm)) * escalaCmPixel) - 20), 40, 40);
afastaRoboDoPonto(robo1, p);
afastaRoboDoPonto(robo2, p);
}
}

Até a semana que vem,
Juliana

sexta-feira, 27 de agosto de 2010

Desenvolvimento técnico: Cliente

>Por Juliana

Bom dia,
Como já foi dito pela Mariana, estivemos trabalhando com o controle remoto do Simulador. Por isso, hoje trouxe a vocês o método enviaComando. Nele, recebemos um comando da classe Simulador e o reenviamos ao Simulador que está em execução no computador cujo IP foi configurado. No caso estamos usando o localhost (127.0.0.1).
static void enviaComando(int cmd) {
try {
byte b[] = new byte[1];
b[0] = (byte) cmd;
DatagramPacket packet;
packet = new DatagramPacket(b, b.length, InetAddress
.getByName("127.0.0.1"), 7878);
socket.send(packet);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

Até a semana que vem.
Juliana

sexta-feira, 20 de agosto de 2010

Desenvolvimento técnico: Salvar

>Por Juliana

Olá
Um detalhe que nós deixamos passar no desenvolvimento em Java foi relacionado a salvar os arquivos GGB. Os arquivos eram salvos, no entando, sem possibilidade de escolha do nome e caminho. Para isso, desenvolvemos o seguinte método:

public static File escolherCaminhoSalvar() {
String sNomeArq = null;
String pastaPadrao = MenuPrincipal.global.getProperty("PastaPadrao");
JFileChooser arquivo = new JFileChooser(pastaPadrao);
FileNameExtensionFilter filter = new FileNameExtensionFilter("Arquivo GoGoBots (.ggb)", "ggb");
arquivo.setFileFilter(filter);
arquivo.setFileSelectionMode(arquivo.FILES_ONLY);
int resultadoArq;
File arquivoNome;
while (true) {
resultadoArq = arquivo.showSaveDialog(null);
if (resultadoArq == arquivo.CANCEL_OPTION)
return null;
arquivoNome = arquivo.getSelectedFile();
if ((arquivoNome == null || arquivoNome.getName().equals("")))
javax.swing.JOptionPane.showMessageDialog(null, "Nome de Arquivo Inválido", "Nome de Arquivo Inválido", javax.swing.JOptionPane.ERROR_MESSAGE);
else if (arquivo.getSelectedFile().exists()) {
int certeza = JOptionPane.showConfirmDialog(null, "Tem certeza de que deseja substituir arquivo existente?", "Arquivo já existe", 0, 0);
if (certeza == 0)
break;
} else
break;
}
MenuPrincipal.global.setProperty("PastaPadrao", arquivo.getCurrentDirectory()
.toString());
MenuPrincipal.salvaConfiguracao();
try {
RandomAccessFile file = new RandomAccessFile(arquivoNome, "rw");
MenuPrincipal.salvaConfiguracao();
return arquivoNome;
} catch (Exception e) {
e.printStackTrace();
MenuPrincipal.salvaConfiguracao();
}
return null;
}

Até mais
Juliana

sexta-feira, 13 de agosto de 2010

Desenvolvimento em Java: Colisão

>Por Juliana

Bom dia,
Hoje vim mostrar a vocês o método verificaColisao() que está na classe Arena. Esse método scanneia as imagens e retorna os pontos na arena onde a bola e o robô etsão num mesmo instante. Saber o ponto exato de onde a colisão está ocorrendo é essencial para trabalharmos o choque entre os objetos.
void verificaColisao(BufferedImage image1,BufferedImage image2) {
int somaX = 0, somaY = 0;
int n=0;
int[] vImg1 = image1.getRGB(0, 0, tamX, tamY, null, 0, tamY);
int[] vImg2 = image2.getRGB(0, 0, tamX, tamY, null, 0, tamY);
for (int i = 0; i < x =" i" y =" i">0)
System.out.format("%d ", n);
}

Até semana que vem,
Juliana

sexta-feira, 6 de agosto de 2010

Um pouco de física...

>Por Juliana

Boa noite,
Nossos seguidores vem acompanhando, desde o início do mês de julho, o desenvolvimento de nosso Simulador 2D. Como a movimentação do Robô Virtual sobre a arena está quase finalizada, passamos a trabalhar também na bola. No entanto, a movimentação de bolas se dá de forma totalmente diferente a dos robôs. Uma bola não responde a comandos, ela age de acordo com impulsos e quantidades de movimento.

De acordo com a Wikipedia:
Impulso é a grandeza física que mede a variação da quantidade de movimento de um objeto. É causado pela atuação de uma força.
Em física, quantidade de movimento linear [...] é uma grandeza física dada pelo produto entre massa e velocidade de um corpo. O momento linear é uma grandeza vetorial, com direção e sentido, cujo módulo é o produto da massa pelo módulo da velocidade, e cuja direção e sentido são os mesmos da velocidade.
Além disso, precisaremos saber verificar os tipos de choque (elásticos e inelásticos) e suas consequências para que possamos criar uma representação mais próxima a realidade tanto quanto possível.
Portanto, antes de darmos continuidade à programação, será necessário estudarmos um pouco de física mecânica. Caso encontremos problemas, estamos certos de que poderemos contar com alguma ajuda de nossas professoras Flávia e Simone.
Deseje-nos sorte.
Boa semana a todos,

Juliana

Capa CD

>Por Mariana

Hey
Como solicitado pelo prof. Rodrigo, de aplicativos II, durante a semana trabalhei sobre a capa do CD, juntamente com a Juliana. Decidimos utilizar o fundo azul, por ser uma cor mais alegre e atrativa para nosso público alvo.
Segue abaixo a imagem:



Bom dia à todos,

sexta-feira, 30 de julho de 2010

Desenvolvimento técnico: Simulador

>Por Juliana

Boa tarde,
A classe que apresento a vocês hoje é a classe Arena. Ela faz parte do Simulador. Nela serão desenhados os objetos a cada execução de um novo comando. Por enquanto, os comandos que são executados no método run() são apenas para teste e logo serão substituídos por comandos recebidos do Tradutor.
class Arena extends JPanel implements Runnable {
/**
* pixels por cm.

* Use multiplicando o valor em cm para obter valor correspondente em pixels
*/
final double escalaCmPixel = 5;

Robo robo;

Arena() {
try {
robo = new Robo(this);
setPreferredSize(new Dimension(400, 400));
new Thread(this).start();
} catch (IOException e) {
e.printStackTrace();
}
}

public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < 40; i++) {
g.drawLine((int) (i * 8 * escalaCmPixel), 0,
(int) (i * 8 * escalaCmPixel), 400);
g.drawLine(0, (int) (i * 8 * escalaCmPixel), 400,
(int) (i * 8 * escalaCmPixel));
}
robo.desenha((Graphics2D) g);
}

void enviaComando(int cmd) {
try {
robo.comando(cmd);
Thread.sleep(33);
repaint();
} catch (InterruptedException e) {
}
}

public void run() {
while (true) {
for (int i = 0; i < 100; i++) {
enviaComando(0x11);
}
for (int i = 0; i < 100; i++) {
enviaComando(0x99);
}
for (int i = 0; i < 100; i++) {
enviaComando(0x19);
}
for (int i = 0; i < 100; i++) {
enviaComando(0x91);
}
for (int i = 0; i < 100; i++) {
enviaComando(0x10);
}
for (int i = 0; i < 100; i++) {
enviaComando(0x01);
}
for (int i = 0; i < 100; i++) {
enviaComando(0x90);
}
for (int i = 0; i < 100; i++) {
enviaComando(0x09);
}
}
}

Até a semana que vem,
Juliana

sexta-feira, 23 de julho de 2010

Desenvolvimento em Java

>Por Juliana

Bom dia,
Uma semana depois, a função executaComando() do RoboVirtual mudou bastante. Após muita trigonometria, o resultado foi o código apresentado a seguir. Alguns princípios se mantiveram, outros mudaram completamente. O robô agora se movimenta como deveria. O próximo passo é pensar a respeito da representação do movimento de uma bola na arena, bem como a colisão entre os objetos.
Enfim, aqui está o trecho do código:
void executaComando() {
if (tempoCmd > 0) {
/** usado pois o giro acontece a 90 graus da direcao do robo */
final double noventa = Math.PI / 2;
double dxa;
double dya;
switch (comando) {
case 0x11:
x += dx = velCmTempo * Math.cos(angulo);
y += dy = velCmTempo * Math.sin(angulo);
break;
case 0x99:
x += dx = -velCmTempo * Math.cos(angulo);
y += dy = -velCmTempo * Math.sin(angulo);
break;
case 0x10:
dxa = distRodasCm * Math.cos(angulo - noventa);
dya = distRodasCm * Math.sin(angulo - noventa);
/**
* simplificando double perim = 2 * Math.PI * distRodasCm;
* angulo += dAngulo = -velCmTempo * 2 * Math.PI / perim; temos:
*/
angulo += dAngulo = -velCmTempo / distRodasCm;
x += dx = (dxa - distRodasCm * Math.cos(angulo - noventa)) / 2;
y += dy = (dya - distRodasCm * Math.sin(angulo - noventa)) / 2;
break;
case 0x90:
dxa = distRodasCm * Math.cos(angulo - noventa);
dya = distRodasCm * Math.sin(angulo - noventa);
/**
* simplificando double perim = 2 * Math.PI * distRodasCm;
* angulo += dAngulo = velCmTempo * 2 * Math.PI / perim; temos:
*/
angulo += dAngulo = velCmTempo / distRodasCm;
x += dx = (dxa - distRodasCm * Math.cos(angulo - noventa)) / 2;
y += dy = (dya - distRodasCm * Math.sin(angulo - noventa)) / 2;
break;
case 0x09:
/** usado pois o giro acontece a 90 graus da direcao do robo */
dxa = distRodasCm * Math.cos(angulo - noventa);
dya = distRodasCm * Math.sin(angulo - noventa);
/**
* simplificando double perim = 2 * Math.PI * distRodasCm;
* angulo += dAngulo = -velCmTempo * 2 * Math.PI / perim; temos:
*/
angulo += dAngulo = -velCmTempo / distRodasCm;
x += dx = -(dxa - distRodasCm * Math.cos(angulo - noventa)) / 2;
y += dy = -(dya - distRodasCm * Math.sin(angulo - noventa)) / 2;
break;
case 0x01:
dxa = distRodasCm * Math.cos(angulo - noventa);
dya = distRodasCm * Math.sin(angulo - noventa);
/**
* simplificando double perim = 2 * Math.PI * distRodasCm;
* angulo += dAngulo = velCmTempo * 2 * Math.PI / perim; temos:
*/
angulo += dAngulo = velCmTempo / distRodasCm;
x += dx = -(dxa - distRodasCm * Math.cos(angulo - noventa)) / 2;
y += dy = -(dya - distRodasCm * Math.sin(angulo - noventa)) / 2;
break;
case 0x19:
/**
* simplificando perim = Math.PI * distRodasCm; angulo +=
* dAngulo = velCmTempo * 2 * Math.PI / perim; temos:
*/
angulo += dAngulo = -velCmTempo * 2 / distRodasCm;
break;
case 0x91:
/**
* simplificando double perim = Math.PI * distRodasCm; angulo +=
* dAngulo = velCmTempo * 2 * Math.PI / perim; temos:
*/
angulo += dAngulo = velCmTempo * 2 / distRodasCm;
break;
}
tempoCmd--;
}
}

Até semana que vem
Juliana

sexta-feira, 16 de julho de 2010

Java Media Framework

>Por Juliana

Bom dia,
Hoje, apresento a vocês a biblioteca JMF(Java Media Framework). Essa biblioteca do Java possibilita a adição de audios, vídeos e outras mídias em aplicações desenvolvidas com tecnologia Java. Esse pacote opcional pode capturar, reproduzir, transmitir e decodificar vários formatos de mídia. Ele se integra ao Java 2 Platform Standard Edition (J2SE) e permite a interação entre mídia e o sistema Java.
Para mais informações, visite o link:
http://java.sun.com/javase/technologies/desktop/media/jmf/

No nosso caso, essa biblioteca deverá ser utilizada para auxiliar a movimentação do robô real. Acima da arena, uma câmera de vídeo será instalada. A partir da imagem capturada, saberemos a posição atual dos objetos do jogo, para que a movimentação dos robôs possa ser feita.
Essa biblioteca ainda será estudada durante essa semana, para, em seguida, passarmos à programação.

Bom final de semana a todos,
Juliana

sexta-feira, 9 de julho de 2010

Desenvolvimento em Java

>Por Juliana

Boa tarde,
Mais uma vez, venho lhes apresentar mais um trechinho de nosso código. Dessa vez trago uma primeira tentativa do que será a função executarComando() do RoboVirtual, ou seja, do simulador 2D. Para tanto, iremos utilizar bibliotecas tais como Graphics, Graphics2D e AffineTransform. É nesse trecho, que a interpretação do comando recebido será feita, atribuindo novos valores de posição e ângulo ao robo virtual.

public void executaComando(int i) {
if (i == 0x11) {
dX = Math.cos(angulo) * distancia;
dY = Math.sin(angulo) * distancia;
dAngulo = 0;
xRotacao=img.getWidth(null) / 2;
yRotacao=img.getHeight(null) / 2;
}
if (i == 0x99) {
dX = -Math.cos(angulo) * distancia;
dY = -Math.sin(angulo) * distancia;
dAngulo = 0;
xRotacao=img.getWidth(null) / 2;
yRotacao=img.getHeight(null) / 2;
}
if (i == 0x1) {
dAngulo = - distancia / entreRodas;
xRotacao=img.getWidth(null);
yRotacao=img.getHeight(null)/2;
}
if (i == 0x10) {
dAngulo = distancia / entreRodas;
xRotacao=0;
yRotacao=img.getHeight(null)/2;
}
if (i == 0x9) {
dAngulo = distancia / entreRodas;
xRotacao=img.getWidth(null);
yRotacao=img.getHeight(null)/2;
}
if (i == 0x90) {
dAngulo = - distancia / entreRodas;
xRotacao=0;
yRotacao=img.getHeight(null)/2;
}
if (i == 0x91) {
dX = 0;
dY = 0;
dAngulo = 2 * distancia / entreRodas;
xRotacao=img.getWidth(null) / 2;
yRotacao=img.getHeight(null) / 2;
}
if (i == 0x19) {
dX = 0;
dY = 0;
dAngulo = -2 * distancia / entreRodas;
xRotacao=img.getWidth(null) / 2;
yRotacao=img.getHeight(null) / 2;
}
x += dX;
y += dY;
angulo += dAngulo;
}
Até a semana que vem,
Juliana

sexta-feira, 2 de julho de 2010

Desenvolvimento em Java

>Por Juliana

Boa noite,
Na segunda-feira desta semana (27/jun), eu e a Mariana nos encontramos e desenvolvemos mais um pouco o projeto. No entanto, encontramos problemas, os quais só conseguimos resolver ontem (01/jul).
A seguir, lhes apresento o código, que a partir de um arquivo ggb, cria os diversos quadros de condição/ação correspondentes.
// Função que carrega o arquivo .ggb
public void Carregar(String caminho, Vector vetMinis) throws Exception {
Properties prop = new Properties();
FileInputStream pf = new FileInputStream(caminho);
prop.load(pf);
vetMinis.clear();
Prog1.pnArea.removeAll();
for (int i = 0; i < prop.size(); i++) {
String s = prop.getProperty("com" + i,"O1(0,0);O2(1,1);O1(1,1);O2(0,0)");
String p[] = s.split(",|\\(|\\),|\\);|\\)");
for (int j = 0; j < p.length; j++)
System.out.println(p[j]);
Mini mini = new Mini(Prog1.objs);
vetMinis.add(mini);
mini.acao.posObj[0]= Cardeais.calculaCardeal(Integer.parseInt(p[1]), Integer.parseInt(p[2]));
mini.acao.posObj[1]= Cardeais.calculaCardeal(Integer.parseInt(p[4]), Integer.parseInt(p[5]));
mini.condicao.posObj[0]= Cardeais.calculaCardeal(Integer.parseInt(p[7]), Integer.parseInt(p[8]));
mini.condicao.posObj[1]= Cardeais.calculaCardeal(Integer.parseInt(p[10]), Integer.parseInt(p[11]));
Prog1.pnArea.add(mini);
}
Prog1.pnArea.updateUI();
Prog1.pnArea.validate();
Dimension d = Prog1.pnArea.getPreferredSize();
}
Isso é tudo por hoje. Em breve traremos outros trechos de código, já que tal desenvolvimento deve se intensificar esse mês.
Juliana

sexta-feira, 25 de junho de 2010

Tela protótipo do simulador 2D

>Por Juliana

Boa noite,
Como certamente já foi dito em algum post de algum integrante, está em nosso plano desenvolver uma tela para a simulação 2D da lógica. Achamos essa tela extremamente importante para o projeto, pois ela possibilitará a execução da programação desenvolvida mesmo quando o usuário não dispuser da parte real (arena, robô e objetos).
Confira a seguir um protótipo da tela. Queremos que seja bastante simplificada, apresentando apenas o essencial.


Obrigada pela atenção. Boas férias e muito projeto a todos vocês,
Juliana