import eprog.*;
import java.util.*;
import java.awt.geom.*;
public class Konvneck extends EprogIO
{
public static void main(String[] args){
// einlesen der KoordinatenPaare
Vector points = new Vector(15);
boolean error = false;
Point2D.Double prevPoint = null;
boolean schnitt = false;
String zwLage = "";
for (String input = readWord(); !input.equals("="); input = readWord()) {
try {
Point2D.Double currentPoint;
points.add(currentPoint = koordinaten(input)); // hollt den Punkt aus dem String
if(prevPoint != null){ // wenn es nicht der erste Punkt ist
if(currentPoint.equals(prevPoint)){ // dann ueberprueft es ob Sie gleich sind
error = true;
}
}
prevPoint = currentPoint;
} catch (Exception e) {
error = true;
}
}
if(points.size() < 3 || points.size() > 15 || error == true){
println("FALSCHE EINGABE");
return;
}
Vector lines = new Vector(15);
for (int k = 1; k < points.size(); k++){
lines.add(new Line2D.Double((Point2D.Double) points.get(k-1), // verbindet vorrigen Punkt
(Point2D.Double) points.get(k))); // mit dem folgenden Punkt
}
lines.add(new Line2D.Double((Point2D.Double) points.lastElement(), // schliess Polygon
(Point2D.Double) points.firstElement()));
if(schneidet(lines)){ // wenn sich etwas schneidet dann schnitt = true
schnitt = true;
}
int summe = 0;
int zwWert = 0;
int count = 0;
Point2D.Double punkt1, punkt2, punkt3;
for(int n = 1; n < (points.size() - 1); n++){
punkt1 = (Point2D.Double) points.get(n-1);
punkt2 = (Point2D.Double) points.get(n);
punkt3 = (Point2D.Double) points.get(n+1);
zwWert = pruefe(punkt1, punkt2, punkt3); // ueberprueft ob es konkav, konvex
summe += zwWert; // oder ein Eckpunkt auf einer Kante liegt
count++;
}
int secondLast = (points.size() - 2);
punkt1 = (Point2D.Double) points.get(secondLast);
punkt2 = (Point2D.Double) points.lastElement();
punkt3 = (Point2D.Double) points.firstElement();
zwWert = pruefe(punkt1, punkt2, punkt3);
summe += zwWert;
zwLage = lage(summe, count);
if(zwLage == "FALSCHE EINGABE"){ // wenn ein Eckpunkt auf einer Kante liegt
println(zwLage); // dann gibt es "FALSCHE EINGABE" aus
}else{
if(schnitt == true){ // anderenfalls wenn sich Kanten schneiden
println("SCHNEIDET"); // wird "SCHNEIDET" ausgegeben
}else{
println(zwLage); // wenn das nicht der Fall ist dann
} // soll ausgegeben werden ob es Konvex
} // oder Konkav ist
}
// parameter input: die Eingabe in der Form (x,y)
// gibt aus: Point2D.Double mit den rausgefilterten Koordinaten
static Point2D.Double koordinaten(String input){
StringTokenizer tk = new StringTokenizer(input, "(,)", false);
double x = 0,y = 0;
String[] koord = new String[tk.countTokens()];
for(int i = 0; i < koord.length; i++){
koord[i] = tk.nextToken();
}
x = Double.parseDouble(koord[0]);
y = Double.parseDouble(koord[1]);
return new Point2D.Double(x,y);
}
// parameter summe: ein abgespeicherte Wert
// parameter count: die anzahl der Schleifendurchgänge
// gibt aus: String ob es FALSCHE EINGABE , KONKAV oder KONVEX ist
static String lage(int summe, int count){
int remainder = summe % count;
String location = "";
if(summe > 1000){
location = "FALSCHE EINGABE";
}else{
if(remainder == 0){
location = "KONKAV";
}
if(remainder == 1){
location = "KONVEX";
}
}
return location;
}
// parameter punkt1-punk3: Point2D.Double mit den Koordinaten
// gibt aus: einen Wert der angibt ob der 3te Punkt rechts, links oder darauf ist bzg.
// der Geraden die mit den ersten 2 Punkten gebildet wird
static int pruefe(Point2D.Double punkt1, Point2D.Double punkt2, Point2D.Double punkt3){
double x[] = new double[3];
double y[] = new double[3];
x[0] = punkt1.getX();
y[0] = punkt1.getY();
x[1] = punkt2.getX();
y[1] = punkt2.getY();
x[2] = punkt3.getX();
y[2] = punkt3.getY();
int value = 0;
double d1 = (x[0] * y[1]) - (x[1]* y[0]);
double d2 = x[2] *(y[1] - y[0]) + y[2] *(x[0] - x[1]);
if(d2 < d1){
value = 1; //links
}
if(d2 > d1){
value = 2; //rechts
}
if(d2 == d1){
value = 1000; //drauf
}
return value;
}
// parameter lines: Vector mit Line2D.Double Objekten welche ein Polygon bilden
// gibt aus: true wenn sich Kanten des Polygons schneiden
static boolean schneidet(Vector lines){
boolean schnittPunkt = false;
for (int l = 0; l < lines.size(); l++) {
Line2D.Double line1 = (Line2D.Double) lines.get(l);
for (int m = 0; m < lines.size(); m++) {
Line2D.Double line2 = (Line2D.Double) lines.get(m);
if (!line1.equals(line2) &&
!line1.getP1().equals(line2.getP2()) &&
!line1.getP2().equals(line2.getP1())){
if (line1.intersectsLine(line2)){
schnittPunkt = true;
}
}
}
}
return schnittPunkt;
}
}