static void facets_analyse(GwyContainer *data, GwyRunType run) { FacetsArgs args; GwyContainer *fdata; GwyDataField *dfield, *mfield; GQuark mquark; gint id; g_return_if_fail(run & FACETS_RUN_MODES); g_return_if_fail(g_type_from_name("GwyLayerPoint")); facets_load_args(gwy_app_settings_get(), &args); gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield, GWY_APP_MASK_FIELD_KEY, &mquark, GWY_APP_MASK_FIELD, &mfield, GWY_APP_DATA_FIELD_ID, &id, 0); g_return_if_fail(dfield && mquark); fdata = gwy_container_new(); gwy_data_field_facet_distribution(dfield, 2*args.kernel_size + 1, fdata); args.theta0 = gwy_container_get_double_by_name(fdata, "/theta0"); args.phi0 = gwy_container_get_double_by_name(fdata, "/phi0"); if (run == GWY_RUN_IMMEDIATE) run_noninteractive(&args, data, fdata, dfield, mfield, mquark); else { facets_dialog(&args, data, fdata, dfield, mfield, id, mquark); facets_save_args(gwy_app_settings_get(), &args); } g_object_unref(fdata); }
static void facet_view_selection_updated(GwySelection *selection, G_GNUC_UNUSED gint id, FacetsControls *controls) { GwyVectorLayer *layer; const gchar *key; gdouble theta, phi, x, y, q, xy[2]; gchar s[24]; q = gwy_container_get_double_by_name(controls->fdata, "/q"); gwy_selection_get_object(selection, 0, xy); x = xy[0] - G_SQRT2/q; y = xy[1] - G_SQRT2/q; xy_to_angles(x, y, &theta, &phi); g_snprintf(s, sizeof(s), "%.2f deg", 180.0/G_PI*theta); gtk_label_set_text(GTK_LABEL(controls->theta_label), s); controls->args->theta0 = theta; g_snprintf(s, sizeof(s), "%.2f deg", 180.0/G_PI*phi); gtk_label_set_text(GTK_LABEL(controls->phi_label), s); controls->args->phi0 = phi; if (!controls->in_update) { layer = gwy_data_view_get_top_layer(GWY_DATA_VIEW(controls->view)); key = gwy_vector_layer_get_selection_key(layer); selection = gwy_container_get_object_by_name(controls->mydata, key); if (gwy_selection_get_data(selection, NULL)) gwy_selection_clear(selection); } controls->computed = FALSE; }
static void facet_view_reset_maximum(FacetsControls *controls) { GwyDataField *mask = NULL; FacetsArgs *args; args = controls->args; args->theta0 = gwy_container_get_double_by_name(controls->fdata, "/theta0"); args->phi0 = gwy_container_get_double_by_name(controls->fdata, "/phi0"); facet_view_select_angle(controls, args->theta0, args->phi0); gtk_label_set_text(GTK_LABEL(controls->mtheta_label), ""); gtk_label_set_text(GTK_LABEL(controls->mphi_label), ""); if (gwy_container_gis_object_by_name(controls->fdata, "/0/mask", &mask)) { gwy_data_field_clear(mask); gwy_data_field_data_changed(mask); } }
static void facets_mark_fdata(FacetsArgs *args, GwyContainer *fdata) { GwyDataField *mask; gdouble q, r, cr, cro, cth0, sth0, cphi0, sphi0; gint hres, i, j; gdouble *m; hres = (FDATA_RES - 1)/2; cr = cos(args->tolerance); cth0 = cos(args->theta0); sth0 = sin(args->theta0); cphi0 = cos(args->phi0); sphi0 = sin(args->phi0); q = gwy_container_get_double_by_name(fdata, "/q"); mask = GWY_DATA_FIELD(gwy_container_get_object_by_name(fdata, "/0/mask")); m = gwy_data_field_get_data(mask); for (i = 0; i < FDATA_RES; i++) { gdouble y = G_SQRT2/(q*hres)*(i - hres); for (j = 0; j < FDATA_RES; j++) { gdouble x = -G_SQRT2/(q*hres)*(j - hres); /** * Orthodromic distance computed directly from x, y: * cos(theta) = 1 - 2*(r/2)^2 * sin(theta) = r*sqrt(1 - (r/2)^2) * cos(phi) = x/r * sin(phi) = y/r * where r = hypot(x, y) **/ r = hypot(x, y); cro = cth0*(1.0 - r*r/2.0) + sth0*r*sqrt(1.0 - r*r/4.0)*(x/r*cphi0 + y/r*sphi0); m[i*FDATA_RES + j] = (cro >= cr); } } gwy_data_field_data_changed(mask); }
static void facet_view_select_angle(FacetsControls *controls, gdouble theta, gdouble phi) { gdouble x, y, q, xy[2]; GwyVectorLayer *layer; GwySelection *selection; const gchar *key; angles_to_xy(theta, phi, &x, &y); controls->in_update = TRUE; q = gwy_container_get_double_by_name(controls->fdata, "/q"); xy[0] = x + G_SQRT2/q; xy[1] = y + G_SQRT2/q; layer = gwy_data_view_get_top_layer(GWY_DATA_VIEW(controls->fview)); key = gwy_vector_layer_get_selection_key(layer); selection = gwy_container_get_object_by_name(controls->fdata, key); gwy_selection_set_object(selection, 0, xy); controls->in_update = FALSE; }