class Window { Config conf; Point point1; Point point2; Point point3; Point point4; Point insidePoint1; Point insidePoint2; Point insidePoint3; Point insidePoint4; FramePiece framePiece1; FramePiece framePiece2; FramePiece framePiece3; FramePiece framePiece4; float smallestAngle = PI / 2; float elevation; Window(Point point1, Point point2, Point point3, Point point4, float elevation) { this.conf = new Config(); this.elevation = elevation; this.point1 = point1; this.point2 = point2; this.point3 = point3; this.point4 = point4; this.insidePoint1 = getInsidePoint(this.point1, this.point4, this.point2, "+x"); this.insidePoint2 = getInsidePoint(this.point2, this.point1, this.point3, "+y"); this.insidePoint3 = getInsidePoint(this.point3, this.point2, this.point4, "-x"); this.insidePoint4 = getInsidePoint(this.point4, this.point3, this.point1, "-y"); this.framePiece1 = new FramePiece(this.point1, this.point2, this.insidePoint2, this.insidePoint1, this.elevation); this.framePiece2 = new FramePiece(this.point2, this.point3, this.insidePoint3, this.insidePoint2, this.elevation); this.framePiece3 = new FramePiece(this.point3, this.point4, this.insidePoint4, this.insidePoint3, this.elevation); this.framePiece4 = new FramePiece(this.point4, this.point1, this.insidePoint1, this.insidePoint4, this.elevation); } void drawYourself(float ratio) { this.framePiece1.drawYourself(ratio); this.framePiece2.drawYourself(ratio); this.framePiece3.drawYourself(ratio); this.framePiece4.drawYourself(ratio); } Point getInsidePoint(Point point1, Point point2, Point point3, String direction) { Vector vector1 = new Vector(point1, point2); Vector vector2 = new Vector(point1, point3); //winkelhalbierende Vector midVector = new Vector( vector1.getX() + vector2.getX(), vector1.getY() + vector2.getY() ); // winkel zwischen den beiden vektoren float angle = this.getAngle(vector1, vector2) / 2; if (angle * 2 < this.smallestAngle) { this.smallestAngle = 2 * angle; } //laenge des mittleren vektors float l = this.conf.frameSize / sin(angle); //println("l:" + l); //winkel zwischen einheitsvektor ind midVector float angleXAxis = this.getAngle(midVector, new Vector(1.0, 0.0)); float angleYAxis = this.getAngle(midVector, new Vector(0.0, 1.0)); //insidePoint int factor = 1; if (direction == "+x" && l * cos(angleXAxis) < 0) { factor = -1; } else if (direction == "-x" && l * cos(angleXAxis) > 0) { factor = -1; } else if (direction == "+y" && l * cos(angleYAxis) < 0) { factor = -1; } else if (direction == "-y" && l * cos(angleYAxis) > 0) { factor = -1; } Point insidePoint = new Point( point1.getX() + (l * cos(angleXAxis) * factor) , point1.getY() + (l * cos(angleYAxis) * factor), 0); return insidePoint; } float getAngle(Vector vector1, Vector vector2) { float angle = acos( ( vector1.getX() * vector2.getX() + vector1.getY() * vector2.getY() ) / ( sqrt ( pow(vector1.getX(), 2) + pow(vector1.getY(), 2) ) * sqrt ( pow(vector2.getX(), 2) + pow(vector2.getY(), 2) ) ) ); return angle; } float getSmallestAngle() { return this.smallestAngle; } }