You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.3 KiB
C

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD>: SegY<67>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
// ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>໥ת<E0BBA5><D7AA>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д: 2011-4-1
//
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RowCol.h"
#include "TInterval.h"
namespace NCube
{
//ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>໥ת<E0BBA5><D7AA>
class AFX_EXT_CLASS CCoorTransform
{
public:
CCoorTransform(void);
~CCoorTransform(void);
//<2F><><EFBFBD><EFBFBD>x<EFBFBD><78>y<EFBFBD><79>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD>m<EFBFBD><6D>n<EFBFBD><6E>Ϊ<EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>
bool Create( double x1, double y1, double m1, double n1,
double ddx, double ddy, double angle );
//<2F><><EFBFBD>ݶ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>(<28><><EFBFBD><EFBFBD>Уλ)
bool Create(
double x1, double y1, double m1, double n1,
double x2, double y2, double m2, double n2 );
//<2F><><EFBFBD>ݶ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>(<28><><EFBFBD><EFBFBD>Уλ)
bool Create(
double x1, double y1, double m1, double n1,
double x2, double y2, double m2, double n2,
double x3, double y3, double m3, double n3 );
////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD> max inline
// 2---------------------------
// | |
// | | max
// | |crossline
// | |
// | |
// 1---------------------------3
/////////////////////////////////////////////////////////////////
//!< <20><><EFBFBD>ñ任<C3B1><E4BBBB>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ߺ<EFBFBD><DFBA><EFBFBD>ͬ
//!< c0<63><30>c1<63><31>c2Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3AC>Ӧ<EFBFBD><D3A6><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊrc0<63><30>rc1<63><31>rc2(rc0.row,col2)
bool set3Points(
const CPoint2D& c0, const CPoint2D& c1, const CPoint2D& c2,
const CRowCol& rc0, const CRowCol& rc1, int col2 );
//!< <20>ߵ<EFBFBD><DFB5><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
void toXY(const CRowCol& rc, CPoint2D& pt);
void toXY(int row, int col, double&x, double& y);
void toXY(double row, double col, double&x, double& y);
CPoint2D toXY(const CRowCol& rc);
CPoint2D toXY(int row, int col);
CPoint2D toXY(double row, double col);
//!< <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>
void toRC(const CPoint2D& pt, CRowCol& rc);
void toRC(double x, double y, int& row, int& col);
CRowCol toRC(const CPoint2D& pt);
CRowCol toRC(double x, double y);
//!< <20><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
CRowCol TransformBack(const CPoint2D& coord,
const TIntervalStep<int>* inlrg=0,
const TIntervalStep<int>* crlrg=0 ) const;
/*!< Transforms Coord to RowCol. If the ranges are
given, they are only used for snapping: the actual range is not used */
CPoint2D TransformBackNoSnap(const CPoint2D& coord) const;
/*!< transforms back, but does not snap. The row is stored in the x-component, and the
col is stored in the y-component. */
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WriteLine(LPCTSTR lpszFileName, TIntervalStep<int> row, TIntervalStep<int> col);
void Write(CFile& fw);
int Read(CFile& fr);
void Serialize(CArchive& ar, const short &ver);
protected:
//!<Sets up the transform using three points. note that the third point is
//assumed to be on the same row as the first point.
struct RCTransform
{
RCTransform() { a = b = c = 0; }
inline double det( const RCTransform& bct ) const
{
return b * bct.c - bct.b * c;
}
inline bool valid( const RCTransform& bct ) const
{
double d = det( bct );
return !mIsZero(d, 1e-10);
}
double a, b, c;
};
public:
void setTransforms( const RCTransform& x,const RCTransform& y ) { xtr = x; ytr = y; }
const RCTransform& getTransform( bool x ) const { return x ? xtr : ytr; }
protected:
RCTransform xtr;
RCTransform ytr;
public:
//<2F>γɱ任<C9B1>Ķ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
CPoint2D m_pt[3];
CRowCol m_rc[3];
};
}//namespace