suche if collision_unregelmaessigesrechteck()

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • suche if collision_unregelmaessigesrechteck()

    ja, wie die überschrift schon sagt, suche ich eine möglichkeit eine kollisionsabfragezu mit einem unregemläßigen rechteck zu machen. von diese rechteck sind nur die vier eckpunkte bekannt x1,y1 ; x2,y2 ; x3.y3 ; x4.y4; .
    mir ist nach 2 tage überlegung nix eingefallen, was aber auch auf meine momentan angschlagene gesundheit zurückgehen kan. hoffe das ihr mir helfen könnt.
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
  • mhh...
    ich glaube er will auch im rechteck auf eine kollision prüfen.
    da wären collision lines nicht die lösung.
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Mir fällt im moment nur ein, dass du die die längere Diagonale raussuchst, von deren Mitte aus ein collision_circle machst und dann überprüfst, ob das object innerhalb des Rechtecks ist.
    Allerdings gibt es dann das Problem, dass bei einer falsifizierung andere Objekte im Viereck nicht beachtete werden.

    Wenn sich das Viereck nicht zu oft ändert könntest du auch mithilfe einer Surface ein Sprite erstellen, mithilfe dessen und eines anderen objects du wiederum instance_position(...) benutzen könntest.
  • also, ich brauche schon eine vollständige, dh auch innerhalb des viereckes, nicht nur die aussenkanten, kollision. das mit den line geht leider nicht.
    @Agnahim:
    deinen vorschlag verstehe ich irgentwie noch nicht. wen ich die längere diagonal nehme und dan von der mitte aus einen cirkelcollision mache, (bis wohin? bis zum endpunkt der diagonalen?) und dan prüfen ob es innerhalb des viereckes (wie das? genau das is ja das problem) mache. wie soll das gehen?

    achja, ich habe mir das viereck nochmal genau angesehen, es entsteht immer eine raute, wen man das überstehende stück abschneidet und es dan die andere seite kleben würde (wie man das in der grundschule zum flächeninhalt berechnen anschaulich erklärt hat) erhält mn wieder ein richtiges rechteck.
    vieleicht kan an damit was anfangen.
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
  • Ich könnte mir auch vorstellen, dass das so funktioniert.

    Male das viereck auf eine surface (mit draw_primitive.... draw_vertex...)
    danach createst du einen Sprite von der surface

    sprite_create_from_surface

    den sprite setzt Du jetzt noch auf Precise-Collision-check

    und schon hast du eine vorlage für deine Collisionsabfrage.


    Hab das zwar nicht probiert, müsste aber eigentlich hinhauen.
  • Original von Nobody-86
    also, ich brauche schon eine vollständige, dh auch innerhalb des viereckes, nicht nur die aussenkanten, kollision. das mit den line geht leider nicht.
    @Agnahim:
    deinen vorschlag verstehe ich irgentwie noch nicht. wen ich die längere diagonal nehme und dan von der mitte aus einen cirkelcollision mache, (bis wohin? bis zum endpunkt der diagonalen?) und dan prüfen ob es innerhalb des viereckes (wie das? genau das is ja das problem) mache. wie soll das gehen?

    achja, ich habe mir das viereck nochmal genau angesehen, es entsteht immer eine raute, wen man das überstehende stück abschneidet und es dan die andere seite kleben würde (wie man das in der grundschule zum flächeninhalt berechnen anschaulich erklärt hat) erhält mn wieder ein richtiges rechteck.
    vieleicht kan an damit was anfangen.

    Also das mit Der Raute hilft mir schon, da ich dadurch weiß, dass das Viereck nicht konkav ist.

    Desweiteren gehe ich bei meinen Ausführen jetzt davon aus, dass die Ecken des Vierecks im Gegenuhrzeigersinn geordnet sind und (x1;y1) links oben ist.

    GML-Quellcode

    1. var diag_x, diag_y, diag_length, m1, t1, m2, t2, m3, t3, m4, t4, _id, test1, test2, test3, test4;
    2. diag_length = max(sqrt(sqr(x3-x1)+sqr(y3-y1)), sqrt(sqr(x4-x2)+sqr(y4-y2));
    3. diag_x = (x3-x1)/2+x1;
    4. diag_y = (y3-y1)/2+y1;
    5. m1 = (y2-y1)/(x2-x1);
    6. m2 = (y3-y2)/(x3-x2);
    7. m3 = (y4-y3)/(x4-x3);
    8. m4 = (y1-y4)/(x1-x4);
    9. t1 = y1 - m1*x1;
    10. t2 = y2 - m2*x2;
    11. t3 = y3 - m3*x3;
    12. t4 = y4 - m4*x4;
    13. _id = collision_circle(diag_x, diag_y, diag_length/2, all, true, true);
    14. //hier muesste man nun alle Vier Ecken der Boundingbox prüfen um sicher zu sein...
    15. test1 = m1*_id.x + t1 > _id.y;
    16. test2 = m2*_id.x + t2 > _id.y;
    17. test3 = m3*_id.x + t3 < _id.y;
    18. test4 = m4*_id.x + t4 < _id.y;
    19. return (test1 && test2 && test3 && test3);
    Alles anzeigen


    So in der Art hatte ich mir das vorgestellt....wie gesagt funktioniert es aber nicht einwandfrei. Wenn ein Objekt den "collision_circle" auslöst, aber nicht im viereck ist, dann wird false zurückgegeben, obwohl sich noch Objekte im Viereck befinden könnten, deswegen hab ich es auch nicht ganz ausgearbeitet.

    EDIT: @ Jürgen: Ich hab oben das geschrieben: :D
    Wenn sich das Viereck nicht zu oft ändert könntest du auch mithilfe einer Surface ein Sprite erstellen, mithilfe dessen und eines anderen objects du wiederum instance_position(...) benutzen könntest.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Agnahim ()

  • ich habe es mir nochmal angesehen und eine relativ einfache lösung gefunden, wen man einen sprite zerren könnte.
    mit zerren mein ich den befehl der so in paint heißt. also die obere seite nach links/rechts verschieben, bzw. die linke nach oben/unten, während di anderen gleichbeiben.
    geht das? ich habe auf die schnelle keinen befehl in der hilfe gefunden.
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
  • Tolle Arbeit Jürgen...nur das hilft imh bei der Kollision nur wieder mit ner Surface....

    @ Nobody: beschreib mal ein bisschen genauer was du überhaupt bezwecken willst, evtl kann man das auch anders lösen...^^
  • also, es soll für mein rts werden, allerdings ist es 3d, darum würde mir eine ohne-surface lösung besser gefallen. die einheitenselektion geht wiein jedem rts über einen rahmen, den man mit der maus aufziehen kan.
    wegen der 3d, kan ich kein normales viereck nehme, wegen der optischen verzerrung. imoment habe ich das so geregelt das ein viereck auf dem boden erscheint. ich auch ein neter effekt, aber wen ich mehrere ebenen einbau, sieht man das vierek unter umständen nicht, da einhügel über ihm ist.
    darum dachte ich mit ich nehme besser ein viereck was rechtwinklig zum bildschirm ist, und nicht zur map, was aber zimlich schwieirg ist, da es dan wie gesagt durch die optische verzerrung kein rechteck auf der map ist.

    am besten lädst du dir das file mal runter, dan sieht man es besser.
    3D_RTS (update 22-03-2006)
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
  • in der gmc habe ich dieses hier gefunden:
    forums.gamemaker.nl/index.php?showtopic=203964
    allerdings steht es ganau an dem selben problem wie ich.
    A little remark: I've had this problem before, and when you draw a selection box (probably a rectangle) with your mouse, the corresponding 3D coördinates of the corners do NOT form a rectangle. I was struggling more than a week with the selection, because I was relying on the fact that they did form a rectangle. This smiley shows the best how I felt when I found out:
    eben ein viereck, was unter dem kamerqawinkel in 3d nicht mehr orthogonal ist.
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl