Tracer une ligne entre deux point en mode console

Tracer une ligne entre deux point en mode console - C++ - Programmation

Marsh Posté le 08-09-2003 à 16:00:15    

Je vasi essayer de develloper un petit jeu genre pong and cie, en c++.
mais au lieu d utiliser un mode vga, j utilise une combinaison de system("cls" ) et gotoxy(int x, inty) (conio.c)
 
cette methode marche bien  :D ,  
 
j ai voulu recreer les bases
c a d class point, class ligne ect...
 

Code :
  1. class point
  2. {
  3.     public :
  4.    
  5.         point();
  6.         point(int x, int y);
  7.         void translate(int x, int y);
  8.         double distance(point b);
  9.         void setx(const int x);
  10.         void sety(const int y);
  11.         int xval ();
  12.         int yval ();
  13.        
  14.     private :
  15.    
  16.         int xcoord;
  17.         int ycoord;
  18. };


 

Code :
  1. class ligne
  2. {
  3.     public :
  4.    
  5.         ligne(point x, point y, int cl, char ch);
  6.         void drawligne ();
  7.        
  8.     private :
  9.    
  10.          point a;
  11.          point b;
  12.          int ligne_color;
  13.          int ligne_caracter;
  14.        
  15. };


 
 
et j en viens au probleme suivant, comment tracer une ligne d un point a a un point b ?
 
verticale, horizontal ok mais diagonale ?
 
en utilisant des gotoxy(x,y) pour chaque point ?
 
 :hello:

Reply

Marsh Posté le 08-09-2003 à 16:00:15   

Reply

Marsh Posté le 08-09-2003 à 16:41:43    

:??:

Reply

Marsh Posté le 08-09-2003 à 16:50:57    

déjà je t'arrêtes direct: faire un system("cls" ) entre chaque image va faire que ça va être vraiement très pourri.
 
je te conseillerai déjà de plustôt effacer l'ancienne position d'un objet pour ensuite traçer la nouvelle...
 
ensuite ton pong, les raquettes sont verticales non ?

Reply

Marsh Posté le 08-09-2003 à 17:02:20    

BJOne a écrit :

déjà je t'arrêtes direct: faire un system("cls" ) entre chaque image va faire que ça va être vraiement très pourri.
 
je te conseillerai déjà de plustôt effacer l'ancienne position d'un objet pour ensuite traçer la nouvelle...
 
ensuite ton pong, les raquettes sont verticales non ?


 
- ok pour le system("cls" ) je vais essayer
pour delter un char c \b ?
 
 
- oui les raquette sont verticale, mais je penssai reutiliser la classe ligne.  :sweat:

Reply

Marsh Posté le 08-09-2003 à 19:57:35    

oulà...
 
tu veux vraiment traçer en mode texte via le bios (enfin le dos aussi :D) ?
 
remarque vu la puissance des machines, y'a ptet moyen de faire des trucs qui tournent via un appel dos->bios par pixel :D (heu patate)


Message édité par bjone le 08-09-2003 à 19:58:02
Reply

Marsh Posté le 08-09-2003 à 20:28:33    

BJOne a écrit :

oulà...
 
tu veux vraiment traçer en mode texte via le bios (enfin le dos aussi :D) ?
 
remarque vu la puissance des machines, y'a ptet moyen de faire des trucs qui tournent via un appel dos->bios par pixel :D (heu patate)


 
Je lis bien mes vidéo en mode texte grace à la combo mplayer + aalib :D

Reply

Marsh Posté le 08-09-2003 à 20:46:35    

oué mais c'est de l'écriture direct en ram vidéo ? :D

Reply

Marsh Posté le 09-09-2003 à 02:29:18    

BJOne a écrit :

oué mais c'est de l'écriture direct en ram vidéo ? :D


 
Je ne pense pas mais c'est bien du temps réel en tout cas. Même sur mon vieux K6-2 300 MHz ça passait bien :D

Reply

Marsh Posté le 09-09-2003 à 05:48:39    

heuuu direct en ram video ??
non c est juste la console qui sert de mode "vga"
en 50*80 svp  [:alarmclock119]  
 
pour le cls ok j ai resolu avec une fonctio erase
c est vrai qu i lny a plus les clignotement.
 
