Предыдущая Следующая
 60
Фракталы и вейвлеты для сжатия изображений в лейс^.
Листинг 2.4.2. Образен программы вычисления вероятностей, сопоставленных
лля вероятностного алгоритма. Кажлая вероятность пропориионалЬн' опрелелителю матрицы аффинного преобразования. Этот определ* тель, в свою очерель, пропорционален плошали, управляемой ЭТи преобразованием. Вы можете молифииировать программу, чтобы По экспериментировать с неравномерными распрелелениями лля разл^ ных частей изображения-аттрактора.
int compute__ifs_j?robabilities (object__list *coeff_list) { int i, no__of__f ns = coeff__list->get__count () ; float *pr = NULL,*det_a = NULL;
// allocated 1. . no__of_f ns float sum = 0.0,pr_sum = 0.0; coef f__s true t if s ;
if (!(det_a = allocate_f_jvector (1, no__of_f ns) ) ) return 0;
if (! (pr = allocate_f__vector (1, no__of__f ns) ) ) { f ree_f__vector (det__a, 1) ; return 0; }
for (i=l;i<=no_of_f ns;i++) {
ifs - *(coeff_struet *) (coeff_list->at(i)); det_a [i] = fabs (ifs.a*ifs.d - ifs.b*ifs.c); sum += det__a[i] ; } /* i */
for (i=l;i<=no__of_fns;i++) {
pr[i] = det__a[i] / sum;
if (pr[i] < 0.01) pr[i] = 0.01;
pr_sum += pr[i];
}
free__f__vector (det_a,l);
/♦adjust pr values to get true probabilities */ for (i=l;i<=no_of_fns;i++) { pr[i] /- pr^sum;
((coeff_struet *)(coeff_list->at(i)))-> prob = pr[i];
)
free__f_vector (pr,l);
return 1;
>
Листинг 2.4.3. Образен программы, реализуюшей вероятностный IFS алгоритм. Э1°]
алгоритм проше реализуется и является более быстролействуюшим п° сравнению с летерминистическим алгоритмом; кроме того, он созАд изображения высокого качества.
void ifs_random__image__graph (graph_setup__rec *gr_setup, graph_window__struct *gr, object__list *coeff_list, term_proc terminating_j?roc) {
Системы итерируемых функций
~ 61
int i,k;
int no__of__fns = coef f__list->get_count () ;
int *p = NULL,*pi « NULL; /* allocated 1. . no__of__f ns */
coeff_struct ifs;
int int__sum = 0; float x,y,xnew,ynew; unsigned long iter;
if (! (p = allocate__int_yector (1,no_of_fns)) ) return; if (! (pi = allocate__int_vector (1,no_of_fns))) goto exit_j?roc; Предыдущая Следующая
|