Пример #1
0
int nice_homography(const double * H)
{
  double det = H[0] * H[4] - H[3] * H[1];
  if (det < 0) return 0;
  double N1 = fast_sqrt( dSquare(H[0]) + dSquare(H[3]) );
  if (N1 > 4) return 0;
  if (N1 < 0.1) return 0;
  double N2 = fast_sqrt( dSquare(H[1]) + dSquare(H[4]) );
  if (N2 > 4) return 0;
  if (N2 < 0.1) return 0;
  double N3 = fast_sqrt( dSquare(H[6]) + dSquare(H[7]) );
  if (N3 > 0.002) return 0;
  return 1;
}
Пример #2
0
double FindShiTomasiScoreAtPoint(const unsigned char *image, const int stride, const xy *irCenter)
{
	double dXX = 0.0;
	double dYY = 0.0;
	double dXY = 0.0;
	
	const int cpos = irCenter->y * stride + irCenter->x;
	const int *win = shiTomasiWin;
	int len = 196 / 4;
	
	while(-- len > -1)
	{
		const double __dx0 = (double)image[ *(win++) + cpos ];
		const double __dx1 = (double)image[ *(win++) + cpos ];
		const double __dy0 = (double)image[ *(win++) + cpos ];
		const double __dy1 = (double)image[ *(win++) + cpos ];
		
		
		const double dx = __dx0 - __dx1;
		const double dy = __dy0 - __dy1;
		
		dXX += dx*dx;
		dYY += dy*dy;
		dXY += dx*dy;
	}
	
	const double nPixels = 0.002551020408163265;//1.0 / (2.0 * (double)((nx+1) * (ny+1)));
	dXX = dXX * nPixels;
	dYY = dYY * nPixels;
	dXY = dXY * nPixels;

	// Find and return smaller eigenvalue:
	return (double)0.5 * (dXX + dYY - fast_sqrt( (dXX + dYY) * (dXX + dYY) - (double)4.0 * (dXX * dYY - dXY * dXY) ));
}
Пример #3
0
static inline double color_distance( uint8_t Cb, uint8_t Cr, int Cbk, int Crk, const double dA, const double dB )
{
		double tmp = 0.0; 
		fast_sqrt( tmp, (Cbk - Cb) * (Cbk-Cb) + (Crk - Cr) * (Crk - Cr) );
		if( tmp < dA ) { /* near color key == bg */
			return 0.0;
		}
		if( tmp < dB ) { /* middle region */
			return (tmp - dA)/(dB - dA); /* distance to key color */
		}
		return 1.0; /* far from color key == fg */
}
Пример #4
0
static inline int intersect_sphere(rt_context_t *rtx, unsigned int index)
{
  int r = FALSE;
  vec3_t v = vec3_sub(rtx->ray.pos, rtx->obj[index].pos);
  float b, d;
  b = -dot(v, rtx->ray.dir);
  float rad = rtx->obj[index].rad;
  d = b * b - dot(v, v) + rad * rad;
  if (d > 0.0f)
  {
    float dsqr = fast_sqrt(d);
    float t0 = b - dsqr;
    if ((t0 > 0.0f) && (t0 < rtx->dist))
    {
      rtx->dist = t0;
      r = TRUE;
    }
  }
  return r;
}
Пример #5
0
 static int calculate(int x, int y, int d)
 {
     return (int)fast_sqrt(x*x + y*y);
 }