masi le pb (je me repete  :whistle: )
 
 
50*80
 
point a(1,1)
point b(50,80)
 
 
je beus tracer un ligne comment je peus faire ?
 
1. calcule  (y2-y1) / (x2-x1)
 
ex si (y2-y1) =(x2-x1)
 
je trace un point (i++, j++) pour la longueur (x2-x1)
 
humm je vais voir ca  [:alarmclock119]  
 
 
 

Reply

Marsh Posté le 09-09-2003 à 06:28:13    

(i++,j++) c'est pas tres bien...
a part pour aller de (1,1) a (50,50) [NB: je prends 50, mais j'aurais pu prendre n'importe quel autre nombre)
 
mais de (1,1) a (50,80), t'es mal barre :D

Reply

Marsh Posté le 09-09-2003 à 06:28:13   

Reply

Marsh Posté le 09-09-2003 à 07:04:48    

Deja tu pourras aps designer comme ca dans la console.
Utilise Allegro c plus simple.
 
Pour ta ligne, ben cherche des algos tout fait ca existe mais c pas trivial.

Reply

Marsh Posté le 09-09-2003 à 07:40:10    

deja je commencerai par distinguer deux cas dans l'algo:
coefficient directeur <1 et l'autre >1 (si = 1, c'est facile)
 
s'il est superieur a 1, ta "droite" sera constituee de plusieurs segments verticaux, sinon, les segments seront horizontaux.
 
a partir de la, c'est pas trop dur de tracer les differents segments....heureusement que c'est une droite :D
 
mais bon, y a d'autres methodes, sans s'embeter avec le coef directeur bien sur...mais c'est peut etre moins facile ;)


---------------
L'inventeur de la cédille est un certain monsieur Groçon .
Reply

Marsh Posté le 09-09-2003 à 07:47:40    

souk a écrit :

deja je commencerai par distinguer deux cas dans l'algo:
coefficient directeur <1 et l'autre >1 (si = 1, c'est facile)
 
s'il est superieur a 1, ta "droite" sera constituee de plusieurs segments verticaux, sinon, les segments seront horizontaux.
 
a partir de la, c'est pas trop dur de tracer les differents segments....heureusement que c'est une droite :D
 
mais bon, y a d'autres methodes, sans s'embeter avec le coef directeur bien sur...mais c'est peut etre moins facile ;)


voila c est a ce que je pensai en gros, je vais essayer ca et poster le code ici  [:alarmclock119]  
sinon pour allegro, justement je viens decouvrir ca, je lai downlaoder il me demande d utiliser "djgg" ou un truc comme ca pour compiler, bref j ai pas reussi a men servir avec devc++
(mailing list  :whistle: )
 

Reply

Marsh Posté le 09-09-2003 à 08:26:17    

Code :
  1. #ifndef GEOMETRY_DOS_LIGNE_H
  2. #define GEOMETRY_DOS_LIGNE_H
  3. #include "GEOMETRY_DOS_POINT.h"
  4. class ligne
  5. {
  6.     public :
  7.    
  8.         ligne(point x, point y, int cl, char ch);
  9.         void draw_ligne();
  10.        
  11.     private :
  12.    
  13.          point a;
  14.          point b;
  15.          int ligne_color;
  16.          char ligne_caracter;
  17.        
  18. };
  19. #endif


 

Code :
  1. #include "GEOMETRY_DOS_LIGNE.H"
  2. #include "GEOMETRY_DOS_POINT.h"
  3. #include <iostream>
  4. using namespace std;
  5. ligne::ligne(point x, point y, int cl, char ch)
  6. {
  7.     ligne_color = cl;
  8.     ligne_caracter = ch;
  9.     a = x;
  10.     b = y;
  11. }
  12. void ligne::draw_ligne()
  13. float coef = (float(b.yval())- a.yval()) / (b.xval() - a.xval());
  14. if (coef == 1)
  15. {
  16.     point x(a.xval(),a.yval());
  17.    
  18.     for (int i=0; i<(b.xval() - a.xval());i++)
  19.     {
  20.         x.draw(ligne_caracter);
  21.         x.translate(1,1);
  22.     } 
  23. }
  24. }


 
bon la diagonale ca marche  :D


Message édité par xiluoc le 09-09-2003 à 08:27:05
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed