File: MAARPacking.h

package info (click to toggle)
bandage 0.9.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 15,684 kB
  • sloc: cpp: 45,359; sh: 491; makefile: 12
file content (162 lines) | stat: -rw-r--r-- 5,739 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
 * $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)<br>
 * 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<Rectangle>& 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<Rectangle>& R);

		//Sorts elemets of R with momotonously decreasing width.
		void presort_rectangles_by_width(List<Rectangle>& R);

        //Sorts elemets of R with momotonously decreasing area.
        void presort_rectangles_by_area(List<Rectangle>& 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<PackingRowInfo>& P, List
            <ListIterator<PackingRowInfo> >&
            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<PackingRowInfo> find_Best_Fit_insert_position(
			ListIterator<Rectangle> 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<PackingRowInfo>& P, List
            <ListIterator
            <PackingRowInfo> >& row_of_rectangle, ListIterator
            <PackingRowInfo> 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<PackingRowInfo>& P,List<ListIterator
			<PackingRowInfo> >&
			row_of_rectangle,List<ListIterator
			<Rectangle> >& rectangle_order);

		//Returns the area of the bounding rectangles in R.
		double calculate_bounding_rectangles_area(List<Rectangle>&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<Rectangle> rect_item);

        double getAspectRatio(List<Rectangle>& R, double wrappingWidth);
        double getAspectRatioAgreement(double ar1, double ar2);

	};

}//namespace ogdf
#endif