int Cam_int_edit::pan( CEvent &e, State *& ) { DEVice_2d *ptr=(DEVice_2d *)e._d; CAMptr cam (e.view()->cam()); CAMdataptr data (cam->data()); Wvec delta(Wpt(ptr->cur(),_down_pt) - Wpt(ptr->old(),_down_pt)); data->translate(-delta); data->set_at(Wline(data->from(), data->at_v()).project(_down_pt)); data->set_center(data->at()); return 0; }
int Cam_int::zoom( CEvent &e, State *& ) { if (debug_fsa) cerr << "Cam_int::zoom" << endl; DEVice_2d *ptr=(DEVice_2d *)e._d; CAMptr cam (e.view()->cam()); CAMdataptr data (cam->data()); XYvec delta(ptr->delta()); double ratio; if (data->persp()) { Wvec movec(_down_pt - data->from()); data->set_center(_down_pt); data->translate(movec.normalized() * (movec.length() * delta[1] * -4)); ratio = cam->height() / cam->width() * (movec * data->at_v()) * data->width() / data->focal(); } else { Wpt spt (XYpt(ptr->cur()[0],_scale_pt[1])); Wvec svec (spt - Wline(data->from(), data->at_v()).project(spt)); double sfact(1 + delta[1]); data->translate( svec * (1.0 - sfact)); data->set_width (data->width() * sfact); data->set_height(data->height()* sfact); ratio = data->height(); } data->translate(-delta[0]/2 * data->right_v() * ratio); data->set_at(Wline(data->from(), data->at_v()).project(data->center())); data->set_center(data->at()); return 0; }