Ajuda com coordenadas e exercício Deitel

Bom Dia!

Pessoal estou estudando Java por conta própria usando o livro do Deitel 8ªe - Java Como Programar e, até agora estava ocorrendo tudo muito bem.

Só que eu empaquei no Exercício 4.1 da página 107 e não consigo fazer de modo algum, não consegui pegar a lógica do problema.

Mas meu maior problema é que eu ainda não consegui entender direito como funcionam as coordenadas para traçar linhas do Java.

Bom, como nem todos tem o livro, temos o seguinte código de exemplo:

CLASS

[code]import java.awt.Graphics;
import javax.swing.JPanel;

public class DrawPanel extends JPanel
{
public void paintComponent( Graphics g )
{
super.paintComponent( g );

	int width = getWidth(); //largura
	int height = getHeight(); // altura
	
	// desenha uma linha a partir do canto superior esquerdo até o inferior direito
	g.drawLine( 0, 0, width, height );
	
	// desenha uma linha a partir do canto inferior esquerdo até o superior direito
	g.drawLine( 0, height, width, 0 );
}

}[/code]

MAIN

[code]import javax.swing.JFrame;

public class DrawPanelTest
{
public static void main( String[] args )
{
DrawPanel panel = new DrawPanel();

	JFrame application = new JFrame();
	
	application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	
	application.add( panel );
	application.setSize( 250, 250 );
	application.setVisible( true );
}

}[/code]

e então temos o enunciado do problema:

[quote]4.1 - O uso de loops e instruções de controle para desenhar linhas pode resultar em muitos projetos interessantes

a) Crie o projeto na captura de tela esquerda da Figura 4.20. Esse projeto desenha linhas a partir do canto superior esquerdo, estendendo as linhas ate que elas cubram a metade superior esquerda do painel. Uma abordagem é dividir a largura e a altura em um numero igual de passos (descobrimos que 15 passos funcionam bem). A primeira extremidade de uma linha sempre estará no canto superior esquerdo(0, 0). A segunda extremidade pode ser encontrada iniciando no canto inferior esquerdo e movendo-se para cima um passo vertical e para a direita um passo horizontal. Desenhe uma linha entre as duas extremidades. Continue movendo-se para cima e para a direita para encontrar cada extremidade sucessiva. A figura deve ser dimensionada de maneira correspondente à medida que você redimensiona a janela.

b) Modifique sua resposta na parte(a) para que as linhas se estendam a partir de todos os quatro cantos, como mostrado na captura de tela direita da Figura 4.20. As linhas nos cantos opostos devem se cruzar no meio.
[/quote]

PS: Pesquisei e encontrei este tópico: http://www.guj.com.br/java/243363-ajuda-em-exercicio-41-do-livro-deitel-6-edicao , mas eu realmente não entendi a lógica, se alguém puder me explicar a lógica usada e como usar as coordenadas, ficaria muito grato.

PS2: Como estou estudando por conta, não quero saber somente do exercício respondido pra entregar pra algum professor, eu quero realmente entender como funciona.

MUITO OBRIGADO!

Boa tarde.
Comecei a ler O Java Como Programar e também estou com dificuldade do exercício.

Polyvox, tudo bom? :slight_smile:

Por “pareça que incrível” eu estou vendo esta parte do livro agora, e finalmente entendi depois de ler várias vezes. Só o exercício que eu também viajei, mas pelo menos o sistema de coordenada eu posso te ajudar a entender. Bom vamos lembrar de matemática na famosa reta (x,y). No java, o sistema de coordenadas é inverso ou seja Y é positivo para “baixo” e não para “cima” como aprendemos na matemática…é só isso que muda. Agora imagino que você também esteja com dúvidas no método drawLine da classe Graphics. É assim para você desenhar um ponto você sempre vai precisar de duas informações (x,y). Agora para você desenhar uma reta, você vai precisar de dois pontos, ou seja, (x1,y1) para o primeiro ponto e (x2,y2) para o segundo ponto. Pegue como exemplo as figuras do livro, na parte em que eles desenham um “X”. Vamos supor que o tamanho da janela é 250x250 então aonde devo desenhar a primeira parte do X? Seguindo o exemplo do livro vamos “desenhar” o “”.

 g.DrawLine(0,0,width,height); // lembre-se (x1,y1,x2,y2) ou seja x1 e y1 informa a posição do primeiro ponto e x2 e y2 informa a posição do segundo ponto.

o x1,y1 são iguais a 0, pois o “” começa pelo canto superior esquerdo (lembre do plano cartesiano, só que no java o valor de y é invertido, no começo deste estudo de caso vc verá um exemplo explicando)

