tomaschku
Goto Top

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:
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) {
    
}

Content-ID: 381816

Url: https://administrator.de/contentid/381816

Ausgedruckt am: 24.11.2024 um 18:11 Uhr

Kraemer
Kraemer 24.08.2018 um 22:12:11 Uhr
Goto Top
Und nun?
rubberman
rubberman 24.08.2018 um 22:35:29 Uhr
Goto Top
Hehe, ja die Frage und der Kontext fehlen komplett.
rubberman
rubberman 26.08.2018 um 13:04:44 Uhr
Goto Top
Irgendwie scheinst du mit unseren Antworten nichts anzufangen zu wissen face-smile

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.
relative_point
#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;
}
Ist kaum getestet, ich hoffe ich habe + und - nicht zu oft verwechselt face-wink Aber wie du siehst brauchst du lediglich Addition und Subtraktion. Man muss kein Mathegenie sein ...

Steffen
tomaschku
tomaschku 28.08.2018 um 15:08:30 Uhr
Goto Top
Was den Kontext angeht: Ich hab ein Gerät mit LCD Display (100 Pixel breit und 64 hoch).
Da ich zwischen PC und dem Gerät Koordinaten austauschen muss, brauchte ich einen Weg zum umwandeln (LCD's haben ja leider die Eigenschaft, das der Startpunkt der Koordinaten Links Unten ist, also würden normalerweise die Koordinaten nach Rechts bzw Oben wachsen).

Was Addition und Subtraktion angeht: Klar, die Idee is mir auch gekommen, aber als ich in Excel dann versucht hab ein funktionierenden Prototyp zu kreieren, ist nur Blödsinn rausgekommen. Deswegen meinte ich, POINT statt Rect wäre einfacher.

Den Code werde ich so früh wie möglich testen face-smile.


P.S.: 'tschuldige, dass die Frage so blöd formuliert ist. Der vorherige Entwurf war zu lang und voller unnötiger Informationen, jetzt hatte ich zu viel weggelassen.
rubberman
rubberman 28.08.2018 um 15:52:29 Uhr
Goto Top
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 - face-wink ) 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