Origin eines POINTS ändern
Hallo zusammen!
Bevor wir zur Frage kommen: Ich habe im vorhinein schon auf Google geschaut, konnte aber nur Lösungen für Libraries oder Algebra finden. Nun, leider bin ich mit der Art von Mathematik noch nicht erfahren, deshalb ist bei meinen Versuchen nichts rumgekommen.
Pseudocode:
Bevor wir zur Frage kommen: Ich habe im vorhinein schon auf Google geschaut, konnte aber nur Lösungen für Libraries oder Algebra finden. Nun, leider bin ich mit der Art von Mathematik noch nicht erfahren, deshalb ist bei meinen Versuchen nichts rumgekommen.
Pseudocode:
enum_origin { LeftTop, RightTop, RightBottom, LeftBottom };
struct MyPoint {
int X;
int Y;
enum_origin origin;
}
int main() {
MyPoint test;
test.X = 1;
test.Y = 2;
test.origin = LeftTop; //Brauchbar für z.B. WinAPI Funktionen
MyPoint n = setOrigin(test, LeftBottom);
pause();
return 0;
}
MyPoint setOrigin(POINT p, enum_origin eo) {
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 381816
Url: https://administrator.de/contentid/381816
Ausgedruckt am: 24.11.2024 um 18:11 Uhr
5 Kommentare
Neuester Kommentar
Irgendwie scheinst du mit unseren Antworten nichts anzufangen zu wissen
Okay, deine Frage kann ich mir selbst denken. Aber der Kontext bleibt das was fehlt. Im Moment spezifizierst du deinen Punkt mit den X,Y Koordinaten und einem Ursprung, der einer von vier Eckpunkten entspricht. Aber, vier Eckpunkte von was eigentlich? Diese Art von Umrechnung kannst du nur vornehmen wenn zu deinen Koordinaten ein Rechteck existiert, auf die sich das ganze bezieht. Da "Origin" impliziert, dass dieser Punkt die Koordinaten 0,0 hat, reicht es die Breite und Höhe des Rechtecks zu definieren. Aber wie gesagt, diese Beziehung betrachtest du aktuell gar nicht.
Weiterhin muss unabhängig vom Koordinatenursprung klar sein, in welche Richtung die Koordinatenwerte wachsen. Bei Bildschirmkoordinaten in der Regel von links nach rechts und von oben nach unten. Einmal definiert, kannst du das als gegeben hinnehmen.
Wenn man den Spaß ein bisschen illustriert, wird es einfacher. Alles was rot ist, fehlt bislang.
Ist kaum getestet, ich hoffe ich habe + und - nicht zu oft verwechselt Aber wie du siehst brauchst du lediglich Addition und Subtraktion. Man muss kein Mathegenie sein ...
Steffen
Okay, deine Frage kann ich mir selbst denken. Aber der Kontext bleibt das was fehlt. Im Moment spezifizierst du deinen Punkt mit den X,Y Koordinaten und einem Ursprung, der einer von vier Eckpunkten entspricht. Aber, vier Eckpunkte von was eigentlich? Diese Art von Umrechnung kannst du nur vornehmen wenn zu deinen Koordinaten ein Rechteck existiert, auf die sich das ganze bezieht. Da "Origin" impliziert, dass dieser Punkt die Koordinaten 0,0 hat, reicht es die Breite und Höhe des Rechtecks zu definieren. Aber wie gesagt, diese Beziehung betrachtest du aktuell gar nicht.
Weiterhin muss unabhängig vom Koordinatenursprung klar sein, in welche Richtung die Koordinatenwerte wachsen. Bei Bildschirmkoordinaten in der Regel von links nach rechts und von oben nach unten. Einmal definiert, kannst du das als gegeben hinnehmen.
Wenn man den Spaß ein bisschen illustriert, wird es einfacher. Alles was rot ist, fehlt bislang.
#include <iostream>
enum enum_origin { LeftTop, RightTop, RightBottom, LeftBottom };
struct relative_point { int X, Y, rect_width, rect_height, rect_origin; };
relative_point setOrigin(const relative_point& point, const int new_origin);
int main()
{
relative_point test{ 170, 60, 200, 100, LeftTop };
relative_point n = setOrigin(test, LeftBottom);
std::cout << "X: " << n.X << ", Y: " << n.Y << std::endl;
return 0;
}
relative_point setOrigin(const relative_point& point, const int new_origin)
{
relative_point transposed = point;
switch (point.rect_origin)
{
case LeftTop:
switch (new_origin)
{
case RightTop:
transposed.X = point.X - point.rect_width;
break;
case RightBottom:
transposed.X = point.X - point.rect_width;
transposed.Y = point.Y - point.rect_height;
break;
case LeftBottom:
transposed.Y = point.Y - point.rect_height;
break;
default:
return transposed;
}
break;
case RightTop:
switch (new_origin)
{
case LeftTop:
transposed.X = point.X + point.rect_width;
break;
case RightBottom:
transposed.Y = point.Y - point.rect_height;
break;
case LeftBottom:
transposed.X = point.X + point.rect_width;
transposed.Y = point.Y - point.rect_height;
break;
default:
return transposed;
}
break;
case RightBottom:
switch (new_origin)
{
case LeftTop:
transposed.X = point.X + point.rect_width;
transposed.Y = point.Y + point.rect_height;
break;
case RightTop:
transposed.Y = point.Y + point.rect_height;
break;
case LeftBottom:
transposed.X = point.X + point.rect_width;
break;
default:
return transposed;
}
break;
case LeftBottom:
switch (new_origin)
{
case LeftTop:
transposed.Y = point.Y + point.rect_height;
break;
case RightTop:
transposed.X = point.X + point.rect_width;
transposed.Y = point.Y - point.rect_height;
break;
case RightBottom:
transposed.X = point.X + point.rect_width;
break;
default:
return transposed;
}
break;
default:
return transposed;
}
transposed.rect_origin = new_origin;
return transposed;
}
Steffen
So richtig hab ich's noch nicht. Nach dem was ich verstanden habe, ändert sich auch der Richtungsvektor, zumindest für Y. Egal. Drucke dir das Bild einfach aus und schreibe die Werte rein, wie sie deiner Meinung nach jeweils aussehen müssen. Danach einfach überlegen welche Operation du anwenden musst um von einem Wert X zum anderen Wert X zu kommen. Dasselbe für Y. (Es bleibt bei + und - ) Wie du siehst kopiere ich den übergebenen Punkt am Anfang der Funktion und ändere nur die Member die sich wirklich verändern. Auch das kannst du so übernehmen...
Steffen
Steffen