o x2 é a largura da janela e y2 é a altura pois estas posições sempre se baseiam no tamanho da janela (LxA =LarguraXAltura)

Vou desenhar o "\"

   (x1,y1)
----|*--------------> x
    |  \       
    |   \      
    |    \     
    |     \    
    |      \   
    |       \  
    |        #(x2,y2) 
    V
    y

* = Exatamente neste ponto estamos informando que x1 e y1 é 0. (x1,y1=0,0)
# = Exatamente neste ponto estamos informando que o x2 e y2 é igual a altura(y2) e largura(x2) da janela.Imagine que o canto seja aí  :) 

Neste caso lembra quando você usou o método getWidth() e o getHeight() antes dessa linha para pegar os valores da janela? Então na linha acima estamos informando para o java que o primeiro ponto da reta “” fica no canto superior esquerdo e o segundo ponto fica no inferior direito. (Se ainda estiver com dúvida nesta parte, sugiro que pegue um lápis e um papel e desenhe o plano cartesiano (x,y) para você ententer melhor :wink: )

então resumindo o “” usa os valores x1,y1 para o começo da reta e o x2,y2 para o final desta mesma reta.

Por que usamos o width e height como x2,y2? Ora, por que queremos que o desenho seja do tamanho da janela, ou seja, se redimensionarmos esta janela, o “” irá respeitar o tamanho da janela e crescer junto com a mesma.

Agora para o “/” a única coisa que muda é que ele começa pelo canto inferior esquerdo e vai até o superior direito ou seja vc irá informa ao java aonde fica o primeiro ponto(x1,y1) que será o começo da linha e também o (x2,y2).

Agora o "/":

            (x1,y1)
----|-------*> x
    |       /   |
    |      /    |
    |     /     |
    |    /      |
    |   /       |
    |  /        |
    |# (x2,y2) 
    V
    y



Agora o "X":

1ª(x1,y1)      (x1,y1)2ª
--- -|*----------*> x
     |  \      / |
     |   \    /  |
     |    \  /   |
     |     \/    |
     |     /\    |
     |    /  \   |
2ª   |   #    #1ª(x2,y2)                                                  
    V
    y

Resumindo em míudos:

 g.DrawLine(0,0,width,height);//1ª - Primeira Linha "\" 
 g.DrawLine(0,height,width,0);//2ª - Segunda Linha "/" 

UFA! rs…espero te ajudado com a parte de explicação de coordenadas, agora espero que alguém nos ajude na questão do exercício 4.1 pois eu também não consegui fazer :cry: Segue abaixo uma tentativa do exercício 4.1…não entendi muito bem a questão dos 15 passos :shock: :lol:

//Classe DrawPanelCha
import java.awt.Graphics;

import javax.swing.JPanel;


public class DrawPanelCha extends JPanel 
{
	public void paintComponent(Graphics g) 
	{
		super.paintComponent(g);
		
		int width = getWidth();
		int height = getHeight();
		int x1 = 0;
		int y1 = 0;
		int	x2 = 0;
		int y2 = height;
		g.drawLine(x1, y1, x2, y2);
		
		while(x2!=width && y2!=0)
		{
			if(y2>0 && x2<width)
			{
				y2--;
				x2++;
				g.drawLine(x1, y1, x2, y2);
			}//fim do if
		}//fim do while
	}// fim do método PaintComponents
}//fim da classe.

import javax.swing.JFrame;


public class DrawPanelChaTest 
{
	public static void main(String[] args) 
	{
		DrawPanelCha panel = new DrawPanelCha();
		JFrame application = new JFrame();
		
		//insere o painel no frame.
		application.add(panel);
		application.setSize(250, 250);
		application.setVisible(true);
		
	}

}

Abraços!

1 curtida

Boa Noite

Eu tambem to nessa questão mais to na letra b)
meu codigo da letra a) deu certo.

import java.awt.Graphics;
import javax.swing.JPanel;

public class DrawPanel extends JPanel {

	public void paintComponent(Graphics g){
		
		super.paintComponents(g);

		int width = getWidth();//total da largura
		int height = getHeight();// total da altura
		int c =15;//os espaço de cada linha
		
		while(c<345){ //vai ter 23 linhas 15*23 = 345
		g.drawLine(0,c,c,height); // vai começar no canto superior esquerdo e vai da sequencia decendo e indo a direita
		c+=15;// incrementa o c

		}// fim do while	
	}//fim do paintComponent	
} //fim da class

esse resolve a letra a)

Na letra b eu consegui coloca as coordenadas em duas estremidades

package capitulo04;

