[DEFI] Dessiner
Publié : mer. 26/févr./2014 18:39
Le défi est le suivant :
Créer une procédure qui dessine un rectangle ABCD avec seulement 2 points A et B donnés et où les seuls opérateurs permis sont "+, -, *, /, sqrt, line() et lineXY()".
Donc, interdiction d'utiliser
la fonction box(), ni rectangle_(), ...
ni les api,
ni les opérateurs de trigo comme sin, cos, tan, atan, acos, etc,
pas le droit d'utiliser non plus une table de nombre, pas de tableau, ni de liste, ni de map, ni de datasection, etc,...
ni quoi que ce soit d'autre.
C'est du niveau Lycée, 1ère S.
Défi subsidiaire : Faire tourner ce rectangle.
Réponse dans 7 ou 14 jours avec le code commenté.
Mesa.
REPONSE
Défi subsidiaire
M.
Créer une procédure qui dessine un rectangle ABCD avec seulement 2 points A et B donnés et où les seuls opérateurs permis sont "+, -, *, /, sqrt, line() et lineXY()".
Donc, interdiction d'utiliser
la fonction box(), ni rectangle_(), ...
ni les api,
ni les opérateurs de trigo comme sin, cos, tan, atan, acos, etc,
pas le droit d'utiliser non plus une table de nombre, pas de tableau, ni de liste, ni de map, ni de datasection, etc,...
ni quoi que ce soit d'autre.
C'est du niveau Lycée, 1ère S.
Défi subsidiaire : Faire tourner ce rectangle.
Réponse dans 7 ou 14 jours avec le code commenté.
Mesa.
REPONSE
Code : Tout sélectionner
Procedure Rectangle(x0, y0, x1, y1, e, couleur)
; -----------------------------------
;
; A(x0,y0)_________________B(x1,y1)
; | |
; | |
; | |
; C(x2,y2)_________________D(x3,y3)
;
; -----------------------------------
;Tracé de la ligne AB
LineXY(x0, y0, x1, y1, couleur)
;Rotation à 90° du point B autour du point A
;Les coordonnées de ce point sont x2_90 et y2_90
x2_90=-(y1-y0)+x0
y2_90=x1-x0+y0
; x3_90=(y1-y0)+x0
; y3_90=-1*(x1-x0)+y0
;Calcul de la longueur du segment AB
L.f=Sqr((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))
;Calcul du coefficient de proportionnalité
;sans lui, on ne pourrait dessiner que des carrés ou des triangles-rectangles
H.f=e/L
;Calcul des coordonnées du point C par homothétie (réduction)
x2=H*(x2_90-x0)+x0
y2=H*(y2_90-y0)+y0
;Tracé de la ligne AC
LineXY(x0, y0, x2, y2, couleur)
;Calcul des coordonnées du point D : les vecteurs AB et CD sont colinéaires
x3=x1-x0+x2
y3=y1-y0+y2
;Tracé de la ligne BD
LineXY(x1,y1,x3, y3,couleur)
;Tracé de la ligne CD
LineXY(x2,y2,x3, y3, couleur)
EndProcedure
;- openwindows
If OpenWindow(0, 100, 200, 300, 300, "Test de rotation de rectangle 2D")
If CreateImage(0, 300, 300)
If StartDrawing(ImageOutput(0))
Box(0,0,300,300,RGB(0,128,128)) ; Fond vert
Rectangle(10,10,110,10,30,RGB(255,255,255))
Rectangle(10,60,30,60,100,RGB(255,255,0))
Rectangle(180,20,220,60,60,RGB(0,255,0))
Rectangle(100,60,210,160,40,RGB(0,255,0))
Rectangle(100,260,210,180,25,RGB(0,255,255))
Rectangle(100,260,210,180,-25,RGB(0,255,255))
Rectangle(200,240,250,240,50,RGB(255,255,255))
StopDrawing()
EndIf
; Affichage du rectangle dans un ImageGadget
ImageGadget(0, 0, 0, 0, 0, ImageID(0))
;Delay(100)
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
End
Code : Tout sélectionner
Procedure Rectangle(x0, y0, x1, y1, e, couleur)
; -----------------------------------
;
; A(x0,y0)_________________B(x1,y1)
; | |
; | |
; | |
; C(x2,y2)_________________D(x3,y3)
;
; -----------------------------------
;Tracé de la ligne AB
LineXY(x0, y0, x1, y1, couleur)
;Rotation à 90° du point B autour du point A
;Les coordonnées de ce point sont x2_90 et y2_90
x2_90=-(y1-y0)+x0
y2_90=x1-x0+y0
; x3_90=(y1-y0)+x0
; y3_90=-1*(x1-x0)+y0
;Calcul de la longueur du segment AB
L.f=Sqr((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))
;Calcul du coefficient de proportionnalité
;sans lui, on ne pourrait dessiner que des carrés ou des triangles-rectangles
H.f=e/L
;Calcul des coordonnées du point C par homothétie (réduction)
x2=H*(x2_90-x0)+x0
y2=H*(y2_90-y0)+y0
;Tracé de la ligne AC
LineXY(x0, y0, x2, y2, couleur)
;Calcul des coordonnées du point D : les vecteurs AB et CD sont colinéaires
x3=x1-x0+x2
y3=y1-y0+y2
;Tracé de la ligne BD
LineXY(x1,y1,x3, y3,couleur)
;Tracé de la ligne CD
LineXY(x2,y2,x3, y3, couleur)
EndProcedure
;- openwindows
If OpenWindow(0, 100, 200, 300, 300, "Test de rotation de rectangle 2D")
If CreateImage(0, 300, 300)
xc=150
yc=150
R=100
For a=0 To 360
; Ici les sin et cos ne servent pas à dessiner le rectangle
; mais juste à le faire tourner autour de A
; ça permet de vérifier que l'on peut dessiner un rectangle dans "toutes les directions"
x=R*Cos(Radian(a))+xc
y=R*Sin(Radian(a))+yc
If StartDrawing(ImageOutput(0))
Box(0,0,300,300,0)
Rectangle(xc,yc,x,y,30,RGB(255,255,255))
StopDrawing()
EndIf
; Affichage du rectangle dans un ImageGadget
ImageGadget(0, 0, 0, 0, 0, ImageID(0))
;Delay(100)
Next a
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
End