![]() |
---|
Es geht um die Abbildung einer recht einfachen Sache in Programmcode (hier . Gegeben: Ein Viereck welches in allen Drehungen und Spiegelungen durch die vier Eckpunkte uli, oli, ure, ore definiert ist. Das Koordinatensystem hat einen float Bereich von 0 bis 1. Eingabewert: Eine Koordinate ebenfalls in 0 bis 1 float. Aufgabe: Den eingegebenen Punkt von seinem Koordinatensystem auf das durch die Eckpunkte definierte Viereck zu projezieren. Lösungsansatz: Da durch die vier Eckpunkte schlimmstenfalls ein Polygon definiert wird ergibt sich daraus, dass ich für einen Eingabepunkt jeweils die Länge der entsprechenden Achse ausrechnen muß. Zwischen den Eckpunkten ergibt sich ein kleineres Rechteck(!), dass die Eckpunte ohne Ihre Auslenkung abbildet. Wenn jetzt beim Bilden des Quadrats . ul/ol eine Differenz auf der Achse habe, dann errechne ich mittels des Sinus die entsprechende Gegenkathete und habe den Wert der Auslenkung, der zur unverzerrten Achse im Innenquadrat zugerechnet wird. Problem: Wenn dieses Innenquadrat Achsen invertiert oder x-achse und y-achse getauscht hat, dann funktioniert diese Rechnung logischerweise nicht. Als Mensch schaue ich auf die Zeichnung und weiß wo ich entsprechende Strecken zu- oder abrechnen muß. Ich will dies in einem kompakten Programmalgo verpacken ohne dabei alle möglichen Fälle einzeln hart zu codieren. Wie erkenne und berücksichtige ich am besten die Lage der Punkte bei meiner Berechnung - um danach den eingegebenen Punkt richtig in den anderen Koordinaten zu projezieren? <Code> - (float)calcHelpLineLength:(NSPoint) from toPoint:(NSPoint) to withVal:(float) inVal float ak gk sized_ak out_gk double deg rad if ( (ak = from.x - to.x) ak if ( (gk = from.y - to.y) gk if (ak gk) make it wider than high float temp = ak; ak = gk; gk = temp; rad = atan(gk / ak); //man atan! deg rad) sized_ak = ak inVal; //inval length of ak out_gk = tan(rad) sized_ak; return out_gk; - (int)calculateNaturalPoint:(NSPoint) here with:(NSPoint*) out_pt atStage:(viereck*) natural float y_axis_mid y_axis_left y_axis_right x_axis_mid x_axis_up x_axis_down y_ax x_ax char zeile255] = ""; y_axis_left = self calcHelpLineLength: natural->bottomleft toPoint: natural->topleft withVal: here.x]; y_axis_right = self calcHelpLineLength: natural->bottomright toPoint: natural->topright withVal:here.x]; //we're here cause we want to locate a pt in our coordinate system //first see how our axises are laid out, pan_y can go on xaxis //from bl see where tr is, decide direction with tl and br float op1 op2 op3 op4 float y_ax_offset //from left pair take the other (second point) and right pair the closer (third point) if (natural->bottomleft.y - natural->topleft.y //to 0 op1 = natural->bottomleft.y; //rect left 1 is closer op2 = natural->topleft.y; else op1 = natural->topleft.y; op2 = natural->bottomleft.y; if (natural->bottomright.y - natural->topright.y //to 0 op3 = natural->topright.y; //rect right 1 is closer op4 = natural->bottomright.y; else op3 = natural->bottomright.y; op4 = natural->topright.y; //see if it's inverted y_axis_mid = op3 - op2; if (y_axis_mid y_axis_mid = op2 - op3; y_ax = y_axis_left y_axis_mid y_axis_right; //yaxis total length (which is equal to here.y y_ax here.y; if ( op2 op3 ) y_ax_offset = op2 - y_axis_left; else //else do same and then swap y_ax_offset = op1; //kommt wieder drauf y_ax_offset y_axis_left; //y_ax_offset op4; y_ax //kommt wieder drauf //what to do if pt is exchanged? . Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert): "Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen." |
Hierzu passend bei OnlineMathe: Tangensfunktion (Mathematischer Grundbegriff) Kosinusfunktion (Mathematischer Grundbegriff) Sinusfunktion (Mathematischer Grundbegriff) Sinus (Mathematischer Grundbegriff) Kosinus (Mathematischer Grundbegriff) Trigonometrie (Mathematischer Grundbegriff) Tangens (Mathematischer Grundbegriff) Rechenregeln Trigonometrie Online-Übungen (Übungsaufgaben) bei unterricht.de: |
![]() |
![]() |
Wenn ich die Fragestellung richtig verstehe: Du hast vier Punkte mit Zu eingegebenen ist gesucht mit . Wie wäre es mit bzw. ? Zumindest gilt hierbei usw. |
![]() |
Es kann eben auch vertauscht (1,0)↦A,(0,0)↦B,(0,1)↦C,(1,1)↦D sein. Wobei A unten links, oben links, oben rechts und unten rechts bleibt. Die Punkte sind nicht nur ABCD, sondern eben logisch weiterverwandt mit oben-unten und links-rechts. Mit diesem Wissen wie die Strecken laufen würde ich dann den Eingabepunkt trasformieren, da mir das einfacher erscheint. Nicht nur das Viereck kann sich drehen, sondern danach kann es sich auch um drehen. Und das muß nicht A sein. Danke, Ich meditiere noch mal über Deinen Ansatz, mir fällt es schwer mir das Vorzustellen. |
![]() |
Hm, dann benenn die halt entsprechend um ?? |
![]() |
Yup. Ich bin frage mich immer noch wieso ich direkt mit einem Trigo-Ansatz starten mußte... Das spielt gut. Danke. |