import java.awt.Graphics;
import javax.swing.JPanel;

public class DrawnPanel extends JPanel {

	public void paintComponent(Graphics g){
		
		super.paintComponents(g);

		int width = getWidth();//total da largura
		int height = getHeight();// total da altura
		int c =15;//os espaço de cada linha
		
		while(c<345){//vai ter 23 linhas 15*23 = 345
		g.drawLine(0,c,c,height);// vai começar no canto superior esquerdo e vai da sequencia decendo e indo a direita
		g.drawLine(width,c,c,0);	
		c+=15;// incrementa o c

        	}// fim do while	
	}//fim do paintComponent	
} //fim da class

Mais não consegui sair dai.

Depois de um pouco de analise consegui resolver a letra b deste exercício abaixo:

package drawpanel;
import java.awt.Graphics;
import javax.swing.JPanel;
/** @author Heraldo*/
public class Testa extends JPanel{
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);

   int width = getWidth ();//largura
   int height = getHeight();//altura
   int contador = 1;
   int c =0;//os espaço de cada linha  
       
   while(c<250){ //vai ter 25 linhas  
   
       g.drawLine(0,c,c,height);
       g.drawLine(width,c,c,0);
       g.drawLine(width-c,0,0,c);
       g.drawLine(width,c,height - c,height);
      c+=10;// incrementa o c  

   }// fim do while  
   
}

}

e a classe de teste:

public class DrawPanelTest {

public static void main(String[] args) {
   //DrawPanel panel = new DrawPanel();
    Testa a = new Testa();
   JFrame aplication = new JFrame();
   aplication.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   //aplication.add(panel);
   aplication.add(a);
   aplication.setSize(500,520);
   aplication.setVisible(true);
}

}

ps: gostaria que alguém me falasse como posto a tela do netbeans com o código, da mesma forma que está na resposta anterior.
Valew!!!

vlw cara, eu ja tinha consegui ae esqueci de postar mais como coloca no formato de codigo vc coloca [ code] codigo [\ code] sem os espaços

vlw

Agradeço a galera aí pela ajuda nessa questão.

Deu uma clareada sim com o código do weslly99 e a explicação do D4ksid3!

Valeu mesmo galera!

Baseado no código do weslly99 entendi e fiz o meu de forma mais feia, rsrs, porém acho que mais fácil de entender com o passo a passo de cada argumento que são as coordenadas para cada extremidade!

Enfim, ficou feio na minha opinião o código, mais está aí a resolução para o Painel:

Classe: JanelaEsquerdaBaixo que é a Classe: DrawPanel

package pagina107;
import java.awt.Graphics;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class JanelaEsquerdaBaixo extends JPanel {
	public void paintComponent( Graphics g ) {
		super.paintComponent(g);
		int height = getHeight();
		int passos = 15;
		g.drawLine(0, 0, passos, height);
		g.drawLine(0, passos * 2, passos * 2, height);
		g.drawLine(0, passos * 3, passos * 3, height);
		g.drawLine(0, passos * 4, passos * 4, height);
		g.drawLine(0, passos * 5, passos * 5, height);
		g.drawLine(0, passos * 6, passos * 6, height);
		g.drawLine(0, passos * 7, passos * 7, height);
		g.drawLine(0, passos * 8, passos * 8, height);
		g.drawLine(0, passos * 9, passos * 9, height);
		g.drawLine(0, passos * 10, passos * 10, height);
		g.drawLine(0, passos * 11, passos * 11, height);
		g.drawLine(0, passos * 12, passos * 12, height);
		g.drawLine(0, passos * 13, passos * 13, height);
		g.drawLine(0, passos * 14, passos * 14, height);
		g.drawLine(0, passos * 15, passos * 15, height);
		g.drawLine(0, passos * 16, passos * 16, height);
		g.drawLine(0, passos * 17, passos * 17, height);
		g.drawLine(0, passos * 18, passos * 18, height);
	}
}

Classe: JanelaEsquerdaBaixoTeste que é a Classe: DrawPanelTest

package pagina107;
import javax.swing.JFrame;
public class JanelaEsquerdaBaixoTeste {
	public static void main (String[] args){
		JanelaEsquerdaBaixo janela = new JanelaEsquerdaBaixo();
		JFrame application = new JFrame();
		application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		application.add( janela );
		application.setSize( 250, 250 );
		application.setVisible( true );	
	}
}

Tentando fazer a segunda figura deste estudo de caso do livro Deitel que são as linhas que se estendem em todos os cantos, não consegui fazer somente as linhas que seriam da direita para a parte abaixo do painel.

Segue aí a classe com as extremidades que consegui fazer:

