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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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)
};
};