program T_navod3

!!****************************************************************************
!! Program k navodu pro modul Japigraf 
!! Nastaveni prostredi pomoci procedury DefViewPort, kresba os atd..
!! Graf Besselovych funkci J0, J1, J2
!! Besselovy funkce jsou rozsirenim zabudovanych funkci v g95
!! Aktivace standardniho menu ViewPortu
!!****************************************************************************



use std_type
		! vsechny realne promenne v Japigraf jsou REAL(KIND=DP)
		! g95 umoznuje zkraceny zapis, napr. REAL(DP) misto REAL(KIND=DP)
use japi
use japigraf
use rgbcolor

implicit none

character(len=*),parameter :: CRLF = char(13)//char(10)

real(DP) :: NposxFR, NposyFR
	! normalni souradnice leveho horniho rohu + rozmer frame
character(len=200) :: NadpisFR
	! nadpis frame (okna)
real(DP) :: NsirkaPA, NvyskaPA
	! normalni souradnice pro rozmery PlotArea
	! k nim se zvoli velikost frame a canvas podle default hodnot
	! PAleft,PAright,PAtop,PAbottom; jsou to PUBLIC promenne a je mozne je
	! z programu zmenit
logical :: AspectRatio
	! pro AspectRatio=.true. modifikuje rozmery PlotArea tak, aby
	! kruznice byla na obrazovce kruznice
Real(DP) :: Uxmin, Uymin, Uxmax, Uymax
	! meze PlotArea v uzivatelskych jednotkach
type(rgbcol) :: BGcanvas, BGplotarea
	! rgb barvy pozadi canvas a PlotArea
type(ViewPortInfo) :: infVP
	! pro ulozeni promennne nesouci vsechny informace o nastavenem prostredi
integer :: frame, canvas
	! napojeni (handlery) na frame,canvas a oblast pro legendu grafu

real(DP) :: OsaXod,OsaXdo,OsaXvY,KrokDeleniX,OsaYod,OsaYdo,OsaYvX,KrokDeleniY
integer :: MalychDilkuX,MalychDilkuY
type(rgbcol) :: BarvaOsyX, BarvaMrizeX,BarvaOsyY, BarvaMrizeY
logical :: KreslitMrizX,KreslitMrizY
	!pro kresbu os
	
real(DP) :: x,dx,y
type(rgbcol),dimension(0:2),parameter :: BarvaFunkce = (/red,DarkGreen,blue/)
	! barvy pro kresbu funkci

real(DP) :: Xleg,Yleg
type(Pbod) :: Gcursor
	! pro vytvoreni legendy
	
integer :: i
	! univerzalni pocitadlo

!===================== Kontrola verse modulu Japigraf =========================
If (JapigrafVer<"2.3") 	then
	print *,"JapigrafVer ",JapigrafVer
	Stop "Program vyzaduje Japigraf verse 2.3 nebo vyssi"
	read *
end if

!===================== zahajeni volanim StartJapi() ===========================
! Nastavi S_width,S_height,AspRatio
! umozni pouzivani normalnich souradnic s pouzitim prevodu Nx2Pix, Ny2Pix

call StartJapi()

!==================== nastaveni ViewPortu procedurou DefViewPort ==============
! Nastavi ViewPort, tj. frame+canvas+PlotArea
! Do nej se v dalsich krocich budou kreslit osy, popisy atd.

NposxFR = 0.1		! poloha leveho horniho rohu v normalnich souradnicich
NposyFR = 0.1
NadpisFR = "Program T_navod3"	! nadpis frame (okna)
NsirkaPA = 0.7			! sirka a vyska PlotArea v normalnich souradnicich
NvyskaPA = 0.4
AspectRatio = .false.	! pro .false. nebude kruznice na obrazovce kruznice
Uxmin = 0.0
Uxmax = 10.0
Uymin = -1.1
Uymax = 1.1
BGcanvas = linen
BGplotarea = white
	! Zkuste zmenit nekterou z PUBLIC promennych z Japigraf
	! napr. sirku canvas vlevo od PlotArea
	!~ PAleft = 150

call DefViewPort(NposxFR,NposyFR,NadpisFR,&
				 NsirkaPA,NvyskaPA,AspectRatio,&
				 Uxmin,Uxmax,Uymin,Uymax,&
				 BGcanvas,BGplotarea,&
				 infVP)
	! nastavi prostredi, ale nezviditelni je na obrazovce
	! takto si muzeme nastavit vice oken a potom na ne odkazovat
	! infVP1, infVP2,...

!====================== Doplnime standardni menu ==============================
	! umozni Soubor/Exit takze nemusime na konec programu davat READ*
	! umozni tisk canvas (Tisk/Canvas) a ulozeni canvas jako obrazku (Graf/...)
	! menu bude aktivni az po zavolani procedury StartStdMenu (viz konec prog.)
	