Classe: Janela que seria a Classe: DrawPanel

package pagina107;
import java.awt.Graphics;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Janela extends JPanel {
	public void paintComponent( Graphics g ) {
		super.paintComponent(g);
		int height = getHeight();
		int passos = 15;
		// extremidade do painel na esquerda abaixo
                g.drawLine(0, 0, passos, height);
		g.drawLine(0, passos * 2, passos * 2, height);
		g.drawLine(0, passos * 3, passos * 3, height);
		g.drawLine(0, passos * 4, passos * 4, height);
		g.drawLine(0, passos * 5, passos * 5, height);
		g.drawLine(0, passos * 6, passos * 6, height);
		g.drawLine(0, passos * 7, passos * 7, height);
		g.drawLine(0, passos * 8, passos * 8, height);
		g.drawLine(0, passos * 9, passos * 9, height);
		g.drawLine(0, passos * 10, passos * 10, height);
		g.drawLine(0, passos * 11, passos * 11, height);
		g.drawLine(0, passos * 12, passos * 12, height);
		g.drawLine(0, passos * 13, passos * 13, height);
		g.drawLine(0, passos * 14, passos * 14, height);
		g.drawLine(0, passos * 15, passos * 15, height);
		g.drawLine(0, passos * 16, passos * 16, height);
		g.drawLine(0, passos * 17, passos * 17, height);
		g.drawLine(0, passos * 18, passos * 18, height);
		// extremidade do painel na esquerda acima
		g.drawLine(0, height, passos, 0);
		g.drawLine(0, height - (passos * 2), passos * 2, 0);
		g.drawLine(0, height - (passos * 3), passos * 3, 0);
		g.drawLine(0, height - (passos * 4), passos * 4, 0);
		g.drawLine(0, height - (passos * 5), passos * 5, 0);
		g.drawLine(0, height - (passos * 6), passos * 6, 0);
		g.drawLine(0, height - (passos * 7), passos * 7, 0);
		g.drawLine(0, height - (passos * 8), passos * 8, 0);
		g.drawLine(0, height - (passos * 9), passos * 9, 0);
		g.drawLine(0, height - (passos * 10), passos * 10, 0);
		g.drawLine(0, height - (passos * 11), passos * 11, 0);
		g.drawLine(0, height - (passos * 12), passos * 12, 0);
		g.drawLine(0, height - (passos * 13), passos * 13, 0);
		g.drawLine(0, height - (passos * 14), passos * 14, 0);
		g.drawLine(0, height - (passos * 15), passos * 15, 0);
		g.drawLine(0, height - (passos * 16), passos * 16, 0);
		g.drawLine(0, height - (passos * 17), passos * 17, 0);
		g.drawLine(0, height - (passos * 18), passos * 18, 0);
		// extremidade do painel na direita acima
		g.drawLine(height, passos, 0, 0);
		g.drawLine(height, passos * 2, passos * 2, 0);
		g.drawLine(height, passos * 3, passos * 3, 0);
		g.drawLine(height, passos * 4, passos * 4, 0);
		g.drawLine(height, passos * 5, passos * 5, 0);
		g.drawLine(height, passos * 6, passos * 6, 0);
		g.drawLine(height, passos * 7, passos * 7, 0);
		g.drawLine(height, passos * 8, passos * 8, 0);
		g.drawLine(height, passos * 9, passos * 9, 0);
		g.drawLine(height, passos * 10, passos * 10, 0);
		g.drawLine(height, passos * 11, passos * 11, 0);
		g.drawLine(height, passos * 12, passos * 12, 0);
		g.drawLine(height, passos * 13, passos * 13, 0);
		g.drawLine(height, passos * 14, passos * 14, 0);
		g.drawLine(height, passos * 15, passos * 15, 0);
		g.drawLine(height, passos * 16, passos * 16, 0);
		g.drawLine(height, passos * 17, passos * 17, 0);
		g.drawLine(height, passos * 18, passos * 18, 0);
	}
}

Classe: JanelaTeste que seria a Classe: DrawPanelTest

package pagina107;
import javax.swing.JFrame;
public class JanelaTeste {
	public static void main (String[] args){
		Janela janela = new Janela();
		JFrame application = new JFrame();
		application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		application.add( janela );
		application.setSize( 275, 300 );
		application.setVisible( true );	
	}
}

Se alguem quiser aí fazer a extremidade que falta posta aí para a galera tirar sua dúvidas inclusive de forma melhor que a minha também que não fiz com todas as extremidades!
Enfim, tentei ajudar e achei que ficou feio o código, rsrs, mas talvez possa ajudar alguém!

1 curtida