! Program T_navod2
! ================

!!*****************************************************************************
!! K navodu pro modul Japigraf
!! Rychle vytvoreni standardniho grafu pomoci procedury NastavStdGraf 
!! Aktivace standardniho menu 
!!*****************************************************************************


Module Funkce
	! Zabudovana funkce (zde sin) nemuze byt pouzita jako aktualni
	! parametr procedury (zde PlotFunction); rovnez nelze jako aktualni
	! parametr pouzit funkci deklarovanou v programu (za CONTAINS)
	! Proto ji musime deklarovat ve zvlastnim modulu
use std_type	
contains

	function Sinus(x) result(y)
		real(DP),intent(in) :: x
		real(DP) :: y
		y = sin(x)
	end function Sinus
	function Cosinus(x) result(y)
		real(DP),intent(in) :: x
		real(DP) :: y
		y = cos(x)
	end function Cosinus
	
end module Funkce

!========================= Program ===========================================

program T_navod2

!! K navodu pro modul Japigraf
!! Rychle vytvoreni stanardniho grafu pomoci procedury NastavStdGraf 



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

use Funkce		! vyse uvedeny modul, neni treba ho uvadet v parametrech g95
use japi
use japigraf
use rgbcolor

implicit none

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

real(DP) :: OdX, DoX, OdY, DoY
	! Hranice pro osu X a osu Y v uzivatelskych jednotkach
logical :: PlotOx, PlotOy, Grid
	! pro .true. kresli osu X,resp. osu Y a sit
character(len=100) :: VPnadpis
	! nadpis v zahlavi Viewportu (okna)
character(len=100) :: PopisX, PopisY, Nadpis
	! volitelne (optional) popisy os a nadpis grafu
Integer :: Velikost
	! volitelny parametr pro velikost pisma v intervalu [2,9]
real(DP) :: KrokX, KrokY
	! krok deleni osy X a Y (hlavni deleni,v nem se take kresli mriz)
	! volitelne parametry
integer :: dilkuX, dilkuY
	! pocet malych dilku pro kazdy krok, volitelny parametr
type(ViewPortInfo) :: infVP
	! Procedura NastavStdGraf sem ulozi informace o vytvorenem prostredi
	! poslouzi jako vstupni parametr pro dalsi procedury
real(DP) :: x,dx,y
	!pomocna promenna pro kresbu grafu


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

! ****************** Nastaveni prostredi grafu **************************

VPnadpis = "Test procedury NastavStdGraf"
OdX = -10.0
DoX = 10.0
OdY = -1.1
DoY = 1.1
PlotOx = .true.
PlotOy = .true.
KrokX = 2.0
dilkuX = 5
KrokY = 0.2
dilkuY = 2
Grid = .true.
PopisX = "x"
PopisY = "sin(y)"
Nadpis = "Funkce sin(x)"
Velikost = 5
	! zhruba urcuje velikost ViewPortu delkou ve smeru x,
	! 2<= velikost <= 9, (velikost*10 jsou procenta delky)  

	! Nyni nastavime prostredi se vsemi popisy
	! Procedura take vrati infVP potrebne pro nasledujici procedury
	! *************************************************************
call NastavStdGraf(infVP,OdX,DoX,OdY,DoY,VPnadpis,PlotOx,PlotOy,Velikost,&
					KrokX,KrokY,DilkuX,DilkuY,PopisX,PopisY,Nadpis,Grid)

	! Nyni do tohoto prostredi nakreslime sinusovku
x = OdX
dx = (DoX-OdX)/200
	! pocatecni x a krok x pro kresbu
y = sin(x)
call USetGcursor(infVP,Ubod(x,y))
	! nastavi graficky kurzor na pocatek kresby
do
	x = x+dx
	if (x>DoX) exit
	y = sin(x)
	call UlineTo(infVP,Ubod(x,y),blue)
		! graficky kurzor po volani procedury ULineTo zustane v koncovem bode
		! a z neho nakreslime usecku do noveho bodu
end do

	! a v opacnem smeru jeste nakreslime cos(x)
x = x-dx
	! z predchoziho cyklu zustalo x=DoX+dx
	! nemusime volat call USetGcursor(infVP,Ubod(x,y))
	! protoze je v koncovem bode predchozi kresby
do
	if (x<OdX) exit
	y = cos(x)
	call UlineTo(infVP,Ubod(x,y),red)
	x=x-dx
end do

Print *, "V dalsim kroku nastavime jen prostredi bez os a jejich popisu "
print *, "Pro pokracovani stiskni v menu Soubor/Konec"

call StartStdMenu(infVP)
	! Aktivuje standardni menu, ktere je uz nastavene volanim procedury
	! NastavStdGraf (zahrnuje volani procedury AddStdMenu)
	! Procedura ve smycce ceka na akci, tj stisknuti nektere polozky menu


! **************** znovu ale bez os a jejich popisu **************************
! **************** a s pouzitim procedury PlotFunction ***********************
! ****************************************************************************

!~ call j_quit()		!!!!
	!~ ! Ukonci japi, tj. uzavre graf
	!~ ! jestlize se nepouzije, graf zustane a dale se vytvori nove okno

!~ call StartJapi()	! Znovu nastartovat JAPI, musi se volat jestlize
					! predchazelo CALL j_quit()

call NastavStdGraf(infVP,OdX,DoX,OdY,DoY,VPnadpis,&
					Nadpis="PlotArea bez kresby os")
	! Pouze prvnich 6 parametru je povinnych,
	! vsechny ostatni (za VPnadpis) jsou OPTIONAL 
	! a jsou nastaveny na .false. nebo ""
	
call UPolyLine(infVP,(/Ubod(OdX,OdY),Ubod(OdX,DoY),&
				Ubod(DoX,DoY),Ubod(DoX,OdY),Ubod(OdX,OdY)/),red)	
	! nakreslime ohraniceni PlotArea 
	! procedura postupne spojuje dvojice bodu v zadanem poli Ubodu
	! a doplnime osovy kriz
call ULine(infVP,Ubod(OdX,0.0_DP),Ubod(DoX,0.0_DP),Gray80)
call ULine(infVP,Ubod(0.0_DP,OdY),Ubod(0.0_DP,DoY),Gray80)

	! Nakreslime funkce pomoci procedury PlotFunction (je v Japigraf)
dx = (DoX-OdX)/300
call PlotFunction(infVP,Sinus,DarkGreen,0.9*OdX,0.9*DoX,dx)
	! Procedura PlotFunction nakresli do nastaveneho prostredi funkci Sinus 
	! (deklarovanou v uvodu v modulu Funkce)
	! Parametry OdX,DoX,krokX jsou volitelne; nejsou-li uvedene, pouzije se 
	! cely deklarovany rozsah osy X a krokX=abs(DoX-OdX)/200 
	! napr. takto
call PlotFunction(infVP,Cosinus,IndianRed,KrokX=0.01_DP)

call StartStdMenu(infVP)

print *, CRLF//"ENTER - konec programu"
!read *


end program T_navod2
