简单基于OPENGL的三维CAD框架(1)工具类

摘要:
在vc++中有CDC类,同样也可以开发基于OPENGL的OPenGLDC类,这样可以像调用CDC类一样调用OPenGLDC类首先给出两个工具类,点类和向量类typedefstructtagVector3D{doubledx;doubledy;doubledz;}VECTOR3D;classCVector3D:publicVECTOR3D{public:CVector3D();virtual~CVe

在vc++中有CDC类,同样也可以开发基于OPENGL的OPenGLDC类,这样可以像调用CDC类一样调用OPenGLDC类

首先给出两个工具类,点类和向量类

typedef struct tagVector3D
{
double dx;
double dy;
double dz;
} VECTOR3D;

class CVector3D : public VECTOR3D
{
public:
CVector3D();
virtual ~CVector3D();
CVector3D(VECTOR3D v);
CVector3D(CVector3D &v);
CVector3D(const double *p);
CVector3D(double ix, double iy, double iz);
public:
double GetLength() const;
void Normal();
CVector3D operator*(VECTOR3D v) const;
CVector3D operator*(CVector3D v) const;
void operator=(CVector3D v) ;
void operator-=(VECTOR3D v);
void operator-=(CVector3D v);
CVector3D operator+(VECTOR3D v) const;
CVector3D operator+(CVector3D v) const;
CVector3D operator-(VECTOR3D v) const;
CVector3D operator-(CVector3D v) const;
CVector3D operator*(double d) const;

};

typedef struct tagPoint3D
{
double x;
double y;
double z;
} POINT3D;

class CPoint3D : public POINT3D
{
public:
CPoint3D();
CPoint3D(double ix,double iy,double iz=0.0);
CPoint3D(const double *p);
CPoint3D(POINT3D p);
virtual ~CPoint3D();

public:
CPoint3D operator-(VECTOR3D v) const;
CPoint3D operator+(VECTOR3D v) const;
void operator+=(VECTOR3D v);
void operator-=(VECTOR3D v);

CPoint3D operator-(CVector3D v) const;
CPoint3D operator+(CVector3D v) const;
void operator+=(CVector3D v);
void operator-=(CVector3D v);
};

具体实现如下

CVector3D::CVector3D()
{

}

CVector3D::~CVector3D()
{

}

CVector3D::CVector3D(VECTOR3D v)
{
dx = v.dx;
dy = v.dy;
dz = v.dz;
}

CVector3D::CVector3D(CVector3D &v)
{
dx = v.dx;
dy = v.dy;
dz = v.dz;
}

CVector3D::CVector3D(const double *p)
{
dx = p[0];
dy = p[1];
dz = p[2];
}

CVector3D::CVector3D(double ix, double iy, double iz)
{
dx = ix;
dy = iy;
dz = iz;
}

double CVector3D::GetLength() const//向量的长度
{
double len = 0;
len = sqrt(dx * dx + dy * dy + dz * dz);
return len;
}

void CVector3D::Normal()//单位化
{
double len = GetLength();

dx /= len;
dy /= len;
dz /= len;
}

//向量叉乘,参数为结构或者类
CVector3D CVector3D::operator*(VECTOR3D v) const
{
return CVector3D(dy * v.dz - dz * v.dy, dz * v.dx - dx * v.dz, dx * v.dy - dy * v.dx);
}

CVector3D CVector3D::operator*(CVector3D v) const
{
return CVector3D(dy * v.dz - dz * v.dy, dz * v.dx - dx * v.dz, dx * v.dy - dy * v.dx);

}

void CVector3D::operator-=(VECTOR3D v)
{
dx -= v.dx;
dy -= v.dy;
dz -= v.dz;
}

void CVector3D::operator-=(CVector3D v)
{
dx -= v.dx;
dy -= v.dy;
dz -= v.dz;
}

CVector3D CVector3D::operator+(VECTOR3D v) const
{
return CVector3D(dx + v.dx, dy + v.dy, dz + v.dz);
}

CVector3D CVector3D::operator+(CVector3D v) const
{
return CVector3D(dx + v.dx, dy + v.dy, dz + v.dz);

}

CVector3D CVector3D::operator-(VECTOR3D v) const
{
return CVector3D(dx - v.dx, dy - v.dy, dz - v.dz);
}

CVector3D CVector3D::operator-(CVector3D v) const
{
return CVector3D(dx - v.dx, dy - v.dy, dz - v.dz);

}

CVector3D CVector3D::operator*(double d) const
{
return CVector3D(dx * d, dy * d, dz * d);
}

void CVector3D::operator=(CVector3D v)
{
dx = v.dx;
dy = v.dy;
dz = v.dz;

}

CPoint3D::CPoint3D()
{

}

CPoint3D::~CPoint3D()
{

}

CPoint3D::CPoint3D(double ix,double iy,double iz)
{
x = ix;
y = iy;
z = iz;
}

CPoint3D::CPoint3D(const double *p)
{
x = p[0];
y = p[1];
z = p[2];

}

CPoint3D::CPoint3D(POINT3D p)
{
x = p.x;
y = p.y;
z = p.z;
}

CPoint3D CPoint3D::operator-(VECTOR3D v) const
{
return CPoint3D(x - v.dx, y - v.dy, z - v.dz);
}

CPoint3D CPoint3D::operator+(VECTOR3D v) const
{
return CPoint3D(x + v.dx, y + v.dy, z + v.dz);
}

void CPoint3D::operator+=(VECTOR3D v)
{
x += v.dx;
y += v.dy;
z += v.dz;
}

void CPoint3D::operator-=(VECTOR3D v)
{
x -= v.dx;
y -= v.dy;
z -= v.dz;
}

CPoint3D CPoint3D::operator-(CVector3D v) const
{
return CPoint3D(x - v.dx, y - v.dy, z - v.dz);
}

CPoint3D CPoint3D::operator+(CVector3D v) const
{
return CPoint3D(x + v.dx, y + v.dy, z + v.dz);
}

void CPoint3D::operator+=(CVector3D v)
{
x += v.dx;
y += v.dy;
z += v.dz;
}

void CPoint3D::operator-=(CVector3D v)
{
x -= v.dx;
y -= v.dy;
z -= v.dz;
}

免责声明:文章转载自《简单基于OPENGL的三维CAD框架(1)工具类》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu下使用tmux实现分屏,以及tmux快捷键十大Web压力测试工具下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

es6常用方法

一、let 和 constlet 声明变量,只在所在的块区有效,不存在变量提升;var 存在变 量提升const 声明常量,只在所在块区有效 二、变量的解构赋值1.数组的解构赋值let [a, b, c] = [1, 2, 3];// a=1;b=2;c=3 2.对象的解构赋值let { foo, bar } = { foo: "aaa", bar: "b...

OpenGL实现多层绘制(Layered Rendering) [转]

http://blog.csdn.net/u010462297/article/details/50589991 引言 在某些情况下会需要用到多层绘制。FBO下有多个颜色挂接点(Color Attachment),可以用不同的挂接点挂接不同的纹理对象,实现绘制多张纹理(MRT),这在之前的文章里已经有所描述。但是有时候这种方法是不够好用的: - 当纹理非...

从VantComponent 谈小程序维护

在开发小程序的时候,我们总是期望用以往的技术规范和语法特点来书写当前的小程序,所以才会有各色的小程序框架,例如 mpvue、taro 等这些编译型框架。当然这些框架本身对于新开发的项目是有所帮助。而对于老项目,我们又想要利用vue的语法特性进行维护,又该如何呢?在此我研究了一下youzan的 vant-weapp。而发现该项目中的组件是如此编写的。 imp...

句柄类与继承

前一小节《容器与继承》http://blog.csdn.net/thefutureisour/article/details/7744790提到过: 对于容器,假设定义为基类类型,那么则不能通过容器訪问派生类新增的成员;假设定义为派生类类型,一般不能用它承载基类的对象,即使利用类型转化强行承载,则基类对象能够訪问没有意义的派生类成员,这样做是非常危...

DataSnap基础

DataSnap基础 1. DATASNAP 历史 作为MIDAS起始于Delphi3,Delphi4是MIDAS II,Delphi5中是MIDASIII,而后基于COM远程数据模块方式使用TCP/IP,HTTP,(D)COM构建出强大的通讯能力.从Delphi6开始改名为DataSnap,直到D2007这个框架一直在使用.D2009重新架构了DataS...

C#如何获取其他程序ListView控件中的内容

源码下载:http://download.csdn.net/detail/php_fly/4923388 需求:获取其他程序中的ListView控件的文本内容 原理:进程之间是相互隔离的,数据是不能共享的(有些特例)    LVM_GETTITEMTEXT:将一个数据缓冲区提供给listview32控件,你不能把你的进程的数据缓冲提供给另外的程序,所以要用...