er.zip

  • PUDN用户
    了解作者
  • C/C++
    开发工具
  • 2KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 8
    下载次数
  • 2009-11-24 22:12
    上传日期
计算机图形学二维图形基本变换的算法实现 使用Turbo C的开发环境
er.zip
  • TCMAIN.C
    9.3KB
内容介绍
#include <stdarg.h> #include <stdlib.h> #include <stdio.h> #include <graphics.h> #include <conio.h> #include <string.h> #include <math.h> /*define custom types */ typedef struct Point { double x; double y; }Point,*pPoint; typedef struct Polygon{ int count; Point p[100]; }Polygon,*pPolygon; enum GeometricTransformation {/* 五种类型几何变换枚举值 */ SCALE, SYMMETRY_X, SYMMETRY_Y, SYMMETRY_O, SYMMETRY_45, SYMMETRY_N45, SHEAR_X, SHEAR_Y, CIRCUMROTATE, SHIFT }; /*information of this program*/ char *QUIT_INFO = "press any key to quit..."; char *INFO = "author: 2009-11-01 00:21:00"; /*resolution of current window,the center position and the area size for drawing*/ int SCREEN_X=0,SCREEN_Y=0,CENTER_X=0,CENTER_Y=0,WORK_AREA_SIZE=0; /** initialize graphics mode and the global variables*/ int init(){ int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, ""); /* read result of initialization */ errorcode = graphresult(); if (errorcode != grOk){ /* an error occurred */ printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt..."); getch(); exit(1); } setbkcolor(DARKGRAY);/*set the default background color*/ setcolor(BLUE);/*set the default line color*/ /*initialize the global variables start*/ SCREEN_X=getmaxx(); SCREEN_Y=getmaxy(); CENTER_X=SCREEN_X/2; CENTER_Y=SCREEN_Y/2; WORK_AREA_SIZE = 3*(SCREEN_Y<SCREEN_X?SCREEN_Y:SCREEN_X)/5; /*initialize the global variables end*/ return 0; } /** waiting to quit,then destory the graphic and quit*/ int join(){ setcolor(RED); setlinestyle(SOLID_LINE,0,THICK_WIDTH); outtextxy(5,SCREEN_Y-2*textheight(QUIT_INFO)-2,QUIT_INFO); outtextxy(5,SCREEN_Y-textheight(INFO),INFO); getch(); closegraph(); return 0; } /*draw a polygon */ int drawPolygon(Polygon polygon){ int i=0; if(polygon.count<3){printf("fatal error:not a polygon.\n");return -1;} for(i=0;i<polygon.count-1;i++){ line(CENTER_X+polygon.p[i].x,CENTER_Y-polygon.p[i].y,CENTER_X+polygon.p[i+1].x,CENTER_Y-polygon.p[i+1].y); } line(CENTER_X+polygon.p[0].x,CENTER_Y-polygon.p[0].y,CENTER_X+polygon.p[polygon.count-1].x,CENTER_Y-polygon.p[polygon.count-1].y); return 0; } int clear(){ char msg[80]; cleardevice(); setcolor(LIGHTCYAN); setlinestyle(DOTTED_LINE,0,NORM_WIDTH); line(CENTER_X,0,CENTER_X,SCREEN_Y); line(0,CENTER_Y,SCREEN_X,CENTER_Y); setlinestyle(SOLID_LINE,0,NORM_WIDTH); line(SCREEN_X,CENTER_Y,SCREEN_X-7,CENTER_Y-7); line(SCREEN_X,CENTER_Y,SCREEN_X-7,CENTER_Y+7); line(CENTER_X,0,CENTER_X-7,7); line(CENTER_X,0,CENTER_X+7,7); setcolor(LIGHTMAGENTA); outtextxy(SCREEN_X-10,CENTER_Y+10,"x"); outtextxy(CENTER_X+10,10,"y"); setcolor(BLUE); } /*########################### common lib start ###########################################*/ /*二维图形的基本几何变换, polygon:多边形, mode:几何变换模式枚举值,由GeometricTransformation定义*/ int transfrom(Polygon polygon,int mode,...){ int i,flag=0; double tmp,tmp2,f=0.0,fx=0.0,fy=0.0; va_list args; va_start(args,mode); switch(mode){ case SCALE:{/*比例变换:fx-x轴缩放因子,fy-y轴缩放因子*/ fx = va_arg(args,double); fy = va_arg(args,double); flag = 1; break; } case SYMMETRY_X:{/*x轴对称变换*/ fx = 1;fy = -1;flag = 1; break; } case SYMMETRY_Y:{/*y轴对称变换*/ fx = -1; fy = 1;flag = 1; break; } case SYMMETRY_O:{/*原点对称变换*/ fx = -1; fy = -1;flag = 1; break; } case SYMMETRY_45:{/*45度线对称变换*/ for(i=0;i<polygon.count;i++){ tmp = polygon.p[i].x; polygon.p[i].x = polygon.p[i].y; polygon.p[i].y = tmp; } break; } case SYMMETRY_N45:{/*-45度线对称变换*/ for(i=0;i<polygon.count;i++){ tmp = polygon.p[i].x; polygon.p[i].x = -polygon.p[i].y; polygon.p[i].y = -tmp; } break; } case SHEAR_X:{/*错切变换:沿x轴方向错切,f-错切因子*/ f = va_arg(args,double); for(i=0;i<polygon.count;i++){ polygon.p[i].x = polygon.p[i].x + f*polygon.p[i].y; } break; } case SHEAR_Y:{/*错切变换:沿y轴方向错切,f-错切因子*/ f = va_arg(args,double); for(i=0;i<polygon.count;i++){ polygon.p[i].y = polygon.p[i].y + f*polygon.p[i].x; } break; } case CIRCUMROTATE:{/*旋转变换:f-逆时针旋转角度*/ f = va_arg(args,double); while(f<0.0){ f += 360.0; } f = f*(3.1415926/180); for(i=0;i<polygon.count;i++){ tmp = cos(f)*polygon.p[i].x - sin(f)*polygon.p[i].y; tmp2 = sin(f)*polygon.p[i].x + cos(f)*polygon.p[i].y; polygon.p[i].x = tmp; polygon.p[i].y = tmp2; } break; } case SHIFT:{/*平移变换:fx-x轴方向位移,fy-y轴方向位移*/ fx = va_arg(args,double); fy = va_arg(args,double); for(i=0;i<polygon.count;i++){ polygon.p[i].x = polygon.p[i].x + fx; polygon.p[i].y = polygon.p[i].y + fy; } break; } default:{ printf("fatal error:illegal mode value:%d\n",mode); return -1; } } va_end(args); if(flag==1){ for(i=0;i<polygon.count;i++){ polygon.p[i].x = fx*polygon.p[i].x; polygon.p[i].y = fy*polygon.p[i].y; } } drawPolygon(polygon); return 0; } /*########################### common lib end ############################################*/ int draw(){ Polygon polygon; /* ########## 比例变换测试 开始 ########## */ polygon.count = 5; polygon.p[0].x = 50;polygon.p[0].y = - 10; polygon.p[1].x = - 15;polygon.p[1].y = - 60; polygon.p[2].x = - 40;polygon.p[2].y = - 5; polygon.p[3].x = - 25;polygon.p[3].y = + 26; polygon.p[4].x = + 7;polygon.p[4].y = + 50; clear(); getch(); drawPolygon(polygon); getch(); setcolor(RED); transfrom(polygon,SCALE,1.5,0.9); getch(); /* ########## 比例变换测试 结束 ########## */ /* ########## 对称变换测试 开始 ########## */ polygon.count = 6; polygon.p[0].x = 30;polygon.p[0].y = 20; polygon.p[1].x = 80;polygon.p[1].y = 20; polygon.p[2].x = 80;polygon.p[2].y = 30; polygon.p[3].x = 60;polygon.p[3].y = 30; polygon.p[4].x = 60;polygon.p[4].y = 80; polygon.p[5].x = 30;polygon.p[5].y = 80; clear(); drawPolygon(polygon); getch(); setcolor(RED); transfrom(polygon,SYMMETRY_X); getch(); transfrom(polygon,SYMMETRY_Y); getch(); transfrom(polygon,SYMMETRY_O); getch(); clear(); setcolor(LIGHTGREEN); moveto(CENTER_X,CENTER_Y); linerel(SCREEN_X+SCREEN_Y,SCREEN_X+SCREEN_Y); moveto(CENTER_X,CENTER_Y); linerel(-SCREEN_X-SCREEN_Y,-SCREEN_X-SCREEN_Y); moveto(CENTER_X,CENTER_Y); linerel(SCREEN_X+SCREEN_Y,-SCREEN_X-SCREEN_Y); moveto(CENTER_X,CENTER_Y); linerel(-SCREEN_X-SCREEN_Y,SCREEN_X+SCREEN_Y); setcolor(BLUE); drawPolygon(polygon); setcolor(RED); getch(); transfrom(polygon,SYMMETRY_45); getch(); transfrom(polygon,SYMMETRY_N45); getch(); setcolor(BLUE); /* ########## 对称变换测试 结束 ########## */ /* ########## 错切变换测试 开始 ########## */ polygon.count = 3; polygon.p[0].x = 0
评论
    相关推荐
    • 数据库课程设计
      一个数据库课程设计,access管理工具实现,用的是窗体!
    • 数据库课程设计
      数据库课程设计十分完整有需要的请下载啊谢谢
    • 数据库课程设计
      广东工业大学数据库课程设计,可视化界面连接数据库,delphi7
    • 数据库课程设计
      数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述
    • 数据库课程设计
      数据库课程设计》由周爱武、汪海威、肖云编著,遵循数据库课程设计的具体要求,独立于具体的数据库教材,从实际应用系统的需求着手,引导读者逐步完成数据库设计全过程,重点讲解数据库系统的需求分析、概念设计、...
    • 数据库课程设计
      数据库课程设计人事管理系统 数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计...
    • 数据库课程设计
      数据库课程设计,基于visual basic自助银行管理系统,界面很清爽,实用。同学都说好,所以就上传了!!!
    • 数据库课程设计
      数据库课程设计 里面有详细的文档资料 包含数据库一切的图 以及生成的数据库表文件 期末得分为优秀
    • 数据库课程设计
      可以作为数据库课程设计,也可以作为Java的课程设计,内容全面。本资源转载的,非本人原创。用于交流学习,特此申明!
    • 数据库课程设计
      数据库课程设计蓝天大学学生管理系统 2.商店信息管理系统 3.实验室机房收费管理系统 4.图书馆资料检索系统 5.企业库存管理系统 6.仓库管理系统 7.工程项目管理系统 8.教材管理系统 9.企业人事管理系统 10.企业财务...