static void preview_selection_updated(GwySelection *selection, G_GNUC_UNUSED gint id, FacetsControls *controls) { GwyDataField *dfield; gdouble theta, phi, xy[2]; gint i, j; if (controls->in_update) return; dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->mydata, "/0/data")); if (!gwy_selection_get_object(selection, 0, xy)) return; j = gwy_data_field_rtoj(dfield, xy[0]); i = gwy_data_field_rtoi(dfield, xy[1]); dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->fdata, "/theta")); theta = gwy_data_field_get_val(dfield, j, i); dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls->fdata, "/phi")); phi = gwy_data_field_get_val(dfield, j, i); facet_view_select_angle(controls, theta, phi); }
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 prof_update_curve(ProfControls *controls, gint i) { GwyGraphCurveModel *gcmodel; gdouble xy[4], h; gint xl0, yl0, xl1, yl1; gint n, lineres; gchar *desc; g_return_if_fail(gwy_selection_get_object(controls->selection, i, xy)); /* The ω=0 pixel is always at res/2, for even dimensions it means it is * shifted half-a-pixel to the right from the precise centre. */ xl0 = gwy_data_field_get_xres(controls->psdffield)/2; yl0 = gwy_data_field_get_yres(controls->psdffield)/2; xl1 = floor(gwy_data_field_rtoj(controls->psdffield, xy[0])); yl1 = floor(gwy_data_field_rtoi(controls->psdffield, xy[1])); xy[0] += gwy_data_field_get_xoffset(controls->psdffield); xy[1] += gwy_data_field_get_yoffset(controls->psdffield); h = hypot(controls->hx*xy[0], controls->hy*xy[1])/hypot(xy[0], xy[1]); if (!controls->args->fixres) { lineres = GWY_ROUND(hypot(abs(xl0 - xl1) + 1, abs(yl0 - yl1) + 1)); lineres = MAX(lineres, MIN_RESOLUTION); } else lineres = controls->args->resolution; gwy_data_field_get_profile(controls->psdffield, controls->line, xl0, yl0, xl1, yl1, lineres, 1, controls->args->interpolation); gwy_data_line_multiply(controls->line, h); n = gwy_graph_model_get_n_curves(controls->gmodel); if (i < n) { gcmodel = gwy_graph_model_get_curve(controls->gmodel, i); } else { gcmodel = gwy_graph_curve_model_new(); g_object_set(gcmodel, "mode", GWY_GRAPH_CURVE_LINE, "color", gwy_graph_get_preset_color(i), NULL); gwy_graph_model_add_curve(controls->gmodel, gcmodel); g_object_unref(gcmodel); } gwy_graph_curve_model_set_data_from_dataline(gcmodel, controls->line, 0, 0); desc = g_strdup_printf(_("PSDF %.0f°"), 180.0/G_PI*atan2(-xy[1], xy[0])); g_object_set(gcmodel, "description", desc, NULL); g_free(desc); }
static gboolean gwy_selection_graph_area_crop_object(GwySelection *selection, gint i, gpointer user_data) { const gdouble *minmax = (const gdouble*)user_data; gdouble xy[OBJECT_SIZE]; gwy_selection_get_object(selection, i, xy); return (MIN(xy[0], xy[2]) >= minmax[0] && MIN(xy[1], xy[3]) >= minmax[1] && MAX(xy[0], xy[2]) <= minmax[2] && MAX(xy[1], xy[3]) <= minmax[3]); }
/* XXX: This replicates straighten_path.c */ static GwyXY* rescale_points(GwySelection *selection, GwyDataField *dfield, gboolean realsquare, gdouble *pdx, gdouble *pdy, gdouble *pqx, gdouble *pqy) { gdouble dx, dy, qx, qy, h; GwyXY *points; guint n, i; dx = gwy_data_field_get_xmeasure(dfield); dy = gwy_data_field_get_ymeasure(dfield); h = MIN(dx, dy); if (realsquare) { qx = h/dx; qy = h/dy; dx = dy = h; } else qx = qy = 1.0; n = gwy_selection_get_data(selection, NULL); points = g_new(GwyXY, n); for (i = 0; i < n; i++) { gdouble xy[2]; gwy_selection_get_object(selection, i, xy); points[i].x = xy[0]/dx; points[i].y = xy[1]/dy; } *pdx = dx; *pdy = dy; *pqx = qx; *pqy = qy; return points; }