This commit is contained in:
2025-03-12 12:37:19 +03:00
committed by Dudarenko
parent 0c9f0664fd
commit d4fb323f86
428 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
#include "layout.hpp"
#include "algebra.hpp"
#include <cmath>
#include <limits>
namespace nodesoup {
using std::vector;
void circle(const adj_list_t& g, vector<Point2D>& positions) {
const double pi = 3.14159265358979323846;
double angle = 2.0 * pi / g.size();
for (vertex_id_t v_id = 0; v_id < g.size(); v_id++) {
positions[v_id].x = cos(v_id * angle);
positions[v_id].y = sin(v_id * angle);
}
}
void center_and_scale(const adj_list_t& g, unsigned int width, unsigned int height, vector<Point2D>& positions) {
// find current dimensions
double x_min = std::numeric_limits<double>::max();
double x_max = std::numeric_limits<double>::lowest();
double y_min = std::numeric_limits<double>::max();
double y_max = std::numeric_limits<double>::lowest();
for (vertex_id_t v_id = 0; v_id < g.size(); v_id++) {
if (positions[v_id].x < x_min)
x_min = positions[v_id].x;
if (positions[v_id].x > x_max)
x_max = positions[v_id].x;
if (positions[v_id].y < y_min)
y_min = positions[v_id].y;
if (positions[v_id].y > y_max)
y_max = positions[v_id].y;
}
double cur_width = x_max - x_min;
double cur_height = y_max - y_min;
// compute scale factor (0.9: keep some margin)
double x_scale = (cur_width > 0) ? width / cur_width : width;
double y_scale = (cur_height > 0) ? height / cur_height : height;
Vector2D scale = { x_scale, y_scale };
// compute offset and apply it to every position
Vector2D center = { x_max + x_min, y_max + y_min };
Vector2D offset = (center / 2.0) * scale;
double shiftMinX = std::numeric_limits<double>::max();
double shiftMinY = std::numeric_limits<double>::max();
for (vertex_id_t v_id = 0; v_id < g.size(); v_id++)
{
positions[v_id] = (Point2D)((Vector2D)positions[v_id] * scale - offset);
shiftMinX = std::min(shiftMinX, positions[v_id].x);
shiftMinY = std::min(shiftMinY, positions[v_id].y);
}
shiftMinX = abs(shiftMinX) + 50;
shiftMinY = abs(shiftMinY) + 50;
for (auto& pos : positions)
{
pos.x += shiftMinX;
pos.y += shiftMinY;
}
}
}