[RESOLVIDO]Java 2D ------> HTML5

36 respostas
arthurminarini

pessoal estou precisando ler um dxf e montar ele em algo visual. Escolhi o java 2D mas não sei nada dele alguem pode me ajudar?
como fazer um quadrado no java 2D? Ele é em applet? alguma luz,dicas obrigado.

36 Respostas

ViniGodoy

Veja os seguintes artigos do ponto V!
Escolhendo onde desenhar
Conhecendo o JFrame
Uma visão rápida sobre o Java 2D
Pintando no java 2D
O fantasma do Pacman
Trabalhando com imagens

Se precisar fazer algo animado, veja também:
O loop de animação
A primeira animação
Desenho direto - Active Rendering

Outra boa fonte é o livro Killer Game Programming in Java, disponível online em:
http://fivedots.coe.psu.ac.th/~ad/jg/

arthurminarini

vlw @ViniGodoy

arthurminarini

vou querer usar em applet mesmo tem algum exemplo tbm de applet?

ViniGodoy

Sim, no primeiro artigo “escolhendo onde desenhar”.
O resto é tudo igual.

Basta sobrescrever o paint do JApplet, ao invés do paint do JFrame. Mas tudo que funciona pra um, funciona também para o outro.

Tchello

ViniGodoy:
Veja os seguintes artigos do ponto V!
O fantasma do Pacman

Se eu tivesse lido esse artigo a uns 2 anos atrás meu fantasma do pacman não seria uma bola vermelha horrorosa…
Até o pacman desenhei bonitinho, usei coordenadas polares pra definir os pontos, tudo ficou desenhado bonitinhamente… mas o fantasma ficou uma bola mesmo UHAUHAuhahuAuhA

arthurminarini

Sim, no primeiro artigo “escolhendo onde desenhar”.
O resto é tudo igual.

Basta sobrescrever o paint do JApplet, ao invés do paint do JFrame. Mas tudo que funciona pra um, funciona também para o outro.

nesse artigo não possui “como” no netbeans crio uma aplicaçaõ web e crio a classe de applet ou crio um projeto separado para o applet e depois importo ele em um outro projeto?

ViniGodoy

Não. Os artigos referem-se à linguagem Java, não à IDEs específicas.

Mas isso não deve ser muito difícil de descobrir.

arthurminarini

tem como vc me dar um exemplo de um applet que apenas desenha 1 linha reta?

arthurminarini

eu tive olhando o .class da applet tem que estar na mesmo diretorio do jsp mas como fazer ele pegar o .class em outro diretorio pois na programação mesmo é feita no .java que esta em um pacote

Marky.Vasconcelos

Cara, segue um tutorial de como fazer um applet primeiro, depois tente com Java2D.

http://www.google.com/search?hl=en&q=hello+world+applet

arthurminarini

é porque eu uso netbeans e não da pra por uma classe no diretorio do html ele cai para o pacote padrão. ao rodar a aplicação web da erro no applet e fica tudo preto porque na verdade o .class gerado fica em

arthurminarini

eu estou com um html de teste com o <applet e um projeto no netbeans basico apenas com classes ao dar F9 pego o .class e jogo na pasta do html e ta funcionando o problema é demora para testar todo hora mas vamos lá…

estou tendo problemas em antalias o 2D ja tem? eu vi uma classe de terceiro que cria até 4 niveis de antialias
por exemplo

g.drawLine(10,10,300,0);//geraria uma linha cerrilhada pois não é reta. Como posso aplicar antialias nessa linha?

arthurminarini

em qual ambiente de desenvolvimento vocês usam para programar os applets e testar no browser ou em algum visualizador?

arthurminarini

isso meu ajudou muito

ViniGodoy

Eu programo no Eclipse. Ele te um visualizador (usa o do próprio java).
E as vezes ponho no browser também para ver como está ficando.

arthurminarini

ja estou avançado na leitura do arquivo DXF agora é so por pra desenhar no metodo paint

