I have a rectangle with size w
and height h
. Now I want to split this rectangle into n
new rectangles that are as similar as possible to a square. Afterwards I'd like to calculated the center of each square.
public static List<Point> getCenters(int number, double width, double height)
{
List<Point> points = new List<Point>();
int originalNumberOfSquares = number;
int numberOfSquares = number;
if (numberOfSquares % 2 == 1)
{
numberOfSquares++;
}
int rectangleWidth = Convert.ToInt32(width);
int rectangleHeight = Convert.ToInt32(height);
double minDistance = Double.MaxValue;
int nSquaresInRow = -1;
int nSquaresInColumn = -1;
for (int i = 0; i <= numberOfSquares; i++)
{
for (int j = 0; j <= numberOfSquares; j++)
{
if (i * j == numberOfSquares)
{
if (Math.Abs(i - j) < minDistance)
{
minDistance = Math.Abs(i - j);
nSquaresInRow = i;
nSquaresInColumn = j;
}
}
}
}
int squareWidth = rectangleWidth / nSquaresInColumn;
int squareHeight = rectangleHeight / nSquaresInRow;
for (int r = 0; r < originalNumberOfSquares; r++)
{
int xSquareCenter = (((r + 1) * 2) - 1) * (squareWidth / 2);
while (xSquareCenter > rectangleWidth)
{
xSquareCenter = xSquareCenter - rectangleWidth;
}
int row = (r / nSquaresInColumn) + 1;
int ySquareCenter = ((2 * row) - 1) * (squareHeight / 2);
points.Add(new Point(Convert.ToDouble(xSquareCenter), Convert.ToDouble(ySquareCenter)));
}
return points;
}
Now the code works, but I think it's a little bit ugly. Any hints on how I can improve it?