Пример #6
0
void show_smileys_cb(smiley_callback_data *data)
{
	eb_local_account *account;
	LList *smileys = NULL;
	protocol_smiley *msmiley = NULL;
	GtkWidget *smileys_table = NULL;
	GtkWidget *button = NULL;
	GtkWidget *iconwid;
	GdkPixbuf *icon;
	GtkWidget *smiley_window;
	LList *done = NULL;
	LList *l;
	smiley *dsmile = NULL;
	int real_len = 0, x = -1, y = 0;
	int win_w = 0, win_h = 0, w, h;
	int win_x, win_y;
	int rows, cols;

	if (data && data->c_window)
		account = data->c_window->conv->local_user;
	else {
		eb_debug(DBG_CORE, "no chat* in data !\n");
		return;
	}

	/* close popup if open */
	if (data->c_window && data->c_window->smiley_window) {
		gtk_widget_destroy(data->c_window->smiley_window);
		data->c_window->smiley_window = NULL;
		return;
	}

	if (account && RUN_SERVICE(account)->get_smileys)
		smileys = RUN_SERVICE(account)->get_smileys();
	else
		return;
	for (; smileys; smileys = smileys->next) {
		gboolean already_done = FALSE;
		msmiley = smileys->data;
		for (l = done; l; l = l->next) {
			protocol_smiley *done_smiley = l->data;
			if (!strcmp(msmiley->name, done_smiley->name)) {
				already_done = TRUE;
				break;
			}
		}

		if (already_done || !get_smiley_by_name(msmiley->name))
			continue;

		done = l_list_append(done, msmiley);
		real_len++;
	}

	rows = fast_sqrt(real_len) - 1;
	if (rows < 5)
		rows = 5;
	cols = real_len / rows + !(!(real_len % rows));
	smileys_table = gtk_table_new(rows, cols, TRUE);

	for (l = done; l; l = l_list_next(l)) {
		msmiley = l->data;
		dsmile = get_smiley_by_name_and_service(msmiley->name,
			GET_SERVICE(account).name);
		if (dsmile != NULL) {
			GtkWidget *parent = NULL;
			if (data && data->c_window)
				parent = data->c_window->window;
			icon = gdk_pixbuf_new_from_xpm_data((const char **)
				dsmile->pixmap);
			iconwid = gtk_image_new_from_pixbuf(icon);

			sscanf(dsmile->pixmap[0], "%d %d", &w, &h);
			if (x < rows) {
				x++;
				if (y == 0)
					win_h += h + 2;
			}
			if (x == rows) {
				y++;
				x = 0;
				win_w += w + 2;
			}
			gtk_widget_show(iconwid);
			button = gtk_button_new();
			gtk_button_set_relief(GTK_BUTTON(button),
				GTK_RELIEF_NONE);
			gtk_container_add(GTK_CONTAINER(button), iconwid);
			gtk_widget_show(button);
			gtk_widget_set_name(button, msmiley->text);
			g_signal_connect(button, "clicked",
				G_CALLBACK(insert_smiley_cb), data);
			gtk_table_attach(GTK_TABLE(smileys_table), button, y,
				y + 1, x, x + 1, GTK_FILL, GTK_FILL, 0, 0);
		}
	}

	l_list_free(done);
	done = NULL;

	smiley_window = gtk_window_new(GTK_WINDOW_POPUP);
	gtk_window_set_transient_for(GTK_WINDOW(smiley_window),
		GTK_WINDOW(data->c_window->window));
	gtk_window_set_modal(GTK_WINDOW(smiley_window), FALSE);
	gtk_window_set_wmclass(GTK_WINDOW(smiley_window), "ayttm-chat",
		"Ayttm");
	gtk_window_set_title(GTK_WINDOW(smiley_window), "Smileys");
	gtk_window_set_resizable(GTK_WINDOW(smiley_window), FALSE);
	gtk_widget_realize(smiley_window);

	g_signal_connect(smiley_window, "delete-event",
		G_CALLBACK(delete_event_cb), (gpointer) data);

	gtk_container_add(GTK_CONTAINER(smiley_window), smileys_table);
	gtk_widget_show(smileys_table);

	/* move the window a bit after the cursor and in the screen */
	gdk_window_get_pointer(NULL, &win_x, &win_y, NULL);
	win_x += 5;
	win_y += 5;
	while ((win_x) + win_w > gdk_screen_width() - 30)
		win_x -= 20;
	while ((win_y) + win_h > gdk_screen_height() - 30)
		win_y -= 20;
	gtk_window_move(GTK_WINDOW(smiley_window), win_x, win_y);

	if (data && data->c_window)
		data->c_window->smiley_window = smiley_window;

	gtk_widget_show(smiley_window);

}
Пример #7
0
void normalizePoints(const int number_of_correspondences, const double *u_v_up_vp, double *normalized_u_v_up_vp, double *T1, double *T2inv)
{
	const double invN = (double)1.0 / (double)number_of_correspondences;
	const double sqrt2N = SQRT2 * (double)number_of_correspondences;
	
	double u_sum = 0., v_sum = 0., up_sum = 0., vp_sum = 0;
	int i, j;
	
	for(i = 0, j = 0; i < number_of_correspondences; i++) {
		u_sum  += u_v_up_vp[j++];
		v_sum  += u_v_up_vp[j++];
		up_sum += u_v_up_vp[j++];
		vp_sum += u_v_up_vp[j++];
	}

	double u_mean  = u_sum  * invN;
	double v_mean  = v_sum  * invN;
	double up_mean = up_sum * invN;
	double vp_mean = vp_sum * invN;

	// translate mean to origin, compute sum of distances from origin
	double dist_sum = 0, distp_sum = 0;
	double n_up_vp_um, n_up_vp_vm;
	for(i = 0; i < number_of_correspondences; i++) 
	{
		normalized_u_v_up_vp[4 * i    ] = ( n_up_vp_um = u_v_up_vp[4 * i    ] - u_mean );
		normalized_u_v_up_vp[4 * i + 1] = ( n_up_vp_vm = u_v_up_vp[4 * i + 1] - v_mean );

		dist_sum += fast_sqrt( dSquare(n_up_vp_um) + dSquare(n_up_vp_vm) );

		normalized_u_v_up_vp[4 * i + 2] = ( n_up_vp_um = u_v_up_vp[4 * i + 2] - up_mean );
		normalized_u_v_up_vp[4 * i + 3] = ( n_up_vp_vm = u_v_up_vp[4 * i + 3] - vp_mean );

		distp_sum += fast_sqrt( dSquare(n_up_vp_um) + dSquare(n_up_vp_vm) );
	}

	// compute normalizing scale factor ( average distance from origin = sqrt(2) )
	double scale  = sqrt2N / dist_sum;
	double scalep = sqrt2N / distp_sum;

	// apply scaling
	for(i = 0, j = 0; i < number_of_correspondences; i++) {
		normalized_u_v_up_vp[j++] *= scale;
		normalized_u_v_up_vp[j++] *= scale;
		normalized_u_v_up_vp[j++] *= scalep;
		normalized_u_v_up_vp[j++] *= scalep;
	}

	// assemble transformation Matrices, used at denormalization

	T1[1] = T1[3] = T1[6] = T1[7] = 0.0;
	T1[0] = scale;
	T1[2] = -scale * u_mean;
	T1[4] = scale;
	T1[5] = -scale * v_mean;
	T1[8] = (double)1.0;
	
	T2inv[1] = T2inv[3] = T2inv[6] = T2inv[7] = 0.0;
	T2inv[0] = (double)1. / scalep;
	T2inv[2] = up_mean;
	T2inv[4] = (double)1. / scalep;
	T2inv[5] = vp_mean;
	T2inv[8] = (double)1.0;
}