示例#1
0
void trace_flash (DNATrace *t) {
    int x0, i;
    Display *d = t->display;
    Window w = Tk_WindowId(t->tkwin);
    Pixmap tmp;

    if (!Tk_IsMapped(t->tkwin) || Tk_WindowId(t->tkwin) == 0)
	return;

    x0 = point_to_pixel(t, trace_get_pos(t, t->cursor_pos));

    tmp = Tk_GetPixmap(d, w, 24, t->pos[TRACEP_T].h, Tk_Depth(t->tkwin));
    XCopyArea(d, w, tmp, t->CursorGC,
	      x0-12, t->pos[TRACEP_T].y, 24, t->pos[TRACEP_T].h, 0, 0);

    for (i=12; i > 0; i-=3) {
	XCopyArea(d, tmp, w, t->CursorGC,
		  0, 0, 24, t->pos[TRACEP_T].h, x0-12, t->pos[TRACEP_T].y);

	XFillRectangle(d, w,
		       t->CursorGC,
		       x0 - i, t->pos[TRACEP_T].y,
		       i, t->pos[TRACEP_T].h);

	XSync(d, False);

	myusleep(20000);
    }
    XCopyArea(d, tmp, w, t->CursorGC,
	      0, 0, 24, t->pos[TRACEP_T].h, x0-12, t->pos[TRACEP_T].y);


    Tk_FreePixmap(d, tmp);
}
示例#2
0
/*
 * Draw the numbers from pixel coordinates (x,y) to (x+width, y+height).
 */
void trace_draw_numbers(DNATrace *t, Display *d, Pixmap p,
			int x0, int xn, int yoff, int height) {
    int ind, pos, x1, fh, i;
    float fwid, fw;
    char number[10];
    double xoff;

    if (!p)
	return;

    x1 = x0 + xn < t->read->NPoints ? x0+xn : t->read->NPoints - 1;
    x1 = t->tracePos[x1] + 1;
    if (x1 >= t->read->NBases) x1--;
    x1 = t->read->basePos[x1];

    fw = t->font_width/2 + 1;

    x0 -= 2*fw;
    if (x0 < 0) x0 = 0;
    ind = t->tracePos[x0];       /* Index of first base on screen */
    if (ind < 1) ind = 1;

    fwid = t->font_width;
    fh = t->fm.ascent + yoff;

    while (ind < t->read->NBases && (pos = t->read->basePos[ind-1]) <= x1) {
	int cind = t->comp ? t->read->NBases - ind + 1: ind;
	if (cind % 10 == 0) {
	    /* Base numbers are right aligned */
	    i = ABS(cind);
	    if (i >= 1000) {
		fw = fwid * 3.5;
	    } else if (i >= 100) {
		fw = fwid * 2.5;
	    } else if (i >= 10) {
		fw = fwid * 1.5;
	    } else {
		fw = fwid * .5;
	    }

	    /* Stick plots have A,C,G,T separated out, so move the number */
	    xoff = 0;
	    if (t->style == STYLE_STICK) {
		switch (t->read->base[ind-1]) {
		case 'A': case 'a': xoff = 0.00; break;
		case 'C': case 'c': xoff = 0.15; break;
		case 'G': case 'g': xoff = 0.30; break;
		case 'T': case 't': xoff = 0.45; break;
		}
	    }

	    sprintf(number, "%d", cind);
	    Tk_DrawChars(d, p, t->CursorGC, t->font, number, strlen(number),
			 point_to_pixel(t, pos + xoff) - fw, fh);
	}

	ind++;
    }
}
示例#3
0
/*
 * Draw the sequence from pixel coordinates (x,y) to (x+width, y+height).
 */
void trace_draw_sequence(DNATrace *t, Display *d, Pixmap p,
			 int x0, int xn, int yoff, int height) {
    int ind, pos, x1, fw, fh;

    if( !p || !t || !t->read || (t->read->NBases==0) )
	return;

    x1 = x0 + xn < t->read->NPoints ? x0+xn : t->read->NPoints - 1;
    x1 = t->tracePos[x1] + 1;
    if (x1 >= t->read->NBases) x1--;
    x1 = t->read->basePos[x1];
    ind = t->tracePos[x0];       /* Index of first base on screen */

    fw = t->font_width/2 + 1;
    fh = t->fm.ascent + yoff;

    while (ind < t->read->NBases && (pos = t->read->basePos[ind]) <= x1) {
	char base = t->read->base[ind];
	GC gc;
	double xoff = 0;

	switch (base) {
	case 'A':
	case 'a':
	    gc = t->Agc;
	    break;
	case 'C':
	case 'c':
	    gc = t->Cgc;
	    xoff = 0.15;
	    break;
	case 'G':
	case 'g':
	    gc = t->Ggc;
	    xoff = 0.3;
	    break;
	case 'T':
	case 't':
	    gc = t->Tgc;
	    xoff = 0.45;
	    break;
	default:
	    gc = t->CursorGC;
	}

	/* XDrawString(d, p, gc, point_to_pixel(t, pos) - fw, fh, &base, 1); */
	if (t->style != STYLE_STICK)
	    xoff = 0;
	pos = point_to_pixel(t, (double)pos + xoff) - fw;
	Tk_DrawChars(d, p, gc, t->font, &base, 1, pos, fh);

	ind++;
    }
}
示例#4
0
void trace_update_extents(DNATrace *t, int *x0p, int *xnp) {
    int ind, pos, x1, fw, cfw, new_x1;
    int min =  999999;
    int max = -999999;
    int x0 = *x0p, xn = *xnp;
    int new_x0, new_xn;
    
    if (t->Ned <= 0)
	return;

    if (x0 < 0) x0 = 0;
    if (x0 >= t->read->NPoints) x0 = t->read->NPoints-1;
    x1 = x0 + xn < t->read->NPoints ? x0+xn : t->read->NPoints - 1;
    x1 = t->tracePos[x1] + 1;
    if (x1 >= t->read->NBases) x1--;
    x1 = t->read->basePos[x1];
    ind = t->tracePosE[x0];       /* Index of first base on screen */

    fw = t->font_width/2 + 1;
    cfw = t->conf_font_width;

    while (ind < t->read->NBases && (pos = trace_get_pos(t, ind)) <= x1) {
	pos = point_to_pixel(t, pos) - fw;
	if (pos < min)
	    min = pos;
	if (pos + cfw > max)
	    max = pos + cfw;
	ind++;
    }

    new_x0 = (int)pixel_to_point(t, min-cfw/2-1);
    new_xn = (int)pixel_to_point(t, max+cfw/2+1) - new_x0;

    x1 = x0 + xn;
    new_x1 = new_x0 + new_xn;
    x0 = MIN(x0, new_x0);
    x1 = MAX(x1, new_x1);
    xn = x1 - x0;

    if (x0 < 0) {
	xn += x0;
	x0 = 0;
    }
    if (x0 + xn > t->read->NPoints)
	xn = t->read->NPoints - x0;

    *x0p = x0;
    *xnp = xn;
}
示例#5
0
void gui_theme::ui_float::compute(const float& size) {
	switch(type) {
		case VALUE_TYPE::PIXEL:
			// just clamp to size
			value = std::min(ui_value, size);
			break;
		case VALUE_TYPE::PERCENTAGE:
			// scale by size
			value = ui_value * size;
			break;
		case VALUE_TYPE::POINT:
			// convert point to pixel (-> multiply by dpi / 72)
			value = point_to_pixel(ui_value);
			break;
		case VALUE_TYPE::CENTER:
			// scale by size
			value = 0.5f * size;
			break;
	}
}
示例#6
0
文件: track.c 项目: yosefm/openptv
/* asses_new_position() determines the nearest target on each camera around a 
 * search position and prepares the data structures accordingly with the 
 * determined target info or the unused flag value.
 * 
 * Arguments:
 * vec3d pos - the position around which to search.
 * vec2d targ_pos[] - the determined targets' respective positions.
 * int cand_inds[][MAX_CANDS] - output buffer, the determined targets' index in
 *    the respective camera's target list
 * frame *frm - the frame holdin target data for the search position.
 * tracking_run *run - scene information struct.
 * 
 * Returns:
 * the number of cameras where a suitable target was found.
 */
