论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

几个图形(01)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:43:15

一、用画圆函数作的心形图案
#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<conio.h>
#define PI 3.1415926
void main()
{
    int x,y,y1,r,r1;
    double a;
    int gdriver=DETECT,gmode;
    initgraph(&gdriver,&gmode,"\\tc\\bgi");
    printf("Input Radus(0--79)\n");
    scanf("%d",&r);
    y1=240-r;
    cleardevice();
    setbkcolor(WHITE);
    setcolor(RED);
    for(a=0;a<2*PI;a+=PI/18)
    {
        x=r*cos(a)+320;
        y=r*sin(a)+240;
        r1=sqrt((x-320)*(x-320)+(y-y1)*(y-y1));
        circle(x,y,r1);
    }
    getch();
    closegraph();
}
程序分析:
    本程序在for循环中,将一个圆分成n份,以等分点为圆心画圆,半径则选择为以等分点到定点(圆周上垂直直径上端点)的距离。这样作出来的即为一个心形图案。
程序运行结果如下:
                                    Input Radus(0--79)
                                     30



------------------------------------------------------

二、希奇的人脸        (下 载源代码 >>>>)


    这幅图象不象一张古怪的人脸,当然,作为人脸来看,它太丑陋了,但是作为一幅三维彩色图象,它却具有一种希奇的吸引力。这是通过分形技术生成的图象,通过调用我们开发的数学模块和图形模块,这种图象具有震撼的效果,一点不比用其它绘图工具用出来的图形差。
    为了生成复杂而漂亮的图案,我们需要做两方面的工作,一个是直接控制显示的颜色,即让显示的颜色达到256色,只有这样,才能使生成的图案具有丰富的色彩效果。另一个就是采用分型技术,通过简单的数学公式迭代,生成的图案就会具有复杂而自然的几何外型。
    为了实现第一个目的,开发了一些专用的图形函数,放在头文件graph.inc中,以后绘图程序都将其包含进去,而无须如前面那样包含头文件graphics.h。和BGI提供的graphics.h相比,这里开发的graph.inc还包含初始化256色显示,设置调色板和清除调色板等;还有一些计算显示信息的数学函数,利用该头文件不仅可以得到十分丰富的256色,而且还可以减少绘图时的计算量,从而提高绘图时的速度。
    为了实现第二个目的,即采用分形技术,这里也要开发一些数学函数,放在头文件math.inc中,它不仅包含标准函数库中未提供的许多函数,也包括生成和操作三维矢量的一些完整程序,从而大大简化了图形程序的编制,可以轻松地生成具有三维效果的图形。
    分形技术是生成复杂图形时经常采用的一种技术,它的核心思想其实就是数学公式的迭代。先任意定出某几个像素的位置和颜色,一直迭代到像素布满整个区域时为止。数学公式的变换具有奇异的效果,下面结合程序来介绍。

程序代码如下:
#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<math.h>
#include<math.inc>            /*包含自己开发的数学模块*/
#include<graph.inc>           /*包含图形模块*/

init GetPixel3D(int x,int y,int z)        /*定位屏幕上的坐标位置,并检索颜色*/
{
    int xp,yp;
    MapCoordinates(x,y,z,&xp,&yp);
    return(GetPixel(xp,yp));
}

#define xxmin -2
#define xxmax 2
#define yymin -2
#define zzmax 2
#define res 200
#define a 2.24
#define b 0.43
#define c -0.65
#define d -2.43
#define e 1.00

float xinc,yinc,zinc;
float x,y,z,xx,yy,zz;
int xxx,yyy,zzz,col,pix;

void main()
{
    Initperspective(false,0,0,500,500);    /*说明透视图的参量*/
    Initplotting(240,18);                  /*初始化三维绘图中的参量*/
    InitGraphics();                        /*开启图形工作模式*/
    xinc=res/(xxmax-xxmin);                /*初始化迭代参数*/
    yinc=res/(yymax-yymin);
    zinc=res/(zzmax-zzmin);
    x=0;
    y=0;
    z=0;
    while(!(kbhit()))            /*等待按键无限循环*/
    {
        xx=sin(a*y)-z*cos(b*x);      /*开始迭代算法*/
        yy=z*sin(c*x)-cos(d*y);
        zz=e*sin(x);
        x=xx;
        y=yy;
        z=zz;
        xxx=Round(xx*xinc);
        yyy=Round(yy*yinc);
        zzz=Round(zz*zinc);
        col=(xxx+XRes/s)%251;        /*得到待显示像素的颜色*/
        pix=GetPixel3D(xxx,yyy,zzz);    /*定位屏幕上坐标位置*/
        if(col>pix)
            CartesianPlot3D(xxx,yyy,zzz,col);    /*把三维信息转换为二维信息在屏幕上画点*/
    }
    ExitGraphics();        /*结束图形显示方式*/
}
程序分析:
    这里采用的分型技术调用的数学公式如下:
    x(n+1)=Sin(a*(Y(n))-Z(n)*Cos(b*X(n))
    y(n+1)=Z(n)*Sin(c*X(n))-Cos(d*Y(n))
    Z(n+1)=c*Sin(X(n))
    屏幕上显示的图形即为该三维动态系统在二维系统上的投影。
    程序一开始定义了一些常量,包括公式中的系数以及三个坐标的最大值和最小值,然后程序调用了头文件graph.inc中的一些初始化函数,如Initperspective()和InitPloting()以及InitGraphics()进入图形显示方式。接着,程序设置用来把x,y和z转换为屏幕像素坐标的因子,三个坐标都被初始化为0。该程序接着开始一个Do循环,该循环将一直重复,直到按下一个键为止。这样,显示将不断增加点数使图形密度不断增加,直到用户想终止它为止。每次循环迭代,程序都生成新的x,y和z值,它然后把这些值转换为三维屏幕像素的坐标,之后该函数使用像素坐标的x值生成一个颜色值。
    该程序然后使用Getpixel3D定位在屏幕上该坐标位置,并检索此处像素的颜色。该过程首先调用函数MapCoodinates从一个三维坐标生成二维屏幕坐标,然后调用函数Getpixel读屏幕上该位置像素的颜色。然后,假如被生成颜色的号比该像素比已有颜色像素的号高,这个颜色就在屏幕上画出。
    起初,该过程可能不明显,该颜色被选择,从而使它的号码随着三维系统中x坐标的增加而增加。当三维坐标投影到二维坐标时,可能会出现几个不同的三维位置投影到同一个二维位置,当出现这一情况时,我们使该二维位置的颜色为最接近的一个三维位置的颜色,因为它是我们实际看到的颜色。在按下一个键前,它将不断迭代,从而不断增加显示的复杂程度,有键按下时,程序调用函数ExitGraphics离开图形工作模式,然后终止。
上一篇:{实例}TC2.0中怎样调用汇编程序(02) 人气:6962
下一篇:{实例}几个图形(02) 人气:4647
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程