Punkt auf,über,unter oder zwischen 2 Geraden

JT1337

Mitglied
Seid gegrüßt!
Ich bin im 2 Jahr Abendschule Elektrotechnik und habe seit heuer das Vergnügen Java programmieren zu Lernen 🙂

Mir wurden 2 Geraden im Koordinatensystem angegeben;
y = -1,8*x+1,1
y= 0,6*x+2,8
- Nun soll ich die Koordinaten(x,y) eines Punkte einlesen - bis hierher kein Problem.
Dann aber soll ich Vergleichen, ob der eingegebene Punkt auf,über,unter oder zwischen den Geraden liegt.
Dies soll ich mittels if/else Verzweigung erledigen.


Unten ist noch das Programm, welches ich bis jetzt geschrieben habe, für mehr würde ich bitte bitte Hilfe oder Tipps brauchen, kann mir jemand helfen?

package hausuebungen;
import java.util.Scanner;
/** Programm soll die Koordinaten eines Punktes von der Tastatur einlesen und ausgeben,
* ob dieser auf,über,unter oder zwischen den Geraden liegt
* @author tomal
*
*/
public class Geraden_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// Variablen festlegen
double Px,Py,y1,y2;
double k1 = -1.8; double d1 = 1.1;
double k2 = 0.6; double d2 = 2.8;
// Koordinaten des Punktes eingeben
System.out.print("Geben sie die x-Koordinate des Punktes ein:");
Px = sc.nextDouble();
System.out.print("Geben sie die y-Koordinate des Punktes ein:");
Py = sc.nextDouble();
// Berechnung
y1 = Px*k1+d1;
y2 = Px*k2+d2;
 
Bis dahin sieht das doch gar nicht so verkehrt aus. Ich verstehe jetzt nur nicht, wo das Problem liegt. Du weißt jetzt, welche y-Werte die beiden Geraden an der Stelle auf der x-Achse annehmen, an er sich auch Dein Punkt befindet.

Jetzt ermittelst Du noch, welche der beiden Koordinaten y1 und y2 die größere ist. Dann kannst Du sagen: liegt Py über der größeren y-Koordinate, liegt der Punkt über den Geraden, liegt Py dagegen unter der kleineren y-Koordinate, liegt der Punkt unter den Geraden. Ansonsten könnte es sein, dass Py (und damit der Punkt) über der kleineren aber unter der größeren y-Koordinate und damit zwischen den Geraden liegt. Ist auch das nicht der Fall, muss P auf (mind.) einer Gerade liegen.
 
Lieben Dank für die rasche Antwort mihe7!
So weit so gut. Ich stand gestern Abend schon etwas auf der Leitung.
Mein fertiges Programm würde nun so Aussehen und habe es auch Online bei meinem Professor abgegeben, wo der Server zurück meldet: 0,8/1 Punkten.
Also nicht so schlecht aber irgendetwas dürfte noch nicht stimmen?


package hausuebungen;
import java.util.Scanner;
/** Programm soll die Koordinaten eines Punktes von der Tastatur einlesen und ausgeben,
* ob dieser auf,über,unter oder zwischen den Geraden liegt
* @author tomal
*
*/
public class Geraden_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// Variablen festlegen
double Px,Py,y1,y2;
double k1 = -1.8; double d1 = 1.1;
double k2 = 0.6; double d2 = 2.8;
// Koordinaten des Punktes eingeben
System.out.print("Geben sie die x-Koordinate des Punktes ein:");
Px = sc.nextDouble();
System.out.print("Geben sie die y-Koordinate des Punktes ein:");
Py = sc.nextDouble();
// Berechnung
y1 = Px*k1+d1;
y2 = Px*k2+d2;
if (Py>y2) System.out.println("Punkt liegt über den Geraden");
else if (Py<y1) System.out.println("Punkt liegt unter den Geraden");
else if (Py>y1&&Py<y2) System.out.println("Punkt liegt zwischen den Geraden");
else System.out.println("Punkt liegt auf einer der Geraden");
sc.close();
}
 
Du hast 2 Geraden mit unterschiedlicher Steigung. Die höhere Gerade vor dem Schnittpunkt ist nicht die höhere nach dem Schnittpunkt. Es reicht also nicht aus nur ein y hier zu prüfen:
Java:
if (Py>y2) System.out.println("Punkt liegt über den Geraden");
Py muss größere als y1 UND y2 sein um über beiden gerade zu liegen.

Ähnliches gilt für die anderen ifs
 
Danke für eure Hilfe, die Lösung;

