//
//				*******	Program to make a line between 2 points in a 2-Dimentional array  ******
//


#include<stdio.h>


void bres_line(float P1_x,float P1_y,float P2_x,float P2_y,int **data){
  float m;
  float zx,zy,xpos,ypos;

  float vec_x,vec_y,ABSvec_x,ABSvec_y;			// 1 vector
  printf("Ich schreibe jetzt");
  data[10][10]=1;
  return;
    
  if((P2_y - P1_y) < 0){
  	zx=P2_x;zy=P2_y; P2_x=P1_x;P2_y=P1_y; P1_x=zx;P1_y=zy;  // Change Points between themselves
  	printf("Y Negativ (P1 und P2 tauschen) \n");
  }
  vec_x = P2_x - P1_x;					// calculate vector between P1 and P2
  vec_y = P2_y - P1_y;
  if((P2_x - P1_x)<0){ ABSvec_x = (P2_x - P1_x) * -1.0;}
  if((P2_x - P1_x)<0){ ABSvec_y = (P2_y - P1_y) * -1.0;}			
   
  printf("vec_x %f , vec_y %f\n",vec_x,vec_y);
  
  if((ABSvec_y < ABSvec_x)&&(P1_x < P2_x)&&(P1_y < P2_y)){	// X Positiv , Y Positiv , Steigung mehr waagerecht
    printf("X Positiv , Y Positiv , Steigung mehr waagerecht\n");
    xpos=P1_x;
    m = vec_x / vec_y;				// Steigung
    for(zy = P1_y; zy <=P2_y; zy++){
      for(zx = 0; zx < m; zx++){
         data[(int)(zx+xpos)][(int)zy]=1;
         printf("%f %f\n",zx+xpos ,zy);
         if( ((xpos+zx)==P2_x)&&(zy==P2_y) ){printf("erreicht");break;}
      }
      xpos=xpos+m;
  } }
  if((ABSvec_y >= ABSvec_x)&&(P1_x < P2_x)&&(P1_y < P2_y)){	// X Positiv , Y Positiv , Steigung mehr Senkrecht
    printf("X Positiv , Y Positiv , Steigung mehr Senkrecht\n");
    ypos=P1_y;
    m = vec_y / vec_x;				// Steigung
    for(zx = P1_x; zx <=P2_x; zx++){
      for(zy = 0; zy < m; zy++){
         data[(int)zx][(int)(zy+ypos)]=1;
         printf("%f %f\n",zx ,zy+ypos);
         if( (zx==P2_x)&&( (ypos+zy) ==P2_y) ){printf("erreicht");break;}
      }
      ypos=ypos+m;
  } }
  if((ABSvec_y > ABSvec_x)&&(P1_x > P2_x)&&(P1_y < P2_y)){	// X Negativ , Y Positiv , Steigung mehr Senkrecht
    printf("X Negativ , Y Positiv , Steigung mehr Senkrecht\n");
    ypos=P1_y;
    m = vec_y / vec_x;				// Steigung
    if(m<0){ m = m * -1.0;}  // Betrag
    printf("%f\n",m);
    for(zx = P1_x; zx >=P2_x; zx--){
      for(zy = 0; zy < m; zy++){
         data[(int)zx][(int)(zy+ypos)]=1;
         printf("%f %f\n",zx ,zy+ypos);
         if( (zx==P2_x)&&( (ypos+zy) ==P2_y) ){printf("erreicht");break;}
      }
      ypos=ypos+m;
  } }
  if((ABSvec_y <= ABSvec_x)&&(P1_x > P2_x)&&(P1_y < P2_y)){	// X Negativ , Y Positiv , Steigung mehr waagerecht
    printf("X Negativ , Y Positiv , Steigung mehr waagerecht\n");
    xpos=P1_x;
    m = vec_x / vec_y;				// Steigung
    printf("%f\n",m);
    for(zy = P1_y; zy <=P2_y; zy++){
      for(zx = 0; zx > m; zx--){
         data[(int)(zx+xpos)][(int)zy]=1;
         printf("%f %f\n",zx+xpos ,zy);
         if( ((xpos+zx)==P2_x)&&(zy==P2_y) ){printf("erreicht");break;}
      }
      xpos=xpos+m;
  } }
    
}


main(void){
  int x,y;
  int data[20][20], **vec_data;
  vec_data = (int **)data;
  for(y = 0 ; y < 20 ; y++) {for(x = 0; x < 20; x++) {data[x][y]=0;} }
  
  bres_line(15,15,5,5,vec_data);				// 2 Points
  
  printf("\n");					// Output
  for(y = 0 ; y < 20 ; y++) {
    for(x = 0 ; x < 20 ; x++) {
      if(data[x][y]==0){printf("o");}else{printf("X");} 
    }
    printf("\n");
  }
}
