/*
* $Revision: 2559 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
***************************************************************/
/** \file
* \brief Implementation of class MAARPacking (used by FMMMLayout).
*
* \author Stefan Hachul
*
* \par License:
* This file is part of the Open Graph Drawing Framework (OGDF).
*
* \par
* Copyright (C)
* See README.txt in the root directory of the OGDF installation for details.
*
* \par
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* Version 2 or 3 as published by the Free Software Foundation;
* see the file LICENSE.txt included in the packaging of this file
* for details.
*
* \par
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* \par
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* \see http://www.gnu.org/copyleft/gpl.html
***************************************************************/
#ifdef _MSC_VER
#pragma once
#endif
#ifndef OGDF_MAAR_PACKING_H
#define OGDF_MAAR_PACKING_H
#include "PackingRowInfo.h"
#include "Rectangle.h"
#include "Set.h"
#include "../basic/List.h"
#include "PQueue.h"
namespace ogdf {
class MAARPacking
{
//data structure for packing rectangles within an area of a desired aspect ratio
//without overlappings; optimization goal: to minimize the used aspect ratio area
public:
MAARPacking(); //constructor
~MAARPacking(); //destructor
//The rectangles in R are packed using the First Fit tiling stratey (precisely the
//new down left corner coordinate of each rectangle is calculated and stored in R).
//The aspect ratio area and the area of the bounding rectangles are calculated,
//too.
void pack_rectangles_using_Best_Fit_strategy(List& R, double
aspect_ratio, int presort, double&
aspect_ratio_area, double&
bounding_rectangles_area);
private:
double area_height; //total height of the packing area
double area_width; //total width of the packing area
//Sorts elemets of R with momotonously dedreasing height.
void presort_rectangles_by_height(List& R);
//Sorts elemets of R with momotonously decreasing width.
void presort_rectangles_by_width(List& R);
//Sorts elemets of R with momotonously decreasing area.
void presort_rectangles_by_area(List& R);
//Creates a new empty row in P and inserts r into this row (by updating P,
//row_of_rectangle and total_width_of_row).
void B_F_insert_rectangle_in_new_row(Rectangle r, List& P, List
>&
row_of_rectangle);
//Finds the Best Fit insert positions of *rect_item and returns the
//corresp. ListIterator in P or NULL (indicating that a new row has
//to be created in P); aspect_ratio_area stores the used aspect ratio area of
//the drawing.
ListIterator find_Best_Fit_insert_position(
ListIterator rect_item,
double aspect_ratio,
double& aspect_ratio_area,
PQueue& total_width_of_row);
//Inserts r into the row with corresponding ListIterator B_F_item and updates
//total_width_of_row.
void B_F_insert_rectangle(Rectangle r, List& P, List
>& row_of_rectangle, ListIterator
B_F_item);
//The information in P and row_of_rectangle are used to generate the new down left
//coordinates of the rectangles in R (rectangle_order holds the order in which
//the rectangles of R have to be processed.
void export_new_rectangle_positions(List& P,List >&
row_of_rectangle,List >& rectangle_order);
//Returns the area of the bounding rectangles in R.
double calculate_bounding_rectangles_area(List&R);
//Calculate the aspect ratio area of a rectangle with width w and height h and the
//given aspect ratio r.
double calculate_aspect_ratio_area(double w,double h,double r);
//Returns true if the aspect_ratio_area of the acual packing becomes better, when
//tipping r over bevore inserting it into the new row. best_area holds the aspect
//ratio area of the best of the two insertion alternatives.
bool better_tipp_rectangle_in_new_row(Rectangle r,double aspect_ratio,
double& best_area);
//Returns true if the aspect_ratio_area of the acual packing becomes better, when
//tipping r over bevore inserting it into the existing row B_F_row. best_area holds
//the aspect ratio area of the best of the two insertion alternatives.
bool better_tipp_rectangle_in_this_row(Rectangle r,double aspect_ratio,
PackingRowInfo B_F_row,double& best_area);
//Tipps *rect_item over, by newly calculatting its width, height, and old_dlc
//values (Coordinates of the underlying connected subgraph are not recaculated
//here!!!). The new values are saved in R[rect_item] and are returned.
Rectangle tipp_over(ListIterator rect_item);
double getAspectRatio(List& R, double wrappingWidth);
double getAspectRatioAgreement(double ar1, double ar2);
};
}//namespace ogdf
#endif