int assess_new_position(vec3d pos, vec2d targ_pos[], 
    int cand_inds[][MAX_CANDS], frame *frm, tracking_run *run) 
{
    int cam, num_cands, valid_cams, _ix;
    vec2d pixel;
    double right, left, down, up; /* search rectangle limits */
    
    left = right = up = down = ADD_PART;
    for (cam = 0; cam < run->cpar->num_cams; cam++) {
        point_to_pixel(pixel, pos, run->cal[cam], run->cpar);
        targ_pos[cam][0] = targ_pos[cam][1] = COORD_UNUSED;
        
        /* here we shall use only the 1st neigbhour */
        num_cands = candsearch_in_pix (frm->targets[cam], frm->num_targets[cam],
            pixel[0], pixel[1], left, right, up, down, 
            cand_inds[cam], run->cpar);

        if (num_cands > 0) {
            _ix = cand_inds[cam][0];  // first nearest neighbour
            targ_pos[cam][0] = frm->targets[cam][_ix].x;
            targ_pos[cam][1] = frm->targets[cam][_ix].y;
        }
    }

    valid_cams = 0;
    for (cam = 0; cam < run->cpar->num_cams; cam++) {
        if ((targ_pos[cam][0] != COORD_UNUSED) && \
            (targ_pos[cam][1] != COORD_UNUSED)) 
        {
            pixel_to_metric(&(targ_pos[cam][0]), &(targ_pos[cam][1]), 
                targ_pos[cam][0], targ_pos[cam][1], run->cpar);
            dist_to_flat(targ_pos[cam][0], targ_pos[cam][1], run->cal[cam], 
                &(targ_pos[cam][0]), &(targ_pos[cam][1]), run->flatten_tol);
            valid_cams++;
        }
    }
    return valid_cams;
}
示例#7
0
void trace_draw_confidence(DNATrace *t, Display *d, Pixmap p,
			   int x0, int xn, int height) {
    int ind, pos, x1, fw, cfw, cfh;
    char b[5];

    if (!p || t->Ned <= 0)
	return;

    x1 = x0 + xn < t->read->NPoints ? x0+xn : t->read->NPoints - 1;
    x1 = t->tracePos[x1] + 1;
    if (x1 >= t->read->NBases) x1--;
    x1 = t->read->basePos[x1];
    ind = t->tracePosE[x0];       /* Index of first base on screen */

    fw = t->font_width/2 + 1;
    cfh = t->conf_font_height;
    cfw = t->conf_font_width;

    while (ind < t->read->NBases && (pos = trace_get_pos(t, ind)) <= x1) {
	int conf;

	conf = t->edConf[ind];
	if (conf < 100)
	    sprintf(b, "%02d", conf);
	else
	    strcpy(b, "XX");

	pos = point_to_pixel(t, pos) - fw;
	XFillRectangle(d, p, t->ConfGC, pos, cfh,
		       cfw, (int)(conf * t->scale_conf));

	Tk_DrawChars(d, p, t->ConfGC, t->conf_font, b, 2,
		     pos, cfh);
	ind++;
    }
}
示例#8
0
文件: track.c 项目: yosefm/openptv
/*     track backwards */
double trackback_c (tracking_run *run_info, int step)
{
    int i, j, h, in_volume = 0;
    int philf[4][MAX_CANDS];
    int count1 = 0, count2 = 0, num_added = 0;
    int quali = 0;
    double angle, acc, dl;
    vec3d diff_pos, X[6];     /* 6 reference points used in the algorithm */
    vec2d n[4], v2[4];     // replaces xn,yn, x2[4], y2[4],
    double rr, Ymin = 0, Ymax = 0;
    double npart = 0, nlinks = 0;
    foundpix *w;

    sequence_par *seq_par;
    track_par *tpar;
    volume_par *vpar;
    control_par *cpar;
    framebuf *fb;
    Calibration **cal;

    /* Shortcuts to inside current frame */
    P *curr_path_inf, *ref_path_inf;

    /* shortcuts */
    cal = run_info->cal;
    seq_par = run_info->seq_par;
    tpar = run_info->tpar;
    vpar = run_info->vpar;
    cpar = run_info->cpar;

    fb = run_info->fb;

    /* Prime the buffer with first frames */
    for (step = seq_par->last; step > seq_par->last - 4; step--) {
        fb_read_frame_at_end(fb, step, 1);
        fb_next(fb);
    }
    fb_prev(fb);

    /* sequence loop */
    for (step = seq_par->last - 1; step > seq_par->first; step--) {
        printf ("Time step: %d, seqnr: %d:\n",
                step - seq_par->first, step);

        for (h = 0; h < fb->buf[1]->num_parts; h++) {
            curr_path_inf = &(fb->buf[1]->path_info[h]);

            /* We try to find link only if the forward search failed to. */
            if ((curr_path_inf->next < 0) || (curr_path_inf->prev != -1)) continue;

            for (j = 0; j < 6; j++) vec_init(X[j]);
            curr_path_inf->inlist = 0;

            /* 3D-position of current particle */
            vec_copy(X[1], curr_path_inf->x);

            /* use information from previous to locate new search position
               and to calculate values for search area */
            ref_path_inf = &(fb->buf[0]->path_info[curr_path_inf->next]);
            vec_copy(X[0], ref_path_inf->x);
            search_volume_center_moving(ref_path_inf->x, curr_path_inf->x, X[2]);
            
            for (j = 0; j < fb->num_cams; j++) {
                point_to_pixel (n[j], X[2], cal[j], cpar);
            }
            
            /* calculate searchquader and reprojection in image space */
            w = sorted_candidates_in_volume(X[2], n, fb->buf[2], run_info);
            
            if (w != NULL) {
                count2++;

                i = 0;
                while (w[i].ftnr != TR_UNUSED) {
                    ref_path_inf = &(fb->buf[2]->path_info[w[i].ftnr]);
                    vec_copy(X[3], ref_path_inf->x);

                    vec_subt(X[1], X[3], diff_pos);
                    if (pos3d_in_bounds(diff_pos, tpar)) {
                        angle_acc(X[1], X[2], X[3], &angle, &acc);

                        /* *********************check link *****************************/
                        if ((acc < tpar->dacc && angle < tpar->dangle) || \
                            (acc < tpar->dacc/10))
                        {
                            dl = (vec_diff_norm(X[1], X[3]) +
                                  vec_diff_norm(X[0], X[1]) )/2;
                            quali = w[i].freq;
                            rr = (dl/run_info->lmax + acc/tpar->dacc + \
                                angle/tpar->dangle)/quali;
                            register_link_candidate(curr_path_inf, rr, w[i].ftnr);
                        }
                    }
                    i++;
                }
            }

            free(w);

            /* if old wasn't found try to create new particle position from rest */
            if (tpar->add) {
                if ( curr_path_inf->inlist == 0) {
                    quali = assess_new_position(X[2], v2, philf, fb->buf[2], run_info);
                    if (quali>=2) {
                        //vec_copy(X[3], X[2]);
                        in_volume = 0;

                        point_position(v2, fb->num_cams, cpar->mm, cal, X[3]);

                        /* volume check */
                        if ( vpar->X_lay[0] < X[3][0] && X[3][0] < vpar->X_lay[1] &&
                             Ymin < X[3][1] && X[3][1] < Ymax &&
                             vpar->Zmin_lay[0] < X[3][2] && X[3][2] < vpar->Zmax_lay[1])
                        {in_volume = 1;}

                        vec_subt(X[1], X[3], diff_pos);
                        if (in_volume == 1 && pos3d_in_bounds(diff_pos, tpar)) {
                            angle_acc(X[1], X[2], X[3], &angle, &acc);

                            if ( (acc<tpar->dacc && angle<tpar->dangle) || \
                                 (acc<tpar->dacc/10) )
                            {
                                dl = (vec_diff_norm(X[1], X[3]) +
                                      vec_diff_norm(X[0], X[1]) )/2;
                                rr = (dl/run_info->lmax+acc/tpar->dacc + angle/tpar->dangle)/(quali);
                                register_link_candidate(curr_path_inf, rr, fb->buf[2]->num_parts);

                                add_particle(fb->buf[2], X[3], philf);
                            }
                        }
                        in_volume = 0;
                    }
                }
            }             /* end of if old wasn't found try to create new particle position from rest */
        }         /* end of h-loop */

        for (h = 0; h < fb->buf[1]->num_parts; h++) {
            curr_path_inf = &(fb->buf[1]->path_info[h]);

            if(curr_path_inf->inlist > 0 ) {
                sort(curr_path_inf->inlist, (float *)curr_path_inf->decis,
                     curr_path_inf->linkdecis);
            }
        }

        /* create links with decision check */
        count1 = 0; num_added = 0;
        for (h = 0; h < fb->buf[1]->num_parts; h++) {
            curr_path_inf = &(fb->buf[1]->path_info[h]);

            if (curr_path_inf->inlist > 0 ) {
                /* if old/new and unused prev == -1 and next == -2 link is created */
                ref_path_inf = &(fb->buf[2]->path_info[curr_path_inf->linkdecis[0]]);

                if ( ref_path_inf->prev == PREV_NONE && \
                     ref_path_inf->next == NEXT_NONE )
                {
                    curr_path_inf->finaldecis = curr_path_inf->decis[0];
                    curr_path_inf->prev = curr_path_inf->linkdecis[0];
                    fb->buf[2]->path_info[curr_path_inf->prev].next = h;
                    num_added++;
                }

                /* old which link to prev has to be checked */
                if ((ref_path_inf->prev != PREV_NONE) && \
                    (ref_path_inf->next == NEXT_NONE) )
                {
                    vec_copy(X[0], fb->buf[0]->path_info[curr_path_inf->next].x);
                    vec_copy(X[1], curr_path_inf->x);
                    vec_copy(X[3], ref_path_inf->x);
                    vec_copy(X[4], fb->buf[3]->path_info[ref_path_inf->prev].x);
                    for (j = 0; j < 3; j++)
                        X[5][j] = 0.5*(5.0*X[3][j] - 4.0*X[1][j] + X[0][j]);

                    angle_acc(X[3], X[4], X[5], &angle, &acc);

                    if ( (acc<tpar->dacc && angle<tpar->dangle) ||  (acc<tpar->dacc/10) ) {
                        curr_path_inf->finaldecis = curr_path_inf->decis[0];
                        curr_path_inf->prev = curr_path_inf->linkdecis[0];
                        fb->buf[2]->path_info[curr_path_inf->prev].next = h;
                        num_added++;
                    }
                }
            }

            if (curr_path_inf->prev != PREV_NONE ) count1++;
        }         /* end of creation of links with decision check */

        printf ("step: %d, curr: %d, next: %d, links: %d, lost: %d, add: %d",
                step, fb->buf[1]->num_parts, fb->buf[2]->num_parts, count1,
                fb->buf[1]->num_parts - count1, num_added);

        /* for the average of particles and links */
        npart = npart + fb->buf[1]->num_parts;
        nlinks = nlinks + count1;

        fb_next(fb);
        fb_write_frame_from_start(fb, step);
        if(step > seq_par->first + 2) { fb_read_frame_at_end(fb, step - 3, 1); }
    }     /* end of sequence loop */

    /* average of all steps */
    npart /= (seq_par->last - seq_par->first - 1);
    nlinks /= (seq_par->last - seq_par->first - 1);

    printf ("Average over sequence, particles: %5.1f, links: %5.1f, lost: %5.1f\n",
            npart, nlinks, npart-nlinks);

    fb_next(fb);
    fb_write_frame_from_start(fb, step);

    fb_free(fb);
    free(fb);
    free(tpar);

    return nlinks;
}
示例#9
0
文件: track.c 项目: yosefm/openptv
/* trackcorr_c_loop is the main tracking subroutine that scans the 3D particle position
 * data from rt_is.* files and the 2D particle positions in image space in _targets and
 * constructs trajectories (links) of the particles in 3D in time.
 * the basic concepts of the tracking procedure are from the following publication by
 * Jochen Willneff: "A New Spatio-Temporal Matching Algorithm For 3D-Particle Tracking Velocimetry"
 * https://www.mendeley.com/catalog/new-spatiotemporal-matching-algorithm-3dparticle-tracking-velocimetry/
 * or http://e-collection.library.ethz.ch/view/eth:26978
 * this method is an extension of the previously used tracking method described in details in
 * Malik et al. 1993: "Particle tracking velocimetry in three-dimensional flows: Particle tracking"
 * http://mnd.ly/2dCt3um
 *
 * Arguments:
 * tracking_run *run_info pointer to the (sliding) frame dataset of 4 frames of particle positions
 * and all the needed parameters underneath: control, volume, etc.
 * integer step number or the frame number from the sequence
 * Note: step is not really setting up the step to track, the buffer provided to the trackcoor_c_loop
 * is already preset by 4 frames buf[0] to buf[3] and we track particles in buf[1], i.e. one "previous"
 * one present and two future frames.
 * 
 * Returns: function does not return an argument, the tracks are updated within the run_info dataset
 */
