void vect_normal(t_vector *normal, t_vector *impact, void *object) { if (type_object(object) == 's') { vector_sub_assoc(normal, impact, ((t_sphere *)object)->pos); } if (type_object(object) == 'p') { vector_set_copy(normal, ((t_plan *)object)->normal); vector_mult(normal, normal, -1); } if (type_object(object) == 'c') { vector_set(normal, impact->x - ((t_cylind *)object)->pos->x, 0 , impact->z - ((t_cylind *)object)->pos->z); } if (type_object(object) == 'o') { vector_set(normal, impact->x - ((t_cone *)object)->pos->x , 0, impact->z - ((t_cone *)object)->pos->z); } vector_normalize(normal); }
/* * Computes clusters' centroids. */ static void compute_centroids(void) { int i, j; /* Loop indexes. */ int population; /* Centroid population. */ start = timer_get(); memcpy(lcentroids, CENTROID(rank*(ncentroids/nprocs)), lncentroids[rank]*dimension*sizeof(float)); memset(&has_changed[rank*NUM_THREADS], 0, NUM_THREADS*sizeof(int)); memset(centroids, 0, (ncentroids + DELTA*nprocs)*dimension*sizeof(float)); memset(ppopulation, 0, (ncentroids + nprocs*DELTA)*sizeof(int)); /* Compute partial centroids. */ #pragma omp parallel for schedule(static) default(shared) private(i, j) for (i = 0; i < lnpoints; i++) { j = map[i]%NUM_THREADS; omp_set_lock(&lock[j]); vector_add(CENTROID(map[i]), POINT(i)); ppopulation[map[i]]++; omp_unset_lock(&lock[j]); } end = timer_get(); total += timer_diff(start, end); sync_pcentroids(); sync_ppopulation(); start = timer_get(); /* Compute centroids. */ #pragma omp parallel for schedule(static) default(shared) private(i, j, population) for (j = 0; j < lncentroids[rank]; j++) { population = 0; for (i = 0; i < nprocs; i++) { if (*POPULATION(i, j) == 0) continue; population += *POPULATION(i, j); if (i == rank) continue; vector_add(PCENTROID(rank, j), PCENTROID(i, j)); } if (population > 1) vector_mult(PCENTROID(rank, j), 1.0/population); /* Cluster mean has changed. */ if (!vector_equal(PCENTROID(rank, j), LCENTROID(j))) { has_changed[rank*NUM_THREADS + omp_get_thread_num()] = 1; vector_assign(LCENTROID(j), PCENTROID(rank, j)); } } end = timer_get(); total += timer_diff(start, end); sync_centroids(); sync_status(); }
/*inline*/ vertex3f vertex3f::operator[](const vertex3f &op) const { return vector_mult(op); }