package hausuebungen;
import java.util.Scanner;
/** Programm soll die Koordinaten eines Punktes von der Tastatur einlesen und ausgeben,
* ob dieser auf,über,unter oder zwischen den Geraden liegt
* @author tomal
*
*/
public class Geraden_2 {

/**
* Gibt an ob double x ueber double y und double z ist
* @param x erster Parameter
* @param y zweiter Parameter
* @param z dritter Parameter
* @Return wenn ueber true
*/
public static boolean ueber(double x, double y,double z) {
if (x>y&&x>z) return true;
else return false;
}

/**
* Gibt an ob double x unter double y und unter double z ist
* @param x erster Parameter
* @param y zweiter Parameter
* @param z dritter Parameter
* @Return wenn unter true
*/
public static boolean unter(double x, double y,double z) {
if (x<y&&x<z) return true;
else return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// Variablen festlegen
double pX,pY,y1,y2;
double k1 = -1.8; double d1 = 1.1;
double k2 = 0.6; double d2 = 2.8;
// Koordinaten des Punktes eingeben
System.out.print("Punkt x:");
pX = sc.nextDouble();
System.out.print("Punkt y:");
pY = sc.nextDouble();
// Berechnung
y1 = pX*k1+d1;
y2 = pX*k2+d2;
if (ueber(pY,y1,y2)) System.out.println("Der Punkt liegt ueber den Geraden");
else if (unter(pY,y1,y2)) System.out.println("Der Punkt liegt unter den Geraden");
else System.out.println("Der Punkt liegt zwischen den Geraden");
sc.close();
}
}
 
Besser, jetzt hast du es dir aber schwer gemacht.

Java:
// schlecht
public static boolean ueber(double x, double y,double z) {
    // Sowas ist immer total überflüssig:
    if (x>y&&x>z) return true;
    else return false;
}

// besser durch sinnigere Benennung und vereinfachten return
public static boolean ueber(double y, double y1, double y2) {
    return y>y1 && y>y2;
}

// am besten lass die Methode aber weg
if (pY>y1 && pY>y2) System.out.println("Der Punkt liegt ueber den Geraden");

// du hast auch noch den Fall AUF den Geraden nun vernachlässigt. In deiner Aufgabe steht er mit drin.
if (pY==y1 || pY==y2) System.out.println("Der Punkt liegt auf den Geraden");
 
Super! Vielen Dank für die genaue Erläuterung.

Mein Professor hat aber auf die "Methoden Methode" bestanden, da sonst das Beispiel als falsch gewertet wurde.
Vermutlich, weil wir es letzte Stunde gelernt haben 🙂
 
Dann aber soll ich Vergleichen, ob der eingegebene Punkt auf,über,unter oder zwischen den Geraden liegt.

Um zu bestimmen, ob ein Punkt oberhalb oder unterhalb einer Geraden liegt muss vorweg die Koordinate die für die Höhe gewählt wird bestimmt werden. Im 2D Raum ist da wohl die y Koordinate und im 3D Raum die z-Koordinate günstig. Des Weitern muss dann der Schnittpunkt der Höhenachse durch den Punkt mit der Geraden ermittelt werden. Dann kann man bestimmen ob der Punkt oberhalb, unterhalb oder auf der Geraden liegt.

--> 2D
g: y = f(x)
P: p = (x,y)

yCompare = f( p.x )
wenn yCompare < p.y --> Punkt oberhalb
wenn yCompare > p.y --> Punkt unterhalb
wenn yCompare == p.y --> Punkt auf der Geraden

--> 3D
g: z = f(x,y)
P: p = (x,y,z)

zCompare = f( p.x, p.y )
wenn yCompare < p.z --> Punkt oberhalb
wenn yCompare > p.z --> Punkt unterhalb
wenn zCompare == p.z --> Punkt auf der Geraden
 
Was passiert wenn ich nach
Java:
System.out.print("Geben sie die x-Koordinate des Punktes ein:");
Px = sc.nextDouble();
System.out.print("Geben sie die y-Koordinate des Punktes ein:");
Py = sc.nextDouble();
sowas wie -> "ungefähr 2.0 oder 4.0 " eintippe.
Fehlt etwas im Code
 
sowas wie -> "ungefähr 2.0 oder 4.0 " eintippe
Du bekommst einen Fehler da er sich 4,0 für einen Double erwartet.
Die Methode ist zum Einlesen eines Doubles sowieso ungeeignet, da eventuelle Eingabefehler nicht abgefangen werden. Besser man definiert sich so etwas um eine Zahl einzulesen -->

Java:
private static double readDouble(Scanner scanner, String label) {
        double value = 0;
        boolean ok = false;
        do {
            System.out.print(label + "\t");
            try {
                value = Double.parseDouble(scanner.next());
                ok = true;
            } catch (NumberFormatException e) {
                System.err.println("Bitte eine Zahl eingeben!");
            }
        } while (!ok);
        return value;
    }
😉
 

Zurück
Oben