////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2018 Leo Tenenbaum
// This file is part of GraphColoring.
//
// GraphColoring is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// GraphColoring 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.
//
// You should have received a copy of the GNU General Public License
// along with GraphColoring. If not, see .
////////////////////////////////////////////////////////////////////////////////
#include "geometry.hpp"
#define _USE_MATH_DEFINES
#include
#include
#include "errors.hpp"
namespace utils {
namespace geometry {
bool InRectangle(int x, int y, int rx, int ry, int rw, int rh)
{
return x >= rx && x <= rx+rw && y >= ry && y <= ry+rh;
}
bool InCircle(int x, int y, int cx, int cy, int r)
{
return (x-cx)*(x-cx) + (y-cy)*(y-cy) <= r*r;
}
double LineAngle(int x1, int y1, int x2, int y2)
{
if (x1 == x2)
{
if (y1 == y2)
return 0; // Give up
if (y1 < y2)
return M_PI / 2; // Slope = Positive infinity
if (y1 > y2)
return 3 * M_PI / 2; // Negative infinity
}
double slope = (double)(y2-y1)/(x2-x1);
return x2 > x1 ? atan(slope) : M_PI + atan(slope);
}
int PointToLineSegmentDistance(int x, int y, int x1, int y1, int x2, int y2,
int tolerance)
{
// See https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Line_defined_by_two_points
// Check if point is inside rectangle bounded by endpoints.
int min_x = std::min(x1, x2);
int min_y = std::min(y1, y2);
int max_x = std::max(x1, x2);
int max_y = std::max(y1, y2);
if (x < min_x-tolerance || x > max_x+tolerance || y < min_y-tolerance
|| y > max_y+tolerance)
return -1;
// Check if the two points are the same.
if (x1 == x2 && y1 == y2)
return sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
// Find distance to line.
int dx = x2-x1, dy = y2-y1;
double length = sqrt(dx*dx+dy*dy);
return abs(dy*x - dx*y + x2*y1 - y2*x1)/length;
}
} // namespace geometry
} // namespace utils