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; } }
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