LOVEEVER 发表于 2024-1-30 17:00

C语言写一个旋转的球-应用


为了在计算机中表示复杂的曲面,我们通常采用一种称为网格化的方法。这意味着将曲面离散化为一系列的小平面片,每个平面片都是一个简单的几何形状,如四边形或三边形。通过这种方式,我们可以用这些简单的平面形状来近似表示原始的曲面。
网格的精度决定了其逼近曲面的效果。当我们将曲面细分得越精细,就需要更多的四边形或三边形来填充这些小区域。这意味着曲面在计算机中的表示将更加接近其实际形状,看起来也就更加光滑。
然而,这种精细化的过程也带来了计算上的挑战。随着网格密度的增加,我们需要处理更多的四边形或三边形,这会导致计算工作量的大幅增加,处理速度也会变慢。
因此,在实际应用中,需要在精度与计算效率之间进行权衡。选择合适的网格密度以实现所需的逼近效果,同时确保计算效率和性能。
下面绘制一个动态的球:

#include<graphics.h>
#include<math.h>
#include<stdio.h>
#include<conio.h>

#define PI acos(-1.0)
void HideSphere(float R,int alfa,int beta,int HideFlag);

int main()
{
initgraph(640, 480);
BeginBatchDraw();
while (true)
{
    for (int i = 0; i < 180; i++)
    {
      HideSphere(200, 45 + i, 30 + i, 1);
      Sleep(20);
      FlushBatchDraw();
      cleardevice();
    }
}
EndBatchDraw();
_getch();
}

void HideSphere(float R, int alfa, int beta, int HideFlag)
{
int i, j, k;
float x, y, z, x1, y1, z1, sx, sy;
double a1, a2, b1, b2, c, d, xn, yn, zn, vn;
c = alfa * PI / 180.0;
d = beta * PI / 180.0;
for (j = 0; j < 180; j = j + 5)
{
    a1 = j * PI / 180.0;
    a2 = (j + 5) * PI / 180.0;
    for (i = 0; i < 360; i = i + 5)
    {
      b1 = i * PI / 180.0;
      b2 = (i + 5) * PI / 180.0;
      x = R * sin(a1) * cos(b1); y = R * sin(a1) * sin(b1); z = R * cos(a1);
      x = R * sin(a2) * cos(b1); y = R * sin(a2) * sin(b1); z = R * cos(a2);
      x = R * sin(a2) * cos(b2); y = R * sin(a2) * sin(b2); z = R * cos(a2);
      x = R * sin(a1) * cos(b2); y = R * sin(a1) * sin(b2); z = R * cos(a1);
      for (k = 0; k < 4; k++)
      {
      x1 = x * cos(c) - y * sin(c);
      y1 = x * sin(c) * cos(d) + y * cos(c) * sin(d) + z * sin(d);
      z1 = -x * sin(c) * sin(d) - y * cos(c) * sin(d) + z * cos(d);
      sx = 320 - x1;
      sy = 240 - z1;
      }
      xn = (y1 - y1) * (z1 - z1) - (y1 - y1) * (z1 - z1);
      yn = -(x1 - x1) * (z1 - z1) + (x1 - x1) * (z1 - z1);
      zn = (x1 - x1) * (y1 - y1) - (x1 - x1) * (y1 - y1);
      vn = sqrt(xn * xn + yn * yn + zn * zn);
      xn = xn / vn;
      yn = yn / vn;
      zn = zn / vn;
      if (!HideFlag || yn >= 0.0)
      {
      moveto(sx,sy);
      lineto(sx,sy);
      lineto(sx,sy);
      lineto(sx,sy);
      lineto(sx,sy);
      }
    }
}
}

tpgf 发表于 2024-2-2 11:47

这个是用c语言来勾勒出一个立体的球体吗

zljiu 发表于 2024-2-2 12:18

如果是其他曲面 算法就会非常不同了吧

nawu 发表于 2024-2-2 12:48

想象着应该是挺难的 不知道怎么能显示出来具象

gwsan 发表于 2024-2-2 13:38

需要对球体上的每个点都要进行操作

aoyi 发表于 2024-2-2 17:58

其实相对来说 球应该是一个比较简单的形体了

tfqi 发表于 2024-2-2 18:31

moveto这个函数是什么用途的呢
页: [1]
查看完整版本: C语言写一个旋转的球-应用