/*Author: Slavica Barbaric Bsp:3154 */ import eprog.*; //importieren der eprog-Klasse import java.util.*; public class Konvneck { public static class EOF extends java.lang.Throwable {}; public static class Punkt //Definition einer neuen Klasse "Punkt", //die die Koordinaten x, y und folgende //Methoden enthaelt: { float x; float y; public Punkt(float x1,float y1) //Konstruktor der Klasse Punkt { this.x = x1; this.y = y1; }; public Punkt() throws EprogException,EOF { String readstr =EprogIO.readWord(); readstr.trim(); //delete whitespace if ((readstr.charAt(0) != '(') || (readstr.charAt(readstr.length()-1) != ')')){ if (readstr.charAt(0) == '='){ throw(new EOF()); //This is not an error but merely the end of input }else{ throw(new EprogException("Parserfehler beim Koordinatenpaar [sollte in form (x,y) sein]")); } } if ((readstr.length() < 5) || (readstr.indexOf(",") == -1)) throw new EprogException(); // das Eingabekoordinatenpaar hat mindestens laenge 5: (0,0) this.x=Float.parseFloat(readstr.substring(1,readstr.indexOf(','))); //string representation of the x value is here this.y=Float.parseFloat(readstr.substring(readstr.indexOf(',')+1,readstr.length()-1));//string representation of the y value is here if (!this.InputTest()) throw new EprogException("Falscher Eingabebereich"); } public Boolean Equals(Punkt p) //Methode um zu testen, ob sich zwei //Punkte paarweise voneinander //unterscheiden { return (this.x == p.x && this.y == p.y); } public Boolean InputTest() //Methode um die Zulaessigkeit der //Eingabe zu pruefen { if ((x < -100) || (x > 100) || (y < -100) || (y > 100 )) return false; else return true; } public float isLeft(Punkt a,Punkt b) { return ( (b.x - a.x) * (this.y - a.y) - (this.x - a.x) * (b.y - a.y) ); } } public static boolean cross(Punkt g1, Punkt g2, Punkt f1, Punkt f2) { if ( (f1.isLeft(g1,g2) < 0) != (f2.isLeft(g1,g2)<0 )) { if((g1.isLeft(f1,f2) <0 ) != (g2.isLeft(f1,f2) <0)) { return true; /* Geraden Schneiden da sowohl die Punkte g1 und g2 auf verchiedenen Seiten gegenueber der geraden durch (f1, f2) liegen, als auch DIE pUNKTE F1 UND F2 GEGENUEBER DER gERADEN (g1,g2)*/ } } return false; } public static void main(String[] args) //Methode main { //try-catch-Block um Exceptions zu fangen try { //Erzeugung von 3 Objekten des Typs Punkt und Einlesen //der Punktekoordinaten mittels der EprogIO Vector v= new Vector(); boolean konkav=false; int konvex=0; //0=unknown 1=konvex boolean falscheEingabe=false; try{ while(true){ try { v.addElement(new Punkt()); } catch (EprogException e){ //Siehe Fehlerbehandlung: Es sind so lange strings einzulesen bis = eingegeben wird. //Fehler heiszt also nicht dasz nicht weiterhin eingelesen werden soll falscheEingabe = true; } if (v.size() > 2){ float f=v.elementAt(v.size()-1).isLeft(v.elementAt(v.size()-3), v.elementAt(v.size()-2)); if (f==0) falscheEingabe = true; if( !konkav && (((konvex < 0) && (f >0)) || ((konvex > 0) && (f <0)) ) ) { konkav = true; } } } } catch (EOF e) {} //exit when EOF is caught if (falscheEingabe) throw new EprogException(); // No undefined characters Read if ((v.size() < 3) || (v.size() >15)) throw new EprogException(); //vector size is OK if (!konkav ){ //Ueberpruefe den ersten Punkt bez. der letzten 2 float f=v.elementAt(0).isLeft(v.elementAt(v.size()-2), v.elementAt(v.size()-1)); if (f==0) throw new EprogException(); if( !konkav && (((konvex < 0) && (f >0)) || ((konvex > 0) && (f <0))) ){ // entweder Konkavitaet schon festgestellt, oder tangente hat naechsten punkt auf entgegenge- //setzter Seite im Vergleich zur Vorgaengertangente konkav = true; } } int i =0, j=0; for ( ; i TOP Contact me
Fr Jul 30 13:54:24 CEST 2021
patent_button.gif valid-html401.png elektra.jpg fsfe-logo.png valid-css.png vim.gif anybrowser.gif