225 lines
8.9 KiB
C
225 lines
8.9 KiB
C
|
|
/**
|
|||
|
|
* @file VecCoordinate.h
|
|||
|
|
* @brief 通用的坐标转换:任意两种坐标之间的转换
|
|||
|
|
* @date 2014-5-26
|
|||
|
|
* @author: liyonggang
|
|||
|
|
*/
|
|||
|
|
#ifndef PAI_FRAME_CVECCOORDINATE_H
|
|||
|
|
#define PAI_FRAME_CVECCOORDINATE_H
|
|||
|
|
#pragma warning( push ,0)
|
|||
|
|
#include <QUuid>
|
|||
|
|
|
|||
|
|
// #include <Vec2d>
|
|||
|
|
// #include <Vec3f>
|
|||
|
|
// #include <Matrix>
|
|||
|
|
|
|||
|
|
#include "OSGFramework.h"
|
|||
|
|
// #include "VecGeoToGeoNormalCoordinate.h"
|
|||
|
|
// #include "VecWindowDocument.h"
|
|||
|
|
// #include "2DWindowViewInfo.h"
|
|||
|
|
|
|||
|
|
#pragma warning( pop )
|
|||
|
|
BEGIN_OSGGRAPHICS_NAMESPACE
|
|||
|
|
class CVecSceneManager;
|
|||
|
|
END_OSGGRAPHICS_NAMESPACE;
|
|||
|
|
|
|||
|
|
BEGIN_OSGGRAPHICS_NAMESPACE;
|
|||
|
|
|
|||
|
|
enum eCoordType
|
|||
|
|
{
|
|||
|
|
//原始的用户业务坐标
|
|||
|
|
eCoord_GEO,//深度,工程值
|
|||
|
|
|
|||
|
|
//归一化的用户业务坐标:统一用户业务坐标到OSG的坐标系
|
|||
|
|
eCoord_GEONormal,//对数变换、倒置坐标轴
|
|||
|
|
|
|||
|
|
// OSG 物体局部坐标系. 就是平常渲染时给OSG::Geometry的顶点坐标
|
|||
|
|
eCoord_OSGLocal, //道内横向刻度
|
|||
|
|
|
|||
|
|
// OSG 全局模型坐标系,( transform by CVecSceneManager Global Model transform)
|
|||
|
|
eCoord_OSGGlobal,//窗口中坐标
|
|||
|
|
|
|||
|
|
//相机坐标系,眼睛坐标系( 视图矩阵变化后)
|
|||
|
|
eCoord_OSGCameraEye,
|
|||
|
|
|
|||
|
|
// 投影矩阵变化后的归一化三维坐标(x,y,z的范围都是(-1,1) )
|
|||
|
|
eCoord_OSGNormal,
|
|||
|
|
|
|||
|
|
// OSG的视口二维像素坐标( Y轴正方向是由下到上 )
|
|||
|
|
eCoord_OSGPixel,
|
|||
|
|
|
|||
|
|
// QT Widget的窗口二维像素坐标( Y轴正方向是由上到下 )
|
|||
|
|
eCoord_GDIPixel,
|
|||
|
|
|
|||
|
|
// 厘米单位坐标( Y轴正方向是由上到下 )
|
|||
|
|
eCoord_GDICM,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// /**
|
|||
|
|
// * @class IVecCoordinate
|
|||
|
|
// * @brief 通用的坐标转换:任意两种坐标之间的转换
|
|||
|
|
// */
|
|||
|
|
// class OSGFRAMEWORK_EXPORT IVecCoordinate
|
|||
|
|
// {
|
|||
|
|
// public:
|
|||
|
|
// IVecCoordinate();
|
|||
|
|
|
|||
|
|
// virtual ~IVecCoordinate();
|
|||
|
|
// /**
|
|||
|
|
// * @brief 把点从一个坐标系统转换另外一个坐标系统
|
|||
|
|
// * @param ObjectID : Object ID,特别是在转为Well Section Geo坐标时有正确的Objecct ID
|
|||
|
|
// * @param eInCoordType: 输入点的坐标系统
|
|||
|
|
// * @param inCoord: 输入的顶点
|
|||
|
|
// * @param eOutCoordType:输出的坐标系统类型
|
|||
|
|
// * @param outCoord: 输出的顶点
|
|||
|
|
// */
|
|||
|
|
// virtual void ConvertCoord( const QUuid &ObjectID,eCoordType eInCoordType, osg::Vec3f inCoord,
|
|||
|
|
// eCoordType eOutCoordType,osg::Vec3f& outCoord) = 0 ;
|
|||
|
|
|
|||
|
|
// /**
|
|||
|
|
// * @brief 把点从一个坐标系统转换另外一个坐标系统
|
|||
|
|
// * @param ObjectID : Object ID,特别是在转为Well Section Geo坐标时有正确的Objecct ID
|
|||
|
|
// * @param eInCoordType: 输入点的坐标系统
|
|||
|
|
// * @param inCoord: 输入的顶点
|
|||
|
|
// * @param eOutCoordType:输出的坐标系统类型
|
|||
|
|
// * @param outCoord: 输出的顶点
|
|||
|
|
// */
|
|||
|
|
// virtual void ConvertCoordDouble( const QUuid &ObjectID,eCoordType eInCoordType, osg::Vec3d inCoord,
|
|||
|
|
// eCoordType eOutCoordType,osg::Vec3d& outCoord ) = 0 ;
|
|||
|
|
|
|||
|
|
// /**
|
|||
|
|
// * @brief 把"长度"从一个坐标系统转换到另外一个坐标系统
|
|||
|
|
// * @param ObjectID : Object ID,特别是在转为Well Section Geo坐标时有正确的Objecct ID
|
|||
|
|
// * @param eInCoordType: 输入点的坐标系统
|
|||
|
|
// * @param inCoord: 输入的长度
|
|||
|
|
// * @param eOutCoordType:输出的坐标系统类型
|
|||
|
|
// * @param outCoord: 输出的长度
|
|||
|
|
// * @param bAbs: 输出的长度是否取绝对值
|
|||
|
|
// */
|
|||
|
|
// virtual void ConvertDeltaCoord( const QUuid &ObjectID,eCoordType eInCoordType, osg::Vec3d inCoord,
|
|||
|
|
// eCoordType eOutCoordType,osg::Vec3d& outCoord ,bool bAbs) = 0;
|
|||
|
|
// };
|
|||
|
|
|
|||
|
|
// /**
|
|||
|
|
// * @class IVecCoordinate
|
|||
|
|
// * @brief 通用的坐标转换:任意两种坐标之间的转换
|
|||
|
|
// */
|
|||
|
|
// class OSGFRAMEWORK_EXPORT CVecCoordinate : public IVecCoordinate
|
|||
|
|
// {
|
|||
|
|
// public:
|
|||
|
|
|
|||
|
|
// CVecCoordinate();
|
|||
|
|
// virtual void InitSceneManager(CVecSceneManager *ppSceneManager);
|
|||
|
|
|
|||
|
|
// /**
|
|||
|
|
// * @brief 把点从一个坐标系统转换另外一个坐标系统
|
|||
|
|
// * @param ObjectID : Object ID,特别是在转为Well Section Geo坐标时有正确的Objecct ID
|
|||
|
|
// * @param eInCoordType: 输入点的坐标系统
|
|||
|
|
// * @param inCoord: 输入的顶点
|
|||
|
|
// * @param eOutCoordType:输出的坐标系统类型
|
|||
|
|
// * @param outCoord: 输出的顶点
|
|||
|
|
// */
|
|||
|
|
// virtual void ConvertCoord( const QUuid &ObjectID,eCoordType eInCoordType, osg::Vec3f inCoord,
|
|||
|
|
// eCoordType eOutCoordType,osg::Vec3f& outCoord) ;
|
|||
|
|
// virtual void ConvertCoordDoubleNoGEONormal( const QUuid &ObjectID,eCoordType eInCoordType, osg::Vec3d inCoord,
|
|||
|
|
// eCoordType eOutCoordType,osg::Vec3d& outCoord );
|
|||
|
|
|
|||
|
|
// /**
|
|||
|
|
// * @brief 把点从一个坐标系统转换另外一个坐标系统
|
|||
|
|
// * @param ObjectID : Object ID,特别是在转为Well Section Geo坐标时有正确的Objecct ID
|
|||
|
|
// * @param eInCoordType: 输入点的坐标系统
|
|||
|
|
// * @param inCoord: 输入的顶点
|
|||
|
|
// * @param eOutCoordType:输出的坐标系统类型
|
|||
|
|
// * @param outCoord: 输出的顶点
|
|||
|
|
// */
|
|||
|
|
// virtual void ConvertCoordDouble( const QUuid &ObjectID,eCoordType eInCoordType, osg::Vec3d inCoord,
|
|||
|
|
// eCoordType eOutCoordType,osg::Vec3d& outCoord ) ;
|
|||
|
|
|
|||
|
|
// /**
|
|||
|
|
// * @brief 把"长度"从一个坐标系统转换到另外一个坐标系统
|
|||
|
|
// * @param ObjectID : Object ID,特别是在转为Well Section Geo坐标时有正确的Objecct ID
|
|||
|
|
// * @param eInCoordType: 输入点的坐标系统
|
|||
|
|
// * @param inCoord: 输入的长度
|
|||
|
|
// * @param eOutCoordType:输出的坐标系统类型
|
|||
|
|
// * @param outCoord: 输出的长度
|
|||
|
|
// * @param bAbs: 输出的长度是否取绝对值
|
|||
|
|
// */
|
|||
|
|
// void ConvertDeltaCoord( const QUuid &ObjectID,eCoordType eInCoordType, osg::Vec3d inCoord,
|
|||
|
|
// eCoordType eOutCoordType,osg::Vec3d& outCoord ,bool bAbs) ;
|
|||
|
|
|
|||
|
|
// //同ConvertCoordDouble,只处理X坐标
|
|||
|
|
// virtual double ConvertX( const QUuid &ObjectID,eCoordType eInCoordType, double x,
|
|||
|
|
// eCoordType eOutCoordType );
|
|||
|
|
|
|||
|
|
// //同ConvertCoordDouble,只处理Y坐标
|
|||
|
|
// virtual double ConvertY( const QUuid &ObjectID,eCoordType eInCoordType, double y,
|
|||
|
|
// eCoordType eOutCoordType );
|
|||
|
|
|
|||
|
|
// //同ConvertDeltaCoord,只处理X方向长度
|
|||
|
|
// virtual double ConvertDeltaX( const QUuid &ObjectID,eCoordType eInCoordType, double x,
|
|||
|
|
// eCoordType eOutCoordType,bool bAbs ) ;
|
|||
|
|
|
|||
|
|
// //同ConvertDeltaCoord,只处理Y方向长度
|
|||
|
|
// virtual double ConvertDeltaY( const QUuid &ObjectID,eCoordType eInCoordType, double y,
|
|||
|
|
// eCoordType eOutCoordType,bool bAbs) ;
|
|||
|
|
|
|||
|
|
// /**
|
|||
|
|
// * @brief 每厘米像素数
|
|||
|
|
// */
|
|||
|
|
// void SetPixelPerCm(QPrinter *pDC);
|
|||
|
|
// void SetPixelPerCm(QPainter *pDC);
|
|||
|
|
// void SetPixelPerCm(double PixelPerCm);
|
|||
|
|
// double GetPixelPerCm();
|
|||
|
|
// /**
|
|||
|
|
// * @brief 像素转为厘米
|
|||
|
|
// */
|
|||
|
|
// double PixelToCM( double fPixel );
|
|||
|
|
// /**
|
|||
|
|
// * @breif 返回对于指定的坐标系而言每个像素对应的高度
|
|||
|
|
// * @param objectID 对象ID,通常为空
|
|||
|
|
// * @param eOutCoordType 结果坐标系的类型
|
|||
|
|
// */
|
|||
|
|
// double HeightPerPixel(const QUuid& objectID,eCoordType eOutCoordType);
|
|||
|
|
|
|||
|
|
// /**
|
|||
|
|
// * @breif 返回对于指定的坐标系而言每个像素对应的高度
|
|||
|
|
// * @param objectID 对象ID,通常为空
|
|||
|
|
// * @param eOutCoordType 结果坐标系的类型
|
|||
|
|
// */
|
|||
|
|
// double WidthPerPixel(const QUuid& objectID,eCoordType eOutCoordType);
|
|||
|
|
|
|||
|
|
// virtual osg::Vec3d TransfromGeo_GeoNormal(const QUuid &ObjectID, osg::Vec3d in, bool bPositive);
|
|||
|
|
// bool IsXYSwap( eCoordType eInCoordType,eCoordType eOutCoordType );
|
|||
|
|
|
|||
|
|
// private:
|
|||
|
|
// typedef osg::Vec3d (*TransfromCoordinateFunc)(CVecCoordinate *pCoordinate, const QUuid &ObjectID,osg::Vec3d in, bool bPositive);
|
|||
|
|
|
|||
|
|
// //坐标系统之间相互转换的函数。每个函数只负责相邻的两个坐标系之间的转换
|
|||
|
|
// static osg::Vec3d TransfromGeo_GeoNormal(CVecCoordinate *pCoordinate,const QUuid &ObjectID, osg::Vec3d in, bool bPositive);
|
|||
|
|
// static osg::Vec3d TransfromGeoNormal_OSGLocal(CVecCoordinate *pCoordinate,const QUuid &ObjectID, osg::Vec3d in, bool bPositive);
|
|||
|
|
// static osg::Vec3d TransfromOSGLocal_Global(CVecCoordinate *pCoordinate, const QUuid &ObjectID,osg::Vec3d in, bool bPositive);
|
|||
|
|
// static osg::Vec3d TransfromOSGGlobal_EyePosition(CVecCoordinate *pCoordinate,const QUuid &ObjectID, osg::Vec3d in, bool bPositive);
|
|||
|
|
// static osg::Vec3d TransfromEye_NormalizedPosition(CVecCoordinate *pCoordinate,const QUuid &ObjectID, osg::Vec3d in, bool bPositive);
|
|||
|
|
// static osg::Vec3d TransfromOSGNormalizedPosition_Pixel(CVecCoordinate *pCoordinate,const QUuid &ObjectID, osg::Vec3d in, bool bPositive);
|
|||
|
|
// static osg::Vec3d TransfromOSGPixel_GDIPixel(CVecCoordinate *pCoordinate,const QUuid &ObjectID, osg::Vec3d in, bool bPositive);
|
|||
|
|
// static osg::Vec3d TransfromGDIPixel_GDICM(CVecCoordinate *pCoordinate,const QUuid &ObjectID, osg::Vec3d in, bool bPositive);
|
|||
|
|
|
|||
|
|
// protected:
|
|||
|
|
// C2DWindowViewInfo *m_pWindowViewInfo;
|
|||
|
|
// bool m_bInitWindowViewInfo;
|
|||
|
|
|
|||
|
|
// protected:
|
|||
|
|
// std::vector< TransfromCoordinateFunc > m_vTransfromCoordinateFunc;// 坐标转换的函数指针数组
|
|||
|
|
// public:
|
|||
|
|
// CVecSceneManager *m_pSceneManager;
|
|||
|
|
// CVecGeoToGeoNormalCoordinate m_GeoToGeoNormalCoordinate;
|
|||
|
|
// double dPixelPerCm;
|
|||
|
|
// osg::Matrixd m_WindowMatrix;
|
|||
|
|
// osg::Matrixd m_ProjectMatrix;
|
|||
|
|
// osg::Matrixd m_ViewMatrix;
|
|||
|
|
// };
|
|||
|
|
|
|||
|
|
END_OSGGRAPHICS_NAMESPACE;
|
|||
|
|
using namespace pai::graphics;
|
|||
|
|
#endif
|