C语言4e2,计算机图形学第二次实验E2-1-C语言

Bresenham算法,可画任意直线

// Exp2.cpp : 定义应用程序的入口点。< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

//

运行图:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

代码:由于字数限制,已删除部分。

完全版:见文末地址

//CoprRight WorldsList Soft 2011

#include "stdafx.h"

#include "Exp2.h"

#include "shellapi.h"

#include "tchar.h"

//#include "math.h"

#define MAX_LOADSTRING 100

// 全局变量:

HINSTANCE hInst;// 当前实例

TCHAR szTitle[MAX_LOADSTRING];// 标题栏文本

TCHAR szWindowClass[MAX_LOADSTRING];// 主窗口类名

intflag=0;//标志位flag=1画直线

// 此代码模块中包含的函数的前向声明:

ATOMMyRegisterClass(HINSTANCE hInstance);

BOOLInitInstance(HINSTANCE,int);

LRESULT CALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);

INT_PTR CALLBACKAbout(HWND,UINT,WPARAM,LPARAM);

intDrawLineBresenham(HDC hdc,intx0,inty0,intx1,inty1,intwidth,intheight,COLORREF color);//E2-1直线Bresenham算法

intDrawGraphics(HDC hdc,intwidth,intheight);//画图调用总函数

intDrawCoordinateSystem(HDC hdc,intwidth,intheight);//显示坐标系

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

{

RECT rect;

intwidth,height;//获取窗口大小信息

GetClientRect(hWnd,&rect);

intwmId,wmEvent;

PAINTSTRUCT ps;

HDC hdc;

switch(message)

{

caseWM_COMMAND:

wmId=LOWORD(wParam);

wmEvent=HIWORD(wParam);

// 分析菜单选择:

switch(wmId)

{

caseIDM_ABOUT:

DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);

break;

caseIDM_EXIT:

DestroyWindow(hWnd);

break;

caseID_DrawLineBresenham:

flag=1;

InvalidateRect(hWnd,&rect,true);

break;

caseID_Exp2Help:

MessageBox(hWnd,_T("1.E2-1画直线,使用Bresenham算法,可画任意直线\n  图中画了6条示例直线,(1).斜率不存在;(2).斜率[0,1]; (3).斜率[-1,0);(4).斜率(1,正无穷);(5).斜率(-1,负无穷)'(6).斜率为0.\n2.坐标系使用的是windows默认的坐标系,与数学坐标系有所不同\n3.为了便于显示,本程序对画出来的直线进行了X及Y方向平移\n4.请把窗口最大化后查看效果!\n"),_T("程序使用帮助"),MB_OK);

break;

caseID_MyBlog:

ShellExecuteW(NULL,_T("open"),_T("http://online19910326.blog.163.com/"),NULL,NULL,SW_SHOWNORMAL);

break;

default:

returnDefWindowProc(hWnd,message,wParam,lParam);

}

break;

caseWM_PAINT:

hdc=BeginPaint(hWnd,&ps);

SetTextColor(hdc,RGB(255,0,0));//设置字体颜色为红色

TextOutW(hdc,0,0,_T("计算机图形学实验2,Win32 API,Windows 7,Visual Studio 2010"),48);

GetWindowRect(hWnd,&rect);//获取当前窗口信息

width=rect.right-rect.left;//当前窗口宽度

height=rect.bottom-rect.top;//当前窗口高度

DrawCoordinateSystem(hdc,width,height);//显示坐标系

DrawGraphics(hdc,width,height);//显示图线

EndPaint(hWnd,&ps);

break;

caseWM_DESTROY:

PostQuitMessage(0);

break;

default:

returnDefWindowProc(hWnd,message,wParam,lParam);

}

return0;

}

int

DrawGraphics

(

HDC hdc

,

int

width

,

int

height

)

{

if(flag==1)

{

DrawLineBresenham(hdc,-300,-300,470,270,width,height,0x00ff0000);//斜率(0,1]

DrawLineBresenham(hdc,540,50,-400,50,width,height,0x00ffff00);//斜率为0直线

DrawLineBresenham(hdc,100,-300,100,300,width,height,0x000000ff);//无斜率直线

DrawLineBresenham(hdc,-250,-250,140,300,width,height,0x0000ff00);//斜率大于1

DrawLineBresenham(hdc,200,-250,-100,250,width,height,0x00ff00ff);//斜率小于-1

DrawLineBresenham(hdc,-300,250,440,-100,width,height,0x00ff00ff);//斜率为[-1,0]

}

else

{

}

return0;

}

