diff options
-rw-r--r-- | src/image.c | 1 | ||||
-rw-r--r-- | src/image.h | 2 | ||||
-rw-r--r-- | src/imagedisplay.c | 26 | ||||
-rw-r--r-- | src/imagedisplay.h | 11 | ||||
-rw-r--r-- | src/reproject.c | 60 | ||||
-rw-r--r-- | src/reproject.h | 1 |
6 files changed, 92 insertions, 9 deletions
diff --git a/src/image.c b/src/image.c index 83ae271..b2b091d 100644 --- a/src/image.c +++ b/src/image.c @@ -78,6 +78,7 @@ void image_add_feature(ImageFeatureList *flist, double x, double y, ImageRecord flist->features[flist->n_features].y = y; flist->features[flist->n_features].intensity = intensity; flist->features[flist->n_features].parent = parent; + flist->features[flist->n_features].partner = NULL; flist->n_features++; diff --git a/src/image.h b/src/image.h index 5061893..82c6443 100644 --- a/src/image.h +++ b/src/image.h @@ -25,6 +25,8 @@ typedef struct imagefeature_struct { double y; double intensity; + struct imagefeature_struct *partner; + } ImageFeature; typedef struct { diff --git a/src/imagedisplay.c b/src/imagedisplay.c index c2f2fbe..c70d8a8 100644 --- a/src/imagedisplay.c +++ b/src/imagedisplay.c @@ -119,7 +119,7 @@ void imagedisplay_put_data(ImageDisplay *imagedisplay, ImageRecord imagerecord) } -void imagedisplay_clear_circles(ImageDisplay *imagedisplay) { +void imagedisplay_clear_marks(ImageDisplay *imagedisplay) { ImageDisplayMark *cur; @@ -135,7 +135,7 @@ void imagedisplay_clear_circles(ImageDisplay *imagedisplay) { static void imagedisplay_destroyed(GtkWidget *widget, ImageDisplay *imagedisplay) { - imagedisplay_clear_circles(imagedisplay); + imagedisplay_clear_marks(imagedisplay); if ( imagedisplay->flags & IMAGEDISPLAY_QUIT_IF_CLOSED ) { gtk_exit(0); @@ -333,6 +333,28 @@ void imagedisplay_add_mark(ImageDisplay *imagedisplay, double x, double y, Image } +void imagedisplay_add_line(ImageDisplay *imagedisplay, double x1, double y1, double x2, double y2, ImageDisplayMarkType type) { + + ImageDisplayMark *new; + + new = malloc(sizeof(ImageDisplayMark)); + new->x = x1; new->y = y1; + new->x2 = x2; new->y2 = y2; + new->type = type; + new->next = NULL; + + if ( !imagedisplay->marks ) { + imagedisplay->marks = new; + } else { + ImageDisplayMark *cur = imagedisplay->marks; + while ( cur->next ) { + cur = cur->next; + } + cur->next = new; + } + +} + void imagedisplay_force_redraw(ImageDisplay *imagedisplay) { imagedisplay_rescale(imagedisplay, imagedisplay->drawingarea_width, imagedisplay->drawingarea_height); gtk_widget_queue_draw_area(imagedisplay->drawingarea, 0, 0, imagedisplay->drawingarea_width, imagedisplay->drawingarea_height); diff --git a/src/imagedisplay.h b/src/imagedisplay.h index 38d2fbe..73ef172 100644 --- a/src/imagedisplay.h +++ b/src/imagedisplay.h @@ -30,14 +30,20 @@ typedef enum { typedef enum { IMAGEDISPLAY_MARK_CIRCLE_1, - IMAGEDISPLAY_MARK_CIRCLE_2 + IMAGEDISPLAY_MARK_CIRCLE_2, + IMAGEDISPLAY_MARK_LINE_1 } ImageDisplayMarkType; typedef struct struct_imagedisplaymark { + double x; double y; + double x2; + double y2; ImageDisplayMarkType type; + struct struct_imagedisplaymark *next; + } ImageDisplayMark; typedef struct imagedisplay_struct { @@ -72,10 +78,11 @@ extern ImageDisplay *imagedisplay_open(ImageRecord image, const char *title, Ima extern ImageDisplay *imagedisplay_open_with_message(ImageRecord image, const char *title, const char *message, ImageDisplayFlags flags, GCallback mouse_click_func, gpointer callback_data); extern void imagedisplay_add_mark(ImageDisplay *imagedisplay, double x, double y, ImageDisplayMarkType type); +extern void imagedisplay_add_line(ImageDisplay *imagedisplay, double x1, double y1, double x2, double y2, ImageDisplayMarkType type); extern void imagedisplay_force_redraw(ImageDisplay *imagedisplay); extern void imagedisplay_put_data(ImageDisplay *imagedisplay, ImageRecord imagerecord); extern void imagedisplay_close(ImageDisplay *imagedisplay); -extern void imagedisplay_clear_circles(ImageDisplay *imagedisplay); +extern void imagedisplay_clear_marks(ImageDisplay *imagedisplay); #endif /* IMAGEDISPLAY_H */ diff --git a/src/reproject.c b/src/reproject.c index b13dd66..535dc0e 100644 --- a/src/reproject.c +++ b/src/reproject.c @@ -177,8 +177,49 @@ ImageFeatureList *reproject_get_reflections(ImageRecord *image, ReflectionList * } +/* Attempt to find the partner for "feature" from the feature list of "image" */ +static ImageFeature *reproject_find_partner(ImageFeature *feature, ImageRecord *image) { + + int i; + double dmin = +HUGE_VAL; + int closest; + closest = 0; + + for ( i=0; i<image->features->n_features; i++ ) { + + double d; + + d = distance(image->features->features[i].x, image->features->features[i].x, feature->x, feature->y); + + if ( d < dmin ) { + dmin = d; + closest = i; + } + + } + + if ( dmin < 20 ) { + return &image->features->features[closest]; + } + + return NULL; /* No suitable partner found */ + +} + +/* Attempt to find partners from the feature list of "image" for each feature in "flist". */ +void reproject_partner_features(ImageFeatureList *flist, ImageRecord *image) { + + int i; + + for ( i=0; i<flist->n_features; i++ ) { + flist->features[i].partner = reproject_find_partner(&flist->features[i], image); + } + +} + static void reproject_mark_peaks(ControlContext *ctx) { + ImageFeatureList *rflist; ImageFeatureList *flist; size_t j; double xc, yc; @@ -187,11 +228,10 @@ static void reproject_mark_peaks(ControlContext *ctx) { yc = ctx->images->images[ctx->reproject_cur_image].y_centre; /* Draw the reprojected peaks */ - flist = reproject_get_reflections(&ctx->images->images[ctx->reproject_cur_image], ctx->cell_lattice, ctx); - for ( j=0; j<flist->n_features; j++ ) { - imagedisplay_add_mark(ctx->reproject_id, xc+flist->features[j].x, yc+flist->features[j].y, IMAGEDISPLAY_MARK_CIRCLE_1); + rflist = reproject_get_reflections(&ctx->images->images[ctx->reproject_cur_image], ctx->cell_lattice, ctx); + for ( j=0; j<rflist->n_features; j++ ) { + imagedisplay_add_mark(ctx->reproject_id, xc+rflist->features[j].x, yc+rflist->features[j].y, IMAGEDISPLAY_MARK_CIRCLE_1); } - image_feature_list_free(flist); /* Now draw the original measured peaks */ flist = ctx->images->images[ctx->reproject_cur_image].features; @@ -199,6 +239,16 @@ static void reproject_mark_peaks(ControlContext *ctx) { imagedisplay_add_mark(ctx->reproject_id, xc+flist->features[j].x, yc+flist->features[j].y, IMAGEDISPLAY_MARK_CIRCLE_2); } + /* Now connect partners */ + reproject_partner_features(rflist, &ctx->images->images[ctx->reproject_cur_image]); + for ( j=0; j<rflist->n_features; j++ ) { + imagedisplay_add_line(ctx->reproject_id, xc+rflist->features[j].x, yc+rflist->features[j].y, + xc+rflist->features[j].partner->x, yc+rflist->features[j].partner->y, + IMAGEDISPLAY_MARK_LINE_1); + } + + image_feature_list_free(rflist); + } static gint reproject_clicked(GtkWidget *widget, GdkEventButton *event, ControlContext *ctx) { @@ -207,7 +257,7 @@ static gint reproject_clicked(GtkWidget *widget, GdkEventButton *event, ControlC ctx->reproject_cur_image++; if ( ctx->reproject_cur_image == ctx->images->n_images ) ctx->reproject_cur_image = 0; - imagedisplay_clear_circles(ctx->reproject_id); + imagedisplay_clear_marks(ctx->reproject_id); reflectionlist_clear_markers(ctx->reflectionlist); reproject_mark_peaks(ctx); diff --git a/src/reproject.h b/src/reproject.h index 92e7183..39cd64d 100644 --- a/src/reproject.h +++ b/src/reproject.h @@ -20,6 +20,7 @@ #include "image.h" extern ImageFeatureList *reproject_get_reflections(ImageRecord image, size_t *n, ReflectionList *reflectionlist, ControlContext *ctx); +extern void reproject_partner_features(ImageFeatureList *flist, ImageRecord *image); extern void reproject_open(ControlContext *ctx); #endif /* REPROJECT_H */ |