@Override
    public void paint(Graphics g) {
        List<ArrayList> a = lista;
        for (int i = 0; i < a.size(); i++) {
            if (a.get(i).get(0).toString().equals("LINE")) {
                g.drawLine(Integer.parseInt(a.get(i).get(1).toString()),
                        Integer.parseInt(a.get(i).get(2).toString()),
                        Integer.parseInt(a.get(i).get(3).toString()),
                        Integer.parseInt(a.get(i).get(4).toString()));
            }
        }
    }

pergunto:

o dxf trabalha com valores flutuantes exemplo 0.00000000000000
a maiorira dos metodos que eu vi do draw recebe int!! qual metodo devo trabalhar para montar uma linha,circulo etc… com valores flutuantes?

ViniGodoy

Você leu os artigos que te indiquei?
Pelo visto não, pois dá para ver que você ainda nem sequer está fazendo a cópia do contexto gráfico.

O java 2D fornece um método chamado draw(Shape). Ele permite que você desenhe uma forma.

Entre essas formas está a classe Line2D. Que pode ser instanciada com precisão de Double ou Float:

Line2D linha = new Line2D.Float(10.2f, 11.5f, 15.2f, -11.5f); graphics.draw(linha);

Recomendo fortemente que você leia os artigos e dê uma boa estudada no funcionamento do Java2D, antes de sair desenhando. É uma boa prática conhecer a API que você usa.

Os artigos que te enviei explicam como usar essas classes. Há exemplos no artigo do fantasma do pacman.

arthurminarini

opa deu certo

public void paint(Graphics g) {
        List<ArrayList> a = lista;
        for (int i = 0; i < a.size(); i++) {
            if (a.get(i).get(0).toString().equals("LINE")) {
                Graphics2D g2d = (Graphics2D) g.create();
                Line2D linha = new Line2D.Float(Float.parseFloat(a.get(i).get(1).toString()),
                                          Float.parseFloat(a.get(i).get(2).toString()),
                                          Float.parseFloat(a.get(i).get(3).toString()),
                                          Float.parseFloat(a.get(i).get(4).toString()));
                g2d.draw(linha);
                g2d.dispose();
            }
        }
    }
ViniGodoy

Melhor fazer uma cópia só:

public void paint(Graphics g) {
   List&lt;ArrayList&gt; a = lista;
   Graphics2D g2d = (Graphics2D) g.create();

   for (int i = 0; i &lt; a.size(); i++) {
      if (a.get(i).get(0).toString().equals(&quot;LINE&quot;)) {         
            Line2D linha = new Line2D.Float(Float.parseFloat(a.get(i).get(1).toString()),
            Float.parseFloat(a.get(i).get(2).toString()),
            Float.parseFloat(a.get(i).get(3).toString()),
            Float.parseFloat(a.get(i).get(4).toString()));
            g2d.draw(linha);                
            }
        }
    g2d.dispose();
}

Por que sua lista não é de floats? Não é ruim ficar fazendo parse a cada iteração do loop?

arthurminarini

porque na 1° posição eu tenho uma string com o tipo de objeto (linha, arco etc…)

deixa eu te perguntar.

por exemplo no dxf tem uma linha que vai de 0 a 800 mas como definir isso no palco do applet

como definir o tamnho do palco do applet para poder calcular (ajustar) porque vai ter que redimencionar
para poder caber . alguma dica?

da uma ollhada tbm no anti alias

@Override
    public void paint(Graphics g) {
        List<ArrayList> a = lista;
        Graphics2D g2d = (Graphics2D) g.create();
        for (int i = 0; i < a.size(); i++) {
            if (a.get(i).get(0).toString().equals("LINE")) {                
                Line2D linha = new Line2D.Double(Double.parseDouble(a.get(i).get(1).toString())/2,
                                                 Double.parseDouble(a.get(i).get(2).toString())/2,
                                                 Double.parseDouble(a.get(i).get(3).toString())/2,
                                                 Double.parseDouble(a.get(i).get(4).toString())/2);

                g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

                g2d.draw(linha);                
            }
        }
        g2d.dispose();
    }

