J'ai voulu tester les compétences de ChatGPT pour la génération de code Purebasic, et j'avoue avoir ri ! J'avais l'impression de revoir Rain Man ou ChatGPT jouait très bien le rôle de Dustin Hoffman.
Donc, voici le petit exercice presque fait (euh non, pas tout à fait fait) par ChatGPT
Avec la petite correction suggérée par Mesa
Voilà, modification de la distance de mise au point et correction de l'affichage d'angle
Code : Tout sélectionner
EnableExplicit
Global distanceFocaleID, formatCapteurID, ouvertureID, distanceMiseAuPointID, boutonCalculID, afficheAngleID, afficheProfondeurID, afficheMAPID, afficheCanvasAngleID
Procedure.f GetDistanceMAP()
Define x.i = GetGadgetState(distanceMiseAuPointID)/10
Define a.d = Exp(-1.8326) ; Valeur de ln(a) obtenue à partir de la formule
Define b.d = Exp(0.3065) ; Valeur de ln(b) obtenue à partir de la formule
ProcedureReturn a * Pow(b, x) ; Calcul de y en utilisant la formule y = a * b^x
EndProcedure
Procedure ChangeDistanceMAP()
SetGadgetText(afficheMAPID,"Mise au point à "+StrF(GetDistanceMAP(),2)+" m")
EndProcedure
Procedure CalculerAngleChampProfondeur()
; Récupérer les valeurs sélectionnées dans les listes déroulantes et le TrackBarGadget
Define distanceFocale.s = GetGadgetText(distanceFocaleID)
Define formatCapteur.s = GetGadgetText(formatCapteurID)
Define ouverture.s = GetGadgetText(ouvertureID)
Define distanceMiseAuPoint.f = GetDistanceMAP()
Define SansErreur=#True
If distanceFocale = "" Or formatCapteur = "" Or ouverture = ""; Or distanceMiseAuPoint = ""
MessageRequester("Erreur", "Veuillez sélectionner tous les paramètres.")
SansErreur=#False
EndIf
If SansErreur
; Facteurs de taille du capteur
Define fullFrameFactor.f = 1.0
Define apsCFactor.f = 1.5
Define mftFactor.f = 2.0
; Conversion des valeurs sélectionnées en nombres
Define distanceFocaleNum.f = Val(distanceFocale)
Define formatCapteurNum.f
Define cercleDeConfusion.f
Select formatCapteur
Case "Plein format"
formatCapteurNum = fullFrameFactor
cercleDeConfusion = 0.03
Case "APS-C"
formatCapteurNum = apsCFactor
cercleDeConfusion = 0.02
Case "Micro 4/3"
formatCapteurNum = mftFactor
cercleDeConfusion = 0.015
Default
MessageRequester("Erreur", "Format de capteur non pris en charge.")
SansErreur=#False
EndSelect
If SansErreur
Define angleChamp.f = 2 * Degree(ATan((43 / formatCapteurNum) / (2 * distanceFocaleNum)))
Define HyperFocale.f = Pow( Val(distanceFocale), 2) / Val(ouverture) * cercleDeConfusion
Define PremierPlanNet.f = HyperFocale * distanceMiseAuPoint / (HyperFocale + distanceMiseAuPoint)
Define DernierPlanNet.f = HyperFocale * distanceMiseAuPoint / (HyperFocale - distanceMiseAuPoint)
SetGadgetText(afficheAngleID, "Angle de champ : " + Str(angleChamp) + " degrés")
If distanceMiseAuPoint < HyperFocale
SetGadgetText(afficheProfondeurID, "Premier plan net : " + StrF(PremierPlanNet,2) + " m | Dernier plan net : "+StrF(DernierPlanNet,2)+" m")
Else
SetGadgetText(afficheProfondeurID, "Premier plan net : " + StrF(PremierPlanNet,2) + " m | Dernier plan net : ∞")
EndIf
If StartDrawing(CanvasOutput(afficheCanvasAngleID))
Box(0,0,OutputWidth(),OutputHeight(),#White)
Define MidX=Round(OutputWidth()/2,#PB_Round_Nearest)
Define MidY=Round(OutputHeight()/2,#PB_Round_Nearest)
Define Diff.i =Int(OutputHeight()*((21.5/formatCapteurNum)/distanceFocaleNum))
LineXY(MidX-Diff,1,MidX,OutputHeight()-1,#Black)
LineXY(MidX,OutputHeight()-1,MidX+Diff,1,#Black)
LineXY(MidX-Diff,1,MidX+Diff,1,#Black)
FillArea(MidX,MidY, #Black, #Black)
StopDrawing()
EndIf
EndIf
EndIf
EndProcedure
; Création de la fenêtre principale
OpenWindow(0, 0, 0, 400, 350, "Calculateur d'angle et de profondeur de champ", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; Liste déroulante pour la distance focale
distanceFocaleID = ComboBoxGadget(#PB_Any, 10, 10, 200, 20)
AddGadgetItem(distanceFocaleID, -1, "8")
AddGadgetItem(distanceFocaleID, -1, "16")
AddGadgetItem(distanceFocaleID, -1, "17")
AddGadgetItem(distanceFocaleID, -1, "20")
AddGadgetItem(distanceFocaleID, -1, "24")
AddGadgetItem(distanceFocaleID, -1, "28")
AddGadgetItem(distanceFocaleID, -1, "35")
AddGadgetItem(distanceFocaleID, -1, "40")
AddGadgetItem(distanceFocaleID, -1, "50")
AddGadgetItem(distanceFocaleID, -1, "60")
AddGadgetItem(distanceFocaleID, -1, "75")
AddGadgetItem(distanceFocaleID, -1, "85")
AddGadgetItem(distanceFocaleID, -1, "90")
AddGadgetItem(distanceFocaleID, -1, "105")
AddGadgetItem(distanceFocaleID, -1, "135")
AddGadgetItem(distanceFocaleID, -1, "150")
AddGadgetItem(distanceFocaleID, -1, "180")
AddGadgetItem(distanceFocaleID, -1, "200")
TextGadget(#PB_Any,210,10,180,20,"Longueur focale en mm")
; Liste déroulante pour le format de capteur
formatCapteurID = ComboBoxGadget(#PB_Any, 10, 40, 200, 20)
AddGadgetItem(formatCapteurID, -1, "Plein format")
AddGadgetItem(formatCapteurID, -1, "APS-C")
AddGadgetItem(formatCapteurID, -1, "Micro 4/3")
TextGadget(#PB_Any,210,40,180,20,"Format de capteur")
; Liste déroulante pour l'ouverture
ouvertureID = ComboBoxGadget(#PB_Any, 10, 70, 200, 20)
AddGadgetItem(ouvertureID, -1, "1")
AddGadgetItem(ouvertureID, -1, "1.4")
AddGadgetItem(ouvertureID, -1, "2")
AddGadgetItem(ouvertureID, -1, "2.8")
AddGadgetItem(ouvertureID, -1, "4")
AddGadgetItem(ouvertureID, -1, "5.6")
AddGadgetItem(ouvertureID, -1, "8")
AddGadgetItem(ouvertureID, -1, "11")
AddGadgetItem(ouvertureID, -1, "16")
AddGadgetItem(ouvertureID, -1, "22")
AddGadgetItem(ouvertureID, -1, "32")
TextGadget(#PB_Any,210,70,180,20,"Ouverture f 1:")
; TrackBarGadget pour la distance de mise au point
distanceMiseAuPointID = TrackBarGadget(#PB_Any, 10, 100, 200, 20, 1, 211, 50)
afficheMAPID = TextGadget(#PB_Any,210, 100, 200, 16, "Mise au point à 0 m")
; Bouton de calcul
boutonCalculID = ButtonGadget(#PB_Any, 10, 130, 80, 30, "Calculer")
; TextGadget pour afficher l'angle de champ
afficheAngleID = TextGadget(#PB_Any, 10, 170, 380, 16, "")
; TextGadget pour afficher la profondeur de champ
afficheProfondeurID = TextGadget(#PB_Any, 10, 190, 380, 16, "")
afficheCanvasAngleID = CanvasGadget(#PB_Any, 10,226,380,110,#PB_Canvas_Border)
SetGadgetState(ouvertureID,0)
SetGadgetState(formatCapteurID,0)
SetGadgetState(distanceFocaleID,0)
BindGadgetEvent(boutonCalculID, @CalculerAngleChampProfondeur(), #PB_EventType_LeftClick)
BindGadgetEvent(distanceMiseAuPointID,@ChangeDistanceMAP());, #PB_EventType_Change)
; Boucle principale
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
PS : Il se trompait même dans les formules, donc pas de crainte que ChatGPT vole la place des développeurs
