//#########################################################################
//##              Г Р А Ф И Ч Е С К А Я   О Б О Л О Ч К А                ##
//##         "  Отображение функции ,задаваемой аналитическим путём  "   ##
//##              функции преобразования геометрических примитивов       ##
//##                  при отображении  их части                          ##
//## студент    :    Ратаев М.Ю.                                         ##
//#########################################################################


//______________________________________________________________________
//|   ФУНКЦИЯ  определяющая принадлежит ли точка заданной области       |
//|            (вещественной)                                           |
//|   0 -    не принадлежит
//|   1 -       принадлежит
//|_____________________________________________________________________|


int ResF(float Xmin,float Ymin,float Xmax,float Ymax,
	   float Xr1,float Yr1 )
{
  if((Xr1<Xmin)||(Xr1>Xmax)||(Yr1<Ymin)||(Yr1>Ymax)) return 0;
  return 1;
}

//______________________________________________________________________
//|   ФУНКЦИЯ  определяющая принадлежит ли точка заданной области       |
//|            (  целой  )                                              |
//|   0 -    не принадлежит                                             |
//|   1 -       принадлежит                                             |
//|_____________________________________________________________________|


int ResI(int Xmin,int Ymin,int Xmax,int Ymax,
	   int Xr1,int Yr1 )
{
  if((Xr1<Xmin)||(Xr1>Xmax)||(Yr1<Ymin)||(Yr1>Ymax)) return 0;
  return 1;
}



//______________________________________________________________________
//| ФУНКЦИЯ ОБРЕЗКИ ВЕЩЕСТВЕННОГО ОТРЕЗКА                               |
//|   ЕСЛИ ЕГО КРАЯ ВЫХОДЯТ ЗА ГРАНИЦЫ ЗАДАННОЙ ОБЛАСТИ                 |
//|_____________________________________________________________________|

int ResRos(float Xmin,float Ymin,float Xmax,float Ymax,
	   float &Xr1,float &Yr1,float &Xr2,float &Yr2 )
 { int flagD=1;  //флаг отображения
   int flagO=0;  // флаг обмена местами концов отрезка
  float Xn1,Yn1,Xn2,Yn2,XY;


     if ( Xr1 < Xr2 )  { Xn1=Xr1;
			 Yn1=Yr1;
			 Xn2=Xr2;
			 Yn2=Yr2;
		       }
	       else    { Xn1=Xr2;
			 Yn1=Yr2;
			 Xn2=Xr1;
			 Yn2=Yr1;
			 flagO=0;
		       }
     if( Xn2 < Xmin  )   flagD=0;         // прямая не отображается
	       else
		 {   if( Xn1 < Xmin )
		      {
			Yn1=Yn1+(Yn2-Yn1)*(Xmin-Xn1)/(Xn2-Xn1);
			Xn1=Xmin;
		      }
		  }

     if( Xn1 > Xmax  )   flagD=0;         // прямая не отображается
	       else
		 {   if( Xn2 > Xmax )
		      {
			Yn2=Yn2-(Yn2-Yn1)*(Xn2-Xmax)/(Xn2-Xn1);
			Xn2=Xmax;
		      }
		  }

     if ( Yn1 > Yn2 )  { XY=Xn1;
			 Xn1=Xn2;
			 Xn2=XY;
			 XY=Yn1;
			 Yn1=Yn2;
			 Yn2=XY;
			 flagO=!(flagO);
		       }
     if( Yn2 < Ymin  )   flagD=0;         // прямая не отображается
	       else
		 {   if( Yn1 < Ymin )
		      {
			Xn1=Xn1+(Xn2-Xn1)*(Ymin-Yn1)/(Yn2-Yn1);
			Yn1=Ymin;
		      }
		  }

     if( Yn1 > Ymax  )   flagD=0;         // прямая не отображается
	       else
		 {   if( Yn2 > Ymax )
		      {
			Xn2=Xn2-(Xn2-Xn1)*(Yn2-Ymax/*-Yn1*/)/(Yn2-Yn1);
			Yn2=Ymax;
		      }
		  }
if(flagO==0){
	    Xr1=Xn1;
	    Yr1=Yn1;
	    Xr2=Xn2;
	    Yr2=Yn2;
	    }
       else {
	    Xr1=Xn2;
	    Yr1=Yn2;
	    Xr2=Xn1;
	    Yr2=Yn1;
	    }
return  flagD;
}

//______________________________________________________________________
//| ФУНКЦИЯ ОБРЕЗКИ ЦЕЛОЧИСЛЕННОГО ОТРЕЗКА                              |
//|   ЕСЛИ ЕГО КРАЯ ВЫХОДЯТ ЗА ГРАНИЦЫ ЗАДАННОЙ ОБЛАСТИ                 |
//|_____________________________________________________________________|
//  пользоваться нельзя пока не будет решён вопрос об описании области
//  пока расчёты ведуться аналогично вещественной области

int ResRosI(int Xmin,int Ymin,int Xmax,int Ymax,
	   int &Xr1,int &Yr1,int &Xr2,int &Yr2 )
 { int flagD=1;  //флаг отображения
   int flagO=0;  // флаг обмена местами концов отрезка
   int Xn1,Yn1,Xn2,Yn2,XY;


     if ( Xr1 < Xr2 )  { Xn1=Xr1;
			 Yn1=Yr1;
			 Xn2=Xr2;
			 Yn2=Yr2;
		       }
	       else    { Xn1=Xr2;
			 Yn1=Yr2;
			 Xn2=Xr1;
			 Yn2=Yr1;
			 flagO=0;
		       }
     if( Xn2 < Xmin  )   flagD=0;         // прямая не отображается
	       else
		 {   if( Xn1 < Xmin )
		      {
			Yn1=(int)(Yn1+(Yn2-Yn1)*(Xmin-Xn1)/(Xn2-Xn1));
			Xn1=Xmin;
		      }
		  }

     if( Xn1 > Xmax  )   flagD=0;         // прямая не отображается
	       else
		 {   if( Xn2 > Xmax )
		      {
			Yn2=(int)(Yn2-(Yn2-Yn1)*(Xn2-Xmax)/(Xn2-Xn1));
			Xn2=Xmax;
		      }
		  }

     if ( Yn1 > Yn2 )  { XY=Xn1;
			 Xn1=Xn2;
			 Xn2=XY;
			 XY=Yn1;
			 Yn1=Yn2;
			 Yn2=XY;
			 flagO=!(flagO);
		       }
     if( Yn2 < Ymin  )   flagD=0;         // прямая не отображается
	       else
		 {   if( Yn1 < Ymin )
		      {
			Xn1=(int)(Xn1+(Xn2-Xn1)*(Ymin-Yn1)/(Yn2-Yn1));
			Yn1=Ymin;
		      }
		  }

     if( Yn1 > Ymax  )   flagD=0;         // прямая не отображается
	       else
		 {   if( Yn2 > Ymax )
		      {
			Xn2=(int)(Xn2-(Xn2-Xn1)*(Yn2-Ymax/*-Yn1*/)/(Yn2-Yn1));
			Yn2=Ymax;
		      }
		  }
if(flagO==0){
	    Xr1=Xn1;
	    Yr1=Yn1;
	    Xr2=Xn2;
	    Yr2=Yn2;
	    }
       else {
	    Xr1=Xn2;
	    Yr1=Yn2;
	    Xr2=Xn1;
	    Yr2=Yn1;
	    }
return  flagD;
}