c语⾔绘制球体(通过easyx)
// 定义三维点
struct POINT3D
{
double x;
double y;
double z;
};
POINT3D p3d[MAXPOINT]; // 所有的三维点
double viewZ = 3; // 视点 z 轴坐标
// 初始化三维点
c语言struct头文件void InitPoint()
{
// 产⽣随机种⼦
srand(time(NULL));
// 产⽣球体表⾯的随机点(根据球体⾯积与其外切圆柱⾯积的关系)
double rxy, a;
for (int i = 0; i<MAXPOINT; i++)
{
p3d[i].z = 2.0 * rand() / RAND_MAX - 1; // 求随机 z 坐标
rxy = sqrt(1 - p3d[i].z * p3d[i].z); // 计算三维⽮量在 xoy 平⾯的投影长度
a = 2 * PI * rand() / RAND_MAX; // 产⽣随机⾓度
p3d[i].x = cos(a) * rxy;
p3d[i].y = sin(a) * rxy;
}
}
//使球体按⽐例缩放
void Zoom(POINT3D &p,double Magnification) //Magnification是缩放的倍数
{
double R;
R = sqrt(p.x * p.x + p.y*p.y + p.z * p.z);
if (R <= 0)return;
p.x = p.x*Magnification;
p.y = p.y*Magnification;
p.z = p.z*Magnification;
}
//使球体平移
void Translation(POINT3D &p,double x_direction,double y_direction,double z_direction) {
p.x += x_direction;
p.y += y_direction;
p.z += z_direction;
}
// 使三维点按 x 轴旋转指定⾓度
void RotateX(POINT3D &p, double angle)
{
double y = p.y;
p.y = p.y * cos(angle) + p.z * sin(-angle);
p.z = y * sin(angle) + p.z * cos(angle);
}
// 使三维点按 y 轴旋转指定⾓度
void RotateY(POINT3D &p, double angle)
{
double x = p.x;
p.x = p.x * cos(angle) + p.z * sin(-angle);
p.z = x * sin(angle) + p.z * cos(angle);
}
// 使三维点按 z 轴旋转指定⾓度
void RotateZ(POINT3D &p, double angle)
{
double x = p.x;
p.x = p.x * cos(angle) + p.y * sin(-angle);
p.y = x * sin(angle) + p.y * cos(angle);
}
// 将三维点投影到⼆维屏幕上(单点透视)
POINT Projection(POINT3D p)
{
POINT p2d;
p2d.x = (int)(p.x * (viewZ / (viewZ - p.z)) * 200 + 0.5) + 320; p2d.y = (int)(p.y * (viewZ / (viewZ - p.z)) * 200 + 0.5) + 240; return p2d;
}
int main()
{
initgraph(640, 480);
InitPoint();
BeginBatchDraw();
int c;
POINT p2d;
while (!_kbhit())
{
cleardevice(); // 清除屏幕
for (int i = 0; i<MAXPOINT; i++)
{
// 使该点围绕三个坐标轴做旋转运动
RotateX(p3d[i],- (PI / 180));
RotateY(p3d[i],- (PI / 180));
RotateZ(p3d[i], PI / 160);
//进⾏缩放
// Zoom(p3d[i],0.99);
//球体的平移
/
/Translation(p3d[i],-0.01, 0, 0);
// 根据点的深度,产⽣相应灰度的颜⾊
c = (int)(p3d[i].z * 100) + 155;
// 投影该点到屏幕上
p2d = Projection(p3d[i]);
// 画点
putpixel(p2d.x, p2d.y, RGB(c, c, c));
}
FlushBatchDraw();
Sleep(10); // 延时 10 毫秒
}
EndBatchDraw();
closegraph();
return 0;
}
需要graphics.h,time.h,math.h,conio.h这些头⽂件的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论