Distributing elements

From TaskDepender
Jump to: navigation, search
(Design)
(Design)
 
Line 15: Line 15:
 
== Design ==
 
== Design ==
  
When distributing the elements evenly horizontally, the space between to adjacent elements must be equal. To calculate this value, the leftmost edge and the rightmost edge must be determined. This gives the total space to occupy. Next the total space occupied by the elements must be calculated. This is done by determining the sum of the widths of all the selected elements. Since for ''N'' selected elements there are ''N''-1 spaces, the value for the space between two adjacent elements is calculated by determining the difference between the rightmost edge and the leftmost edge minus the sum of the widths and dividing this value by ''N''-1.
+
When distributing the elements evenly horizontally, the space between to adjacent elements must be equal. To calculate this value, the leftmost edge and the rightmost edge must be determined as illustrated in the example in the figure below:
  
 
[[Image:Distribute.png]]
 
[[Image:Distribute.png]]
  
Assuming that the space between two adjacent elements is ''s'', then a certain element ''i'' must be positioned at:
+
This gives the total space to occupy. Next the total space occupied by the elements must be calculated. This is done by determining the sum of the widths of all the selected elements:
<syntaxhighlight lang="cpp">
+
left_edge =
+
</syntaxhighlight>
+
  
 +
<math>W  = \displaystyle\sum_{i=1}^N w_i</math>
  
 +
This is illustrated in the figure below:
  
The steps that need to be performed when the selected elements are to be horizontally distributed:
+
[[Image:Distribute_step_2.png]]
# Order the selected elements by position of the left edges.
+
# Set <tt>x_min</tt> to hold the left edge of the first element which is the leftmost edge.
+
# Set <tt>x_max</tt> to hold the right edge of the last element which is the rightmost edge.
+
# Set <tt>sum_width</tt> to hold the sum of the widths of all the elements.
+
# Set <tt>s=(x_max-x_min-sum_width)/(N-1)</tt>x_min</tt> to hold the space between two adjacent elements.
+
# Reposition all the elements except the first and the last element to their new position using the determined space.
+
  
<syntaxhighlight lang="cpp">
+
Using the fact that for ''N'' selected elements there are ''N''-1 spaces, it can be seen from the figure that the value for the space between two adjacent elements is calculated by determining the difference between the rightmost edge and the leftmost edge minus the sum of the widths and dividing this value by ''N''-1.
;
+
 
</syntaxhighlight>
+
[[Image:Distribute_step_3.png]]
 +
 
 +
Assuming that the space between two adjacent elements is ''S'', then the edge ''x<sub>i</sub>'' of certain element ''i'' must be positioned at:
 +
 
 +
<math>x_i = s_{i-1} + w_{i-1} + S</math>
 +
 
 +
with:
 +
* <math>s_{1} = x_{min}</math>
 +
* <math>S  = \displaystyle\frac{x_{max}-x_{min}-W}{N-1}</math>
 +
 
 +
This means that the position of the element is given by:
 +
 
 +
<math>X_i =x_i + w_i/2</math>
 +
 
 +
Since the algorithm assumes the elements being ordered by position of the left edges, this additional step must be performed before running the described algorithm.
 +
 
 +
The same algorithm can be used for distributing the elements vertically, in which case the equations are:
 +
 
 +
<math>y_i = s_{i-1} + h_{i-1} + S</math>
 +
 
 +
with:
 +
* <math>s_{1} = y_{min}</math>
 +
* <math>S  = \displaystyle\frac{y_{max}-y_{min}-H}{N-1}</math>
 +
* <math>H  = \displaystyle\sum_{i=1}^N h_i</math>
 +
 
 +
and the position of an element given by:
 +
 
 +
<math>Y_i =y_i + h_i/2</math>
  
 
== Implementation ==
 
== Implementation ==

Latest revision as of 15:27, 14 November 2011