void trackcorr_c_loop (tracking_run *run_info, int step) {
    /* sequence loop */
    int j, h, mm, kk, in_volume = 0;
    int philf[4][MAX_CANDS];
    int count1 = 0, count2 = 0, count3 = 0, num_added = 0;
    int quali = 0;
    vec3d diff_pos, X[6];     /* 7 reference points used in the algorithm, TODO: check if can reuse some */
    double angle, acc, angle0, acc0,  dl;
    double angle1, acc1;
    vec2d v1[4], v2[4]; /* volume center projection on cameras */ 
    double rr;


    /* Shortcuts to inside current frame */
    P *curr_path_inf, *ref_path_inf;
    corres *curr_corres;
    target **curr_targets;
    int _ix;     /* For use in any of the complex index expressions below */
    int orig_parts; /* avoid infinite loop with particle addition set */

    /* Shortcuts into the tracking_run struct */ 
    Calibration **cal;
    framebuf *fb;
    track_par *tpar;
    volume_par *vpar;
    control_par *cpar;

    foundpix *w, *wn; 
    count1 = 0; num_added = 0;

    fb = run_info->fb;
    cal = run_info->cal;
    tpar = run_info->tpar;
    vpar = run_info->vpar;
    cpar = run_info->cpar;
    curr_targets = fb->buf[1]->targets;

    /* try to track correspondences from previous 0 - corp, variable h */
    orig_parts = fb->buf[1]->num_parts;
    for (h = 0; h < orig_parts; h++) {
        for (j = 0; j < 6; j++) vec_init(X[j]);

        curr_path_inf = &(fb->buf[1]->path_info[h]);
        curr_corres = &(fb->buf[1]->correspond[h]);

        curr_path_inf->inlist = 0;

        /* 3D-position */
        vec_copy(X[1], curr_path_inf->x);

        /* use information from previous to locate new search position
           and to calculate values for search area */
        if (curr_path_inf->prev >= 0) {
            ref_path_inf = &(fb->buf[0]->path_info[curr_path_inf->prev]);
            vec_copy(X[0], ref_path_inf->x);
            search_volume_center_moving(ref_path_inf->x, curr_path_inf->x, X[2]);

            for (j = 0; j < fb->num_cams; j++) {
                point_to_pixel (v1[j], X[2], cal[j], cpar);
            }
        } else {
            vec_copy(X[2], X[1]);
            for (j = 0; j < fb->num_cams; j++) {
                if (curr_corres->p[j] == -1) {
                    point_to_pixel (v1[j], X[2], cal[j], cpar);
                } else {
                    _ix = curr_corres->p[j];
                    v1[j][0] = curr_targets[j][_ix].x;
                    v1[j][1] = curr_targets[j][_ix].y;
                }
            }

        }

        /* calculate search cuboid and reproject it to the image space */
        w = sorted_candidates_in_volume(X[2], v1, fb->buf[2], run_info);
        if (w == NULL) continue;

        /* Continue to find candidates for the candidates. */
        count2++;
        mm = 0;
        while (w[mm].ftnr != TR_UNUSED) {       /* counter1-loop */
            /* search for found corr of current the corr in next
               with predicted location */

            /* found 3D-position */
            ref_path_inf = &(fb->buf[2]->path_info[w[mm].ftnr]);
            vec_copy(X[3], ref_path_inf->x);

            if (curr_path_inf->prev >= 0) {
                for (j = 0; j < 3; j++)
                    X[5][j] = 0.5*(5.0*X[3][j] - 4.0*X[1][j] + X[0][j]);
            } else {
                search_volume_center_moving(X[1], X[3], X[5]);
            }

            for (j = 0; j < fb->num_cams; j++) {
                point_to_pixel (v1[j], X[5], cal[j], cpar);
            }

            /* end of search in pix */
            wn = sorted_candidates_in_volume(X[5], v1, fb->buf[3], run_info);
            if (wn != NULL) {
                count3++;
                kk = 0;
                while (wn[kk].ftnr != TR_UNUSED) {
                    ref_path_inf = &(fb->buf[3]->path_info[wn[kk].ftnr]);
                    vec_copy(X[4], ref_path_inf->x);

                    vec_subt(X[4], X[3], diff_pos);
                    if ( pos3d_in_bounds(diff_pos, tpar)) {
                        angle_acc(X[3], X[4], X[5], &angle1, &acc1);
                        if (curr_path_inf->prev >= 0) {
                            angle_acc(X[1], X[2], X[3], &angle0, &acc0);
                        } else {
                            acc0 = acc1; angle0 = angle1;
                        }

                        acc = (acc0+acc1)/2; angle = (angle0+angle1)/2;
                        quali = wn[kk].freq+w[mm].freq;

                        if ((acc < tpar->dacc && angle < tpar->dangle) || \
                            (acc < tpar->dacc/10))
                        {
                            dl = (vec_diff_norm(X[1], X[3]) +
                                vec_diff_norm(X[4], X[3]) )/2;
                            rr = (dl/run_info->lmax + acc/tpar->dacc + \
                                angle/tpar->dangle)/(quali);
                            register_link_candidate(
                                curr_path_inf, rr, w[mm].ftnr);
                        }
                    }
                    kk++;
                } /* End of searching 2nd-frame candidates. */
            }             

            /* creating new particle position,
             *  reset img coord because of num_cams < 4
             *  fix distance of 3 pixels to define xl,xr,yu,yd instead of searchquader
             *  and search for unused candidates in next time step
             */
            quali = assess_new_position(X[5], v2, philf, fb->buf[3], run_info); 
                        
            /* quali >=2 means at least in two cameras
             * we found a candidate
             */
            if ( quali >= 2) {
                in_volume = 0;                 //inside volume

                dl = point_position(v2, cpar->num_cams, cpar->mm, cal, X[4]);

                /* volume check */
                if ( vpar->X_lay[0] < X[4][0] && X[4][0] < vpar->X_lay[1] &&
                     run_info->ymin < X[4][1] && X[4][1] < run_info->ymax &&
                     vpar->Zmin_lay[0] < X[4][2] && X[4][2] < vpar->Zmax_lay[1])
                {
                    in_volume = 1;
                }

                vec_subt(X[3], X[4], diff_pos);
                if ( in_volume == 1 && pos3d_in_bounds(diff_pos, tpar) ) {
                    angle_acc(X[3], X[4], X[5], &angle, &acc);

                    if ((acc < tpar->dacc && angle < tpar->dangle) || \
                        (acc < tpar->dacc/10))
                    {
                        dl = (vec_diff_norm(X[1], X[3]) +
                              vec_diff_norm(X[4], X[3]) )/2;
                        rr = (dl/run_info->lmax + acc/tpar->dacc + angle/tpar->dangle) /
                             (quali+w[mm].freq);
                        register_link_candidate(curr_path_inf, rr, w[mm].ftnr);

                        if (tpar->add) {
                            add_particle(fb->buf[3], X[4], philf);
                            num_added++;
                        }
                    }
                }
                in_volume = 0;
            }
            quali = 0;

            /* end of creating new particle position */
            /* *************************************************************** */

            /* try to link if kk is not found/good enough and prev exist */
            if ( curr_path_inf->inlist == 0 && curr_path_inf->prev >= 0 ) {
                vec_subt(X[3], X[1], diff_pos);

                if (pos3d_in_bounds(diff_pos, tpar)) {
                    angle_acc(X[1], X[2], X[3], &angle, &acc);

                    if ( (acc < tpar->dacc && angle < tpar->dangle) || \
                         (acc < tpar->dacc/10) )
                    {
                        quali = w[mm].freq;
                        dl = (vec_diff_norm(X[1], X[3]) +
                              vec_diff_norm(X[0], X[1]) )/2;
                        rr = (dl/run_info->lmax + acc/tpar->dacc + angle/tpar->dangle)/(quali);
                        register_link_candidate(curr_path_inf, rr, w[mm].ftnr);
                    }
                }
            }

            free(wn);
            mm++;
        } /* end of loop over first-frame candidates. */

        /* begin of inlist still zero */
        if (tpar->add) {
            if ( curr_path_inf->inlist == 0 && curr_path_inf->prev >= 0 ) {
                quali = assess_new_position(X[2], v2, philf, fb->buf[2], run_info);

                if (quali>=2) {
                    vec_copy(X[3], X[2]);
                    in_volume = 0;

                    dl = point_position(v2, fb->num_cams, cpar->mm, cal, X[3]);

                    /* in volume check */
                    if ( vpar->X_lay[0] < X[3][0] && X[3][0] < vpar->X_lay[1] &&
                         run_info->ymin < X[3][1] && X[3][1] < run_info->ymax &&
                         vpar->Zmin_lay[0] < X[3][2] &&
                         X[3][2] < vpar->Zmax_lay[1])
                    {
                        in_volume = 1;
                    }

                    vec_subt(X[2], X[3], diff_pos);
                    if ( in_volume == 1 && pos3d_in_bounds(diff_pos, tpar) ) {
                        angle_acc(X[1], X[2], X[3], &angle, &acc);

                        if ( (acc < tpar->dacc && angle < tpar->dangle) || \
                             (acc < tpar->dacc/10) )
                        {
                            dl = (vec_diff_norm(X[1], X[3]) +
                                  vec_diff_norm(X[0], X[1]) )/2;
                            rr = (dl/run_info->lmax + acc/tpar->dacc + angle/tpar->dangle)/(quali);
                            register_link_candidate(curr_path_inf, rr, fb->buf[2]->num_parts);

                            add_particle(fb->buf[2], X[3], philf);
                            num_added++;
                        }
                    }
                    in_volume = 0;
                }                 // if quali >= 2
            }
        }
        /* end of inlist still zero */
        /***********************************/

        free(w);
    }     /* end of h-loop */

    /* sort decis and give preliminary "finaldecis"  */
    for (h = 0; h < fb->buf[1]->num_parts; h++) {
        curr_path_inf = &(fb->buf[1]->path_info[h]);

        if(curr_path_inf->inlist > 0 ) {
            sort(curr_path_inf->inlist, (float *) curr_path_inf->decis,
                 curr_path_inf->linkdecis);
            curr_path_inf->finaldecis = curr_path_inf->decis[0];
            curr_path_inf->next = curr_path_inf->linkdecis[0];
        }
    }

    /* create links with decision check */
    for (h = 0; h < fb->buf[1]->num_parts; h++) {
        curr_path_inf = &(fb->buf[1]->path_info[h]);

        if(curr_path_inf->inlist > 0 ) {
            ref_path_inf = &(fb->buf[2]->path_info[curr_path_inf->next]);

            if (ref_path_inf->prev == PREV_NONE) {
                /* best choice wasn't used yet, so link is created */
                ref_path_inf->prev = h;
            } else {
                /* best choice was already used by mega[2][mega[1][h].next].prev */
                /* check which is the better choice */
                if ( fb->buf[1]->path_info[ref_path_inf->prev].finaldecis > \
                     curr_path_inf->finaldecis)
                {
                    /* remove link with prev */
                    fb->buf[1]->path_info[ref_path_inf->prev].next = NEXT_NONE;
                    ref_path_inf->prev = h;
                } else {
                    curr_path_inf->next = NEXT_NONE;
                }
            }
        }
        if (curr_path_inf->next != NEXT_NONE ) count1++;
    }
    /* end of creation of links with decision check */

    printf ("step: %d, curr: %d, next: %d, links: %d, lost: %d, add: %d\n",
            step, fb->buf[1]->num_parts, fb->buf[2]->num_parts, count1,
            fb->buf[1]->num_parts - count1, num_added);

    /* for the average of particles and links */
    run_info->npart = run_info->npart + fb->buf[1]->num_parts;
    run_info->nlinks = run_info->nlinks + count1;

    fb_next(fb);
    fb_write_frame_from_start(fb, step);
    if(step < run_info->seq_par->last - 2) {
        fb_read_frame_at_end(fb, step + 3, 0);
    }
} /* end of sequence loop */
示例#10
0
文件: track.c 项目: yosefm/openptv
/* searchquader defines the search region, using tracking parameters
 * dvxmin, ... dvzmax (but within the image boundaries), per camera
 * Its primary objective is to provide a safe search region in each camera
 * to the following candidate search in pixels (candsearch_in_pix).
 * We project a position of a center of search from 3D to the image space (pixels)
 * and project also 8 corners in 3D of a cuboid on the image space
 * The searchquader returns the distances from the center of search to the
 * left, right, up and down, in any case not crossing the image size limits
 * (0,0) and (cpar->imx, cpar->imy). If the point is on the border, the search
 * region is only in the allowed directions.
 * Arguments:
 * vec3d point position in physical space
 * track_par *tpar set of tracking parameters
 * control_par *cpar set of control parameters for the num_cams
 * Calibration *cal calibration per camera to find a projection of a 3D vertex
 * of a cuboid in the image space.
 * Returns the arrays xr,xl,yd,yu (right, left, down, up) per camera
 * for the search of a quader (cuboid), given in pixel distances, relative to the
 * point of search.
 */
