/*************************************/
/* Auteur : Rémi Synave */
/* Date de création : 01/03/07 */
/* Date de modification : 18/09/16 */
/* Version : 0.4 */
/*************************************/
/***************************************************************************/
/* This file is part of a2ri. */
/* */
/* a2ri is free software: you can redistribute it and/or modify it */
/* under the terms of the GNU Lesser General Public License as published */
/* by the Free Software Foundation, either version 3 of the License, or */
/* (at your option) any later version. */
/* */
/* a2ri 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 Lesser General Public License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public */
/* License along with a2ri. */
/* If not, see . */
/***************************************************************************/
#ifndef GEOMETRY__H
#define GEOMETRY__H
#include
#include
#include
#include
#include "util.h"
#include "point.h"
#include "vector.h"
#include "matrix.h"
/**
Calcul de la longueur entre deux point3d
@param p1 premier point3d
@param p2 second point3d
@return longueur \f$p_1p_2\f$
*/
double point3d_length (
const point3d * const p1,
const point3d * const p2);
/**
Calcul de la longueur au carré entre deux point3d
@param p1 premier point3d
@param p2 second point3d
@return longueur \f$p_1p_2\f$
*/
double point3d_square_length (
const point3d * const p1,
const point3d * const p2);
/**
Calcul de la longueur entre deux point2d
@param p1 premier point2d
@param p2 second point2d
@return longueur \f$p_1p_2\f$
*/
double point2d_length (
const point2d * const p1,
const point2d * const p2);
/**
Calcule l'équation d'un plan à partir d'une liste de point sous la forme ax+by+cz+d=0
@param p liste de points
@param size nombre de points
@param aeq valeur de "a"
@param beq valeur de "b"
@param ceq valeur de "c"
@param deq valeur de "d"
@return aucun
Exemple de code
@code
double a,b,c,d;
point3d p[3];
point3d_init(&(p[0]),0.0,0.0,0.0);
point3d_init(&(p[1]),1.0,1.0,-2.0);
point3d_init(&(p[2]),-1.0,1.0,0.0);
equation_plan(p,3,&a,&b,&c,&d);
printf("%dx+%dy+%dz+%d=0\n",a,b,c,d);
@endcode
donne le résultat
@code
1.0x+1.0y+1.0z+0.0=0
@endcode
*/
void equation_plan (
const point3d * const p,
int size,
double *aeq,
double *beq,
double *ceq,
double *deq);
/**
Calcul de l'aire du triangle défini par les trois points
@param p1 premier point du triangle
@param p2 second point
@param p3 troisième point
@return aire du triangle
*/
double point3d_area (
const point3d * const p1,
const point3d * const p2,
const point3d * const p3);
/**
Transformation des coordonnées d'un point dans un espace à trois dimension en coordonnées dans un espace à deux dimensions dont la base est le couple (base1,base2) et d'origine le point3d "origin"
@param p point dont les coordonnées vont etre recalculées
@param origin point origine du nouveau repére
@param base1 premier vecteur formant la nouvelle base
@param base2 second vecteur formant la nouvelle base
@param newp point contenant les coordonnées dans la nouvelle base
@return aucun
*/
void base_modification_3d_to_2d (
const point3d * const p,
const point3d * const origin,
const vector3d * const base1,
const vector3d * const base2,
point2d * newp);
/**
Calcul du vecteur normal à AB et contenu dans le meme plan que celui formé par les vecteurs (AB,AC). Le résultat final est une base orthogonal du repére.
@param AB premier vecteur de la base
@param AC second vecteur du repére
@param U pointeur sur le nouveau vecteur formant la base orthogonal
*/
void find_second_base_vector (
const vector3d * const AB,
const vector3d * const AC,
vector3d * U);
/**
Vérification qu'un point M se trouve bien dans le triangle ABC
@param M le point à tester
@param A premier sommet du triangle
@param B second sommet du triangle
@param C troisième sommet du triangle
@return 1 si le point M appartient au triangle ABC, 0 sinon
*/
int point_in_triangle (
const point3d * const M,
const point3d * const A,
const point3d * const B,
const point3d * const C);
/**
Calcule l'angle en radian formé par les deux vector3d
@param v1 le premier vector3d
@param v2 le second vector3d
@return angle en radian
*/
double vector3d_angle_radian (
const vector3d * const v1,
const vector3d * const v2);
/**
Calcule l'angle en degré formé par les deux vector3d
@param v1 le premier vector3d
@param v2 le second vector3d
@return angle en degré
*/
double vector3d_angle_degre (
const vector3d * const v1,
const vector3d * const v2);
/**
Calcule le centre du cercle inscrit à un triangle
@param A premier point du triangle
@param B second point
@param C troisème point
@return le point centre du cercle inscrit
*/
point3d incircle_center (
const point3d * const A,
const point3d * const B,
const point3d * const C);
/**
Calcule le centre du cercle circonscrit à un triangle
@param A premier point du triangle
@param B second point
@param C troisème point
@return le point centre du cercle circonscrit
*/
point3d circumcircle_center (
point3d * A,
point3d * B,
point3d * C);
/**
Calcule le centre de sphère circonscrite au tétraédre
@param A premier point du tétraédre
@param B second point
@param C troisème point
@param D quatrième point
@return le point centre de la sphère circonscrite
*/
point3d circumsphere_center (
point3d * A,
point3d * B,
point3d * C,
point3d * D);
/**
Calcule la distance entre un point M et une droite définie par deux points A et B
@param M point
@param A premier point sur la droite
@param B second point sur la droite
@return distance entre le point M et la droite AB
*/
double distance_point_straight_line (
point3d * M,
point3d * A,
point3d * B);
/**
Calcule la distance entre un point M et un plan définie par trois points A,b et C
@param M point
@param A premier point du plan
@param B second point du plan
@param C troisieme point du plan
@return distance entre le point M et le plan ABC
*/
double distance_point_plane (
point3d * M,
point3d * A,
point3d * B,
point3d * C);
/**
Calcule la distance entre un point M et un triangle défini par trois points A,b et C
@param M point
@param A premier point du triangle
@param B second point du triangle
@param C troisieme point du triangle
@return distance entre le point M et le triangle ABC
*/
double distance_point_triangle (
point3d * M,
point3d * A,
point3d * B,
point3d * C);
/**
Echantillonne le triangle ABC
@param A point A du triangle
@param B point B
@param C point C
@param nb_sample nombre d'échantillon à extraire
@param list tableau de réel représentant les coordonées des échantillons
@param size taille du tableau
@return aucun
*/
void sample_triangle (
const point3d * const A,
const point3d * const B,
const point3d * const C,
int nb_sample,
point3d ** list);
/**
Test de l'instrsection entre une droite et un plan
@param d1 premier point définissant la droite
@param d2 second point définissant la droite
@param p1 premier point du plan
@param p2 second point du plan
@param p3 troisieme point du plan
@param t paramètre d'intersection
@return 1 si intersection, 0 sinon
*/
int intersection_droite_plan (
point3d * d1,
point3d * d2,
point3d * p1,
point3d * p2,
point3d * p3,
double *t);
/**
Test de l'intersection entre une droite et un triangle
@param d1 premier point définissant la droite
@param d2 second point définissant la droite
@param p1 premier point du triangle
@param p2 second point du triangle
@param p3 troisieme point du triangle
@return 1 si intersection, 0 sinon
*/
int intersection_droite_triangle (
point3d * d1,
point3d * d2,
point3d * p1,
point3d * p2,
point3d * p3,
double *t);
/**
Test de l'intersection entre un segment et un triangle
@param s1 premier point définissant le segment
@param s2 second point définissant le segment
@param p1 premier point du triangle
@param p2 second point du triangle
@param p3 troisieme point du triangle
@return 1 si intersection, 0 sinon
*/
int intersection_segment_triangle (
point3d * s1,
point3d * s2,
point3d * p1,
point3d * p2,
point3d * p3,
double *t);
/**
Test de l'intersection entre deux triangles
@param t1 premier point définissant le premier triangle
@param t2 second point définissant le premier triangle
@param t3 troisieme point définissant le premier triangle
@param p1 premier point du second triangle
@param p2 second point du second triangle
@param p3 troisieme point du second triangle
@return 1 si intersection, 0 sinon
*/
int intersection_triangle_triangle (
point3d * t1,
point3d * t2,
point3d * t3,
point3d * p1,
point3d * p2,
point3d * p3);
/**
Teste si les trois points A, B et C sont alignés
@param A premier point
@param B second point
@param C troisieme point
@return 1 si les trois points sont alignés, 0 sinon
*/
int trois_points_alignes (
point3d * A,
point3d * B,
point3d * C);
#endif