Skalierte Coordinaten

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Skalierte Coordinaten

    Nabend,

    Langsam wird es zwar peinlich, aber naja :wacko:
    Ich komm gerade einfach nicht dahinter, wie man die
    echte Mausposition in die dazu passende Koordinate eines
    darrunter liegendes skalierten Bildes umrechnet.

    Bild mit 1280p x 720p

    Gezeichnet in den Maßen 800 x 740 bei Coordinate 0, 200

    Maus ist bei Koordinate: X=320 & Y=480

    Also im gezeichneten Bild bei (320|480-200) => (320|280).

    Koordinate auf dem 720p Bild?

    Ich hoffe gerade ehrlich gesagt auf den "Forum Effekt".
    Gruß und noch ein schönen Abend, euer gewürfelter Eistee.
    Das Bild wurde in der Breite um den Faktor 800/1280 'vergrößert' und in der Höhe um den Faktor 740/720.
    Wenn du jetzt also im größeveränderten Bild in den Koordinaten (320|280) klickst, dann wären das im echten Bild:
    320 / 800/1280 = 512
    280 / 740/720 = 272,432p
    Also etwa im Punkt ([u]512[/u]|272)

    Alles Klar ? :D
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThePlexian“ ()

    @ThePlexian: Nicht wirklich, ich hab es mir sogar aufs Blatt gemalt und es ergibt einfach keinen Sinn :thumbsup:
    Eig. sollte ich mal eine Pause machen, aber es soll einfach mal fertig werden :D

    X = Mausposition.X * (skalierteBreite/normaleBreite) Skaliert die Koordinate runter wenn das Bild runter-skaliert wurde.

    umgekehrt also normaleBreite/skalierteBreite machts es auch fast richtig (die Koordinate ist in der Nähe), aber auch nur fast.
    (So hatte ich es schon von anfang an :( )
    @Eistee:
    Ich gehe mal davon aus, dass Du selbst weißt, wie Du die Mausposition relativ zur linken oberen Ecke des Bildes bekommst, denn das können wir nicht wissen, weil wir nicht wissen, wie genau Du zeichnest. Allgemein gilt halt: MausPositionRelativZumBild = MausPositionRelativZumBildschirm - DasWoraufGezeichnetWird.PointToScreen(KoordinateDesBildesImContainer)
    Oder: MausPositionRelativZumBild = DasWoraufGezeichnetWird.PointToClient(MausPositionRelativZumBildschirm) - KoordinateDesBildesImContainer
    Wobei KoordinateDesBildesImContainer bei dem Beispiel im Startpost (0|200) wäre.
    Es kann hier sein, dass ich Minuend und Subtrahend vertauscht habe, also dass Du b - a statt a - b rechen musst.

    Wenn Du die Mausposition relativ zum Bild hast, ist es einfach. Dazu stelle ich Dir ein paar einfach zu beantwortende Fragen:
    Gehen wir davon aus, dass das Bild original 100 Pixel breit ist.
    • Das Bild wird in Originalgröße gezeichnet. Wenn sich die Maus relativ zum Bild bei X = 100 befindet, wo ist sie dann, wenn man es zurückrechnet?
      (Bei X' = 100)
    • Das Bild wird doppelt so groß gezeichnet. Wenn sich die Maus relativ zum Bild bei X = 100 befindet, wo ist sie dann, wenn man es zurückrechnet?
      (Bei X' = 50)
    • Das Bild wird viermal so groß gezeichnet. wenn sich die Maus relativ zum Bild bei X = 100 befindet, wo ist sie dann, wenn man es zurückrechnet?
      (Bei X' = 25)

    Hier die Erklärung dazu:

    Wenn für jedes Pixel des Bildes 1,2,4 Pixel auf dem Bildschirm verwendet werden (also das Bild 1,2,4-mal so groß gezeichnet wird), dann muss die Maus auch 1,2,4-mal so weit fahren, um zum entsprechenden Pixel auf der Bitmap zu gelangen.
    Beispiel:
    Ich hab hier dieses Bild gemalt:

    Da sind mit den Pfeilen zwei rote Pixel markiert. Links Pixel A und rechts Pixel B. Am besten kopierst Du Dir das in Paint und zoomst ran, damit Du es besser erkennst. Ok, jetzt zoom nochmal raus (auf Originalgröße), platziere die Maus auf Pixel A und fahre rüber zu Pixel B. Wie weit musstest Du fahren? Es müssten ca. 37 sein.
    Jetzt zoomst Du mal rein, z.B. auf 8-fache Größe.
    Platziere die Maus wieder auf Pixel A und fahre rüber zu Pixel B. Wie weit musstest Du jetzt fahren? Das müsste jetzt um die 296 Pixel gewesen sein. Und das ist das 8-fache vom vorherigen Wert. Bzw. Wenn Du das Bild nur 4-fach vergrößerst, ist die Entfernung der beiden Pixel auch nur 4-mal so groß.

    Also allgemein gesagt:
    Wenn Du das Bild um Faktor f vergrößerst, dann muss die Maus f-mal so weit fahren, um gleich viele Pixel zurückzulegen.
    Also x' = x * f

    Und ich hoffe, Du schaffst diesen Gedankensprung:
    Wenn das Bild f-mal größer gezeichnet wird, und die Maus eine festgelegte Strecke x' gefahren ist, dann ergibt das auf der Bitmap ein f-tel dieser Entfernung:
    x = x' / f
    Also wenn Du 100 Pixel fährst und doppelt so groß zeichnest, ergibt das 50 Pixel auf der Bitmap:
    x = x' / f = 100 / 2 = 50

    Ich hoffe, das ist verständlich genug.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils