/* This function takes two points (x1, y1) and (x2, y2) and computes the slope of the line that is formed by connecting the two points. The slope of a line is computed by calculating the following. m = (y2 - y1) / (x2 - x1) */ enum SLOPE compute_slope(void** p1, void** p2, float* m){ int dx; int dy; printf("okay"); div_t d = div((dy = compute_difference((**(point**)p2).y ,(**(point**)p1).y)), // STONESOUP:CROSSOVER_POINT (dx = compute_difference((**(point**)p2).x, (**(point**)p1).x))); // STONESOUP:TRIGGER_POINT /* If there is a remainder, we need to make sure to convert the integer values to floats, when we divide them, to ensure that we obtain an accurate slope value. There is really not reason to do this normally, but, I wanted to try and make the test case more interesting than a simple division operation. */ printf("ok"); printf("%d,%d",d.rem, d.quot); if ( dx != 0 ){ if ( d.rem == 0 ){ *m = dy/dx; }else{ *m = ((float)dy)/((float)dx); } return DEFINED_SLOPE; }else{ /* No need to set m */ return UNDEFINED_SLOPE; } }
void MYTIME_stop(pmytime pt) { my_assert(pt!=NULL); gettimeofday(&(pt->stop), NULL); pt->active= false; compute_difference(pt); }
// Evaluate difference from identity double eval_difference(const gsl_vector *v, void *params) { // Parameters sto_params_t *p=(sto_params_t *)params; // Form vector of exponents std::vector<double> exps=get_exps(v,p); // Compute difference double d=compute_difference(exps,p->zeta,p->l); // printf("Computed difference %e.\n",d); return d; }
// Evaluate derivative void eval_difference_df(const gsl_vector *v, void *params, gsl_vector *g) { // Parameters sto_params_t *p=(sto_params_t *)params; // Helper gsl_vector *vt=gsl_vector_alloc(v->size); // Step size double step=1e-4; // Loop over parameters for(size_t i=0;i<v->size;i++) { // Copy vector gsl_vector_memcpy(vt,v); // Current value double x=gsl_vector_get(vt,i); // Right trial gsl_vector_set(vt,i,x+step); double rval=compute_difference(get_exps(vt,p),p->zeta,p->l); // Left trial gsl_vector_set(vt,i,x-step); double lval=compute_difference(get_exps(vt,p),p->zeta,p->l); // Set gradient gsl_vector_set(g,i,(rval-lval)/(2*step)); } /* printf("Gradient:\n"); for(size_t i=0;i<v->size;i++) printf("g(%2i) = % e\n",(int) i, gsl_vector_get(g,i)); */ }
static void dog (gint32 image_ID, GimpDrawable *drawable, gdouble inner, gdouble outer, gboolean show_progress) { GimpDrawable *drawable1; GimpDrawable *drawable2; gint32 drawable_id = drawable->drawable_id; gint32 layer1; gint32 layer2; gint width, height; gint x1, y1, x2, y2; guchar maxval = 255; gimp_drawable_mask_bounds (drawable_id, &x1, &y1, &x2, &y2); width = (x2 - x1); height = (y2 - y1); gimp_drawable_flush (drawable); layer1 = gimp_layer_copy (drawable_id); gimp_drawable_set_visible (layer1, FALSE); gimp_drawable_set_name (layer1, "dog_scratch_layer1"); gimp_image_add_layer (image_ID, layer1, 0); layer2 = gimp_layer_copy (drawable_id); gimp_drawable_set_visible (layer2, FALSE); gimp_drawable_set_name (layer2, "dog_scratch_layer2"); gimp_image_add_layer (image_ID, layer2, 0); drawable1 = gimp_drawable_get (layer1); drawable2 = gimp_drawable_get (layer2); gauss_rle (drawable1, inner, 0, show_progress); gauss_rle (drawable2, outer, 1, show_progress); compute_difference (drawable, drawable1, drawable2, &maxval); gimp_drawable_detach (drawable1); gimp_drawable_detach (drawable2); gimp_image_remove_layer (image_ID, layer1); gimp_image_remove_layer (image_ID, layer2); gimp_drawable_flush (drawable); gimp_drawable_merge_shadow (drawable_id, TRUE); gimp_drawable_update (drawable_id, x1, y1, width, height); if (dogvals.normalize) { normalize (drawable, maxval); gimp_drawable_flush (drawable); gimp_drawable_merge_shadow (drawable_id, TRUE); gimp_drawable_update (drawable_id, x1, y1, width, height); } if (dogvals.invert) gimp_invert (drawable_id); }
static void dog (gint32 image_ID, GimpDrawable *drawable, gdouble inner, gdouble outer, gboolean show_progress) { GimpDrawable *drawable1; GimpDrawable *drawable2; gint32 drawable_id = drawable->drawable_id; gint32 layer1; gint32 layer2; gint width, height; gint x1, y1, x2, y2; guchar maxval = 255; gimp_drawable_mask_bounds (drawable_id, &x1, &y1, &x2, &y2); width = (x2 - x1); height = (y2 - y1); gimp_drawable_flush (drawable); layer1 = gimp_layer_copy (drawable_id); gimp_item_set_visible (layer1, FALSE); gimp_item_set_name (layer1, "dog_scratch_layer1"); gimp_image_insert_layer (image_ID, layer1, gimp_item_get_parent (drawable_id), 0); layer2 = gimp_layer_copy (drawable_id); gimp_item_set_visible (layer2, FALSE); gimp_item_set_name (layer2, "dog_scratch_layer2"); gimp_image_insert_layer (image_ID, layer2, gimp_item_get_parent (drawable_id), 0); drawable1 = gimp_drawable_get (layer1); drawable2 = gimp_drawable_get (layer2); gauss_rle (drawable1, inner, 0, show_progress); gauss_rle (drawable2, outer, 1, show_progress); compute_difference (drawable, drawable1, drawable2, &maxval); gimp_drawable_detach (drawable1); gimp_drawable_detach (drawable2); gimp_image_remove_layer (image_ID, layer1); gimp_image_remove_layer (image_ID, layer2); gimp_drawable_flush (drawable); gimp_drawable_merge_shadow (drawable_id, TRUE); gimp_drawable_update (drawable_id, x1, y1, width, height); if (dogvals.normalize || dogvals.invert) /* gimp_invert doesn't work properly with previews due to shadow handling * so reimplement it here - see Bug 557380 */ { normalize_invert (drawable, dogvals.normalize, maxval, dogvals.invert); gimp_drawable_flush (drawable); gimp_drawable_merge_shadow (drawable_id, TRUE); gimp_drawable_update (drawable_id, x1, y1, width, height); } }