会旋转的星状图

来源:互联网 发布:云计算需要什么基础 编辑:程序博客网 时间:2024/06/10 01:22
 
有好事者,将TC库导入到VC中,我姑且命名之VTC,VTC用起来很爽,VC的画图必须是要到窗口下的,用GDI,过程比较

复杂,但是TC就简单多了

以前发誓再也不用TC了,这也遂了我的心了,不用TC以后用VC,VC中可以导入TC库嘛,岂不是爽哉。

其实TC中有些东西可以学学,比如说异或技术,拉屏技术,这些东西在游戏中用到了,不管是过去的怀旧经典游戏,

还是现在花样百出的3D游戏

TC让我知道有显存这回事,只要你改变显存中某个单元的值,屏幕上的图像就会发生变化,只是你不察觉而已。

#include <stdio.h>
#include "graphics.h"
#include <conio.h>
#include <math.h>
//--------------------------------------------------------------------------------------
//以(orgin_x, origin_y)为圆点,按照arc角度旋转,放大mutiple倍, 以color为颜色画一个星状图
//该星状图的函数为
//x = cos(s) * cos(s) * cos(s)
//y = sin(s) * sin(s) * sin(s)
//--------------------------------------------------------------------------------------
void DrawStar(double origin_x, double origin_y, double arc, int mutiple, size_t color);

//--------------------------------------------------------------------------------------
//获取坐标系中的某点
//--------------------------------------------------------------------------------------
int GetQuardrand(double x, double y);

int main()
{
 int x_center, y_center;
 double beg = 0;
 initgraph(-1, -1);//初始化屏幕大小,参数分别表示屏幕的高和宽,(-1, -1)表示全屏
 //-------------获取屏幕的中点位置----------------
 x_center = getmaxx() / 2;
 y_center = getmaxy()/  2;
 //----------------------------------------------
 //---------------判断有无按键,按键结束-------------------
 while(!kbhit())
 {
  //循环设置角度(0-2pi)
  for(beg = 0; beg <= 2.0 && !kbhit(); beg += 0.01)
  {
   //画一个某个角度上的星状图
   DrawStar(x_center, y_center, beg * PI, y_center, WHITE);
   //DrawStar(x_center, y_center, (2 - beg) * PI, y_center, WHITE);//这个可以反向旋转
   delay(50);//延迟50毫秒
   cleardevice();//清屏(VC中TC库居然不能用异或技术,遗憾啊,只见屏幕一闪一闪,心烦
  }
 }
 closegraph();//关闭图形设备
 return 0;
}

void DrawStar(double origin_x, double origin_y, double arc, int mutiple, size_t color)
{
 double beg = 0, x, y, cosValue, sinValue, distance, interAngle;
 int n;
 //从(0-2pi)旋转,获取各个角度上的点,(记住beg并不是某个点到原点的射线与X轴的夹角)
 for(;beg < 2.0; beg += 0.01)
 {
  //------------获取某点的X坐标-----------------------
  cosValue = cos(PI * beg);
  x = mutiple * cosValue * cosValue * cosValue;
  //-------------------------------------------
  //------------获取某点Y的坐标------------------------
  sinValue = sin(PI * beg);
  y = mutiple * sinValue * sinValue * sinValue;
  //---------------------------------------------------
  //------------(x, y)到原点的距离---------------------
  distance = sqrt(x * x + y * y);
  //---------------------------------------------------
  //------------(x, y)所在坐标的象限-------------------
  n = GetQuardrand(x, y);
  //---------------------------------------------------
  //-----------获取某个点到原点的射线与X轴的夹角-------
  switch(n)
  {
  case 1://一象限
   interAngle = asin(y / distance);
   break;
  case 2://二象限
   interAngle = PI - asin(y / distance);
   break;
  case 3://三象限
   interAngle = PI - asin(y / distance);
   break;
  case 4://四象限
   interAngle = 2 * PI + asin(y / distance);
   break;
  case 5://X轴左半轴
   interAngle = 0;
   break;
  case 6://Y轴上半轴
   interAngle = 0.5 * PI;
   break;
  case 7://X轴右半轴
   interAngle = PI;
   break;
  case 8://Y轴下半轴
   interAngle = 1.5 * PI;
   break;
  }
  //------------------------------------------------
  //获取旋转并且平移之后的新的坐标
  //此时该点的坐标为原来点的夹角加图形旋转的角度
  //平移,分别把此点在向量方向上加上原点(origin_x, origin_y)的位置
  x = distance * cos(interAngle + arc) + origin_x;
  y = distance * sin(interAngle + arc) + origin_y;
  //-----------------------------------------------
  //-------------此时要有微积分的思想,任何图形都是有很微小的线段组成的,近乎点了---
  if(beg == 0)
  {
   moveto((int)x, (int)y);//移动到第一个
  }
  else
  {
   lineto((int)x, (int)y);//以后一直画线
  }
  //----------------------------------------------------------------------------------
 }
}
//判断(x, y)所在坐标系的位置
int GetQuardrand(double x, double y)
{
 if(x > 0 && y > 0) return 1;//一象限
 if(x < 0 && y > 0) return 2;//二象限
 if(x < 0 && y < 0) return 3;//三象限
 if(x > 0 && y < 0) return 4;//四象限
 if(x > 0 && y == 0) return 5;//X左半轴
 if(x == 0 && y > 0) return 6;//Y上半周
 if(x < 0 && y == 0)return 7;//X右半轴
 if(x == 0 && y < 0) return 8;//Y下半轴
 return 0;//原点
}

原创粉丝点击