|
|
#pragma once
|
|
|
#include "Vector.h"
|
|
|
#include "Point2D.h"
|
|
|
|
|
|
namespace NBase
|
|
|
{
|
|
|
|
|
|
class AFX_EXT_CLASS CLine2D : public CPoint2D
|
|
|
{
|
|
|
public:
|
|
|
CLine2D(void);
|
|
|
~CLine2D(void);
|
|
|
|
|
|
int Create(double x1, double y1, double x2, double y2);
|
|
|
|
|
|
double DistanceToPoint(double x, double y);
|
|
|
double DistanceToPointOne(double x, double y);
|
|
|
|
|
|
int One(void);
|
|
|
double MininumPoint(double x, double y);
|
|
|
double MininumPointOne(double x, double y);
|
|
|
|
|
|
double x(double t);
|
|
|
double y(double t);
|
|
|
|
|
|
void Rotate(double xs, double ys, double angle);
|
|
|
double Cross(CLine2D& OtherLine);
|
|
|
int Cross(CLine2D& OtherLine, double& x, double& y);
|
|
|
void Mirror(double& x, double& y);
|
|
|
|
|
|
void operator+=(double t);
|
|
|
void operator=(CLine2D& t);
|
|
|
|
|
|
public:
|
|
|
double a;
|
|
|
double b;
|
|
|
};
|
|
|
|
|
|
/*!\brief
|
|
|
|
|
|
A Line3 is a line in space, with the equations:
|
|
|
|
|
|
x = x0 + a*t
|
|
|
y = y0 + b*t
|
|
|
z = z0 + c*t
|
|
|
|
|
|
标准空间直线方程
|
|
|
(x-x0)/a = (y-y0)/b = (z-z0)/c = k
|
|
|
(x0,y0,z0)为该直线原点
|
|
|
*/
|
|
|
class AFX_EXT_CLASS CLine3D : public CPoint3D
|
|
|
{
|
|
|
public:
|
|
|
CLine3D(void);
|
|
|
~CLine3D(void);
|
|
|
|
|
|
int Create(const CPoint3D& pt1, const CPoint3D& pt2);
|
|
|
int Create(double x1, double y1, double z1, double x2, double y2, double z2);
|
|
|
int Create2(double x2, double y2, double z2);
|
|
|
|
|
|
/** @brief 得到参数为t时直线上点的坐标*/
|
|
|
virtual double x(double t); ///< x0 + a*t
|
|
|
virtual double y(double t); ///< y0 + b*t
|
|
|
virtual double z(double t); ///< z0 + c*t
|
|
|
|
|
|
int Cross(CLine3D& line, double& t1, double& t2);
|
|
|
void operator=(CLine3D &t);
|
|
|
void Write(FILE *& fw, double t1, double t2);
|
|
|
|
|
|
double One(void);
|
|
|
double One2(void);
|
|
|
void ONE(void);
|
|
|
|
|
|
double DistanceToPoint(double x, double y, double z);
|
|
|
double DistanceToPointZ(double x, double y, double z);
|
|
|
double DistanceToPointOne(double x, double y, double z);
|
|
|
|
|
|
protected:
|
|
|
double DistanceOne(double x,double y,double z);
|
|
|
|
|
|
public:
|
|
|
double a,b,c; ///< 方向向量(a,b,c),a,b,c代表各方向数
|
|
|
};
|
|
|
/** @brief 空间平面类,由空间直线CLine3D和直线外一点生成
|
|
|
(x0,y0,z0)
|
|
|
A--------> AB 向量 (a,b,c)
|
|
|
\ B
|
|
|
\
|
|
|
\C AC向量 (aappend,bappend,cappend)
|
|
|
*/
|
|
|
class AFX_EXT_CLASS CPlane : public CLine3D
|
|
|
{
|
|
|
public:
|
|
|
CPlane(void);
|
|
|
~CPlane(void);
|
|
|
|
|
|
int Create(double x1, double y1, double m1, double n1, double step_m, double step_n, double angle);
|
|
|
/** @brief 由三个空间点坐标生成基本空间平面*/
|
|
|
int Create(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3);
|
|
|
int Create(
|
|
|
double x1, double y1, double z1,
|
|
|
double x2, double y2, double z2,
|
|
|
double x3, double y3, double z3,
|
|
|
double m1,double n1,double step_m,double step_n);
|
|
|
|
|
|
//根据对应三点生成平面(三点校位)
|
|
|
int 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 );
|
|
|
//根据对应二点生成平面(二点校位)
|
|
|
int Create(double x1, double y1, double m1, double n1, double x2, double y2, double m2, double n2);
|
|
|
|
|
|
int Cross(CLine3D& line,double m_cross[3]);
|
|
|
double Cross(CLine3D& line,CPoint3D &point);
|
|
|
double Cross(CLine3D& line);
|
|
|
bool Cross( CPlane& b, CLine3D& res );
|
|
|
|
|
|
//!<\param bWhichside if true, the distance along the normal will be returned, which can be negative.
|
|
|
double DistanceToPoint( const CPoint3D& point, bool bWhichside = false);
|
|
|
|
|
|
//A CPlane is a plane in space, with the equation:
|
|
|
//Ax + By + Cz + D = 0
|
|
|
void GetEquation(double& A, double& B, double& C, double& D); //获得方程
|
|
|
|
|
|
void GetNormal(double& A, double& B, double& C);
|
|
|
void GetNormal(CLine3D& line);
|
|
|
void CreateNormal(double x1, double y1, double z1, double x2, double y2, double z2);
|
|
|
|
|
|
void GetMN(double& m, double& n);
|
|
|
void SetMN(double m1, double n1, double m2, double n2);
|
|
|
|
|
|
void Rotate(double alfa,double beta);
|
|
|
|
|
|
int Reflect(CLine3D& line);
|
|
|
int Refraction(CLine3D &line,double v21,double &sinin); //v21=v2/v1
|
|
|
/** @brief 得到AB向量上m个长度单位,AC向量上n个长度单位的点坐标*/
|
|
|
double x(double m, double n); ///< CLine3D::x(t1)+t2*aappend
|
|
|
double y(double m, double n); ///< CLine3D::y(t1)+t2*bappend
|
|
|
double z(double m, double n); ///< CLine3D::z(t1)+t2*cappend
|
|
|
|
|
|
int Write(FILE *&fw, double m1, double dm, int numm, double n1, double dn, int numn);
|
|
|
int Read(CFile& fr);
|
|
|
|
|
|
public:
|
|
|
double aappend,bappend,cappend; ///< 原点到第3点的空间向量 (aappend,bappend,cappend)
|
|
|
};
|
|
|
};
|