2010-10-15 4 views
0

J'ai été chargé de dessiner huit lignes, formant quelque chose comme une étoile régulière à huit points, avec l'algorithme de dessin au trait de Bresenham. Cela devait être fait en langage Delphi. Comme je ne suis pas très doué en dessin sur toile, j'ai simplement copié-collé l'algorithme de Wikipedia pour Object Pascal, avec un minimum de modifications.
Mais l'algorithme Wikipédien avait le signe (x) fonction, qui n'a pas été inclus dans les bibliothèques standard Delphi, donc je devais écrire moi-même:Dessin au trait de Bresenham en Delphi - problèmes avec la fonction Signe (x)

function Sign(x:integer):integer; 
begin 

if x=0 then Result:=0; 
if x>0 then Result:=1; 
else Result:=-1; 
end; 

Tout fonctionnait bien, mais je ne pouvais fonctionner Dans les deux premiers quadrants, les autres coordonnées étaient reflétées. j'ai changé la fonction pour afficher les erreurs:

function Sign(x:integer):integer; 
begin 

if x=0 then Result:=0; 
if x>0 then Result:=1; 
if x<0 then Result:=-1 else begin 
Form1.Label5.Caption:='Err!'; 
Result:=2; 
end; 

end; 

J'ai utilisé cette fonction comme suit:

sx:=Sign(x1-x0); 
sy:=Sign(y1-y0); 

x0, x1, y0, y1 sont les coordonnées de la ligne commencent et des points d'extrémité. Je suis confus, il semble que parfois x1-x0 et y1-y0 ne sont pas moins, plus ou égal à zéro, mais tombent sous la 4ème instruction 'else'. Pourriez-vous s'il vous plaît expliquer l'humble débutant, pourquoi cela arrive-t-il?

P.S. J'ai eu ce programme pour travailler, en changeant la 4ème déclaration 'else' à Result in 1, mais toujours confus de cette situation.

Merci d'avance.

Répondre

4

Il vous manque un autre avant le second si. Donc 0 tombe à la fois dans le cas = 0 et dans le cas contraire de> 0.

function Sign(x:integer):integer; 
begin  
    if x=0 then Result:=0 
    else if x>0 then Result:=1 
    else Result:=-1; 
end; 

Et il existe une fonction Sign dans l'unité Math.

Et vous pourriez avoir testé votre fonction avec les paramètres -2, -1,0, + 1, + 2 pour voir ce qui se passe.

+0

Euh, merci, coudnt google up le nom de cette unité.Accepté. – Arnthor

+0

@norvind: Si vous voulez l'accepter, cliquez sur la coche sous le contrôle de partition. –

+1

@Norvind, ne demandez pas à Google quelles sont les fonctions de Delphi. Demande à Delphi. Utilisez votre outil de recherche de texte favori pour rechercher dans les fichiers sources Delphi la fonction qui vous intéresse. Delphi est livré avec un outil de ligne de commande 'grep' et sa commande GUI" find in files "est également utilisable. –