Files
vroni/geom.h
T
SaraP f3e15b8c8d vroni 7.6 :
- aggiunti file della libreria e progetto visual studio.
2023-09-06 15:44:02 +02:00

130 lines
4.4 KiB
C

/*****************************************************************************/
/* */
/* Copyright (C) 2010-2023 M. Held, S. Huber */
/* */
/* This code is not in the public domain. All rights reserved! Please make */
/* sure to read the full copyright statement contained in "README.txt" or in */
/* the "main" file of this code, such as "main.cc". */
/* */
/*****************************************************************************/
/* */
/* Written by: Stefan Huber, Martin Held */
/* */
/* E-Mail: held@cs.sbg.ac.at */
/* Fax Mail: (+43 662) 8044-611 */
/* Voice Mail: (+43 662) 8044-6304 */
/* Snail Mail: Martin Held */
/* FB Informatik */
/* Universitaet Salzburg */
/* A-5020 Salzburg, Austria */
/* */
/*****************************************************************************/
#ifndef VRONI_GEOM_H
#define VRONI_GEOM_H
#include "util.h"
/** Compute squared distance between two points */
inline double vroniObject::PntPntDistSq(coord pi, coord pj)
{
const double x = pi.x - pj.x;
const double y = pi.y - pj.y;
return x*x + y*y;
}
/** Compute distance between two points */
inline double vroniObject::PntPntDist(coord pi, coord pj)
{
const double x = pi.x - pj.x;
const double y = pi.y - pj.y;
return sqrt(x*x + y*y);
}
/** Compute mid point on the line (pi,pj) */
inline coord vroniObject::MidPoint(coord pi, coord pj)
{
coord q;
q.x = (pi.x + pj.x) / 2.0;
q.y = (pi.y + pj.y) / 2.0;
return q;
}
/** Compute centroid point of the triangle (pi,pj,pk) */
inline coord vroniObject::Centroid(coord pi, coord pj, coord pk)
{
coord q;
q.x = (pi.x + pj.x + pk.x)/3.0;
q.y = (pi.y + pj.y + pk.y)/3.0;
return q;
}
/** Build linar combination of vectors p and r by parameter t */
inline coord vroniObject::LinearComb(const coord & p, const coord & r,
double_arg t)
{
coord q;
q.x = p.x + t*(r.x-p.x);
q.y = p.y + t*(r.y-p.y);
return q;
}
/** Get the point q = p + t*v */
inline coord vroniObject::RayPnt(const coord & p, const coord & v,
double_arg t)
{
coord q;
q.x = p.x + t*v.x;
q.y = p.y + t*v.y;
return q;
}
/** Compute (signed) distance of point p to circle (c,r). Positive
* values indicate that p is outside the circle (c,r). */
inline double vroniObject::PntCircleDist(const coord & c, double_arg r,
const coord & p)
{
return PntPntDist(p, c) - r;
}
/** Compute absolute distance of point p tor circle (c,r) */
inline double vroniObject::AbsPntCircleDist(const coord & c, double_arg r,
const coord & p)
{
return Abs(PntCircleDist(c, r, p));
}
/** Test if point p is on circle (c,r) */
inline int vroniObject::IsPntOnCircle(const coord & c, double_arg r, const coord & p)
{
return eq(PntCircleDist(c,r,p), ZERO);
}
/** Compute the signed distance of the point p to the line given by
* the equation a*x + b*y + c = 0. A positive result means that
* p lies in the positive half-plane defined by the line. */
inline double vroniObject::PntLineDist(double_arg a, double_arg b, double_arg c, const coord & p)
{
return a*p.x + b*p.y + c;
}
/** Compute the absolute distance of the point p to the line given by
* the equation a*x + b*y + c = 0 */
inline double vroniObject::AbsPntLineDist(double_arg a, double_arg b, double_arg c, const coord & p)
{
return Abs( PntLineDist(a, b, c, p));
}
inline vr_bool vroniObject::IsBetweenVoronoiNodes(int e, const coord & p, double eps)
{
return (NodeEdgeClassificator(e, p, eps) == 0.0);
}
#endif