void searchquader(vec3d point, double xr[4], double xl[4], double yd[4], \
                  double yu[4], track_par *tpar, control_par *cpar, Calibration **cal){
    int i, pt, dim;
    vec3d mins, maxes;
    vec2d corner, center;
    vec3d quader[8];



    vec_set(mins, tpar->dvxmin, tpar->dvymin, tpar->dvzmin);
    vec_set(maxes, tpar->dvxmax, tpar->dvymax, tpar->dvzmax);

    /* 3D positions of search volume - eight corners of a box */
    for (pt = 0; pt < 8; pt++) {
        vec_copy(quader[pt], point);
        for (dim = 0; dim < 3; dim++) {
            if (pt & 1<<dim) {
                quader[pt][dim] += maxes[dim];
            } else {
                quader[pt][dim] += mins[dim];
            }
        }
    }


    /* calculation of search area in each camera */
    for (i = 0; i < cpar->num_cams; i++) {

        /* initially large or small values */
        xr[i] = 0;
        xl[i] = cpar->imx;
        yd[i] = 0;
        yu[i] = cpar->imy;

        /* pixel position of a search center */
        point_to_pixel (center, point, cal[i], cpar);

        /* mark 4 corners of the search region in pixels */
        for (pt = 0; pt < 8; pt++) {
            point_to_pixel (corner, quader[pt], cal[i], cpar);

            if (corner[0] < xl[i] ) xl[i] = corner[0];
            if (corner[1] < yu[i] ) yu[i] = corner[1];
            if (corner[0] > xr[i] ) xr[i] = corner[0];
            if (corner[1] > yd[i] ) yd[i] = corner[1];
        }

        if (xl[i] < 0 ) xl[i] = 0;
        if (yu[i] < 0 ) yu[i] = 0;
        if (xr[i] > cpar->imx)
            xr[i] = cpar->imx;
        if (yd[i] > cpar->imy)
            yd[i] = cpar->imy;

        /* eventually xr,xl,yd,yu are pixel distances relative to the point */
        xr[i] = xr[i]     - center[0];
        xl[i] = center[0] - xl[i];
        yd[i] = yd[i]     - center[1];
        yu[i] = center[1] - yu[i];
    }
}
示例#11
0
文件: font.c 项目: bilboed/wine
/*******************************************************************************
 * GdipCreateFont [GDIPLUS.@]
 *
 * Create a new font based off of a FontFamily
 *
 * PARAMS
 *  *fontFamily     [I] Family to base the font off of
 *  emSize          [I] Size of the font
 *  style           [I] Bitwise OR of FontStyle enumeration
 *  unit            [I] Unit emSize is measured in
 *  **font          [I] the resulting Font object
 *
 * RETURNS
 *  SUCCESS: Ok
 *  FAILURE: InvalidParameter if fontfamily or font is NULL.
 *  FAILURE: FontFamilyNotFound if an invalid FontFamily is given
 *
 * NOTES
 *  UnitDisplay is unsupported.
 *  emSize is stored separately from lfHeight, to hold the fraction.
 */
GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily,
                        REAL emSize, INT style, Unit unit, GpFont **font)
{
    WCHAR facename[LF_FACESIZE];
    LOGFONTW* lfw;
    const NEWTEXTMETRICW* tmw;
    GpStatus stat;

    if (!fontFamily || !font)
        return InvalidParameter;

    TRACE("%p (%s), %f, %d, %d, %p\n", fontFamily,
            debugstr_w(fontFamily->FamilyName), emSize, style, unit, font);

    stat = GdipGetFamilyName (fontFamily, facename, 0);
    if (stat != Ok) return stat;
    *font = GdipAlloc(sizeof(GpFont));

    tmw = &fontFamily->tmw;
    lfw = &((*font)->lfw);
    ZeroMemory(&(*lfw), sizeof(*lfw));

    lfw->lfWeight = tmw->tmWeight;
    lfw->lfItalic = tmw->tmItalic;
    lfw->lfUnderline = tmw->tmUnderlined;
    lfw->lfStrikeOut = tmw->tmStruckOut;
    lfw->lfCharSet = tmw->tmCharSet;
    lfw->lfPitchAndFamily = tmw->tmPitchAndFamily;
    lstrcpynW(lfw->lfFaceName, facename, LF_FACESIZE);

    switch (unit)
    {
        case UnitWorld:
            /* FIXME: Figure out when World != Pixel */
            lfw->lfHeight = emSize; break;
        case UnitDisplay:
            FIXME("Unknown behavior for UnitDisplay! Please report!\n");
            /* FIXME: Figure out how this works...
             * MSDN says that if "DISPLAY" is a monitor, then pixel should be
             * used. That's not what I got. Tests on Windows revealed no output,
             * and the tests in tests/font crash windows */
            lfw->lfHeight = 0; break;
        case UnitPixel:
            lfw->lfHeight = emSize; break;
        case UnitPoint:
            lfw->lfHeight = point_to_pixel(emSize); break;
        case UnitInch:
            lfw->lfHeight = inch_to_pixel(emSize); break;
        case UnitDocument:
            lfw->lfHeight = document_to_pixel(emSize); break;
        case UnitMillimeter:
            lfw->lfHeight = mm_to_pixel(emSize); break;
    }

    lfw->lfHeight *= -1;

    lfw->lfWeight = style & FontStyleBold ? 700 : 400;
    lfw->lfItalic = style & FontStyleItalic;
    lfw->lfUnderline = style & FontStyleUnderline;
    lfw->lfStrikeOut = style & FontStyleStrikeout;

    (*font)->unit = unit;
    (*font)->emSize = emSize;
    (*font)->height = tmw->ntmSizeEM;
    (*font)->line_spacing = tmw->tmAscent + tmw->tmDescent + tmw->tmExternalLeading;

    TRACE("<-- %p\n", *font);

    return Ok;
}
示例#12
0
/*
 * Draw the edited seq. from pixel coordinates (x,y) to (x+width, y+height).
 */
