/*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