Wie Mausposition in eine Rasterposition umrechen?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von oobdoo.

    Wie Mausposition in eine Rasterposition umrechen?

    Ich habe mal wieder ein Brett vor dem Kopf. ||

    Folgende Grafik habe ich in meinen Programm vorliegen:



    Das Bild ist eine stark vergrößerte Version der originalen Grafik. In bunten Kästchen haben eine Größe von 8x8 Pixeln,
    die schwarze Umrandung ist immer 1 Pixel groß. Das Bild stellt nur einen kleinen Abschnitt der gesamten Grafik dar.

    Nun suche ich eine Formel wie ich die Mausposition in eine Rasterposition umrechnen kann, so das mir über eine
    Funktion die Werte 1-9 zurück gegeben wird. Steht die Maus auf dem schwarzen Rand, dann darf kein Wert berechnet
    werden.
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    @oobdoo Offset auf (0, 0) des Fensters 1,
    Division Mouse.X und Mouse.Y durch das Rastermaß.
    Nun hat Feld1 die Werte { x, y } = (0, 0), Feld9 die Werte { x, y } = (2, 2).
    Auf die Feld-Werte kommst Du mit { 1 + x + 3 * y }.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich bekomme es einfach nicht hin. :(

    Visual Basic-Quellcode

    1. Public Function Maus2Raster(MausX As Integer, MausY As Integer, AnzahlKästchen As Integer) As Integer
    2. Dim Position = 1 + (MausX / AnzahlKästchen) + 3 * (MausY / AnzahlKästchen)
    3. Return Position
    4. End Function


    So verstehe ich Deine Formel wenn ich sie in VB schreibe.
    Wenn ich mich mit der Maus nur in der ersten Kästchenreihe bewege und diese Reihe 32 Kästchen hat, dann
    sollte die Funktion 32 ausgeben. Bei mir steht aber 10.
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    @oobdoo Dann fahre mit der Maus über alle Kästchen und sieh nach, was nicht stimmt.
    ===
    Was ist AnzahlKästchen?
    Und Option Strict On.
    Visual Studio - Empfohlene Einstellungen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @oobdoo Welchen Wert hat AnzahlKästchen im Beispiel von Post #1?
    ====
    Bei mir läuft der Code richtig.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @oobdoo Bei mir ist das Rastermaß = 75.

    VB.NET-Quellcode

    1. Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove
    2. Label1.Text = Maus2Raster(e.X, e.Y, 75).ToString()
    3. End Sub
    4. Public Function Maus2Raster(MausX As Integer, MausY As Integer, AnzahlKästchen As Integer) As Integer
    5. Dim Position = 1 + (MausX \ AnzahlKästchen) + 3 * (MausY \ AnzahlKästchen)
    6. Return Position
    7. End Function
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @oobdoo Breite Deines Bildes / 3 Unterbilder, eine Rastereinheit eben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nun scheint es geklappt zu haben. 8o



    Der Mauszeiger steht jetzt über dem Kästchen ganz rechts oben.

    VB.NET-Quellcode

    1. Private Sub piboGFX_MouseMove(sender As Object, e As MouseEventArgs) Handles piboGFX.MouseMove
    2. Dim X As Integer = e.X \ 9
    3. Dim Y As Integer = e.Y \ 9
    4. Dim Raster As Integer = (Y * 32) + X
    5. txbxGFX.Text = "X: " + e.X.ToString + " | " + "Y: " + e.Y.ToString + " # " + "X: " + X.ToString + " | " + Y.ToString + " # (" + Raster.ToString + ")"
    6. End Sub


    Sorry für die lange Leitung bei mir und vielen Dank für die Hilfe. :whistling:

    Das schlimme ist, sowas ähnliches hatte ich vor ca. 20 Jahren schon einmal programmiert und auch ohne Hilfe hinbekommen.
    Meinen Source von damals verstehe ich aber nicht mehr. :S



    Ich glaube ich werde alt. :D
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love: