Hi,
ich habe ein Fehler in meiner Berechnung, der mir einige Zeit schon Kopfzerbrechen bereitet.
Zuerstmal der Code:
float scale_temp = scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst;
int Startpunkt_alt_X = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X * (int)scale_temp;
int Startpunkt_alt_Y = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * (int)scale_temp;
Die Werte der Variablen lt. Debugger:
Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst = 1.29949236
scale = 0.76953125
scale_temp = 1
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 243
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 228
Startpunkt_alt_X = 243
Startpunkt_alt_Y = 226
Der Knackpunkt liegt bei Y. Ich habe schon einige Durchgänge durchgespielt - bei X stimmt der Wert (Start_Point_X = Startpunkt_alt_X).
Y hat meistens eine Abweichung von 1. In diesem Beispiel sogar 2.
Ich verstehe es einfach nicht - hat jemand von euch eine Idee?
*Edit*
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X & ..Y sind als int deklariert.
Ich habe jetzt mal "Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y" nach oben genommen und float in double geändert.
double scale_temp_Y = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst;
Debugger:
scale_temp_Y = 201.99999586120248 == Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y * scale * Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst = 202.99999584071338
Das Ergebnis vom Debugger ist also folgendes:
links = rechts
201.99999586120248 = 202.99999584071338
Ich verstehe nicht, wo die 1 herkommt. Ich habe es mit dem Taschenrechner überprüft und rechts stimmt. Mir raucht der Kopf....
Ich rate einfach mal:
MovingSegment ist ein Index einer Schleife. Du inkrementierst diesen und vergleichst dann die Werte aus dem letzten mit denen aus dem aktuellen Durchlauf.
Ich rate einfach mal:
MovingSegment ist ein Index einer Schleife. Du inkrementierst diesen und vergleichst dann die Werte aus dem letzten mit denen aus dem aktuellen Durchlauf.
Fast.
MovingSegment ist der Index einer bestimmten Linie in einem Bild, welche ich verschieben möchte. Das klappt auch alles ohne Probleme.
Nun habe ich ein Zoomfaktor eingeführt. Das heisst in meiner Liste wird der jeweilige Zoomfaktor (Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst) gespeichert. Hinzu kommt der Zoomfaktor des aktuellen Bildausschnittes (scale). Diese beiden Werte multipliziere ich mit einander - beides float.
In meinem Testbeispiel ergibt dies 1.
Um nun in der jeweiligen Zoomstufe zu verschieben, brauche ich den Startpunkt, hochgerechnet auf die aktuelle Zoomstufe. D.h. den alten Startpunkt (Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y) * scale_temp_Y
Und da kommt nicht das heraus, was ich bei der Multiplikation mit eins erwarten würde.
Liste_Messung_Filter_Daten[MovingSegment].Scale_Lst = 1.29949236
scale = 0.76953125
scale_temp = 1
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 243
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 228
Startpunkt_alt_X = 243
Startpunkt_alt_Y = 226
Wie hast du diese Werte ermittelt?
Vorschlag:
Trage alle diese Werte beim Debuggen in das "Überwachen" Fenster ein. Halte das Programm hinter der letzten Zuweisung an und mach einen Screenshot von VS in dem man das Überwachen-Fenster, den relevanten Code mit Breakpoint sehen kann.
Verwendest du Threads (bzw. Background-Tasks) in deinem Programm (welche die Liste oder den Index verändert)?
Ansonsten kann es gar nicht bei einer Ganzzahlmultiplikation von 228 * 1 zu 226 kommen.
Leider habe ich bei den Listen-Werten eine Fehlermeldung bekommen.
Ich habe diese in einer extra Klasse definiert:
public class Liste_Messung_Filter
{
public int Image_ID_Lst { get; set; }
public int Messlinie_ID_Lst { get; set; }
public double Laenge_Lst { get; set; }
public int Start_Point_X { get; set; }
public int Start_Point_Y { get; set; }
public int End_Point_X { get; set; }
public int End_Point_Y { get; set; }
public float Scale_Lst { get; set; }
}
Der Variablen der Listenwerte haben folgende Werte:
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 153
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 235
Um sie auszulesen habe ich sie in eine extra-Variable schreiben lassen:
int Liste_Messung_Filter_Daten_MovingSegment_Start_Point_X_temp = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X;
int Liste_Messung_Filter_Daten_MovingSegment_Start_Point_Y_temp = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y;
Und dort passiert bei Y etwas Merkwürdiges:
Ergebnis: 236 = 235 🤔
Das Bild sagt aber etwas anderes: 236 == 236.
Hast du dir MovingSegment
mal ausgeben lassen? Du kannst dir auch die Inhalte der Liste Liste_Messung_Filter_Daten
im Überwachungsfenster anzeigen lassen (oder du benutzt gleich das "Locals"-Fenster).
ohh .. ich hatte ein Copy&Paste-Feher drin:
Der Variablen der Listenwerte haben folgende Werte:
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_X = 153
Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y = 235
Eben nicht gleich:
int Liste_Messung_Filter_Daten_MovingSegment_Start_Point_Y_temp = Liste_Messung_Filter_Daten[MovingSegment].Start_Point_Y;
236 = 235
MovingSegment hat den Richtigen und bei allen den gleichen Wert, bspw. hier 0
Leider kann man in dem Screenshot nicht sehen, was um die Zuweisungen, die du ja nun schon mehrmals gepostet hast, passiert. Poste bitte die komplette Schleife, inklusive der Anzeige, wo das Programm sich gerade befindet (gelber Pfeil links). Und am noch den (wenn nötig gekürzten) Inhalt von Liste_Messung_Filter_Daten.