Prüfen ob Punkt im Rechteck liegt

JavaIsTheBest

Bekanntes Mitglied
Hallo,
ich habe keine Ahnung, wie ich überprüfen kann ob ein Punkt im oder außerhalb des Rechtecks ist.
Wie mache ich das?

Java:
public class Rect {
    private double m1,m2,b,h,breiteHoehe;
   
    public Rect(double m1, double m2){
        this.m1=m1;
        this.m2=m2;
    }
    public Rect(double m1,double m2,double b, double h){
        this(m1,m2); // Warum nicht this.m1, this.m2
        this.b=b;
        this.h=h;
    }
    public Rect(double m1,double m2, double breiteHoehe){
        this(m1,m2);
        this.breiteHoehe=breiteHoehe;
    }
    public double area(){
        return this.b*this.h;
    }
    public double circumference(){
        return 2*b+2*h;
    }
    public void move(double x, double y){
        this.b+=x;
        this.h+=y;
    }
    public void scale (double faktor){
        this.b*=faktor;
        this.h*=faktor;
    }
    public boolean contains(Point p){ // Warum kein new Point...
       
        return false;
    }
   

}
 

Anhänge

  • 2.png
    2.png
    8,8 KB · Aufrufe: 66
  • rect.png
    rect.png
    7,5 KB · Aufrufe: 57
Also wann liegt denn ein Punkt im Rechteck? Wenn die x-Koordinate des Punktes zwischen den x-Koordinaten des Rechtecks liegt und bezüglich der y-Koordinate ebenso.

Und wenn Du nur den Mittelpunkt + Höhe/Breite hast, dann ist es x-Koordinate von M +/- der Breite.
 
Das Koordinatensystem ist in Java so aufgebaut:
user_space.gif

Folgender Code zeigt die Theorie kneitzels in Aktion.
Java:
if(
Punkt.x > Rechteck.mittelpunkt.x - Rechteck.breite / 2 &&
Punkt.x < Rechteck.mittelpunkt.x + Rechteck.breite / 2 &&
&&
Punkt.y > Rechteck.mittelpunkt.y - Rechteck.höhe / 2 &&
Punkt.y < Rechteck.mittelpunkt.y + Rechteck.höhe / 2) {
    // Punkt liegt innerhalb des Rechtecks
}

Java:
public boolean contains(Punkt p) {
    double breite = this.breite / 2;
    double hoehe = this.hoehe / 2;
    return
        p.x > this.mittelpunkt.x - breite &&
        p.x < this.mittelpunkt.x + breite &&
        &&
        p.y > this.mittelpunkt.y - hoehe &&
        p.y < this.mittelpunkt.y + hoehe;
}

Edit: Nach kneitzels Anmerkung, verbessert, hatte den Mittelpunkt übersehen 🙂

P.S: Die Formatierung des Codes, ist absichtlich auseinander gezogen^^
 
Zuletzt bearbeitet:
@Jardcore Nicht ganz, da nicht die Ecke oben Links gegeben ist, sondern der Mittelpunkt. So habe ich zumindest die Zeichnung verstanden und das erklärt dann auch die Verwendung von m.

über den Punkt bin ich auch gestolpert, aber dadurch ergibt sich dann die Berechnung der Koordinaten über minus (linker punkt) und plus (rechter Punkt) von Breite/2
 
Wisst ihr, warum nicht das richtige Ergebnis rauskommt, wenn ich überprüfen will ob der Punkt im Rechteck liegt?

Java:
public class Rect {
    private double mx,my,b,h,breiteHoehe;
   
    public Rect(double m1, double m2){
        this.mx=m1;
        this.my=m2;
    }
    public Rect(double m1,double m2,double b, double h){
        this(m1,m2); // Warum nicht this.m1, this.m2
        this.b=b;
        this.h=h;
    }
    public Rect(double m1,double m2, double breiteHoehe){
        this(m1,m2);
        this.breiteHoehe=breiteHoehe;
    }
    public double area(){
        return this.b*this.h;
    }
    public double circumference(){
        return 2*b+2*h;
    }
    public void move(double x, double y){
        this.b+=x;
        this.h+=y;
    }
    public void scale (double faktor){
        this.b*=faktor;
        this.h*=faktor;
    }
    public boolean contains(Point p){
        if(p.getX()<b && p.getX()>mx-b/2 && p.getY()<h && p.getY()>h/2-my) return true;
        else return false;
    }
   
    public static void main(String[] args){
        Rect r1=new Rect(3,3);
        Point p1=new Point(2.5,3.5);
       
        System.out.print(r1.contains(p1));
    }
   

}
 
Also bezüglich der Prüfung, ob ein Punkt im Rechteck liegt hattest Du schon einige Antworten und in #3 ist sogar Code dabei, der die Prüfung zeigt.

Code:
   public Rect(double m1,double m2,double b, double h){
       this(m1,m2);// Warum nicht this.m1, this.m2
       this.b=b;
       this.h=h;
   }
Um diese Frage zu beantworten musst Du verstehen, was welche Variable ist!
Die Klasse definiert die Variablen mx, my, b und h. Daher sind diese Instanzvariablen immer mit this.mx, this.my, this.b und this.h ansprechbar. Das "this." kann dabei normalerweise weggelassen werden.

In dem oben gezeigten Konstruktor haben wir nun aber das Problem, dass die Instanzvariablen b und h durch die Parameter b und h verdeckt werden. b und h sind da nun die Parameter. Aber die Instanzvariablen sind über this.b und this.h immer noch zugreifbar.

Und die Werte sind natürlich in den Parametern, daher werden die Parameter m1 und m2 beim Aufruf des anderen Konstruktors angegeben. Und es existieren keine this.m1 und this.m2 weil die Variablen in der Instanz mx und my heissen.

Und dann ist mir noch aufgefallen:
Code:
   public void move(double x, double y){
       this.b+=x;
       this.h+=y;
   }

Wenn Du das Rechteck verschieben willst, verändern sich Breite und Höhe? Das halte ich für falsch.
 

Neue Themen


Zurück
Oben