Hauptseite | Klassenhierarchie | Auflistung der Klassen | Auflistung der Dateien | Klassen-Elemente | Datei-Elemente | Zusätzliche Informationen

TRANSFRM.H

gehe zur Dokumentation dieser Datei
00001 #ifndef __TRANSFRM_H 00002 #define __TRANSFRM_H 00003 00004 // Definition von Konstanten zur Festlegung der Transformationsreihenfolge 00005 const unsigned XYZ= REIHENFOLGE_XYZ; 00006 const unsigned ZYX= REIHENFOLGE_ZYX; 00007 00008 00009 // Aufzählungstyp zur komfortablen Angabe der Koordinatensystemdrehachse 00010 // bei Benutzung wird angegeben, um welche Achse eine KS-Drehung 00011 // durchgeführt werden soll 00012 enum EDrehachse 00013 { 00014 Drehachse_X= 1, 00015 Drehachse_Y, 00016 Drehachse_Z 00017 }; 00018 00019 // Aufzählungstyp zur komfortablen Angabe der Optimierungsachse 00020 // bei Benutzung wird angegeben, auf welcher Achse der 00021 // Optimierungsalgorithmus das Maximum der Intensität suchen soll 00022 enum ELaufachse 00023 { 00024 Laufachse_X= 1, 00025 Laufachse_Y, 00026 Laufachse_Z 00027 }; 00028 00029 00030 // Transformationsklasse 00031 // zur Durchführung von Koordinatentransformationen 00032 class TransformationClass 00033 { 00034 private: 00035 00036 // Listen zur Abspeicherung der Transformationsmatrizen 00037 TMatrizenListe trafo_hin; 00038 TMatrizenListe trafo_rueck; 00039 00040 // Zähler für durchgeführte KS-Transformationen 00041 unsigned anzahl_koordinatentrafos; 00042 00043 // Ursprungsmotorpositionen und -intervalle 00044 TMotorPositionsWerte Wertebereich; 00045 00046 // Zeichenpuffer für Protokollierung 00047 char *buf, *buf1; 00048 00049 public: 00050 // Vektor der akt. Koordinatenpositionen 00051 TVektor PosVektor; 00052 // Größe des letzten Intervalls beim Goldenen Schnitt 00053 float toleranz; 00054 // gibt an, ob eine Überschreitung der 00055 // max. zulässigen Detektorintensität auftrat (100.000 Counts) 00056 bool bIntensityTooHigh; 00057 00058 TransformationClass(void); 00059 // Kontruktor 00060 00061 virtual ~TransformationClass(void); 00062 // Destruktor 00063 00064 bool Initialize(double MaxDF, double MaxTL, double MaxCC); 00065 // Initialisierung der Transformationsklasse 00066 // 1. Ermittlung der aktuellen Motorpositionen und 00067 // 2. Festlegen der Intervallgrenzen zur Justage 00068 00069 TVektor translate_to_worldpoints(TVektor OrigVektor); 00070 // Berechnung der Weltkoordinaten eines Punktes im akt. KS 00071 // 1. vektor homogen machen 00072 // 2. (HIN-Transformation) 00073 // Multiplikation des homog. Vektors mit den Trafo-Matrizen von Anfang an 00074 // 3. Rückgabe des Vektors in kartesischer Form 00075 00076 TVektor translate_from_worldpoints(TVektor OrigVektor); 00077 // Umrechnung eines Punktes im Welt-KS in Koordinaten im akt. KS 00078 // 1. vektor homogen machen 00079 // 2. (RÜCK-Transformation) 00080 // Multiplikation des homog. Vektors mit den Trafo-Matrizen 00081 // vom Ende der Liste bis zum Anfang 00082 // 3. Rückgabe des Vektors in kartesischer Form 00083 00084 TMotorPositionsWerte translate_PosBorders(void); 00085 // Übersetzung der Intervalle in akt. Koordinaten 00086 // unbedingt mit Vergleich der Softwareschranken !!! 00087 // d.h. notwendige Rückrechnung (translate_to_worldpoints) 00088 // der akt. Schranken in Weltkoordinaten 00089 // aktSchranke(x,y,z) -> weltkoord_aktSchranke(x_w,y_w,z_w) 00090 // x_w-Werte mit Wertebereich.Min/MaxTL bzw. Softwareschranke vergl. usw. 00091 00092 float GetIntensityOnPosition(unsigned nMeasureCount); 00093 // fährt die zu übersetzenden (TRAFO Klasse) Motorpositionen des PosVektors an 00094 // und gibt Intensität zurück(Bestimmung der durch Medianbestimmung über 00095 // mehreren Messungen mgl. durch Übergabe von nMeasureCount) 00096 // muss alle 3 Motorachsen anfahren 00097 // 1. translate_to_worldpoints(akt.anzufahrenderPosVektor) 00098 // 2. worldkoordinaten-Vektor.get_XYZ(&x,&y,&z) 00099 // 3. nMotorTL mMoveToDistance (x + Wertebereich.OrigTL) weil Ursprung (0,0,0) 00100 // nMotorDF mMoveToDistance (y + Wertebereich.OrigDF) 00101 // nMotorCC mMoveToDistance (z + Wertebereich.OrigCC) 00102 // 4. Rückgabe der Intensität 00103 00104 int Goldener_Schnitt(ELaufachse, double &intervall_li, double &intervall_re, 00105 unsigned nMeasureCount); 00106 // bekommt aktuelle Koordinaten (Grenzen, akt. PosVektor) 00107 // und rechnet nur im akt. KS für eine bestimmte Achse (x,y,z) 00108 // erst der Aufruf von GetIntensityOnPosition(vektor) führt zu einer 00109 // Bestimmung der realen Positionen 00110 00111 TMotorPositionsWerte GetOrigPosBorders(void) 00112 { 00113 return Wertebereich; 00114 } 00115 // gibt die Wertebereiche der Motoren zurück 00116 00117 bool KoordinatenTransformation(EDrehachse, TVektor vVerschiebung); 00118 // 1. Berechnung des Winkels von vektor zur Dreh-Achse (Einheitsvektor) 00119 // 2. Aufruf der transformiere-Methode der Matrix-Klasse 00120 // HIN : transformiere(XYZ, ... ) 00121 // RÜCK: transformiere(ZYX, ... ) 00122 // 3. Matrizenliste.push(hin) 00123 // Matrizenliste.push(rück) 00124 // 4. anzahl_koordinatentrafos ++ 00125 00126 unsigned get_koordinatentrafos(void) 00127 { 00128 return anzahl_koordinatentrafos; 00129 } 00130 // gibt die Anzahl der KS-Transformationen zurück 00131 00132 float MeasureIntensity(unsigned nMeasureCount); 00133 // sicheres Auslesen der Intensität vom Detektor 00134 // Möglichkeit einer Mehrfachmessung mit Medianbestimmung, um 00135 // Messschwankungen auszugleichen 00136 00137 00138 void DFCorrection(unsigned nMeasureCount, double & fDFPos, float & fIntensity); 00139 // Korrektur für die Motorachse "Beugung Fein" 00140 // Grund: Wenn die Position der maximalen Intensität am Ende der Suche wieder 00141 // angefahren wird, dann ist die Intensität nicht mehr die gleiche 00142 // die gemessen wurde. Die Position ist leicht verschoben. 00143 // Lösung: DFCorrection soll in der näheren Umgebung das Maximum wieder finden 00144 00145 }; 00146 00147 00148 #endif

Erzeugt am Sat Nov 13 12:48:11 2004 für XCTL32 von doxygen 1.3.7