#include<iostream>
#include<math.h>
int arrondi(float x)
{
return (N*(x+0.5));
}
int main()
{
float x,y,xE,yE;
int image[N][N];
int ix=0;
int iy=0;
for(int i=0;i<=N;i++)
{
for(intj=0;j<=N;j++)
{
image[i][j]=0;
}
}
printf("Veuillez saisir les coordonnees de
l'extremite E(xE,yE): \n);
scanf("%f%f, &xE, &yE);
if((xE<0)||(xE>1)||(yE<0)||(yE>1)
{
printf("Erreur saisie.\n);
}
Bonsoir,
Je me suis récemment mis au code en C et je suis tombé sur un exercice qui me pose problème.
Voici l'énoncé:
On s’intéresse au tracé sur écran de segments de droite. Un tel tracé s’effectue en allumant les pixels les plus proches possible du segment “réel”. L’image affichée, constituée de l’ensemble des pixels, est représentée par un tableau de N*N entiers Image[N][N] (on prendra N=20 et on utilisera la directive #define N 20 pour fixer cette valeur). On supposera que chaque pixel ne possède que 2 états: 0 pour éteint et 1 pour allumé.
Dans la suite, on travaillera dans le premier quadrant (0<=x<=1 et 0<=y<=1)et on supposera que l’une des extrémités du segment coïncide avec l’origineO. On notera l’autre extrémité E=(xE,yE).
À un point de coordonnées (x,y) de l'image réelle, on associe le pixel le plus proche ayant pour indices i=|N*x+0.5| et j=|N*y+0.5|, où |x| désigne la partie entière inférieure de x.
1°) Écrire une fonction int arrondi(float x) qui calcule et renvoie la partie entière inférieure de N*x+0.5.
Voici ce que j'ai fais:
2°)Dans une fonction main(), déclarer un tableau Image[][] de N*N entiers et initialiser ses éléments à zéro.
Et, demander à l’utilisateur de saisir au clavier les coordonnées de l’extrémité (xE, yE) en vérifiant qu’on a bien 0<=xE,yE<=1. Ajouter les instructions pour afficher à l’écran les indices associés au pixel le plus proche de E (utiliser la fonction arrondi()).
Voir plus haut.
Voilà, j'ai essayé, je sais que j'ai oublier plein de choses, surtout à la fin et je vous avoue que je me perds dans tout ça.
Salut, Tu n'as pas donné de code complet. Ton main n'est pas complété. Il te faut les fichiers d'inclusion (#include <...>) et le #define qu'on te demande. As-tu un compilateur. Il est bon de tester son code soi-même. Le pire qu'il peut arriver est que ça ne fonctionne pas, soit à cause d'une erreur de compilation, soit une erreur à l'exécution. Ta fonction arrondi est correcte. Je suggère de déclarer le tableau sur une ligne séparée. Certains te diront même d'avoir une ligne par variable. Tu ne déclares pas correctement les variables de type float: x, y, xE, yE. Les variables i et j pourraient être déclarées dans le for correspondant (regardes la documentation). Tu initialises correctement le tableau image. Dans le scanf(), le format pour float est %f Petite erreur de frappe: yE<01 (on doit lire yE<0) Tu n'assignes pas le résultat de arrondi() dans une variable, que tu pourrais appeler ix (ou iy) Fais avec la variable y comme avec x. On te dit comment faire pour allumer un pixel. Il te rreste à afficher le résultat dans deux boucles for imbriquées ...
Le Tout est souvent plus grand que la somme de ses parties.
Merci PierrotLeFou ainsi que rouloude pour ces réponses.
Oui, désolé, les fichiers d'inclusion, je les ai mis dans mon compilateur CodeBlocks effectivement mais ici, j'ai oublié. J'y penserais la prochaine fois.;-)
Variables séparées--->O.K, je prends note.
x,y,xE,yE en float.....c'est vrai qu'avoir xE et yE entre 0 et 1, ce ne sera pas facile (merci les gars).
Si j'écris for(int i=0; i<N; i++), c'est bon ou bien (int i; int i<N; int i++)?
%f dans le scanf car ce sont des float---Noté!
Merci pour l'erreur de frappe!
Quand tu dis que je n'assigne pas le résultat de arrondi() dans une variable mais dans par exemple ix( resp iy), je ne saisi pas trop. Comment je pourrais faire? Je ne vois pas trop ce que tu veux dire.
Veux-tu dire que je dois écrire printf("L'arrondi de l'extrémité est %d ", arrondi(ix));?
float ix=0;
float iy=0;
printf("L'arrondi de l'extremite xE(ou yE) est: ", arrondi(ix)(ou iy));? (Merci du conseil rouloude ;-)!)
//Pour allumer le pixel, j'essaie:
float delta= yb-ya/xb-xa;
for(i=ix;i<xE;i++)
{ for(j=iy;j<yE;j++)
{
iy=y+(ix-x)*delta;
printf( , ix, arrondi(iy); //Je ne sais pas trop comment afficher le pixel en (ix, arrondi(iy)
float ix=0;
float iy=0;
printf("L'arrondi de l'extremite xE( ou yE) est: "arrondi(ix) (ou iy);
//Pour allumer le pixel, j'essaie:
float delta=iy-y/ix-x;
for(i=ix;i<xE;i++)
{
for(j=iy;j<yE;j++)
{
iy=y+(ix-x)*delta;
printf(ix, arrondi(iy));
}
}
Il va falloir revoir les bases du C: la ligne 4 ne compile pas, le printf() ligne 15 non plus.
Et que crois-tu que va donner la ligne 8 ? Revois la priorité des opérateurs, car je suppose que tu voudrais que l'opération soit delta=(iy-y)/(ix-x). Toi, ce que tu as écrit, c'est delta=iy-x-y/ix
- Edité par edgarjacobs 28 novembre 2020 à 23:28:02
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Les lignes 4 et 15 vont retourner un 0 j'imagine, car ix (resp. iy) est égal à 0.
Dans mon 1er message, j'avais écris concernant la ligne 4: arrondi(xE) mais on m'a dit que c'était faux, je t'avoue que je suis perdu sur ce point (d'autres aussi d'ailleurs) étant novice.
Dans la ligne 8, j'ai écris, que delta=(iy-y)/(ix-x), je n'ai pas écris que delta=iy-x-y/ix.
En gros, ce que je veux, c'est delta=(yB-yA)/(xB-xA) avec yB>yA et xB>xA
Les lignes 4 et 15 vont retourner un 0 j'imagine, car ix (resp. iy) est égal à 0.
Non, ces lignes sont syntaxiquement incorrectes, donc elles ne retourneront rien puisque le programme n'aura pas été compilé.
Dans mon 1er message, j'avais écris concernant la ligne 4: arrondi(xE) mais on m'a dit que c'était faux, je t'avoue que je suis perdu sur ce point (d'autres aussi d'ailleurs) étant novice.
Le problème n'est pas là mais dans la syntaxe de 'printf' : il faut indiquer le format d'affichage (%d peut-être).
Dans la ligne 8, j'ai écris, que delta=(iy-y)/(ix-x), je n'ai pas écris que delta=iy-x-y/ix.
Ah si :
float delta=iy-y/ix-x; // est équivalent à iy-x-y/ix
En effet il fallait mettre des parenthèses, c'est pour ça qu'Edgarjacobs parlait des priorités des opérations.
J'ai l'impression que je me suis mal exprimé. Tu appelles la fonction arrondi() avec un float comme argument, et tu t'attends à ce que ça soit converti en int. Ça, la fonction le fait bien. Mais où va la valeur retournée par la fonction? J'ai suggéré des variables de type int que j'ai nommées ix et iy (pour integer x ...) Donc ce que tu dois faire est d'assigner à ix et iy les conversions de x et y. Ce n'est pas une bonne idée de mettre les résultats des appels à arrondi() directement dans les printf() car tu en auras besoin plus tard. Comment penses-tu mettre à 1 le pixel correspondant aux coordonnées que tu viens de saisir? Et on ne te demande qu'un seul point. Sinon, tu devrais mettre la saisie, etc., dans une boucle pour en saisir plusieurs. Ça me fait penser aux vieux traceurs mécaniques pour lesquels il fallait arrondir le tracé au dixième de millimèttre. On a encore le même problème si on veut tracer sur un écran. On ne peut pas mettre de point entre deux pixels.
Le Tout est souvent plus grand que la somme de ses parties.
Dans la ligne 8, j'ai écris, que delta=(iy-y)/(ix-x), je n'ai pas écris que delta=iy-x-y/ix
Bien sur que si. Si tu ne mets pas les parenthèses, le compilateur ne les mettra pas pour toi. Lui, il fait ce que tu lui dis de faire. Si j'écris 10-4/4-1, ça donnera 8, pas 2.
- Edité par edgarjacobs 29 novembre 2020 à 17:48:15
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Même en algèbre, ça ne serait pas ce que tu penses. Ça ressemble plus à ce qu'on ferait avec une calculette: 10 - 4 / à ce moment, elle affiche 6 4 - elle affiche 1.5 ? 1 = elle affiche 0.5
Le Tout est souvent plus grand que la somme de ses parties.
Non, ces lignes sont syntaxiquement incorrectes, donc elles ne retourneront rien puisque le programme n'aura pas été compilé.
Le problème n'est pas là mais dans la syntaxe de 'printf' : il faut indiquer le format d'affichage (%d peut-être).
Oui, tu as raison, merci!
edgarjacobs a écrit:
Bien sur que si. Si tu ne mets pas les parenthèses, le compilateur ne les mettra pas pour toi. Lui, il fait ce que tu lui dis de faire. Si j'écris 10- 4/4-1, ça donnera 8, pas 2.
Au temps pour moi, je comprends. J'ai tendance à les oublier dans les forums alors que dans le compilateur je les mets systématiquement.
J'éviterais à l'avenir. Merci.
PierrotLeFou a écrit:
J'ai l'impression que je me suis mal exprimé. Tu appelles la fonction arrondi() avec un float comme argument, et tu t'attends à ce que ça soit converti en int. Ça, la fonction le fait bien. Mais où va la valeur retournée par la fonction? J'ai suggéré des variables de type int que j'ai nommées ix et iy (pour integer x ...) Donc ce que tu dois faire est d'assigner à ix et iy les conversions de x et y.
Est-ce-que si je mets un int juste après le return pour que la fonction me retourne un entier, c'est correct?
int arrondi(float x)
{
return (int)(N*(x+0.5));
}
PierrotLeFou a écrit:
Ce n'est pas une bonne idée de mettre les résultats des appels à arrondi() directement dans les printf() car tu en auras besoin plus tard.
En gros, après les 2 boucles for, j'écris "arrondi(iy); et ensuite printf...., c'est bien ça?
PierrotLeFou a écrit:
Comment penses-tu mettre à 1 le pixel correspondant aux coordonnées que tu viens de saisir? Et on ne te demande qu'un seul point. Sinon, tu devrais mettre la saisie, etc., dans une boucle pour en saisir plusieurs. Ça me fait penser aux vieux traceurs mécaniques pour lesquels il fallait arrondir le tracé au dixième de millimèttre. On a encore le même problème si on veut tracer sur un écran. On ne peut pas mettre de point entre deux pixels.
Je ne vais pas te mentir, je n'en ai aucune idée, je ne vois pas ce que je peux faire.
Peut-être que lorsqu’un pixel s'allume ou s'éteint, on utilise les booléens?
L’image affichée, constituée de l’ensemble des pixels, est représentée par un tableau de N*N entiers Image[N][N] (on prendra N=20 et on utilisera la directive #define N 20 pour fixer cette valeur). On supposera que chaque pixel ne possède que 2 états: 0 pour éteint et 1 pour allumé.
Ça me semble assez clair pour le tableau représentant les pixel !
@JakeWater: Je ne répond pas par MP à ce genre de problème. (Ça ne me dérange pas que tu me dises TU ...) Tu sembles mélanger les types de variables, et ce n'est pas une bonne idée que d'utiliser des float comme variables de contrôle dans un for. Ensuite, je crois que l'exercice n'a pas été compris. Il ne s'agit pas de tracer une "vraie" image à l'écran, mais un tableau de 0 et de 1 pour montrer où sera placé le point saisi. Je te suggère de reviser les parties du cours sur les types de variable, les fonctions avec valeur de retour, l'assignation, l'affichage avec printf(), etc.
Le Tout est souvent plus grand que la somme de ses parties.
Tracé de segment pour un débutant en C
× 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.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.