isometrische tiles -> in welchem teil liegt die maus?



  • hi,
    ich habe folgendes problem:
    ich habe eine isometrische map (diamantförmig) und will für diese einen editor bauen.
    wenn ich nun die maus koordinaten umrechne usw und dann ein tile ändern will, kann ich aber nur jedes zwei tile ändern weil eines ja folgendermaßen aussieht:
    http://www.slin-online.de/tile1.bmp
    die magenta farbenen teile werden nicht mit angezeigt.
    wenn ich aber in jedem zweiten tile bin, bin ich immer mit der maus auf einem der vier umliegenden tiles, da die maus ja noch innerhalb eines solchen vierecks ist.
    nun hab ich mir gedacht, ich schau einfach in welchem der magentafarbenen teile die maus liegt und selektiere das entsprechende tile.

    dazu habe ich das tile in vier rechtecke zerlegt und habe jedes davon nochmal anhand des randes des angezeigten teiles eines jeden tiles in zwei dreiecke zerlegt (die diagonale ausgerechnet).

    das sah z.b. für das rechtecke links oben so aus:

    inline int WhereIsPointOnIsoTile(int x, int y, int tw, int th)
    {
      int rectX = 0, rectY = 0, rectW = tw/2, rectH = th/2, int d = 0;
    
      //Links oben
      d = (rectW*rectH)/2;
    
      /*nun will ich schauen ob der punkt x, y innerhalb des dreiecks liegt,
        welches die katheten rectW (breite) und rectH (höhe) und
        die hypertenuse d (die diagonale des rechtecks) hat.*/
    }
    

    nun meine frage:
    wie kann ich nun schauen, ob ein punkt innerhalb eines dreieckes liegt?

    danke sehr
    mfg



  • Das geht in diesem Spezialfall relativ einfach, da das Dreieck rechtwinklig ist. Du weißt sicher, wie man nachschaut, ob sich der Pointer in dem Rechteck zu dem das Dreieck gehört befindet. Einfach die Koordinaten anschaun. Außerdem kannst Du anhand der Diagonalen einfach ausrechnen wo die Diagonale an dieser Stelle ist. (Gleichung der Diagonalen aufstellen, x-Koordinate des Punktes einsetzen).
    Liegst Du jetzt drunter, dann bist Du drin, sonst eben nicht (wenn Du das Dreieck die Diagonale oben hat).

    Es gibt auch allgemeinere Verfahren für beliebige Dreiecke, aber das ist hier wohl schlicht nicht nötig.

    Aber ich hab noch andere Idee wie Du das implementieren könntest. Du könntest ein kleines "Bild" machen (so wie das, daß Du verlinkt hast). Aber Du färbst die Raute in der Mitte und die 4 Dreiecke jeweils anders ein. Wenn jetzt jemand in ein Tile klickt, dann rechnest Du um wo er in Dein "Bild" geklickt hat und schaust nach was für ne Farbe da ist. Je nach Farbe weißt Du wohin er geklickt hat. Das kostet Dich zwar den Speicher für das Bild (ist aber nicht so groß), dafür isses einfach zu implementieren und auch relativ schnell.

    MfG Jester



  • Jester schrieb:

    Du weißt sicher, wie man nachschaut, ob sich der Pointer in dem Rechteck zu dem das Dreieck gehört befindet. Einfach die Koordinaten anschaun.´

    ja, soweit ich weiß:

    if(pointX > rectX && pointX < rectX+rectW &&
       pointY > rectY && pointY < rectY+rectH)
      hier isses drinnen ^^
    

    Jester schrieb:

    Außerdem kannst Du anhand der Diagonalen einfach ausrechnen wo die Diagonale an dieser Stelle ist. (Gleichung der Diagonalen aufstellen, x-Koordinate des Punktes einsetzen).
    Liegst Du jetzt drunter, dann bist Du drin, sonst eben nicht (wenn Du das Dreieck die Diagonale oben hat).

    entschuldige die (vielleicht) dumme frage, aber wenn ich die diagonale mit d = a*b/2 ausrechne, wo ist dann platz für die x koordinate des punktes?
    kannst du mir ein kurzes beispiel geben?
    danke ^^

    Jester schrieb:

    Aber ich hab noch andere Idee wie Du das implementieren könntest. Du könntest ein kleines "Bild" machen (so wie das, daß Du verlinkt hast). Aber Du färbst die Raute in der Mitte und die 4 Dreiecke jeweils anders ein. Wenn jetzt jemand in ein Tile klickt, dann rechnest Du um wo er in Dein "Bild" geklickt hat und schaust nach was für ne Farbe da ist. Je nach Farbe weißt Du wohin er geklickt hat. Das kostet Dich zwar den Speicher für das Bild (ist aber nicht so groß), dafür isses einfach zu implementieren und auch relativ schnell.

    ginge auch, aber ich würds trotzdem gerne wissen wies rechnerisch geht 😉
    wissendurst 😉

    vielen dank schonmal



  • Irrenhaus schrieb:

    aber wenn ich die diagonale mit d = a*b/2 ausrechne, wo ist dann platz für die x koordinate des punktes?
    kannst du mir ein kurzes beispiel geben?

    Ja kann ich. 😉

    Du kannst die Gerade in der die Diagonale liegt als Gerade beschreiben:

    y = m*x + c (siehe 8.Klasse).

    dabei ist m=rectH/rectW die Steigung, c kriegste, indem Du es so berechnest, daß rectY = m*rectX+c ist. (linker unterer Punkt liegt auf der Diagonalen)

    Wenn Du in diese Gleichung jetzt die x-Koordinate des Punktes (also PointX) einsetzt, dann erhältst Du , wie hoch diie Diagonale an dieser Stelle ist.

    Jetzt vergleichst Du diesen Wert mit pointY und weißt, ob Dein Punkt oberhalb oder unterhalbt der Diagonalen liegt.

    MfG Jester



  • achso -.- *g*
    danke dir vielmals, jetzt funkt es ^^

    mfg


Anmelden zum Antworten