void trace_draw_edits(DNATrace *t, Display *d, Pixmap p,
		      int x0, int xn, int yoff, int height) {
    int ind, pos, x1, fw, fh;

    if( !p || !t || !t->read || (t->read->NBases==0) )
	return;

    x0 -= 4;
    if (x0 < 0) x0 = 0;
    xn += 8;
    x1 = x0 + xn < t->read->NPoints ? x0+xn : t->read->NPoints - 1;
    x1 = t->tracePos[x1] + 1;
    if (x1 >= t->read->NBases) x1--;
    x1 = t->read->basePos[x1];
    ind = t->tracePosE[x0];       /* Index of first base on screen */

    fw = t->font_width/2 + 1;
    fh = t->fm.ascent + yoff;

    while (ind < t->Ned && (pos = trace_get_pos(t, ind)) <= x1) {
	char base;
	GC gc;

	base = t->edBases[ind];

	switch (base) {
	case 'A':
	case 'a':
	    gc = t->Agc;
	    break;
	case 'C':
	case 'c':
	    gc = t->Cgc;
	    break;
	case 'G':
	case 'g':
	    gc = t->Ggc;
	    break;
	case 'T':
	case 't':
	    gc = t->Tgc;
	    break;
	default:
	    gc = t->CursorGC;
	}

	/* XDrawString(d, p, gc, point_to_pixel(t, pos) - fw, fh, &base, 1); */
	Tk_DrawChars(d, p, gc, t->font, &base, 1,
		     point_to_pixel(t, pos) - fw, fh);
	ind++;
    }

    /* Cursor */
    if (t->cursor_pos > 0)
	pos = trace_get_pos(t, t->cursor_pos-1);
    else
	pos = 0;

    XFillRectangle(d, p, t->CursorGC, point_to_pixel(t, pos)+4,
		   t->fm.linespace-3, 8, 3);
}
示例#13
0
/*
 * Draw a trace from pixel coordinates (x0,0) to (x0+xn, height).
 */
