Posté le 13/08/2012 18:09
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 63 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 13/08/2012 18:17 | #
Il affiche un message d'erreur ?
Je sais que je ne peut pas trop aider, vu mes connaissances
Citer : Posté le 13/08/2012 18:23 | #
pas de message d’erreur, c'est le pixels qui s'affichent au petit bonheur de la chance, et en clignotant comme du niveau de gris (alors qu'il y a pas de rafraîchissement durant la fonction)
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 13/08/2012 18:25 | #
Je le savais, Je ne peut pas t'aider, désolé...
Citer : Posté le 13/08/2012 18:38 | #
bah, vu que tu me considère comme ton prof de programmation
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 13/08/2012 18:45 | #
La fonction pixel, c'est toi qui l'a faite ? Si oui, l'erreur vient pt de là.
Citer : Posté le 13/08/2012 18:51 | #
dsl, l'erreur ne vient pas de la, j'ai testé en remplaçant pixel par la fonction de basse de casio et sa marchait pas non plus.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 13/08/2012 19:17 | #
Quand tu dit au petit bohneur la chance, le resultat est le même quand tu lui donne les argument ? c'est pas completement aléatoire non plus ?
Et quand je calcul vite fait à la main pour ca:
Ligne(1, 1, 4, 3, 1)
et j'obtient si je me trompe pas
2.5 ; 1
4 ; 2
5.5 ; 3
Bon deja c'est pas des entiers, mais bon ca va tronquer je suppose. donc moi je lui demande le point 1,1 au debut et lui il commance par le point 2,1 deja y'a un problème la. Et je voulais qu'il finisse par 4,3 il finit par 5,3. Enfin je crois pas m'être trompé.
Bref j'avais deja essayé de dessiner une ligne pixel par pixel et sache qu'il y a un algorithme qui est utilisé sur pas mal de truc et qui est sur wikipedia : Algorithme de tracé de segment de Bresenham
Moi j'avais l'un de ces code, tu le traduit en C vu que la c'est du pseudo code, et ca avais parfaitement marché pour moi, enfin après tu fait ce que tu veux
Citer : Posté le 13/08/2012 19:24 | #
Dès le début tu écris : si x1>x2, inverser x1 et x2; si y1>y2, inverser y1 et y2;
Donc la ligne (1,5,5,1) sera dessinée en (1,1,5,5)
Dans ton case 0, pourquoi un switch et pas un simple if else ?
De plus, tu as inversé les 2 boucles, si (x2-x1)<(y2-y1) alors la ligne sera plus verticale qu'horizontale.
Enfin, ton algo est très lourd. Faire une division prend du temps. De tout ce que j'ai pu tester, je n'ai jamais rien trouvé de plus rapide que Bresenham.
Citer : Posté le 13/08/2012 19:30 | #
Si l'écart en x est inférieur, tu dois faire ta boucle en y, et inversement.
Citer : Posté le 13/08/2012 20:46 | #
exact pierotll, j'avais pas fait gaffe, il ce peut que l'un des problèmes vient des inversions
Enfin, ton algo est très lourd. Faire une division prend du temps. De tout ce que j'ai pu tester, je n'ai jamais rien trouvé de plus rapide que Bresenham.
Tu peux m’expliquer ce qu'est Bresenham?
Ajouté le 13/08/2012 à 20:59 :
Merci Wikipedia
J\'ai trouvé l\'algo, c\'est un peux ce que je voulais faire, mais je refaisait bêtement certains calculs inutiles. Merci Pierotll pour ta suggestion.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 13/08/2012 21:03 | #
Bresenham propose d'autres fonctions comme le cercle
Citer : Posté le 13/08/2012 21:20 | #
je n'ai besoins que de lignes, merci (minecraft ne compte heureusement pas de cercles ni d'ellipses ou sphères et c'est mieux comme sa)
Ajouté le 13/08/2012 à 21:21 :
enfin, bref, je pense que l\'on peut déjà clore et supprimer le sujet pour éviter de prendre trop de place sur le site
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 13/08/2012 21:59 | #
On ne supprime pas un sujet, ça peut toujours servir.
Citer : Posté le 13/08/2012 22:42 | #
Et puis merde, sa marche toujours pas, je vais me contenter de copier la fonction ML_line() et la modifier comme je l'entend, parce que je viens de tenter de créer une fonction utilisant la méthode Bresenham et c'est encore un fiasco:
Ligne(x1, y1, x2, y2, couleur)
{
float x,y,pas;
switch(2*(x1==x2)-(y1==y2))
{
case 0: if(abs(x1-x2)>abs(y1-y2))
{
if(x1>x2)
{
x=x1;
x1=x2;
x2=x;
y=y1;
y1=y2;
y2=y;
}
pas=(y2-y1)/(x2-x1);
y=y1;
for(x=x1;x<=x2;x++)
{
Pixel(x,(int)y,couleur);
y+=pas;
}
}
else
{
if(y1>y2)
{
x=x1;
x1=x2;
x2=x;
y=y1;
y1=y2;
y2=y;
}
pas=(x2-x1)/(y2-y1);
x=x1;
for(y=y1;y<=y2;y++)
{
Pixel((int)x,y,couleur);
x+=pas;
}
}
break;
case 1: Pixel(x1,y1,couleur);
break;
case 2: if(y1>y2)
{
y=y1;
y1=y2;
y2=y;
}
for(y=y1;y<=y2;y++) Pixel(x1,y,couleur);
break;
case -1: if(x1>x2)
{
x=x1;
x1=x2;
x2=x;
}
for(x=x1;x<=x2;x++) Pixel(x,y1,couleur);
break;
}
}
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 13/08/2012 23:01 | #
T'a le même resultat que tout a l'heure ?
Ajouté le 13/08/2012 à 23:21 :
Je sais pas si ca peut t\'aider, moi je l\'avais fait il y a longtemps quand j\'avais commencé un emulateur de basic casio (que j\'ai jamais fini, il ne gère que horizontal vertical, f-line, text, et viewwindows pixelon/off ploton/off ) Bref le code est en C++ mais il je l\'avais fait à la base en C, puis je l\'avais mis en C++ pour pour pouvoir faire de la POO, donc tu pourra peut être l\'adapter facilement pour ton programme:
{
int dx=x2-x1;
int dy=y2-y1;
if(dx!=0)
{
if(dx>0)
{
if(dy!=0)
{
if(dy>0)
{
// vecteur oblique dans le 1er quadran
if(dx>dy)
{
// vecteur diagonal ou oblique proche de l’horizontale, dans le 1er octant
int e=dx;
dx=dx*2;
dy=dy*2;
while(1)
{
basic_PxlOn(x1, y1) ;
x1=x1+1;
if(x1==x2){break;}
e=e-dy;
if(e<0)
{
y1++; //deplacement diagonal
e=e+dx;
}
}
}
else
{
// vecteur oblique proche de la verticale, dans le 2nd octant
int e=dy;
dy=dy*2;
dx=dx*2;
while(1)
{
basic_PxlOn(x1, y1) ;
y1++;
if(y1==y2){break;}
e=e-dx;
if(e<0)
{
x1++; //deplacement diagonal
e=e+dy;
}
}
}
}
else// dy < 0 (et dx > 0)
{
// vecteur oblique dans le 4e cadran
if(dx>-dy)
{
// vecteur diagonal ou oblique proche de l’horizontale, dans le 8e octant
int e=dx;
dx=dx*2;
dy=dy*2;
while(1)
{
basic_PxlOn(x1, y1) ;
x1=x1+1;
if(x1==x2){break;}
e=e+dy;
if(e<0)
{
y1--; //deplacement diagonal
e=e+dx;
}
}
}
else
{
// vecteur oblique proche de la verticale, dans le 7e octant
int e=dy;// e est négatif
dy=dy*2;
dx=dx*2;
while(1)
{
basic_PxlOn(x1, y1) ;
y1--;
if(y1==y2){break;}
e=e+dx;
if(e<0)
{
x1++; //deplacement diagonal
e=e+dy;
}
}
}
}
}
else // dy = 0 (et dx > 0)
{
// vecteur horizontal vers la droite
do
{
basic_PxlOn(x1, y1) ;
x1++;
} while (x1==x2);
}
}
else // dx < 0
{
dy=y2-y1;
if(dy!=0)
{
if(dy>0)
{
// vecteur oblique dans le 2nd quadran
if(-dx>=dy)
{
// vecteur diagonal ou oblique proche de l’horizontale, dans le 4e octant
int e=dx;
dx=dx*2;
dy=dy*2;
while(1)// déplacements horizontaux
{
basic_PxlOn(x1, y1) ;
x1--;
if(x1==x2){break;}
e=e+dy;
if(e>=0)
{
y1++; //deplacement diagonal
e=e+dx;
}
}
}
else
{
// vecteur oblique proche de la verticale, dans le 3e octant
int e=dy;
dy=dy*2;
dx=dx*2;
while(1)
{
basic_PxlOn(x1, y1) ;
y1++;
if(y1==y2){break;}
e=e+dx;
if(e<=0)
{
x1--; //deplacement diagonal
e=e+dx;
}
}
}
}
else // dy < 0 (et dx < 0)
{
// vecteur oblique dans le 3e cadran
if(dx<=dy)
{
// vecteur diagonal ou oblique proche de l’horizontale, dans le 5e octant
int e=dx;
dx=dx*2;
dy=dy*2;
while(1)
{
basic_PxlOn(x1, y1) ;
x1--;
if(x1==x2){break;}
e=e-dy;
if(e>=0)
{
y1--; //deplacement diagonal
e=e+dx;
}
}
}
else
{
// vecteur oblique proche de la verticale, dans le 6e octant
int e=dy;
dy=dy*2;
dx=dx*2;
while(1)
{
basic_PxlOn(x1, y1) ;
y1--;
if(y1==y2){break;}
e=e-dx;
if(e>=0)
{
x1--; //deplacement diagonal
e=e+dy;
}
}
}
}
}
else // dy = 0 (et dx < 0)
{ // vecteur horizontal vers la gauche
do
{
basic_PxlOn(x1, y1) ;
x1--;
} while (x1==x2);
}
}
}
else// dx = 0
{
dy=y2-y1;
if(dy!=0)
{
if(dy>0)
{
// vecteur vertical croissant
do
{
basic_PxlOn(x1, y1) ;
y1++;
} while (y1==y2);
}
else // dy < 0 (et dx = 0)
{
// vecteur vertical décroissant
do
{
basic_PxlOn(x1, y1) ;
y1--;
} while (y1==y2);
}
}
}
}
Normalement t\'a juste a remplacé tous les basic_PxlOn par ta fonction pour changer les pixel de couleur, enfin je crois Au pire essaye ca te coute pas grand chose
Citer : Posté le 13/08/2012 23:29 | #
T'a le même resultat que tout a l'heure ?
pas vraiment, le programme ce contente de s’arrêter.
Sinon, ton algo est sympas, mais ce que je cherche, c'est la simplicité, et ML_line() est de loin la fonction la plus simple que j'ai trouvé qui pourrait me servir.
(je ne cherche pas vraiment a afficher des points, mais en mode graphique, c'est plus facile que dans une matrice)
(je cherche a créer un mappeur, une fonction qui applique des transformations a une image et qui l'insère dans une figure géométrique plane)
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 13/08/2012 23:54 | #
(Quoi il est pas simple je vois pas de quoi tu parle )
Bah ça c'est sur que c'est le plus simple, Pierrotll c'est un dieux aussi, tu peut pas faire mieux, surtout que ce code la je l'ai fait il y a 6 mois et que je savais moins coder en C (ca veut pas dire que je code super bien maintenant )
Bref j'ai du mal a comprendre ce que tu veut faire pourquoi ne pas utiliser ML_line() à ce moment là ?
Et je dois dire que j'ai pas vraiment compris tes deux parenthèse
En gros tu veut dessiner dessiner les trait mais au lieux de faire a l'écran tu le fait dans une matrice ? Ca tombe mal je suis pas calé en matrice ! Bref je vais laisser mon petit cervaux de coté et laisser les autre t'aider
Citer : Posté le 14/08/2012 00:23 | #
J'ai trouvé ça sur cemetech, cette fonction utilise l'algorithme de bresenham :
void drawLine(int x1, int y1, int x2, int y2, int color) {
signed char ix;
signed char iy;
// if x1 == x2 or y1 == y2, then it does not matter what we set here
int delta_x = (x2 > x1?(ix = 1, x2 - x1):(ix = -1, x1 - x2)) << 1;
int delta_y = (y2 > y1?(iy = 1, y2 - y1):(iy = -1, y1 - y2)) << 1;
plot(x1, y1, color);
if (delta_x >= delta_y) {
int error = delta_y - (delta_x >> 1); // error may go below zero
while (x1 != x2) {
if (error >= 0) {
if (error || (ix > 0)) {
y1 += iy;
error -= delta_x;
} // else do nothing
} // else do nothing
x1 += ix;
error += delta_y;
plot(x1, y1, color);
}
} else {
int error = delta_x - (delta_y >> 1); // error may go below zero
while (y1 != y2) {
if (error >= 0) {
if (error || (iy > 0)) {
x1 += ix;
error -= delta_y;
} // else do nothing
} // else do nothing
y1 += iy;
error += delta_x;
plot(x1, y1, color);
}
}
}
Citer : Posté le 14/08/2012 18:24 | #
merci, je vais voir si je peux l'utiliser, a la base, je vous pose ces question car ce que je veux faire c'est une sorte de fonction Fill simplifiée pour afficher des formes géometriques simples (4 sommets, convexe)
Ajouté le 14/08/2012 à 18:52 :
le ML_filled_polygone() est trop lent par rapport a ce qu\'il me faudrait, car il prend en compte trop de paramètres, il me faudrait une fonction propre a un polygone a 4 sommets et convexe, j\'en ai vu dans le tutoriel de christophe heulin, mais je n\'arrive pas a l\'intégrer dans mes programmes.
Ajouté le 14/08/2012 à 19:14 :
Je retire ce que je viens de dire, je suis juste con, j\'oubliais que c\'est GRAPHIC.c qu\'il fallait intégrer, et non pas GRAPHIC.h pour le tuto de christophe heulin
dsl de te faire une remarque pierotll, mais sa fonction fill est nettement plus rapide, et contrairement a la tienne, on a pas de pixel blancs sur les bordures (j\'ai encadré un fill avec les fonctions ML_line() et le fill ne remplissait pas exactement toute la forme)
Ajouté le 14/08/2012 à 19:16 :
je pense donc pouvoirs sortir bientôt un test d\'affichage de face sur un cube unique bientôt, le temps de trafiquer encore un peu mon programme.
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 14/08/2012 20:01 | #
Peut être que les fonctions n'ont pas le même rôle, c'est pour ça que celle de pierrot doit être plus lente.