me ajuda a definir a scala da imagem

por exemplo se eu tenho um pauco de 593x567

e recebo uma imagem de 1200x900

vou ter que calcular tudo

será que não tem como eu receber o valor normal desenhar e depois tipo dar um zoom afastando os elementos?

ViniGodoy

Eu ainda criaria uma classe para armazenar isso.

Com um enum para o tipo do objeto.
E uma lista com as coordenadas.

Evitar casts e conversões assim é sempre uma boa política. Se você for desenhar muitos pontos, isso vai acabar com sua performance. Faça a conversão uma vez só, na hora da leitura.

O applet tem os métodos getWidth() e getHeigth(). O objeto Graphics() também tem o método getClipRect(). Eles te retornam as dimensões da área de pintura.
E a dica que eu dou é que vc leia os artigos que te passei com cuidado, pq isso também está explicado por lá.

ViniGodoy

Use para isso a classe AffineTransform. Ela pode fazer o zoom para você.

arthurminarini

ok parece que deu certo

@Override
    public void paint(Graphics g) {
        List<ArrayList> a = lista;
        Graphics2D g2d = (Graphics2D) g.create();

        //Scala de zoom out
        AffineTransform af = new AffineTransform();
        af.scale(3,3);
        
        try {
            af.invert();
        } catch (NoninvertibleTransformException ex) {
            Logger.getLogger(ViewerApplet.class.getName()).log(Level.SEVERE, null, ex);
        }

        for (int i = 0; i < a.size(); i++) {
            if (a.get(i).get(0).toString().equals("LINE")) {                
                Line2D linha = new Line2D.Double((Double.parseDouble(a.get(i).get(1).toString()) +10),
                                                 (Double.parseDouble(a.get(i).get(2).toString()) +10),
                                                 (Double.parseDouble(a.get(i).get(4).toString()) +10),
                                                 (Double.parseDouble(a.get(i).get(5).toString()) +10));

                g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                
                g2d.setTransform(af);
                g2d.draw(linha);
            }
        }
        g2d.dispose();        
    }
ViniGodoy

Você também pode setar os rendering hints uma única vez, logo depois de usar o create().

arthurminarini

vlw coloquei la em cima

arthurminarini

qual melhor compoenete para fazer um arco de meu dxf

ele vem com os seguintes atributos

1-ponto central x
2-ponto central y
3-raio
4-anglo inicial
5-anglo final

sei que tem o Arc2D arco = new Arc2D.Double

mas não consegui montalo pois os parametros é diferente como por exemplo Arc2D.OPEN que vc explicou no tutorial
esse componente mesmo qeu devo usar ou outro?

a documentação dele é boa
http://java.sun.com/j2se/1.4/pdf/j2d-book.pdf

vi que o arc do java 2d é bem parecido só que ele não recebe como parametro o raio e sim width e height
como posso calcular então?

Arc2D arco = new Arc2D.Double((Double.parseDouble(a.get(i).get(1).toString())),//StartX,
                                              (Double.parseDouble(a.get(i).get(2).toString())),//StartY,
                                              (50),//Width            //<--------- eu tenho o raio 
                                              (50),//Height,         //<--------- eu tenho o raio 
                                              (Double.parseDouble(a.get(i).get(5).toString())),//startAngle
                                              (Double.parseDouble(a.get(i).get(6).toString())),//endAngle
                                              Arc2D.OPEN);


arthurminarini

outra duvida seria que o dxf ler e monta o x e y de baixo pra cima e o applet de cima pra baixo daí tudo fica inverso no meu desenho. temo como espelhar esse desenho ou fazer com que o applet leia de baixo pra cima?

arthurminarini

viny só falta o arco pra mim terminar só que não fica igual à imagem acima é encontra de varios arcos para formar um arco grande

veja como esta ficando


arthurminarini
} else if (a.get(i).get(0).toString().equals("ARC")) {//<---------- o arco que ta me dando dor de cabeça                
                Arc2D arco = new Arc2D.Double((Double.parseDouble(a.get(i).get(1).toString()) +10),//StartX,
                                              (Double.parseDouble(a.get(i).get(2).toString()) +10),//StartY,
                                              (Double.parseDouble(a.get(i).get(4).toString())*2),//Width raio*2     //na especificação diz que  tem que passar o tamanho daí tenho o raio 2 vezes que é width!
                                              (Double.parseDouble(a.get(i).get(4).toString())*2),//Height, raio*2
                                              (Double.parseDouble(a.get(i).get(5).toString())),//startAngle    //-<<<<< aqui que parece que ta doido
                                              (Double.parseDouble(a.get(i).get(6).toString())),//endAngle
                                              Arc2D.OPEN);////vi outros tipo também aqui o melhor que ficou foi o Open
                //g2d.setTransform(af);
                //g2d.setStroke(bsThick);
                g2d.setPaint(Color.red);
                g2d.draw(arco);
            } else if (a.get(i).get(0).toString().equals("CIRCLE")) {//<----------circulo e linha ta beleza
                Ellipse2D.Double circle = new Ellipse2D.Double((Double.parseDouble(a.get(i).get(1).toString()) +10),
                                                               (Double.parseDouble(a.get(i).get(2).toString()) +10),
                                                               (Double.parseDouble(a.get(i).get(4).toString()))*2,   // <--------- calculei que o raio é 5 então o width dele é 2 x o raio
                                                               (Double.parseDouble(a.get(i).get(4).toString()))*2);<--------- calculei que o raio é 5 então o height dele é 2 x o raio

                //g2d.setTransform(af);
                //g2d.setStroke(bsThick);
                g2d.setPaint(Color.BLUE);
                g2d.draw(circle);
            }
arthurminarini

@ViniGodoy tem como me ajudar a fechar aquele arco igual da primeira figura?

ViniGodoy

Cara, tenho que pedir para você ler de novo os artigos que te passei? Você chegou a ler?

Leia a parte “Definindo a forma do corpo”.
http://www.pontov.com.br/site/index.php/java/48-java2d/107-o-fantasma-do-pacman

Aliás, aproveita e lê o artigo todo, e os outros também.

arthurminarini

ok

arthurminarini

como minha aplicação é web optei por usar HTML é bem mais facil e adaptou muito bem pra ler DXF visto que as funções são bem iguais

http://srcware.com/programacao/html-5-introducao-a-tag-canvas/

arthurminarini

no html 5 usei igual eu estava usando no applet java2D e no html5 funcionou (Math.PI/180)* angloinicial e (Math.PI/180)* anglofinal mas no java2D é diferente o ARC. que pena.
mas no html5 da pra fazer de tudo que preciso. inclusive scale, rotate, zoom, etc…

ViniGodoy

arthurminarini:
no html 5 usei igual eu estava usando no applet java2D e no html5 funcionou (Math.PI/180)* angloinicial e (Math.PI/180)* anglofinal mas no java2D é diferente o ARC. que pena.
mas no html5 da pra fazer de tudo que preciso. inclusive scale, rotate, zoom, etc…

É pq vc devia ter usado a função Curve, não a Arc. Como explicam os tutoriais.

Essa história de tentar programar por tentativa e erro não dá certo mesmo.

arthurminarini
É pq vc devia ter usado a função Curve, não a Arc. Como explicam os tutoriais.

obrigado!!!

Essa história de tentar programar por tentativa e erro não dá certo mesmo.

eu li bastante coisa e li os tutoriais mas uma coisa que é simples para você para mim não seja
concordo que brutalforce não é viavel mas estou sem tempo e o HTML5 foi bastante intuitivo e eficaz
incusive é bem parecido com api java2D

obrigado por todas as ajudas! :smiley:

Criado 25 de agosto de 2010
Ultima resposta 30 de ago. de 2010
Respostas 36
Participantes 4