Computer tools > C

C

Summary

Hello_World.c

#include{stdio.h}

int main(void)
{   
  printf("Hello World\n");
  return 0;
} // comment 1
/*
 comment 2
 */

morphing.c


This program uses read_bmp.c, found on internet, which in turn uses read_bmp.h
#include <stdio.h>
#include <stdlib.h>
#include "read_bmp.c"

float det(float a, float b, float c, float d) {return (a*d - b*c);};

void Convert_BMP_Color(size_t w, size_t h, char *data_input_1, char *data_input_2, char *data_output, float coef) {
unsigned i = 0;
unsigned j = 0;
unsigned char *p = data_input_1; // unsigned char causes warning...
unsigned char *p2 = data_input_2;
unsigned char *q = data_output;
unsigned x = 0, y = 0, k = 0, z = 0, i_tr = 0;
unsigned triangles1[][6] = {
  {9, h-170, 99, h-170, 100, h-68},
  {99, h-180, 260, h-186, 100, h-68},
  {260, h-186, 208, h-80, 100, h-68},

  {97, h-226, 99, h-170, 9, h-170},
  {97, h-226, 260, h-186, 99, h-170},
  {97, h-226, 260, h-226, 259, h-186},

  {9, h-170, 100, h-68, 0, 0},
  //{260, h-186, w-1, h-1, 208, h-1},
  {0, h-226, 97, h-226, 9, h-170},
};
unsigned triangles2[][6] = {
  {7, h-171, 99, h-170, 100, h-77},
  {99, h-180, 249, h-177, 100, h-77},
  {249, h-177, 197, h-88, 100, h-77},

  {95, h-219, 99, h-170, 7, h-171},
  {95, h-219, 260, h-177, 99, h-170},
  {95, h-219, 260, h-219, 259, h-177},

  {7, h-171, 100, h-77, 0, 0},
  //{249, h-177, w-1, h-1, 197, h-1},
  {0, h-219, 95, h-219, 7, h-177},
};
unsigned n_tr = sizeof(triangles1)/(6 * sizeof(int));
unsigned x1a, x1b, x1c, y1a, y1b, y1c, x2a, x2b, x2c, y2a, y2b, y2c, x1, y1, x2, y2, z1, z2;
float xa, xb, xc, ya, yb, yc, x1f, y1f, x2f, y2f, lx1, ly1, lx2, ly2, pz10, pz11, pz12, pz20, pz21, pz22, delta_tot, delta_a, delta_b, delta_c;

for( i = 0 ; i < w ; i++) {
  for( j = 0 ; j < h ; j++) {
    x = i; y = j;
    z = 3*(x+y*w);
    q[z] = 255; q[z+1] = 255; q[z+2] = 255; // Clear output image
    // q[z] = p[z]; q[z+1] = p[z+1]; q[z+2] = p[z+2]; // Copy i1 into o
  }
}

for( i_tr = 0 ; i_tr < n_tr ; i_tr++) {
  x1a = triangles1[i_tr][0]; y1a = triangles1[i_tr][1];
  x1b = triangles1[i_tr][2]; y1b = triangles1[i_tr][3];
  x1c = triangles1[i_tr][4]; y1c = triangles1[i_tr][5];
  x2a = triangles2[i_tr][0]; y2a = triangles2[i_tr][1];
  x2b = triangles2[i_tr][2]; y2b = triangles2[i_tr][3];
  x2c = triangles2[i_tr][4]; y2c = triangles2[i_tr][5];
  xa = (1-coef)*x1a+coef*x2a; ya = (1-coef)*y1a+coef*y2a;
  xb = (1-coef)*x1b+coef*x2b; yb = (1-coef)*y1b+coef*y2b;
  xc = (1-coef)*x1c+coef*x2c; yc = (1-coef)*y1c+coef*y2c;

if (x1a >= 0 && x1a < w && y1a >= 0 && y1a < h &&
  x1b >= 0 && x1b < w && y1b >= 0 && y1b < h &&
  x1c >= 0 && x1c < w && y1c >= 0 && y1c < h &&
  x2a >= 0 && x2a < w && y2a >= 0 && y2a < h &&
  x2b >= 0 && x2b < w && y2b >= 0 && y2b < h &&
  x2c >= 0 && x2c < w && y2c >= 0 && y2c < h)
{
  delta_tot = det(xb-xa, yb-ya, xc-xa, yc-ya);

  // Supposing ya < yb < yc in triangle a, b, c (y from bottom to top).
  //       and xc < xb
  for (j = (int)ya; j < yb; j++) {
    for (i = (int)(xa+(xc-xa)*(j-ya)/(yc-ya)); i < xa+(xb-xa)*(j-ya)/(yb-ya); i++) {
      delta_a = det(xc-xb, yc-yb, i-xb, j-yb);
      delta_b = det(xa-xc, ya-yc, i-xc, j-yc);
      delta_c = det(xb-xa, yb-ya, i-xa, j-ya);
      x1f = (delta_a*x1a+delta_b*x1b+delta_c*x1c)/delta_tot;
      y1f = (delta_a*y1a+delta_b*y1b+delta_c*y1c)/delta_tot;
      x2f = (delta_a*x2a+delta_b*x2b+delta_c*x2c)/delta_tot;
      y2f = (delta_a*y2a+delta_b*y2b+delta_c*y2c)/delta_tot;
      x1 = (int)x1f;
      y1 = (int)y1f;
      x2 = (int)x2f;
      y2 = (int)y2f;
      lx1 = x1f-x1;
      ly1 = y1f-y1;
      lx2 = x2f-x2;
      ly2 = y2f-y2;
      k = 3*(i+j*w);
      z1 = 3*(x1+y1*w);
      z2 = 3*(x2+y2*w);
      pz10 = (1-ly1)*((1-lx1)*p[z1]  +lx1*p[z1  +3])  + ly1*((1-lx1)*p[z1  +3*w]+lx1*p[z1  +3*(w+1)]);
      pz11 = (1-ly1)*((1-lx1)*p[z1+1]+lx1*p[z1+1+3])  + ly1*((1-lx1)*p[z1+1+3*w]+lx1*p[z1+1+3*(w+1)]);
      pz12 = (1-ly1)*((1-lx1)*p[z1+2]+lx1*p[z1+2+3])  + ly1*((1-lx1)*p[z1+2+3*w]+lx1*p[z1+2+3*(w+1)]);
      pz20 = (1-ly2)*((1-lx2)*p2[z2]  +lx2*p2[z2  +3]) + ly2*((1-lx2)*p2[z2  +3*w]+lx2*p2[z2  +3*(w+1)]);
      pz21 = (1-ly2)*((1-lx2)*p2[z2+1]+lx2*p2[z2+1+3]) + ly2*((1-lx2)*p2[z2+1+3*w]+lx2*p2[z2+1+3*(w+1)]);
      pz22 = (1-ly2)*((1-lx2)*p2[z2+2]+lx2*p2[z2+2+3]) + ly2*((1-lx2)*p2[z2+2+3*w]+lx2*p2[z2+2+3*(w+1)]);

      q[k] =  (unsigned char)((1-coef)*pz10+coef*pz20);
      q[k+1] =  (unsigned char)((1-coef)*pz11+coef*pz21);
      q[k+2] =  (unsigned char)((1-coef)*pz12+coef*pz22);
    }
  }
  for (j = (int)yb; j < yc; j++) {
    for (i = (int)(xa+(xc-xa)*(j-ya)/(yc-ya)); i < xb+(xc-xb)*(j-yb)/(yc-yb); i++) {
      delta_a = det(xc-xb, yc-yb, i-xb, j-yb);
      delta_b = det(xa-xc, ya-yc, i-xc, j-yc);
      delta_c = det(xb-xa, yb-ya, i-xa, j-ya);
      x1f = (delta_a*x1a+delta_b*x1b+delta_c*x1c)/delta_tot;
      y1f = (delta_a*y1a+delta_b*y1b+delta_c*y1c)/delta_tot;
      x2f = (delta_a*x2a+delta_b*x2b+delta_c*x2c)/delta_tot;
      y2f = (delta_a*y2a+delta_b*y2b+delta_c*y2c)/delta_tot;
      x1 = (int)x1f;
      y1 = (int)y1f;
      x2 = (int)x2f;
      y2 = (int)y2f;
      lx1 = x1f-x1;
      ly1 = y1f-y1;
      lx2 = x2f-x2;
      ly2 = y2f-y2;
      k = 3*(i+j*w);
      z1 = 3*(x1+y1*w);
      z2 = 3*(x2+y2*w);
      pz10 = (1-ly1)*((1-lx1)*p[z1]  +lx1*p[z1  +3])  + ly1*((1-lx1)*p[z1  +3*w]+lx1*p[z1  +3*(w+1)]);
      pz11 = (1-ly1)*((1-lx1)*p[z1+1]+lx1*p[z1+1+3])  + ly1*((1-lx1)*p[z1+1+3*w]+lx1*p[z1+1+3*(w+1)]);
      pz12 = (1-ly1)*((1-lx1)*p[z1+2]+lx1*p[z1+2+3])  + ly1*((1-lx1)*p[z1+2+3*w]+lx1*p[z1+2+3*(w+1)]);
      pz20 = (1-ly2)*((1-lx2)*p2[z2]  +lx2*p2[z2  +3]) + ly2*((1-lx2)*p2[z2  +3*w]+lx2*p2[z2  +3*(w+1)]);
      pz21 = (1-ly2)*((1-lx2)*p2[z2+1]+lx2*p2[z2+1+3]) + ly2*((1-lx2)*p2[z2+1+3*w]+lx2*p2[z2+1+3*(w+1)]);
      pz22 = (1-ly2)*((1-lx2)*p2[z2+2]+lx2*p2[z2+2+3]) + ly2*((1-lx2)*p2[z2+2+3*w]+lx2*p2[z2+2+3*(w+1)]);

      q[k] =  (unsigned char)((1-coef)*pz10+coef*pz20);
      q[k+1] =  (unsigned char)((1-coef)*pz11+coef*pz21);
      q[k+2] =  (unsigned char)((1-coef)*pz12+coef*pz22);
    }
  }

}
}
}

