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;
}