Point mp = new Point(), endPoint; int xsize,ysize;   double ankath, hypo, gegenkath; double winkel, cosine, sine; int schnittx, schnitty;  transList = startState.getTransList(); current = transList.listIterator();  while (current.hasNext()) { currTrans = current.next(); endState = currTrans.getEndState();   if (endState==startState) { startLoc = startState.getLocation();
Point mp = new Point(), endPoint; int xsize,ysize;   double ankath, hypo, gegenkath; double winkel, cosine, sine; int schnittx, schnitty;  transList = startState.getTransList(); current = transList.listIterator();  spitze = new Polygon(); Point a = new Point();  while (current.hasNext()) { currTrans = current.next(); endState = currTrans.getEndState();   if (endState==startState) { startLoc = startState.getLocation();
    protected void drawTransitions(JState startState, Graphics g) {	Point startLoc, endLoc;	LinkedList<TransitionData> transList;	ListIterator<TransitionData> current;	JState endState;	TransitionData currTrans;        Polygon spitze;                // fr die Pfeilspitzen        double width = 5.0, length = 20.0;              	Point mp = new Point(), endPoint;	int xsize,ysize;	// dreiecksseiten	double ankath, hypo, gegenkath;	double winkel, cosine, sine;	int schnittx, schnitty;	transList = startState.getTransList();	current = transList.listIterator();	while (current.hasNext()) {	    currTrans = current.next();	    endState = currTrans.getEndState();	    // Transition ist eine Schlinge	    if (endState==startState) {                startLoc = startState.getLocation();	                startLoc.translate(STATE_HALFSIZE,STATE_HALFSIZE);                // zeichne einen  'dreiviertel bogen'                g.setColor(lineColour);		g.drawArc(startLoc.x-STATE_SIZE, startLoc.y-STATE_SIZE, STATE_SIZE, STATE_SIZE, 0, 270);		// die Transititionszeichen werden oberhalb des		// Kreisbogens dargestellt		mp.x = startLoc.x-STATE_SIZE;		mp.y = startLoc.y-STATE_SIZE-10;		g.setColor(charColour);                g.drawString(currTrans.getChars().toString(), mp.x, mp.y);		continue;	    }	                            	    // aktueller Zielzustand, linke obere Ecke, Mittelpunkt berechnen	    endLoc = endState.getLocation();	                // hat der aktuelle Zielzustand auch eine Transition zu uns,            // wird eine der beiden Transition leicht nach unten verschoben            // wurden die Transitionen des Zielzustands noch nicht gezeichnet            // wird unsere Transition zu ihm verschoben, der Zielzustand            // seinerseits wird seine dann nicht verschieben                    startLoc = startState.getLocation();                                    if (endState.hasTransTo(startState) && endState.getTransDrawn()) {                startLoc.translate(STATE_HALFSIZE,STATE_HALFSIZE-12);                endLoc.translate(STATE_HALFSIZE,STATE_HALFSIZE-12);            }            else {                startLoc.translate(STATE_HALFSIZE,STATE_HALFSIZE);                endLoc.translate(STATE_HALFSIZE,STATE_HALFSIZE);            }	    	    // fr die Beschriftung mit den Transitionszeichen die Mitte der Linie bestimmen	    xsize = Math.abs(endLoc.x-startLoc.x);	    ysize = Math.abs(endLoc.y-startLoc.y);	    xsize = xsize / 2;	    ysize = ysize / 2;	    // mit der Transition als Hypotenuse bildet	    // das ganze ein rechtwinkliges Dreieck, berechne die fehlenden Seiten	    ankath = Math.abs(startLoc.x-endLoc.x);	    gegenkath = Math.abs(startLoc.y-endLoc.y);	    hypo = Math.sqrt(ankath*ankath + gegenkath*gegenkath);	    // zu kurze Transition werden ausgeblendet	    if (hypo<MIN_STATE_DISTANCE) continue;	    // berechne nun den Winkel der zw. Hypo und Ankath. am Zielzustand	    if (hypo!=0)		winkel = gegenkath/hypo;	    else		winkel = 0;	    winkel = Math.asin(winkel);	    // um den Zielzustand befindet sich ein imaginrer Kreis, dessen Schnittpunkt	    // mit der Hypotenuse ist gesucht	    cosine = Math.cos(winkel);	    sine = Math.sin(winkel);	    // cos alpha = u/r -> u = cos alpha * r	    // u ist die x koor des Schnittpunkts	    // analog fr y	    schnittx = (int)(cosine*25);	    schnitty = (int)(sine*25);	    endPoint = new Point(endLoc);            	    // abhngig wie die Zustnde zueinander liegen wird dieser Punkt nun	    // auf den Mittelpunkt draufaddiert/subtrahiert            // TODO --- das geht besser :)                                   	    if (endLoc.x <= startLoc.x) {		mp.x = endLoc.x + xsize;		endPoint.x += schnittx;            }	    else {		mp.x = startLoc.x + xsize;		endPoint.x -= schnittx;            }	    if (endLoc.y <= startLoc.y) {		mp.y = endLoc.y + ysize;		endPoint.y += schnitty;                            }	    else {		mp.y = startLoc.y + ysize;		endPoint.y -= schnitty;            }            g.setColor(charColour);            g.drawString(currTrans.getChars().toString(), mp.x, mp.y-4); 	    g.setColor(lineColour);            g.drawLine(startLoc.x,startLoc.y,endPoint.x,endPoint.y);                                    // nicht 100% sauber, Pfeilspitze            double e_x, e_y;                        Point a, b, c;                        e_x = (endPoint.x - startLoc.x) / hypo;            e_y = (endPoint.y - startLoc.y) / hypo;                       a = new Point(); b = new Point(); c = new Point();                        a.x = endPoint.x - (int) Math.round(length/2*e_x);            a.y = endPoint.y - (int) Math.round(length/2*e_y);                        spitze = new Polygon();                        spitze.addPoint(endPoint.x, endPoint.y);                        spitze.addPoint(a.x - (int) Math.round(width*e_y),                            a.y + (int) Math.round(width*e_x));                        spitze.addPoint(a.x + (int) Math.round(width*e_y),                            a.y - (int) Math.round(width*e_x));                                    g.fillPolygon(spitze);                      	    	}    }