int main() {
float coef;
char file_input_1[1000] = "input_1.bmp";
char file_input_2[1000] = "input_2.bmp";
BMP_Data bmp_data_input_1;
BMP_Data bmp_data_input_2;
BMP_Data bmp_data_output;

printf("Morphing between following files : %s and %s\n", file_input_1, file_input_2);
printf("Loading images...\n\n");

if( !Load_BMP(file_input_1, &bmp_data_input_1) ) {
  fprintf(stderr, "Error opening image %s\n", file_input_1);
  exit(1);
}
if( !Load_BMP(file_input_2, &bmp_data_input_2) ) {
  fprintf(stderr, "Error opening image %s\n", file_input_2);
  exit(1);
}
printf("Creating images...\n\n");
for (coef = 0; coef < 1.1; coef = coef+0.1f) {
  char file_output[1000] = "oXY.bmp";
  file_output[1] = '0'+(char)(coef*10)/10;
  file_output[2] = '0'+(unsigned)(coef*10)%10;
  printf("%s...\n", file_output);

  if( !Load_BMP(file_output, &bmp_data_output) ) {
    fprintf(stderr, "Error opening image %s\n", file_output);
    exit(1);
  }

  Convert_BMP_Color(bmp_data_input_1.width, bmp_data_input_1.height, bmp_data_input_1.data, bmp_data_input_2.data, bmp_data_output.data, coef);
  if( !Save_BMP(file_output, &bmp_data_output) ) {
    fprintf(stderr, "Error saving image\n");
    exit(1);
  }
}
return 0;
}