Mathematik online lernen im Mathe-Forum. Nachhilfe online
Startseite » Forum » Projezieren von Viereckspunkten in Prorgrammcode

Projezieren von Viereckspunkten in Prorgrammcode

Universität / Fachhochschule

Körper

Tags: Koordinatensystem, Körper, Polygon, Projektion, Trigonometrie, Trigonometrische Funktionen, Viereck

 
Antworten Neue Frage stellen Im Forum suchen
Neue Frage
progi134

progi134 aktiv_icon

15:32 Uhr, 21.01.2010

Antworten
Es geht um die Abbildung einer recht einfachen Sache in Programmcode (hier C).

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 z.B. ul/ol eine Differenz auf der y 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 =0, gk =0, sized_ak =0, out_gk =0;
double deg =0, rad =0;

if ( (ak = from.x - to.x) <0) ak =(-1);
if ( (gk = from.y - to.y) <0) gk =(-1);

if (ak < gk) / make it wider than high
{
float temp = ak;
ak = gk;
gk = temp;
}

rad = atan(gk / ak); //man atan!
deg =(180 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 =0, y_axis_left =0, y_axis_right =0, x_axis_mid =0, x_axis_up =0, x_axis_down =0, y_ax =0, x_ax =0;
char zeile[255] = "";

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 =0, op2 =0, op3 =0, op4 =0;
float y_ax_offset =0;

//from left pair take the other (second point) and right pair the closer (third point)

if (natural->bottomleft.y - natural->topleft.y 0) //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 0) //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 0) 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 =1)
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 =-1; //kommt wieder drauf
}

//what to do if pt is exchanged?
...

DSC03251

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:
 
Online-Nachhilfe in Mathematik
Antwort
hagman

hagman aktiv_icon

16:15 Uhr, 21.01.2010

Antworten
Wenn ich die Fragestellung richtig verstehe:
Du hast vier Punkte A,B,C,D mit
(0,0)A,(1,0)B,(1,1)C,(0,1)D
Zu eingegebenen x,y ist gesucht P mit (x,y)P.

Wie wäre es mit P==(1-x)(1-y)A+x(1-y)B+xyC+(1-x)yD bzw.
xP=(1-x)(1-y)xA+x(1-y)xB+xyxC+(1-x)yxD
yP=(1-x)(1-y)yA+x(1-y)yB+xyyC+(1-x)yyD?
Zumindest gilt hierbei (0,0)A usw.
progi134

progi134 aktiv_icon

16:35 Uhr, 21.01.2010

Antworten
Es kann eben auch vertauscht

(1,0)↦A,(0,0)↦B,(0,1)↦C,(1,1)↦D
sein.

Wobei A unten links, B oben links, C oben rechts und D 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 0,0 drehen. Und das muß nicht A sein.

Danke, Ich meditiere noch mal über Deinen Ansatz, mir fällt es schwer mir das Vorzustellen.
Antwort
hagman

hagman aktiv_icon

17:41 Uhr, 21.01.2010

Antworten
Hm, dann benenn die halt entsprechend um ??
Frage beantwortet
progi134

progi134 aktiv_icon

02:09 Uhr, 22.01.2010

Antworten
Yup. Ich bin frage mich immer noch wieso ich direkt mit einem Trigo-Ansatz starten mußte...

Das spielt gut. Danke.