void trace_draw_trace(DNATrace *t, Display *d, Pixmap p,
		      int x0, int xn, int yoff, int height) {
    double yscale;
    int m = t->read->maxTraceVal;

    if (x0 < 0) {
	xn += x0;
	x0 = 0;

	if (xn <= 0)
	    return;
    }

    if (x0 + xn > t->read->NPoints)
	xn = t->read->NPoints - x0;

    trace_update_extents(t, &x0, &xn);
    if (xn <= 0)
	return;

    if (t->show_conf) {
	if (t->style == STYLE_STICK)
	    trace_draw_confidence4(t, d, p, x0, xn, height);
	else
	    trace_draw_confidence(t, d, p, x0, xn, height);
    }

    if (t->read->traceA == 0 || p == 0)
	return;

    if (t->read->maxTraceVal) {
	int c = (t->show_conf && t->style == STYLE_STICK) ? 20 : 0;
	yscale = (double)(t->scale_y * (height-1-c)) /
	    (double)(t->trace_scale ? t->trace_scale : t->read->maxTraceVal);
    } else {
	yscale = 0;
    }

    switch (t->style) {
    case STYLE_CHROMA:
	trace_draw2(t, &t->read->traceA[x0], d, p, m,
		    t->Agc, x0, xn, yoff, height, yscale,
		    t->read->baseline, 1);
	trace_draw2(t, &t->read->traceC[x0], d, p, m,
		    t->Cgc, x0, xn, yoff, height, yscale,
		    t->read->baseline, 1);
	trace_draw2(t, &t->read->traceG[x0], d, p, m,
		    t->Ggc, x0, xn, yoff, height, yscale,
		    t->read->baseline, 1);
	trace_draw2(t, &t->read->traceT[x0], d, p, m,
		    t->Tgc, x0, xn, yoff, height, yscale,
		    t->read->baseline, 1);
	break;
#if 0
    case STYLE_FILLED:
	trace_draw2filled(t, d, p, m, x0, xn, height, yscale,
			  t->read->baseline);
	break;
#endif

    case STYLE_PYRO:
	trace_draw_hist(t, &t->read->traceA[x0], d, p, m,
			t->Agc, x0, xn, yoff, height, yscale,
			t->read->baseline);
	trace_draw_hist(t, &t->read->traceC[x0], d, p, m,
			t->Cgc, x0, xn, yoff, height, yscale,
			t->read->baseline);
	trace_draw_hist(t, &t->read->traceG[x0], d, p, m,
			t->Ggc, x0, xn, yoff, height, yscale,
			t->read->baseline);
	trace_draw_hist(t, &t->read->traceT[x0], d, p, m,
			t->Tgc, x0, xn, yoff, height, yscale,
			t->read->baseline);
	break;

    case STYLE_STICK:
	trace_draw_hist(t, &t->read->traceA[x0], d, p, m,
			t->Agc, x0, xn, yoff, height, yscale,
			t->read->baseline);
	trace_draw_hist(t, &t->read->traceC[x0], d, p, m,
			t->Cgc, x0+.15, xn, yoff, height, yscale,
			t->read->baseline);
	trace_draw_hist(t, &t->read->traceG[x0], d, p, m,
			t->Ggc, x0+.3, xn, yoff, height, yscale,
			t->read->baseline);
	trace_draw_hist(t, &t->read->traceT[x0], d, p, m,
			t->Tgc, x0+.45, xn, yoff, height, yscale,
			t->read->baseline);
	/* trace_draw_pyro(t, d, p, x0, xn, yoff, height, yscale); */
	break;
    }

    if (t->yticks)
	trace_draw_yticks(t, d, p, t->CursorGC, x0, xn, yoff, height,
			  yscale, t->read->baseline);

    if (t->show_edits == 0) {
	int pos;

	pos = point_to_pixel(t, trace_get_pos(t, t->cursor_pos));

	XFillRectangle(d, p, t->CursorGC, pos-1, yoff, 1, height);
    }
}
示例#14
0
/*
 * Draws the 4 confidence values produced by Solexa in their +/- log-odds
 * encoding.
 *
 * NB: Only works when trace editing hasn't been performed
 */
