#include <graphics.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>

#define COLOR LIGHTGRAY
#define BGIPATH "D:\\borlandc\\bgi"

//zdefiniowanie makra round obliczajacego najblizsza liczbe calkowita 
//danej liczby zmiennoprzecinkowej
#define round(a) (a)-floor(a)<=0.5 ? floor(a) : floor(a)+1

void Krzywa(double,double,double,double,int);

int main(){
  int st;
  int ster,tryb;

  cout << "Podaj stopien krzywej Kocha, ktora"
	"mam narysowac"<<endl;
  cin >> st;

  initgraph(&ster,&tryb,BGIPATH);

  //ustawienie koloru lini i wypelnienia
  setcolor(COLOR);


  Krzywa(100,450,540,450,st);
  while ( !kbhit() );
  return 1;
}

//funkcja rysujaca krzywa Kocha stopnia st.
// (x1,y1), (x2,y2)  to wierzcholki pomiedzy ktorymi rysowana jest krzywa
void Krzywa(double x1,double y1,double x2,double y2, int st){
	double dx=x2-x1,dy=y2-y1;
	if ( !st ){  // stopien == 0 - narysowanie linii
	line(round(x1),round(y1),round(x2),round(y2));
	}
	else { // w pozostalych przypadkach narysowanie 4 krzywych
	  // stopnia o 1 mniejszego

	  // krzywa od (x1,y1) do 1/3 odcinka [(x1,y1),(x2,y2)]
	  Krzywa(x1,y1,x1+dx/3,y1+dy/3,st-1);

	  // krzywa od 2/3 odcinka [(x1,y1),(x2,y2)] do (x2,y2)
	  Krzywa(x1+dx*2/3,y1+dy*2/3,x2,y2,st-1);

	  // od 1/3 odcinka do wierzcholka trojkata rownobocznego
	  // wyznaczonego przez 1/3 odcinka i 2/3 odcinka
	  Krzywa(x1+dx/3,y1+dy/3,
		(x1+x2)/2+sqrt(3)/6*dy,(y1+y2)/2-sqrt(3)/6*dx,
		st-1);

	  // od od wierzcholka tr. rownobocz. wyznaczonego przez 1/3 odcinka i 2/3 odcinka
	  // do 2/3 odcinka
	  Krzywa((x1+x2)/2+sqrt(3)/6*dy,(y1+y2)/2-sqrt(3)/6*dx,
		x1+dx*2/3,y1+dy*2/3,
		st-1);
	 }
}


