50f653750b
- aggiunte funzioni per verifica di collisione tra Tronco di Cono e Triangolo e tra Tronco di Piramide Generalizzato e Triangolo - migliorate funzioni per verifica di collisione tra Tronco di Cono e Zmap e tra Tronco di Piramide Generalizzato e Zmap.
124 lines
7.0 KiB
C
124 lines
7.0 KiB
C
//----------------------------------------------------------------------------
|
|
// EgalTech 2020-2020
|
|
//----------------------------------------------------------------------------
|
|
// File : CoplanarDiscTriaInterferance.h Data : 27.10.20 Versione :
|
|
// Contenuto : Dichiarazione funzione verifica interferenza tra
|
|
// Disco e Triangle3d complanari
|
|
//
|
|
// Modifiche : 27.10.20 LM Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include "/EgtDev/Include/EGkPoint3d.h"
|
|
#include "/EgtDev/Include/EGkTriangle3d.h"
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Dati un punto e una retta, restituisce il quadrato della loro distanza.
|
|
// La retta è descritta da un suo punto e dal suo versore tangente.
|
|
double
|
|
GetPointLineSqDist( const Point3d& ptP, const Point3d& ptLine, const Vector3d& vtLine) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Dati un punto e un piano, ne restituisce la distanza con segno.
|
|
// Il piano è descritto da un suo punto e dal suo versore normale.
|
|
double
|
|
PointPlaneSignedDist( const Point3d& ptP, const Point3d& ptPlane, const Vector3d& vtNorm) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Dati un sistema di tre punti e un piano, ne calcola le tre distanze con segno e ne restituisce la
|
|
// maggiore. I tre punti sono passati mediante un triangolo, il piano è descritto da un suo punto e
|
|
// dal suo versore normale.
|
|
double
|
|
ThreePointPlaneSignedDist( const Triangle3d& trTria, const Point3d& ptPlane, const Vector3d& vtNorm) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Calcola, se esiste, il punto di una retta a distanza con segno data da un piano.
|
|
// Il piano è descritto da punto e versore normale.
|
|
// La retta è descritta da punto e versore direzione.
|
|
// I casi possibili sono:
|
|
// - Nessun punto della retta dista d dal piano (retta parallela al piano con distanza diversa da d),
|
|
// viene restituito 0 e il valore di dPar non ha senso.
|
|
// - Un solo punto della retta dista d dal piano (retta non parallela al piano), viene restituito 1
|
|
// e il valore di dPar è il parametro del punto sulla retta.
|
|
// - Tutti i punti della retta distano d dal piano (retta parallela al piano con distanza d), viene
|
|
// restituito 2 e qualunque valore di dPar ha senso.
|
|
int
|
|
LinePlaneDDistPar( const Point3d& ptPlane, const Vector3d& vtPlane, const Point3d& ptLine, const Vector3d& vtLine,
|
|
double dDist, double& dPar) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Date due rette nello spazio restituisce il quadrato della loro distanza.
|
|
// Le rette sono definite da un punto e dal versore direzione.
|
|
double
|
|
LineLineSqDist( const Point3d& ptP1, const Vector3d& vtD1, const Point3d& ptP2, const Vector3d& vtD2) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Data una retta e un segmento, ne restituisce il quadrato della distanza.
|
|
// La retta è definita da un punto e dal versore direzione.
|
|
// Il segmento è definito da un estremo, dal versore direzione verso l'altro estremo e dalla lunghezza.
|
|
double
|
|
LineSegmentSqDist( const Point3d& ptPLn, const Vector3d& vtDLn,
|
|
const Point3d& ptPSg, const Vector3d& vtDSg, double dSgLen) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Valuta l'interferenza di un disco e un triangolo complanari.
|
|
// Si assume che disco e piano siano paralleli, ovvero che valga a n = 1 con
|
|
// a versore dell'asse del disco e n versore normale al triangolo.
|
|
// L'informazione su n è contenuta nell'oggetto triangolo; quella su a non è passata
|
|
// in quanto inutile sotto le nostre assunzioni.
|
|
bool
|
|
CoplanarDiscTriangleInterference( const Point3d& ptCen, double dRad, const Triangle3d& trTria, int nTriType) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Date due rette, descritte da un punto e un vettore direzione,
|
|
// trova i parametri corrispondenti ai punti di minima distanza.
|
|
// Se le rette non sono parallele abbiamo una singola coppia di
|
|
// punti e viene restituito true, altrimenti ne abbiamo infinite
|
|
// e viene restituito false. Si noti che i parametri dU1, dU2
|
|
// non hanno necessariamente il significato di lunghezza;
|
|
// perché non è richiesto che i vettori siano normalizzati.
|
|
bool
|
|
FindLineLineMinDistPar( const Point3d& ptL1, const Vector3d& vtV1,
|
|
const Point3d& ptL2, const Vector3d& vtV2,
|
|
double& dU1, double& dU2) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Calcolo delle posizioni di tangenza di una sfera che si muove dalla posizione
|
|
// originale lungo una direzione prefissata rispetto ad una retta.
|
|
// Le posizioni sono rappresentate dalla distanza percorsa.
|
|
// Il parametro di ritorno può assumere i seguenti valori :
|
|
// 0 : la sfera non è mai tangente alla retta; dU1 e dU2 non hanno senso
|
|
// 1 : la sfera è tangente alla retta in una posizione; solo dU1 ha senso
|
|
// 2 : la sfera è tangente alla retta in due posizioni; dU1 e dU2 valide
|
|
// 3 : la sfera è sempre tangente
|
|
int
|
|
SphereLineTangentPoints( const Point3d& ptSpheCen, double dSpheRad,
|
|
const Point3d& ptSeg, const Vector3d& vtSegDir, double dSegLen,
|
|
const Vector3d& vtMove, double& dU1, double& dU2) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Valuta l'allontanamento di un disco, lungo il proprio asse di simmetria, da un piano.
|
|
// Il disco è descritto dal centro nella posizione iniziale e dal raggio (la normale è il versore traslazione).
|
|
// Il piano è descritto da un suo punto e dal suo versore normale.
|
|
// Il moto è descritto dal versore di traslazione.
|
|
// Il valore restituito è un intero che descrive la situazione di allontanamento e,
|
|
// quando sensato, per referenza restituisce il punto di ultimo contatto.
|
|
// 0: Nessun contatto
|
|
// 1: Un contatto
|
|
// 2: Disco e piano ortogonali, con disco tg al piano, il contatto è una semiretta
|
|
// 3: Disco e piano ortogonali, con disco secante il piano, il contatto è una striscia
|
|
// 4: Disco e piano paralleli, come ultimo contatto si restituisce il centro.
|
|
// Nel caso 0 il parametro ptTouch non ha senso, così come nel caso 2 e nel caso 3
|
|
int
|
|
DiskPlaneLastContactLongMot( const Point3d& ptDiskCen, double dDiskRad,
|
|
const Point3d& ptPlane, const Vector3d& vtPlane,
|
|
const Vector3d& vtMove, Point3d& ptTouch) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Si limita il segmento alla parte di spazio con distanza positiva dal piano.
|
|
// Se segmento ancora valido si restituisce true, altrimenti false.
|
|
bool
|
|
ClampSegmentOutPlane( const Plane3d& plPlane, Point3d& ptSegP, const Vector3d& vtSegV, double& dSegLen, double dSignTol = 0.) ; |