Example #1
0
File: normal.c Project: gmpetrov/RT
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);
}
Example #2
0
/*
 * 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();
}
Example #3
0
/*inline*/ vertex3f vertex3f::operator[](const vertex3f &op) const {
    return vector_mult(op);
}