c语言绘制球体(通过easyx)

因为学习了c语言想着用c语言绘制立体的球体,先说自己的思路吧,先是随机生成一些球体的坐标,再将这些坐标通过公式转化为2D的坐标,绘制在电脑上。程序中包括了3D点的旋转,平移,缩放,大家可以参考一下。通过自己改变一些东西,可能会有更有趣的发现吧。
这里用到了线性代数的知识,大家可以参考以下链接,程序中的3D点的旋转来源可以在里面找到,当然大家也可以通过自己的认知来编写更有趣的东西。
https://blog.csdn.net/smilejiasmile/article/details/80147901

// 定义三维点
struct POINT3D
{
double x;
double y;
double z;
};

POINT3D p3d[MAXPOINT]; // 所有的三维点
double viewZ = 3; // 视点 z 轴坐标

                        // 初始化三维点

void InitPoint()
{
// 产生随机种子
srand(time(NULL));

// 产生球体表面的随机点(根据球体面积与其外切圆柱面积的关系)
double rxy, a;
for (int i = 0; i

}
//使球体按比例缩放
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

}

需要graphics.h,time.h,math.h,conio.h这些头文件的。

你可能感兴趣的:(c语言绘制球体(通过easyx))