call AddStdMenu(infVP)
!------------------------------------------------------------------------------

frame = infVP%frame
canvas = infVP%canvas
	! pro dalsi pohodlnejsi volani
	! s vice nastavenymi okny (ViewPorty) by bylo napr.
	! frame1=infVP1%frame, canvas1=infVP1%canvas, atd.

call j_show(frame)
	! volani procedury JAPI (vsechny zacinaji na j_)
	! tato procedura zobrazi okno(ViewPort) na obrazovce
	! skryje ho CALL j_hide,
	! zkuste odpoznamkovat nasledujici usek
!~ totez udela procedura z Japigraf 
!~	ShowVP(infVP)

!~ Print *,"ViewPort(okno) se na 3s skryje a potom znovu vyvola a nakresli graf"
!~ call sleep(3)
!~ call j_hide(frame)	! z JAPI, skryje okno, nebo
!~ call HideVP(infVP)	! z Japigraf
!~ call sleep(3)		! provede pauzu 3s, vestavena procedura, rozsireni g95!!
!~ call j_show(frame)	! znovu zobrazi okno
!~ call ShowVP(infVP)
!================== Nyni budeme na canvas kreslit a psat ======================
!
	! Nakreslime osu X tak, aby prochazela y=0 
	! kreslime ji az po ose Y, aby prekryla caru mrize pro y=0
OsaXod = Uxmin
OsaXdo = Uxmax
OsaXvY = 0.0
KrokDeleniX = 1.0
MalychDilkuX = 5	! kolik se vytvori dilku, malych carek je o 1 mene
BarvaOsyX = black
KreslitMrizX = .true.
BarvaMrizeX = Grey80

call OsaX(infVP,OsaXod,OsaXdo,OsaXvY,KrokDeleniX,MalychDilkuX,&
			BarvaOsyX,KreslitMrizX,BarvaMrizeX)

	! nakreslime osu Y prochazejici pocatkem osy X
OsaYod = Uymin
OsaYdo = Uymax
OsaYvX = OsaXod
KrokDeleniY = 0.2
MalychDilkuY = 2
BarvaOsyY = black
KreslitMrizY = .true.
BarvaMrizeY = Grey80

call OsaY(infVP,OsaYod,OsaYdo,OsaYvX,KrokDeleniY,MalychDilkuY,&
			BarvaOsyY,KreslitMrizY,BarvaMrizeY)

call ULine(infVP,Ubod(osaXod,OsaXvY),Ubod(osaXdo,OsaXvY),black)
	! znovu namaluje osu X, kterou prepsala linie mrize pro Y=0

	! Nadpis a popsani os
call PlotLabels(infVP,"x","Jn(x)","Besselovy funkce J0(x), J1(x),  J2(x)",&
				NavyBlue)

!========================= kresba funkci ======================================
	! nakreslime funkce Jn(x), jsou v rozsireni g95 jako intrinsicke funkce
	! pouziti procedury PlotFunction by vyzadovalo deklaraci modulu
	! (priklad je v T_navod2.f95), proto pouzijeme prosty cyklus

do i=0,2
	! zkuste odpoznamkovat nasledujici prikaz
	!~ CALL StartStdMenu(infVP) 
	! a kdyz se program zastavi stiskavejte v menu Soubor/Exit
	x = OsaXod
	dx = (OsaXdo-OsaXod)/150
	y = dbesjn(i,x)
	call USetGcursor(infVP,Ubod(x,y))
		! nastavi graficky kurzor na pocatek kresby
	do
		x = x+dx
		if (x>OsaXdo) exit
		y = dbesjn(i,x)
		call UlineTo(infVP,Ubod(x,y),BarvaFunkce(i))
	end do
end do

!======================== Kresba legendy ======================================
Xleg = 1.0			! uzivatelske souradnice leveho horniho rohu 
Yleg = -0.75		! zacatku legendy
do i=0,2
	call USetGcursor(infVP,Ubod(Xleg,Yleg))
	call ULineTo(infVP,Ubod(Xleg+1.0_DP,Yleg),BarvaFunkce(i))
	Gcursor = GetGcursor()
	Gcursor = Gcursor+Pbod(15,5)	! posun graf. kursoru o 15 pixelu vpravo
	call PisText(infVP,Gcursor,black,"J"//char(i+48))
		! char(48) = 0, char(49) = 1, atd
	Yleg = Yleg-0.1_DP
end do



!================ spustime smycku cekani na volbu z menu ======================

call StartStdMenu(infVP)

call StopJapi()

! nepotrebujeme READ *, program bude cekat az na Soubor/Exit


end program T_navod3


