Calculateur d'angle et de profondeur de champs
Publié : mer. 14/juin/2023 11:05
				
				Bonjour,
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
N'hésitez-pas à y apporter vos modifications.
PS : Il se trompait même dans les formules, donc pas de crainte que ChatGPT vole la place des développeurs
			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