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.

149 lines
4.1 KiB
C

1 month ago
#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
<EFBFBD><EFBFBD>׼<EFBFBD>ռ<EFBFBD>ֱ<EFBFBD>߷<EFBFBD><EFBFBD><EFBFBD>
(x-x0)/a = (y-y0)/b = (z-z0)/c = k
(x0,y0,z0)Ϊ<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>
*/
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 <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>Ϊtʱֱ<CAB1><D6B1><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
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; ///< <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(a,b,c)<29><>a,b,c<><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
/** @brief <20>ռ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ɿռ<C9BF>ֱ<EFBFBD><D6B1>CLine3D<33><44>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
(x0,y0,z0<EFBFBD><EFBFBD>
A--------> AB <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (a,b,c)
\ B
\
\C AC<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (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 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD><C9BB><EFBFBD><EFBFBD>ռ<EFBFBD>ƽ<EFBFBD><C6BD>*/
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);
//<2F><><EFBFBD>ݶ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>(<28><><EFBFBD><EFBFBD>Уλ)
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 );
//<2F><><EFBFBD>ݶ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>(<28><><EFBFBD><EFBFBD>Уλ)
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); //<2F><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD>
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 <20>õ<EFBFBD>AB<41><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><6D><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>λ<EFBFBD><CEBB>AC<41><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD>λ<EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>*/
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; ///< ԭ<><EFBFBD><E3B5BD>3<EFBFBD><33><EFBFBD>Ŀռ<C4BF><D5BC><EFBFBD><EFBFBD><EFBFBD> (aappend,bappend,cappend)
};
};