voir x3Dcomtois a écrit :Crystal Noir a écrit : A partir de là, si je prend mon point A(-7000,7000) si je retranscrit ce que je viens de dire à l'écran il aura les coordonnées 0,0
Voila , sauf que A c'est (-7000,-7000) donc coordonnées 0,480 ( 479 pour être plus juste )
ben maintenant on attend le programme qui trace les segments à l'écran
Besoin d'une petite explication de code
-
Le Soldat Inconnu
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
Bon voilà le code mais j'ai un soucis :
Voilà ce que ca donne. Alors c'est simple j'ai compris à quoi correspondaient les valeurs du coup facile de définir que -7000 c'est 0 sur les x par ex.
Mon pb c'est que moi j'aurais aimé utiliser les variables que j'ai définie c'est à dire ay, ay etc...car finalement là c simple mais si j'ai d'autres valeur je vais avoir besoin d'une formule. Et j'ai beau me triturer la tête dans tous les sens pas moyen de trouver la correspondance
Car là pour au moins montrer que j'ai pigé j'ai fait les LineXY directement avec les valeurs correspondantes, mais j'aurais voulu le faire avec ax, ay et cie ct un peu le but de l'exo...j'arrive pas à trouver cette formule grrrr.
Code : Tout sélectionner
;Initialisation des composants
InitSprite()
InitKeyboard()
;Initialisation des constantes
;Variables Globales
Global MaFenetre ;Fenêtre principale
;Constantes
#Main_Window = 1
#ScreenW = 640
#ScreenH = 480
;variables
ax.w = -7000
ay.w = -7000
bx.w = 7000
by.w = -7000
cw.w = 7000
cy.w = 7000
;Création de la fenêtre principale
SetRefreshRate(60)
MaFenetre = OpenWindow(#Main_Window, 0, 0, 640, 480, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Test")
OpenWindowedScreen(MaFenetre,0,0, #ScreenW, #ScreenH,0, 0, 0)
;MaFenetre = OpenScreen(800,600,32,"Test")
If MaFenetre = 0
MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
EndIf
;Tracé du repère XY
StartDrawing(ScreenOutput())
LineXY(320,0,320,479,RGB(255,255,255))
LineXY(0,240,639,240,RGB(255,255,255))
StopDrawing()
;Liaison du point A(-7000,-7000) au point B(7000,-7000) soit à l'écran A(0,0) et B(639,479)
StartDrawing(ScreenOutput())
LineXY(0,479,639,479,RGB(255,0,0))
StopDrawing()
;Liaison du point B(7000,-7000) au point C(7000,7000) soit à l'écran B(639,0) et C(639,0)
StartDrawing(ScreenOutput())
LineXY(639,479,639,0,RGB(255,0,0))
StopDrawing()
;Liaison du point C(7000,7000) au point A(-7000,7000) soit à l'écran C(639,0) et A(0,0)
StartDrawing(ScreenOutput())
LineXY(639,0,0,479,RGB(255,0,0))
StopDrawing()
Repeat
FlipBuffers()
EID = WindowEvent()
Until EID = #PB_Event_CloseWindowMon pb c'est que moi j'aurais aimé utiliser les variables que j'ai définie c'est à dire ay, ay etc...car finalement là c simple mais si j'ai d'autres valeur je vais avoir besoin d'une formule. Et j'ai beau me triturer la tête dans tous les sens pas moyen de trouver la correspondance
Car là pour au moins montrer que j'ai pigé j'ai fait les LineXY directement avec les valeurs correspondantes, mais j'aurais voulu le faire avec ax, ay et cie ct un peu le but de l'exo...j'arrive pas à trouver cette formule grrrr.
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
J'ai changé les valeurs de A,B,C , on était aux limites de l'écran et je ne gère pas le clipping ,pour ça il faut s'adresser à Cederavic 
Code : Tout sélectionner
;Initialisation des composants
InitSprite()
InitKeyboard()
;Initialisation des constantes
;Variables Globales
Global MaFenetre ;Fenêtre principale
;Constantes
#Main_Window = 1
#ScreenW = 640
#ScreenH = 480
;C'est pas vraiment utile c'est juste pour repérer plus facilement les 3 points
Enumeration
#PointA
#PointB
#PointC
EndEnumeration
;variables
Dim Pts.POINT(2)
;Point A
Pts(#PointA)\x = -6000
Pts(#PointA)\y = -6000
;Point B
Pts(#PointB)\x = 6000
Pts(#PointB)\y = -6000
;Point C
Pts(#PointC)\x = 6000
Pts(#PointC)\y = 6000
;Projection
;Pour le point aux coordonnées 0,0 , il sera à l'écran en 320,240 soit #ScreenW/2,#ScreenH/2
;ce qui donne pour Y => 0 * X + K = #ScreenH/2 => Soit K = #ScreenH/2
;Pour le point aux coordonnées 7000,-7000 ( Le point B ) tu auras :
; -7000 * X + K = #ScreenH
; Et tu déduis X = (#ScreenH-K)/-7000 , après simplification ça donne => X =(#ScreenH/2)/-7000
;c'est ce que tu retrouves dans la procedure ProjY() => CoefY.f=-#ScreenH/7000*2
;Et le principe est le même pour l'axe des X.
;Bien sûr c'est simplifié , si tu veux tenir compte de la profondeur Z, et jouer sur la focale
;tu devras reprendre les exemples déjà maintes fois cités :)
Procedure ProjX(x.l)
CoefX.f=#ScreenW/(7000*2)
Xp = CoefX * x + #ScreenW/2
ProcedureReturn Xp
EndProcedure
Procedure ProjY(y.l)
CoefY.f=#ScreenH/(-7000*2)
Yp = CoefY * y + #ScreenH/2
ProcedureReturn Yp
EndProcedure
;Création de la fenêtre principale
SetRefreshRate(60)
MaFenetre = OpenWindow(#Main_Window, 0, 0, 640, 480, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Test")
OpenWindowedScreen(MaFenetre,0,0, #ScreenW, #ScreenH,0, 0, 0)
;MaFenetre = OpenScreen(800,600,32,"Test")
If MaFenetre = 0
MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
EndIf
;Tracé du repère XY
StartDrawing(ScreenOutput())
LineXY(320,0,320,479,RGB(255,255,255))
LineXY(0,240,639,240,RGB(255,255,255))
;Liaison du point A(-7000,-7000) au point B(7000,-7000) soit à l'écran A(0,0) et B(639,479)
LineXY(ProjX(Pts(#PointA)\x),ProjY(Pts(#PointA)\y),ProjX(Pts(#PointB)\x),ProjY(Pts(#PointB)\y),RGB(255,0,0))
;Liaison du point B(7000,-7000) au point C(7000,7000) soit à l'écran B(639,0) et C(639,0)
LineXY(ProjX(Pts(#PointB)\x),ProjY(Pts(#PointB)\y),ProjX(Pts(#PointC)\x),ProjY(Pts(#PointC)\y),RGB(255,0,0))
;Liaison du point C(7000,7000) au point A(-7000,7000) soit à l'écran C(639,0) et A(0,0)
LineXY(ProjX(Pts(#PointC)\x),ProjY(Pts(#PointC)\y),ProjX(Pts(#PointA)\x),ProjY(Pts(#PointA)\y),RGB(255,0,0))
StopDrawing()
Repeat
FlipBuffers()
EID = WindowEvent()
Until EID = #PB_Event_CloseWindow
Dernière modification par comtois le mer. 09/juin/2004 17:19, modifié 2 fois.
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
en fait si on connais l'échelle du plan imaginaire c facile (merci cédéravic).
on calcule un facteur et hop on l'utilise pour retranscrire. ca fait donc un décalage.
Maintenant pour la 3d j'ai l'impression que c un peu plus complexe, c le calcul du facteur qui me pose pb.
Ma question serait, comment calculer ses facteurs sous purebasic ? car la formule de la projection je l'ai :p meme si j'ai vu la formule avec tan je pense pas que ce soit ca qu'il faut utiliser.
on calcule un facteur et hop on l'utilise pour retranscrire. ca fait donc un décalage.
Maintenant pour la 3d j'ai l'impression que c un peu plus complexe, c le calcul du facteur qui me pose pb.
Ma question serait, comment calculer ses facteurs sous purebasic ? car la formule de la projection je l'ai :p meme si j'ai vu la formule avec tan je pense pas que ce soit ca qu'il faut utiliser.