//坐标系显示调用系统自带的画线函数

intDrawCoordinateSystem(HDC hdc,intwidth,intheight)//显示坐标系

{

SetTextColor(hdc,RGB(0,0,0));//设置字体颜色为黑色

MoveToEx(hdc,width/2,height/9,NULL);//y轴

LineTo(hdc,width/2,8*height/9);

MoveToEx(hdc,width/2-10,8*height/9-30,NULL);

LineTo(hdc,width/2,8*height/9);//画"\"

LineTo(hdc,width/2+10,8*height/9-30);//画"/"

TextOutW(hdc,width/2+5,8*height/9-15,_T("Y轴"),2);

MoveToEx(hdc,width/9,height/2,NULL);//x轴

LineTo(hdc,8*width/9,height/2);

MoveToEx(hdc,8*width/9-30,height/2-10,NULL);

LineTo(hdc,8*width/9,height/2);//画"\"

LineTo(hdc,8*width/9-30,height/2+10);//画"/"

TextOutW(hdc,8*width/9+5,height/2+5,_T("X轴"),2);

return0;

}

//E2-1直线Bresenham算法,可画任意直线

intDrawLineBresenham(HDC hdc,intx0,inty0,intx1,inty1,intwidth,intheight,COLORREF color)

{

//可画任意直线,分3种情况

//1.斜率不存在; 2.斜率的绝对值[0,1]; 3.斜率的绝对值(1,正无穷)

intx,y,dx,dy,i,e;

doublek;//1.斜率不存在; 2.1.斜率[0,1]; 2.2.斜率[-1,0);3.1.斜率(1,正无穷);3.2.斜率(-1,负无穷)

intmoveX=width/2,moveY=height/2;//坐标原点平移

dx=x1>x0?x1-x0:x0-x1;

dy=y1>y0?y1-y0:y0-y1;

e=dx;

if(dx==0)//1.斜率不存在,垂直于X轴·;

{

y=y0>y1?y1+moveY:y0+moveY;//取坐标最小的那个点

x=x1+moveX;

for(i=0;i<=dy;i++)

{

SetPixel(hdc,x,y,color);

y=y+1;

}

return0;

}

elseif(dx>=dy)//2.斜率的绝对值[0,1]

{

k=(x0-x1)*(y0-y1);//k>0则斜率[0,1),k<=0则斜率[-1,0]

e=-dx;

x=x0>x1?x1+moveX:x0+moveX;//x取x0,x1中的最小值

if(k>0)

y=y0>y1?y1+moveY:y0+moveY;//k>0,则y取y0,y1中的最小值

elsey=y0>y1?y0+moveY:y1+moveY;//k<=0,则y取y0,y1中的最大值

for(i=0;i<=dx;i++)

{

SetPixel(hdc,x,y,color);

x=x+1;

e=e+2*dy;

if(e>=0)

{

y=k>0?y+1:y-1;//斜率(0,1],则y增1;否则([-1,0])y减1

e=e-2*dx;

}

}

return-1;

}

else//3.斜率的绝对值(1,正无穷)

{

k=(x0-x1)*(y0-y1);

e=-dy;

y=y0>y1?y1+moveY:y0+moveY;//y取y0,y1中的最小值

if(k>0)

x=x0>x1?x1+moveX:x0+moveX;//k>0,则x取x0,x1中的最小值

elsex=x0>x1?x0+moveX:x1+moveX;//k<=0,则x取x0,x1中的最大值

for(i=0;i<=dy;i++)

{

SetPixel(hdc,x,y,color);

y=y+1;

e=e+2*dx;

if(e>=0)

{

x=k>0?x+1:x-1;//斜率(1,正无穷),则x增1;否则((-1,负无穷))x减1

e=e-2*dy;

}

}

return1;

}

}

代码下载地址:{}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值