Files
DarioS 234878388d EgtGeomKernel 2.5g2 :
- approssimazione con archi di curve composite viene fatta nel piano perpendicolare all'estrusione o se questa non definita nel piano medio della curva
- trim start/end a parametro di curve composite ora irrobustito.
2023-07-19 09:53:11 +02:00

183 lines
5.8 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2013-2013
//----------------------------------------------------------------------------
// File : Point3d.cpp Data : 20.11.13 Versione : 1.3a1
// Contenuto : Funzioni della classe Punto 3d.
//
//
//
// Modifiche : 04.01.13 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "\EgtDev\Include\EGkPoint3d.h"
#include "\EgtDev\Include\EGkFrame3d.h"
//----------------------------------------------------------------------------
// Traslazione
//----------------------------------------------------------------------------
void
Point3d::Translate( const Vector3d& vtMove)
{
*this = *this + vtMove ;
}
//----------------------------------------------------------------------------
// Rotazione
//----------------------------------------------------------------------------
bool
Point3d::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dAngDeg)
{
double dAngRad = dAngDeg * DEGTORAD ;
return Rotate( ptAx, vtAx, cos( dAngRad), sin( dAngRad)) ;
}
//----------------------------------------------------------------------------
// Rotazione
//----------------------------------------------------------------------------
bool
Point3d::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, double dSinAng)
{
// vettore dall'asse al punto
Vector3d vtDiff = *this - ptAx ;
if ( vtDiff.IsZero())
return true ;
// rotazione del vettore
if ( ! vtDiff.Rotate( vtAx, dCosAng, dSinAng))
return false ;
// ricostruisco il punto
*this = ptAx + vtDiff ;
return true ;
}
//----------------------------------------------------------------------------
// Scalatura non uniforme
//----------------------------------------------------------------------------
bool
Point3d::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoeffZ)
{
// vettore dal centro al punto
Vector3d vtDiff = *this - frRef.Orig() ;
if ( vtDiff.IsZero())
return true ;
// scalatura del vettore
if ( ! vtDiff.Scale( frRef, dCoeffX, dCoeffY, dCoeffZ))
return false ;
// ricostruisco il punto
*this = frRef.Orig() + vtDiff ;
return true ;
}
//----------------------------------------------------------------------------
// Specchiatura
//----------------------------------------------------------------------------
bool
Point3d::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
{
// vettore dal riferimento al punto
Vector3d vtDiff = *this - ptOn ;
if ( vtDiff.IsZero())
return true ;
// specchiatura del vettore
if ( ! vtDiff.Mirror( vtNorm))
return false ;
// ricostruisco il punto
*this = ptOn + vtDiff ;
return true ;
}
//----------------------------------------------------------------------------
// Scorrimento
//----------------------------------------------------------------------------
bool
Point3d::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vtDir, double dCoeff)
{
// vettore dal riferimento al punto
Vector3d vtDiff = *this - ptOn ;
if ( vtDiff.IsZero())
return true ;
// ricostruisco il punto
*this += dCoeff * ( vtDiff * vtNorm) * vtDir ;
return true ;
}
//----------------------------------------------------------------------------
// Cambio di riferimento : dal riferimento al globale
//----------------------------------------------------------------------------
bool
Point3d::ToGlob( const Frame3d& frRef)
{
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// eseguo trasformazione
if ( frRef.GetType() != Frame3d::TOP) {
Point3d ptT( x, y, z) ;
x = ptT.x * frRef.VersX().x + ptT.y * frRef.VersY().x + ptT.z * frRef.VersZ().x + frRef.Orig().x ;
y = ptT.x * frRef.VersX().y + ptT.y * frRef.VersY().y + ptT.z * frRef.VersZ().y + frRef.Orig().y ;
z = ptT.x * frRef.VersX().z + ptT.y * frRef.VersY().z + ptT.z * frRef.VersZ().z + frRef.Orig().z ;
}
else if ( ! frRef.Orig().IsZero()) {
x += frRef.Orig().x ;
y += frRef.Orig().y ;
z += frRef.Orig().z ;
}
return true ;
}
//----------------------------------------------------------------------------
// Cambio di riferimento : dal globale al riferimento
//----------------------------------------------------------------------------
bool
Point3d::ToLoc( const Frame3d& frRef)
{
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// eseguo trasformazione
if ( frRef.GetType() != Frame3d::TOP) {
Vector3d vtT( x - frRef.Orig().x, y - frRef.Orig().y, z - frRef.Orig().z) ;
x = vtT.x * frRef.VersX().x + vtT.y * frRef.VersX().y + vtT.z * frRef.VersX().z ;
y = vtT.x * frRef.VersY().x + vtT.y * frRef.VersY().y + vtT.z * frRef.VersY().z ;
z = vtT.x * frRef.VersZ().x + vtT.y * frRef.VersZ().y + vtT.z * frRef.VersZ().z ;
}
else if ( ! frRef.Orig().IsZero()) {
x -= frRef.Orig().x ;
y -= frRef.Orig().y ;
z -= frRef.Orig().z ;
}
return true ;
}
//----------------------------------------------------------------------------
// Cambio di riferimento : dal primo riferimento al secondo
//----------------------------------------------------------------------------
bool
Point3d::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
{
// se i due riferimenti coincidono, non devo fare alcunché
if ( AreSameFrame( frOri, frDest))
return true ;
return ( ToGlob( frOri) && ToLoc( frDest)) ;
}