void trace_draw_confidence4(DNATrace *t, Display *d, Pixmap p,
			    int x0, int xn, int height) {
    int ind, x1, fw, cfh, cfw;
    char b[5];
    double pos;

    if (!p || t->Ned <= 0)
	return;

    x1 = x0 + xn < t->read->NPoints ? x0+xn : t->read->NPoints - 1;
    x1 = t->tracePos[x1] + 1;
    if (x1 >= t->read->NBases) x1--;
    x1 = t->read->basePos[x1];
    ind = t->tracePosE[x0];       /* Index of first base on screen */

    fw = t->font_width/2 + 1;
    cfh = t->conf_font_height;
    cfw = t->conf_font_width;

    while (ind < t->read->NBases && (pos = trace_get_pos(t, ind)) <= x1) {
	int conf;
	int edind;
	double xoff;

	/* Called confidence value */
	conf = (signed char)(t->edConf[ind]);
	if (conf < 100)
	    sprintf(b, "%02d", conf);
	else 
	    strcpy(b, "XX");

	xoff = 0;
	switch (t->read->base[ind]) {
	case 'A': case 'a': xoff = 0.00; break;
	case 'C': case 'c': xoff = 0.15; break;
	case 'G': case 'g': xoff = 0.30; break;
	case 'T': case 't': xoff = 0.45; break;
	}

	Tk_DrawChars(d, p, t->ConfGC, t->conf_font, b, 2,
		     point_to_pixel(t, pos + xoff)-fw, cfh);

	/* Graphics bars for 4 confidence values */
	edind = t->edPos[ind];
	pos = point_to_pixel(t, pos);
	if (edind) {
	    int i;
	    for (i = 0; i < 4; i++, pos += .15 * t->scale_x) {
		int v;
		switch(i) {
		case 0: v = t->read->prob_A[ind]; break;
		case 1: v = t->read->prob_C[ind]; break;
		case 2: v = t->read->prob_G[ind]; break;
		case 3: v = t->read->prob_T[ind]; break;
		}
		if (v >= 0)
		    XFillRectangle(d, p, t->ConfGC, pos-fw, cfh+30-v, cfw, v);
		else
		    XFillRectangle(d, p, t->ConfNegGC, pos, cfh+30, 3, -v);
		/*
		if (v >= 0)
		    XFillRectangle(d, p, t->ConfGC, pos-1, cfh, 5, v);
		else
		    XFillRectangle(d, p, t->ConfNegGC, pos, cfh, 3, -v);
		*/
	    }
	}

	ind++;
    }
}