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