Partage
  • Partager sur Facebook
  • Partager sur Twitter

Forme géométrique non centrée

Sujet résolu
    25 avril 2016 à 23:20:43

    Bonjour ou bonsoir !

    J'avais déjà fais un post mais visiblement je suis passé inaperçu donc je réitère mon problème :x

    J'ai créé une forme isométrique, seulement, on n'en voit que la moitié, l'autre moitié se situe hors de ma fenêtre o_O, je vous laisse le code

    import javax.swing.JPanel;
    
    import java.awt.Color;
    import java.awt.Graphics;
    
    public class carte extends JPanel{
    	private static final long serialVersionUID = 1L;
    
    	int tileWidth=100;
    	int tileHeight=50;
    	
    	public void paint(Graphics g){
    		super.paint(g);
    		for(int i=0;i<10;i++){
    			for(int j=0;j<10;j++){
    				drawTile(i,j, Color.BLUE, g);
    			}
    		}
    	}
    	
    	private void drawTile(int x, int y, Color blue, Graphics g) {
    		g.translate(WIDTH/2, 50);
    		g.drawLine(-tileWidth/2, -tileHeight/2,0,0);
    		g.drawLine(-tileWidth/2, tileHeight/2,0,0);
    		g.drawLine(tileWidth/2, tileHeight/2,0,0);
    		g.drawLine(+tileWidth/2, tileHeight/2,0,tileHeight);
    		//g.drawLine(0,tileHeight,0,0);
    	}
    }

    J'aimerais pouvoir centrer tout ca,

    Si vous avez une solution à me proposer, je suis preneur  !

    Merci d'avance :)

    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2016 à 10:37:26

      Salut,

      Mauvaise utilisation du translate : WIDTH vaut 1, donc ton décalage selon x est insignifiant !

      class Carte extends JPanel {
      	private static final long serialVersionUID = 1L;
      
      	int tileWidth = 100;
      	int tileHeight = 50;
      
      	public void paint(Graphics g) {
      		super.paint(g);
      		g.translate(100, 50);
      
      		for (int i = 0; i < 10; i++) {
      			for (int j = 0; j < 10; j++) {
      				drawTile(i, j, Color.BLUE, g);
      			}
      		}
      	}
      
      	private void drawTile(int x, int y, Color blue, Graphics g) {
      		g.translate(0, 50);
      		g.drawLine(-tileWidth / 2, -tileHeight / 2, 0, 0);
      		g.drawLine(-tileWidth / 2, tileHeight / 2, 0, 0);
      		g.drawLine(tileWidth / 2, tileHeight / 2, 0, 0);
      		g.drawLine(+tileWidth / 2, tileHeight / 2, 0, tileHeight);
      		// g.drawLine(0,tileHeight,0,0);
      	}
      }

      J'ai fait un premier translate pour deplacer g de 100 selon x et 50 selon y. Ensuite a chaque iteration, on deplace l'origine de g de 50 selon y et 0 selon x.

      Bon courage =)

      PS : pense a respecter les conventions de nommage java : nom de classe avec une majuscule (Carte et non carte ;) )

      • Partager sur Facebook
      • Partager sur Twitter
        26 avril 2016 à 14:08:50

        Re !

        Déjà merci beaucoup tu m'as permis de me débloquer ! En revanche je rencontre un autre problème x(, je te laisse le code source (je me suis permis de le modifier :D) :

        class Carte extends JPanel {
            private static final long serialVersionUID = 1L;
         
            int mapWidth = 700;
            int mapHeight = 350;
            int microtileW=100;
            int microtileH=50;
            public void paint(Graphics g) {
                super.paint(g);
                g.translate(350, 50);
                drawMap(mapHeight, mapHeight, Color.BLUE, g); 
                for (int i = 0; i < 2; i++) {
                    for (int j = 0; j < 3; j++) {
                    	drawTile(i,j, Color.BLUE, g);
                    }
                }
            }
         
            private void drawMap(int x, int y, Color blue, Graphics g) {
                g.translate(50, 25);
                g.drawLine(-mapWidth / 2, mapHeight / 2, 0, 0);
                g.drawLine(-mapWidth / 2, mapHeight / 2, 0, 0);
                g.drawLine(mapWidth / 2, mapHeight / 2, 0, 0);
                g.drawLine(-mapWidth / 2, mapHeight / 2, 0, mapHeight);
                g.drawLine(mapWidth / 2, mapHeight / 2, 0, mapHeight);  
            }
            private void drawTile(int x, int y, Color blue, Graphics g) {
                g.translate(50, 25);
                g.drawLine(-microtileW / 2, microtileH / 2, 0, 0);
                g.drawLine(-microtileW / 2, microtileH / 2, 0, 0);
                g.drawLine(microtileW / 2, microtileH / 2, 0, 0);
                g.drawLine(-microtileW / 2, microtileH / 2, 0, microtileH);
                g.drawLine(microtileW / 2, microtileH / 2, 0, microtileH);  
            }
        }
        Ce qui me donne ceci : (J'aimerais pouvoir remplir tout le "losange" principal de petits "losanges" ) encore merci pour ton aide ;)
        • Partager sur Facebook
        • Partager sur Twitter
          26 avril 2016 à 14:34:14

          La gestion avec un translate va t'embrouiller plus qu'autre chose je pense... Pourquoi ne pas plutôt tracer toutes les lignes ?

          class Carte extends JPanel {
          	private static final long serialVersionUID = 1L;
          
          	int mapWidth = 700;
          	int mapHeight = 350;
          	int microtileW = 100;
          	int microtileH = 50;
          	int offsetX = 400;
          
          	public void paint(Graphics g) {
          		super.paint(g);
          		drawMap(mapHeight, mapHeight, Color.BLUE, g);
          
          		for (int i = 1; i < 7; i++) {
          			int x0 = (offsetX - mapWidth / 2) + i * 50;
          			int y0 = (mapHeight / 2) + i * 25;
          			int x1 = offsetX + i * 50;
          			int y1 = i * 25;
          			g.drawLine(x0, y0, x1, y1);
          		}
          
          		for (int i = 1; i < 7; i++) {
          			int x0 = (offsetX - mapWidth / 2) + i * 50;
          			int y0 = (mapHeight / 2) - i * 25;
          			int x1 = offsetX + i * 50;
          			int y1 = mapWidth/2 - i * 25;
          			g.drawLine(x0, y0, x1, y1);
          		}
          	}
          
          	private void drawMap(int x, int y, Color blue, Graphics g) {
          		g.drawLine(offsetX, 0, offsetX - mapWidth / 2, mapHeight / 2);
          		g.drawLine(offsetX + mapWidth / 2, mapHeight / 2, offsetX, 0);
          		g.drawLine(offsetX - mapWidth / 2, mapHeight / 2, offsetX, mapHeight);
          		g.drawLine(offsetX + mapWidth / 2, mapHeight / 2, offsetX, mapHeight);
          	}
          
          }


          J'avoue y être allé a taton pour les valeurs de x0,y0,x1,y1 mais tu va pouvoir trouver des équations propres ^^

          -
          Edité par BabC 26 avril 2016 à 14:35:24

          • Partager sur Facebook
          • Partager sur Twitter
            26 avril 2016 à 14:43:10

            Nickel t'es un génie tu viens de résoudre un problème qui perdurait depuis 1mois et demi.... Comment te remercier ...x)
            • Partager sur Facebook
            • Partager sur Twitter
              26 avril 2016 à 14:51:21

              A ce point la !! Les maths c'est la vie fut pas l'oublier x)

              Fallait venir plus tôt ^^

              • Partager sur Facebook
              • Partager sur Twitter
                26 avril 2016 à 15:00:48

                Oui vraiment ! Depuis le temps que je galérais x)

                Une dernière chose, est ce que tu peux juste m'expliquer le code car au final j'ai la solution mais elle diffère vachement de la mienne (et je comprends pas tout à fait :x) et je trouve plus intéressante de comprendre  le code, que de recopier bêtement :D ?

                • Partager sur Facebook
                • Partager sur Twitter
                  26 avril 2016 à 15:09:49

                  Alors plutôt que de déplacer le repère pour tracer les lignes, je les traces depuis (x0,y0) jusqu’à (x1,y1). Sauf le contour de la map, je me suis dit que ça pourrait t’être utile plus tard ^^

                  Lors de

                   
                          for (int i = 1; i < 7; i++) {
                              int x0 = (offsetX - mapWidth / 2) + i * 50;
                              int y0 = (mapHeight / 2) + i * 25;
                              int x1 = offsetX + i * 50;
                              int y1 = i * 25;
                              g.drawLine(x0, y0, x1, y1);
                          }

                  En réalité je déplace les points de départ et d'arriver d'une ligne a la fois (x0,x1,y0,y1). J'ai fait a taton pour trouver la bonne équation permettant de bien déplacer selon les bord de map avec l'increment i.

                  Amuse toi a commenter des lignes, changer le nombre d'iteration maximale de la boucle for pour mieux comprendre ;)
                  Et il y a deux boucles for car il y a les lignes horizontales, et les verticales (enfin en iso ;) )

                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 avril 2016 à 15:46:35

                    Ok très bien ! Et à quoi sert offsetX ? Il dépend de mapWidth ?

                    (Ah oui d'ailleurs ! Est-ce que ce code sort tout droit de ta tête ou tu le tires d'exemple sur internet ? :D )

                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 avril 2016 à 9:46:15

                      C'est moi qui l'ai fait a la va vite, d'ou le fait que je n'utilise pas de méthode ou des calculs un peu plus clairs ^^

                      OffSetX permet juste de décaler toute ta carte de x (ici 400). Tu peux le faire dépendre de mapWidth si tu veux ^^ Tout depend si tu veux avoir des menu plus tard sur les cotes par exemple. Mais c'est un bon moyen de pouvoir déplacer toute la carte en changeant une seule valeur ;)

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Forme géométrique non centrée

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown