C++Builder绘制三维曲面

hu_cdut 2006-09-05 07:30:43
哪位用C++Builder绘制过三维曲面?
我要用C++Builder绘制曲面,还必须消隐.
希望大家给点思路哈!
先谢了!
...全文
397 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
leesnow1 2006-10-16
  • 打赏
  • 举报
回复
用 MATLAB把
Y___Y 2006-09-05
  • 打赏
  • 举报
回复
这里有我自己编写的一个简单的绘制三维曲面类,不过是画的网格
能以任意视角绘制,任意放大,网格密度也可以是任意的
但不能消隐,不能进行纹理映射
如果需要较好的效果,可以花点时间学习openGL编程
#include <math.h>
//绘制三维曲面类
class Draw3DSurface
{
protected:
double Ox,Oy;//原点坐标
double startX,startY,endX,endY;//起始位置和终止位置
int numX,numY;//线条数目
double tc,tp;//平视角,仰视角
double R; //放大倍数
public:
void InitInstance( double Ox0,double Oy0,
double startX0,double startY0,double endX0,double endY0,
int numX0,int numY0,
double tc0,double tp0,
double R0
);//初始化
Draw3DSurface();
Draw3DSurface( double Ox0,double Oy0,
double startX0,double startY0,double endX0,double endY0,
int numX0,int numY0,
double tc0,double tp0,
double R0
);
void SetOrigin(double Ox0,double Oy0);//设置原点
void SetLocation(double startX0,double startY0,
double endX0,double endY0);//设置起始和终止位置
void SetNum(int numX0,int numY0);//设置线条数目
void SetAngle(double Ox0,double Oy0);//设置角度
void SetMultiple(double R0);//设置倍数
void Draw(TCanvas *pDc,double (*fun)(double,double));// 绘制三维曲面
};
Draw3DSurface::Draw3DSurface()
{
InitInstance(300.0,300.0,
0.0,0.0,1.0,1.0,
10,10,
1.047197551,0.785398163,
10.0
);

}
Draw3DSurface::Draw3DSurface(double Ox0,double Oy0,
double startX0=0.0,double startY0=0.0,double endX0=1.0,double endY0=1.0,
int numX0=10,int numY0=10,
double tc0=1.047197551,double tp0=0.785398163,
double R0=10)
{
InitInstance( Ox0,Oy0,
startX0,startY0,endX0,endY0,
numX0,numY0,
tc0,tp0,
R0
);
}
void Draw3DSurface::InitInstance(double Ox0=300,double Oy0=300,
double startX0=0.0,double startY0=0.0,double endX0=1.0,double endY0=1.0,
int numX0=10,int numY0=10,
double tc0=1.047197551,double tp0=0.785398163,
double R0=10)
{
Ox=Ox0;
Oy=Oy0;
startX=startX0;
startY=startY0;
endX=endX0;
endY=endY0;
numX=numX0;
numY=numY0;
tc=tc0;
tp=tp0;
R=R0;
}
void Draw3DSurface::SetOrigin(double Ox0,double Oy0)
{
Ox=Ox0;
Oy=Oy0;
}
void Draw3DSurface::SetLocation(double startX0,double startY0,
double endX0,double endY0)
{
startX=startX0;
startY=startY0;
endX=endX0;
endY=endY0;
}
void Draw3DSurface::SetNum(int numX0,int numY0)
{
numX=numX0;
numY=numY0;
}
void Draw3DSurface::SetMultiple(double R0)
{
R=R0;
}
void Draw3DSurface::Draw(TCanvas *pDC,double (*fun)(double,double))
{ int i;
register int j;
int ix=int(endX-startX);
int iy=int(endY-startY);
double ddx,ddy;
double x,y,z,x0,y0;
double dx=(endX-startX)/numX,dy=(endY-startY)/numY;
double sintc=sin(tc),costc=cos(tc),sintp=sin(tp),costp=cos(tp);
ddx=(endX-startX)/ix;
ddy=(endY-startY)/ix;
for(i=0;i<=numX;i++)
{
x=startX+i*dx;
y=startY;
z=(*fun)(x,y);
x0=-x*sintc+y*costc;
y0=-x*costp*costc-y*costp*sintc+z*sintp;
pDC->MoveTo((int)(Ox+R*x0),(int)(Oy-R*y0));
for(j=0;j<=iy;j++)
{
y=startY+j*ddy;
z=(*fun)(x,y);
x0=-x*sintc+y*costc;
y0=-x*costp*costc-y*costp*sintc+z*sintp;
pDC->LineTo((int)(Ox+R*x0),(int)(Oy-R*y0));
}
}
for(i=0;i<=numY;i++)
{
y=startY+i*dy;
x=startX;
z=(*fun)(x,y);
x0=-x*sintc+y*costc;
y0=-x*costp*costc-y*costp*sintc+z*sintp;
pDC->MoveTo((int)(Ox+R*x0),(int)(Oy-R*y0));
for(j=0;j<=iy;j++)
{
x=startX+j*ddx;
z=(*fun)(x,y);
x0=-x*sintc+y*costc;
y0=-x*costp*costc-y*costp*sintc+z*sintp;
pDC->LineTo((int)(Ox+R*x0),(int)(Oy-R*y0));
}
}
}
Y___Y 2006-09-05
  • 打赏
  • 举报
回复
用openGL编程吧

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