aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/image.c1
-rw-r--r--src/image.h2
-rw-r--r--src/imagedisplay.c26
-rw-r--r--src/imagedisplay.h11
-rw-r--r--src/reproject.c60
-rw-r--r--src/reproject.h1
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 */