//---------------------------------------------------------------------------
//  Obiekt realizujący uproszczony wykres 3-wymiarowy.

#include <vcl\vcl.h>
#pragma hdrstop

#include "pseudo3d.h"
//---------------------------------------------------------------------------
//	Konstruktor z kompletem parametrów
TWykresPseudo3d :: TWykresPseudo3d( int xe0, int ye0, int eszer, int ewys,
				   double xr0, double yr0, double rszer, double rwys)
{
 for( int k = 0; k < MAX_ESZER; k ++)   //inicjowanie kontroli przesłaniania
 {
    doliny[ k] = 100000;                //przenicowana dolina
    gory[ k] = -100000;                 //przenicowana góra
 }

 fxe0 = xe0;                            //obszar ekranowy, udostępniony funkcji iteruj()
 fye0 = ye0;
 feszer = eszer;
 fewys = ewys;

 x0 = xr0 - rszer / 2;                  //początek kreślenia w poziomie
 y0 = yr0 - rwys  / 2;                  //i w pionie
 dx = rszer / (double)eszer;            //krok kreślenia w poziomie
 dy = rwys  / (double)ewys;             //i w pionie
}
//---------------------------------------------------------------------------
//	Opis kreślonej płachty funkcyjnej.
//	Użytkownik obiektu TWykresPseudo3d musi przedefiniować tą funkcję,
//	wprowadzając do gry własną formułę.
double TWykresPseudo3d :: fun( double x, double y)
{
 return 0;
}
//---------------------------------------------------------------------------
//	zapoczątkowanie procesu przeglądania obszaru funkcji
void TWykresPseudo3d :: inicjuj_iterator( void)
{
 i = j = 0;                             //start dla funkcji iterator()
}
//---------------------------------------------------------------------------
//	Gdy true, dostarcza punktów do kreślenia wykresów.
//	false - koniec kreślenia.
bool TWykresPseudo3d :: iterator( int &xe1, int &ye1, int &xe2, int &ye2)
{
 int xe, ye;                            //roboczy punkt na ekranie
 double x, y, f;
 bool znaleziono = false;               //czy znaleziono punkt?
 bool kontynuacja_linii;                //czy można łączyć linią poprzedni punkt z bieżącym?

 kontynuacja_linii = j == 0 ? false : true;//kontynuujemy wcześniej zaczętą linię? Zaczynamy nową?

 while( i < fewys)                      //kontynuuj, gdy nie koniec wykresu
 {
    y = y0 + (double)i * dy;            //współrzędna w przestrzeni matematycznej

    while( j < feszer)                  //kontynuuj, nie koniec linii w poziomie
    {
        x = x0 + (double)j * dx;        //współrzędna w przestrzeni matematycznej

        f = fun( x, y);                 //pobranie wartości funkcji

        xe = j + i;                     //wyliczenie ekranowych współrzędnych punktu wykresu
        ye = i + f;

        if( ye < doliny[ xe])           //dolina niższa niż jakakolwiek?
            doliny[ xe] = ye;           //zmodyfikuj dolną krawędź obszaru przesłaniania

        if( ye > gory[ xe])             //góra wyższa niż jakakolwiek?
            gory[ xe] = ye;             //zmodyfikuj górną krawędź obszaru przesłaniania

        if( ye <= doliny[ xe] || ye >= gory[ xe])//czy punkt widać?
            znaleziono = true;          //pętle zakończą działanie
        else
            kontynuacja_linii = false;  //złamanie ciągłości linii

        j ++;

        if( znaleziono)
        {
            if( kontynuacja_linii)
            {
                xe1 = fxe0 + xeold;     //z poprzedniego wejścia do niniejszej funkcji
                ye1 = (fye0 + fewys) - yeold;
            }
            else
            {
                xe1 = fxe0 + xe;        //bez kontynuacji linii: punkt poprzedni = bieżący
                ye1 = (fye0 + fewys) - ye;
            }
            xeold = xe;                 //przechowanie dla następnego wywołania niniejszej funkcji
            yeold = ye;
            xe2 = fxe0 + xe;            //udostępnienie bieżącego punktu (referencja!)
            ye2 = (fye0 + fewys) - ye;

            return true;
        }
    }
    if( j >= feszer)
        j = 0;
    i ++;
    kontynuacja_linii = false;          //nowa linia
 }
 return false;                          //koniec przeglądania obszaru wykresu
}
//---------------------------------------------------------------------------
