struct PPM *render_potential( int h, int w, float *potential, COLOR (*table_func)(float rate) ) { int i; float val_max, val_min, val_range; struct PPM *ppm; if (w <= 0 || h <= 0) { return NULL; } val_max = *potential; val_min = *potential; for (i = 1; i < w*h; ++i) { if (potential[i] < val_min) { val_min = potential[i]; } if (potential[i] > val_max) { val_max = potential[i]; } } val_range = val_max - val_min; ppm = PPM_init_hw(h, w); if (val_range != 0) { for (i = 0; i < w*h; ++i) { ppm->buf[i] = table_func( (potential[i] - val_min) / val_range); } } else { for (i = 0; i < w*h; ++i) { ppm->buf[i] = table_func(1); } } return ppm; }
/* Functions to start tables */ static void write_table(int table_num, RA charges, int (*table_func)(RA, int)) { g_curr_table = table_num; ARB_NUM_SET_ZERO (&g_table_total); if (!table_func(charges, TABLE_COUNT)) return; /* write the header */ write_table_header(FALSE); g_in_a_table = TRUE; /* write the table body */ table_func(charges, TABLE_PRINT); /* write the footer */ /* adjust the grand_total first, since the footer might use it */ arb_num_arith (&g_table_grand_total, &g_table_grand_total, ARB_NUM_ADD, &g_table_total); finish_table(); g_in_a_table=FALSE; }