forked from DavidEilenstein/PolarisationSimulator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathps_stokescalc.cpp
124 lines (103 loc) · 3.22 KB
/
ps_stokescalc.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "ps_stokescalc.h"
#include "ui_ps_stokescalc.h"
PS_StokesCalc::PS_StokesCalc(QDir *pDIR, QWidget *parent) :
QDialog(parent),
ui(new Ui::PS_StokesCalc)
{
ui->setupUi(this);
pDIR_Operation = pDIR;
setWindowTitle("Stokes Parameter Calculator");
}
PS_StokesCalc::~PS_StokesCalc()
{
delete ui;
}
void PS_StokesCalc::CalcAll()
{
ui->groupBox_Stokes->setEnabled(true);
ui->groupBox_Poincare->setEnabled(true);
ui->groupBox_Ellipse->setEnabled(true);
Stks_0 = P_0_0 + P_p90_0;
Stks_1 = P_0_0 - P_p90_0;
Stks_2 = P_p45_0 - P_m45_0;
Stks_3 = P_p45_m90 - P_m45_m90;;
Stks_I = Stks_0;
Stks_p = sqrt(Stks_1 + Stks_2 + Stks_3) / Stks_0;
Stks_Psi = atan2(Stks_2, Stks_1) / 2.0;
Stks_Chi = atan2(Stks_3, sqrt(Stks_1 * Stks_1 + Stks_2 * Stks_2)) / 2.0;
ui->doubleSpinBox_S0->setValue(Stks_0);
ui->doubleSpinBox_S1->setValue(Stks_1);
ui->doubleSpinBox_S2->setValue(Stks_2);
ui->doubleSpinBox_S3->setValue(Stks_3);
ui->doubleSpinBox_I->setValue(Stks_I);
ui->doubleSpinBox_p->setValue(Stks_p);
ui->doubleSpinBox_Psi->setValue(Stks_Psi);
ui->doubleSpinBox_Chi->setValue(Stks_Chi);
//ellipse parameters
double angle = Stks_Psi * Rad2Grad;
double Rre = 1.0;
double Rim = tan(Stks_Chi);
//clear old content
ui->label_Ellipse->clear();
//target pixmap
PX_Ellipse = QPixmap(ui->label_Ellipse->width(), ui->label_Ellipse->height());
PX_Ellipse.fill(Qt::white);
//scale
double min = ui->label_Ellipse->width();
if(min > ui->label_Ellipse->height())
min = ui->label_Ellipse->height();
double R_max = (min-3)/2.0;
//draw
QPainter painter(&PX_Ellipse);
painter.setPen(QPen(Qt::black, 2, Qt::SolidLine));
painter.translate(PX_Ellipse.rect().center().x(), PX_Ellipse.rect().center().y());
painter.rotate(angle);
painter.translate(-PX_Ellipse.rect().center().x(), -PX_Ellipse.rect().center().y());
painter.drawEllipse(
PX_Ellipse.rect().center(),
static_cast<int>(Rre * R_max),
static_cast<int>(Rim * R_max));
ui->label_Ellipse->setPixmap(PX_Ellipse);
}
void PS_StokesCalc::on_doubleSpinBox_P_0_0_valueChanged(double arg1)
{
P_0_0 = arg1;
CalcAll();
}
void PS_StokesCalc::on_doubleSpinBox_P_p90_0_valueChanged(double arg1)
{
P_p90_0 = arg1;
CalcAll();
}
void PS_StokesCalc::on_doubleSpinBox_P_p45_0_valueChanged(double arg1)
{
P_p45_0 = arg1;
CalcAll();
}
void PS_StokesCalc::on_doubleSpinBox_m45_0_valueChanged(double arg1)
{
P_m45_0 = arg1;
CalcAll();
}
void PS_StokesCalc::on_doubleSpinBox_45_m90_valueChanged(double arg1)
{
P_p45_m90 = arg1;
CalcAll();
}
void PS_StokesCalc::on_doubleSpinBox_m45_m90_valueChanged(double arg1)
{
P_m45_m90 = arg1;
CalcAll();
}
void PS_StokesCalc::on_pushButton_Save_clicked()
{
QString name_save = QFileDialog::getSaveFileName(
this,
"Save Stokes Calculation",
pDIR_Operation->path() + "/Stokes_Calculation.jpg",
tr("Image Files (*.png *.jpg *.bmp)"));
if(name_save.isEmpty())
return;
this->grab().save(name_save);
pDIR_Operation->setPath(name_save);
}