File: INCLUDE\AUTOJUST\TRANSFRM.H
1 #ifndef __TRANSFRM_H
2 #define __TRANSFRM_H
3
4 // Definition von Konstanten zur Festlegung der Transformationsreihenfolge
5 const unsigned XYZ= REIHENFOLGE_XYZ;
6 const unsigned ZYX= REIHENFOLGE_ZYX;
7
8
9 // Aufzählungstyp zur komfortablen Angabe der Koordinatensystemdrehachse
10 // bei Benutzung wird angegeben, um welche Achse eine KS-Drehung
11 // durchgeführt werden soll
12 enum EDrehachse
13 {
14 Drehachse_X= 1,
15 Drehachse_Y,
16 Drehachse_Z
17 };
18
19 // Aufzählungstyp zur komfortablen Angabe der Optimierungsachse
20 // bei Benutzung wird angegeben, auf welcher Achse der
21 // Optimierungsalgorithmus das Maximum der Intensität suchen soll
22 enum ELaufachse
23 {
24 Laufachse_X= 1,
25 Laufachse_Y,
26 Laufachse_Z
27 };
28
29
30 // Transformationsklasse
31 // zur Durchführung von Koordinatentransformationen
32 class TransformationClass
33 {
34 private:
35
36 // Listen zur Abspeicherung der Transformationsmatrizen
37 TMatrizenListe trafo_hin;
38 TMatrizenListe trafo_rueck;
39
40 // Zähler für durchgeführte KS-Transformationen
41 unsigned anzahl_koordinatentrafos;
42
43 // Ursprungsmotorpositionen und -intervalle
44 TMotorPositionsWerte Wertebereich;
45
46 // Zeichenpuffer für Protokollierung
47 char *buf, *buf1;
48
49 public:
50 // Vektor der akt. Koordinatenpositionen
51 TVektor PosVektor;
52 // Größe des letzten Intervalls beim Goldenen Schnitt
53 float toleranz;
54 // gibt an, ob eine Überschreitung der
55 // max. zulässigen Detektorintensität auftrat (100.000 Counts)
56 bool bIntensityTooHigh;
57
58 TransformationClass(void);
59 // Kontruktor
60
61 virtual ~TransformationClass(void);
62 // Destruktor
63
64 bool Initialize(double MaxDF, double MaxTL, double MaxCC);
65 // Initialisierung der Transformationsklasse
66 // 1. Ermittlung der aktuellen Motorpositionen und
67 // 2. Festlegen der Intervallgrenzen zur Justage
68
69 TVektor translate_to_worldpoints(TVektor OrigVektor);
70 // Berechnung der Weltkoordinaten eines Punktes im akt. KS
71 // 1. vektor homogen machen
72 // 2. (HIN-Transformation)
73 // Multiplikation des homog. Vektors mit den Trafo-Matrizen von Anfang an
74 // 3. Rückgabe des Vektors in kartesischer Form
75
76 TVektor translate_from_worldpoints(TVektor OrigVektor);
77 // Umrechnung eines Punktes im Welt-KS in Koordinaten im akt. KS
78 // 1. vektor homogen machen
79 // 2. (RÜCK-Transformation)
80 // Multiplikation des homog. Vektors mit den Trafo-Matrizen
81 // vom Ende der Liste bis zum Anfang
82 // 3. Rückgabe des Vektors in kartesischer Form
83
84 TMotorPositionsWerte translate_PosBorders(void);
85 // Übersetzung der Intervalle in akt. Koordinaten
86 // unbedingt mit Vergleich der Softwareschranken !!!
87 // d.h. notwendige Rückrechnung (translate_to_worldpoints)
88 // der akt. Schranken in Weltkoordinaten
89 // aktSchranke(x,y,z) -> weltkoord_aktSchranke(x_w,y_w,z_w)
90 // x_w-Werte mit Wertebereich.Min/MaxTL bzw. Softwareschranke vergl. usw.
91
92 float GetIntensityOnPosition(unsigned nMeasureCount);
93 // fährt die zu übersetzenden (TRAFO Klasse) Motorpositionen des PosVektors an
94 // und gibt Intensität zurück(Bestimmung der durch Medianbestimmung über
95 // mehreren Messungen mgl. durch Übergabe von nMeasureCount)
96 // muss alle 3 Motorachsen anfahren
97 // 1. translate_to_worldpoints(akt.anzufahrenderPosVektor)
98 // 2. worldkoordinaten-Vektor.get_XYZ(&x,&y,&z)
99 // 3. nMotorTL mMoveToDistance (x + Wertebereich.OrigTL) weil Ursprung (0,0,0)
100 // nMotorDF mMoveToDistance (y + Wertebereich.OrigDF)
101 // nMotorCC mMoveToDistance (z + Wertebereich.OrigCC)
102 // 4. Rückgabe der Intensität
103
104 int Goldener_Schnitt(ELaufachse, double &intervall_li, double &intervall_re,
105 unsigned nMeasureCount);
106 // bekommt aktuelle Koordinaten (Grenzen, akt. PosVektor)
107 // und rechnet nur im akt. KS für eine bestimmte Achse (x,y,z)
108 // erst der Aufruf von GetIntensityOnPosition(vektor) führt zu einer
109 // Bestimmung der realen Positionen
110
111 TMotorPositionsWerte GetOrigPosBorders(void)
112 {
113 return Wertebereich;
114 }
115 // gibt die Wertebereiche der Motoren zurück
116
117 bool KoordinatenTransformation(EDrehachse, TVektor vVerschiebung);
118 // 1. Berechnung des Winkels von vektor zur Dreh-Achse (Einheitsvektor)
119 // 2. Aufruf der transformiere-Methode der Matrix-Klasse
120 // HIN : transformiere(XYZ, ... )
121 // RÜCK: transformiere(ZYX, ... )
122 // 3. Matrizenliste.push(hin)
123 // Matrizenliste.push(rück)
124 // 4. anzahl_koordinatentrafos ++
125
126 unsigned get_koordinatentrafos(void)
127 {
128 return anzahl_koordinatentrafos;
129 }
130 // gibt die Anzahl der KS-Transformationen zurück
131
132 float MeasureIntensity(unsigned nMeasureCount);
133 // sicheres Auslesen der Intensität vom Detektor
134 // Möglichkeit einer Mehrfachmessung mit Medianbestimmung, um
135 // Messschwankungen auszugleichen
136
137
138 void DFCorrection(unsigned nMeasureCount, double & fDFPos, float & fIntensity);
139 // Korrektur für die Motorachse "Beugung Fein"
140 // Grund: Wenn die Position der maximalen Intensität am Ende der Suche wieder
141 // angefahren wird, dann ist die Intensität nicht mehr die gleiche
142 // die gemessen wurde. Die Position ist leicht verschoben.
143 // Lösung: DFCorrection soll in der näheren Umgebung das Maximum wieder finden
144
145 };
146
147
148 #endif
149