Testen ob eine Gerade einen Rechteck schneidet.



  • Kennt jemand ein effizientes Verfahren/Algo mit dem man testen kann ob eine Gerade einen rechteckigen Bereich schneidet? Die Gerade kann aber eine Rotation 0 - 360 Grad besitzen.

    Wie sieht dann die Berechnung aus?

    Danke im voraus.





  • probleme ergeben sich bei deiner beschreibung (@vertexwahn) wenn x1-x2 == 0 bzw. y1-y2 == 0. Dann steht 0 im Nenner und die Berechnung stimmtn icht mehr. Vielleicht könnte man das ganze auf die Parameterform der Geraden x=(x0/y0)+t(vx/vy) zurückführen und damit berechnen.



  • Maxi schrieb:

    probleme ergeben sich bei deiner beschreibung (@vertexwahn) wenn x1-x2 == 0 bzw. y1-y2 == 0. Dann steht 0 im Nenner und die Berechnung stimmtn icht mehr. Vielleicht könnte man das ganze auf die Parameterform der Geraden x=(x0/y0)+t(vx/vy) zurückführen und damit berechnen.

    abgesehen davon, das horizontale und vertikale Geradenstücke eh einfach geclippt werden können wird doch der Sonderfall behandelt:

    // Testen ob Strecke horizontal?
    if(y2-y1==0)
    {
    xs = rect.left;
    ys = y1; // Höhe ändert sich nicht
    }
    ...
    

    an den Stellen wo durch (x1-x2) getielt wird kann (x1-x2) nie 0 sein



  • z. B. hier:

    else if(outcode & IS_LEFT_OF) // Links davon?
    {
      // Testen ob Strecke horizontal?
      if(y2-y1==0)
      {
        xs = rect.left;
        ys = y1; // Höhe ändert sich nicht
      }
      else
      {
        xs = rect.left;
        ys = y1 + (xs - x1) * (y2 - y1) / (x2 - x1);
      }
    }
    

    hier wird durch x2-x1 geteilt - aber nur wenn ein Punkt links außerhalb des Rechtecks liegt und einer Innerhalb des Rechtecks - damit kann x2-x1 nicht 0 werden

    vielleicht habe ich noch etwas übersehen - wenn ja gibt mir bitte an mit welchen Prametern du die Funktion bool CohenSutherland(int &x1, int &y1, int &x2, int &y2, const RectangleV &rect) aufrufst


Log in to reply