package com.canoo.cog.solver;
/*
* #%L
* code-of-gotham
* %%
* Copyright (C) 2015 Canoo Engineering AG
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.util.List;
public class LittleBetterSolverEver implements Solver {
@Override
public String toString() {
return "Little Better Solver Ever";
}
@Override
public void solveProblem(CityNode node, int streetSize) {
// Solve leaf
if (node.isLeaf()) {
return;
}
// Solve problem for children hoods
for (CityNode childNode : node.getChildren()) {
solveProblem(childNode, streetSize);
}
//Solve problem
int max_y_axes = 0;
int max_x_offset = (int) Math.sqrt(node.getTotalArea());
int next_y_step = 0;
int offset_x = 0;
int offset_y = 0;
List<CityNode> children = node.getChildren();
for (CityNode child : children) {
// If reach end of row go to new row
if (offset_x >= max_x_offset) {
offset_x = 0;
offset_y += next_y_step + streetSize;
next_y_step = 0;
}
// Get maximum size in this row
if (child.getSize() > next_y_step) {
next_y_step = child.getSize();
}
// Set the current node
child.setX(offset_x);
child.setY(offset_y);
// Add the current node to the offset
offset_x += child.getSize() + streetSize;
// Update the maximum y offset
final int potentialNewYOffset = offset_y + child.getSize();
if (max_y_axes < potentialNewYOffset) {
max_y_axes = potentialNewYOffset;
}
// Update the maximum x offset
final int potentialNewXOffset = offset_x;
if (max_x_offset < potentialNewXOffset) {
max_x_offset = potentialNewXOffset;
}
}
node.setSize(Math.max(max_x_offset, max_y_axes));
}
}