Calculateur d'angle et de profondeur de champs

Sujets variés concernant le développement en PureBasic
Ehma
Messages : 26
Inscription : dim. 24/juin/2018 19:01

Calculateur d'angle et de profondeur de champs

Message par Ehma »

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

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
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 :wink:
Dernière modification par Ehma le jeu. 15/juin/2023 9:05, modifié 4 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Calculateur d'angle et de profondeur de champs

Message par Mesa »

La trackbar ne fonctionne pas.

Ça a l'air de fonctionner avec le code suivant:

Code : Tout sélectionner

EnableExplicit

Global distanceFocaleID, formatCapteurID, ouvertureID, distanceMiseAuPointID, boutonCalculID, afficheAngleID, afficheProfondeurID, afficheMAPID, afficheCanvasAngleID
Procedure ChangeDistanceMAP()
	SetGadgetText(afficheMAPID,Str(GetGadgetState(distanceMiseAuPointID))+" m")
EndProcedure
Procedure.i Min(Val1.i, Val2.i)
	If Val1 < Val2
		ProcedureReturn Val1
	Else
		ProcedureReturn Val2
	EndIf
	
	
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.s = Str(GetGadgetState(distanceMiseAuPointID))
	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 "Full Frame"
				formatCapteurNum = fullFrameFactor
				cercleDeConfusion = 0.03
			Case "APS-C"
				formatCapteurNum = apsCFactor
				cercleDeConfusion = 0.02
			Case "Micro Four Thirds"
				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 * Val(distanceMiseAuPoint) / (HyperFocale + Val(distanceMiseAuPoint))
			Define DernierPlanNet.f = HyperFocale * Val(distanceMiseAuPoint) / (HyperFocale - Val(distanceMiseAuPoint))
			
			SetGadgetText(afficheAngleID, "Angle de champ : " + Str(angleChamp) + " degrés")
			If Val(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 DeltaAngle.f= ATan(Radian(angleChamp))
				Define Diff.i = Round((OutputHeight() * DeltaAngle),#PB_Round_Nearest)
				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")


; Liste déroulante pour le format de capteur
formatCapteurID = ComboBoxGadget(#PB_Any, 10, 40, 200, 20)
AddGadgetItem(formatCapteurID, -1, "Full Frame")
AddGadgetItem(formatCapteurID, -1, "APS-C")
AddGadgetItem(formatCapteurID, -1, "Micro Four Thirds")

; 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")

; TrackBarGadget pour la distance de mise au point
distanceMiseAuPointID = TrackBarGadget(#PB_Any, 10, 100, 200, 20, 0, 100)
afficheMAPID = TextGadget(#PB_Any,220, 100, 200, 16, "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
M.
Ehma
Messages : 26
Inscription : dim. 24/juin/2018 19:01

Re: Calculateur d'angle et de profondeur de champs

Message par Ehma »

Merci Mesa,

Chez moi ça fonctionne, mais peut-être est-ce lié aux plateformes.

En tout cas, merci pour ta correction.


Edit :


Oui, en effet, j'ai vu la modif. Du coup, je ne comprends d'ailleurs pas pourquoi ça fonctionne chez moi.

Je me rend compte que la représentation de l'angle de champ n'est pas bonne. Mais bon, l'idée est là.
Répondre