WIP: scale factor editing, pan mode done.

This commit is contained in:
Matthias Koefferlein 2021-08-31 10:43:02 +02:00
parent 4a3e694b9b
commit 5afd48b12f
5 changed files with 42 additions and 9 deletions

View File

@ -51,6 +51,8 @@ D25View::D25View (QWidget *parent)
connect (mp_ui->fit_bottom, SIGNAL (clicked ()), this, SLOT (fit_button_clicked ()));
connect (mp_ui->zoom_slider, SIGNAL (valueChanged (int)), this, SLOT (scale_slider_changed (int)));
connect (mp_ui->vzoom_slider, SIGNAL (valueChanged (int)), this, SLOT (vscale_slider_changed (int)));
connect (mp_ui->zoom_factor, SIGNAL (editingFinished ()), this, SLOT (scale_value_edited ()));
connect (mp_ui->vzoom_factor, SIGNAL (editingFinished ()), this, SLOT (vscale_value_edited ()));
connect (mp_ui->d25_view, SIGNAL (scale_factor_changed (double)), this, SLOT (scale_factor_changed (double)));
connect (mp_ui->d25_view, SIGNAL (vscale_factor_changed (double)), this, SLOT (vscale_factor_changed (double)));
connect (mp_ui->d25_view, SIGNAL (init_failed ()), this, SLOT (init_failed ()));
@ -80,6 +82,34 @@ D25View::init_failed ()
mp_ui->gl_stack->setCurrentIndex (1);
}
void
D25View::scale_value_edited ()
{
double f = mp_ui->d25_view->scale_factor ();
try {
tl::from_string (tl::to_string (mp_ui->zoom_factor->text ()), f);
f = std::min (1e6, std::max (1e-6, f));
} catch (...) {
// ignore exceptions
}
mp_ui->d25_view->set_scale_factor (f);
scale_factor_changed (f);
}
void
D25View::vscale_value_edited ()
{
double f = mp_ui->d25_view->vscale_factor ();
try {
tl::from_string (tl::to_string (mp_ui->vzoom_factor->text ()), f);
f = std::min (1e6, std::max (1e-6, f));
} catch (...) {
// ignore exceptions
}
mp_ui->d25_view->set_vscale_factor (f);
vscale_factor_changed (f);
}
void
D25View::scale_slider_changed (int value)
{

View File

@ -58,8 +58,10 @@ private slots:
void fit_button_clicked ();
void scale_factor_changed (double f);
void scale_slider_changed (int value);
void scale_value_edited ();
void vscale_factor_changed (double f);
void vscale_slider_changed (int value);
void vscale_value_edited ();
void init_failed ();
private:

View File

@ -117,15 +117,11 @@ hit_point_with_cuboid (const QVector3D &line, const QVector3D &line_dir, const Q
double min_dist = 0.0;
int min_dist_index = -1;
QVector3D ld_norm = line_dir.normalized ();
for (std::vector<std::pair<bool, QVector3D> >::const_iterator i = cutpoints.begin (); i != cutpoints.end (); ++i) {
if (i->first) {
double dist = QVector3D::dotProduct (i->second - line, ld_norm);
if (min_dist_index < 0) {
min_dist = dist;
min_dist_index = int (i - cutpoints.begin ());
} else if (dist < min_dist) {
double dist = QVector3D::dotProduct (i->second - line, line_dir);
if (min_dist_index < 0 || dist < min_dist) {
min_dist = dist;
min_dist_index = int (i - cutpoints.begin ());
}

View File

@ -100,7 +100,7 @@ public:
QVector3D yv (-re * xv.z (), cos (view ()->cam_elevation () * M_PI / 180.0), re * xv.x ());
QVector3D drag = xv * dx + yv * dy;
view ()->set_displacement (m_start_displacement + drag / view ()->scale_factor ());
view ()->set_displacement (m_start_displacement + drag / view ()->scale_factors ());
}
private:
@ -366,8 +366,8 @@ D25ViewWidget::hit_point_with_scene (const QVector3D &line_dir)
{
double min_focus_dist = 0.5;
QVector3D corner = (QVector3D (m_bbox.left (), m_zmin, -(m_bbox.bottom () + m_bbox.height ())) + m_displacement) * m_scale_factor;
QVector3D dim = QVector3D (m_bbox.width (), m_zmax - m_zmin, m_bbox.height ()) * m_scale_factor;
QVector3D corner = (QVector3D (m_bbox.left (), m_zmin, -(m_bbox.bottom () + m_bbox.height ())) + m_displacement) * scale_factors ();
QVector3D dim = QVector3D (m_bbox.width (), m_zmax - m_zmin, m_bbox.height ()) * scale_factors ();
QVector3D line = cam_position ();
std::pair<bool, QVector3D> hp = lay::hit_point_with_cuboid (line, line_dir, corner, dim);

View File

@ -96,6 +96,11 @@ public:
refresh ();
}
QVector3D scale_factors () const
{
return QVector3D (scale_factor (), scale_factor () * vscale_factor (), scale_factor ());
}
double scale_factor () const { return m_scale_factor; }
void set_scale_factor (double f)