计算机图形学基础 中点画圆,计算机图形学中的中点画线,中点画圆,Bresenham画线与画圆算法...

这篇博客详细介绍了Bresenham直线算法和中点画线算法的C++实现,包括Bresenham的直线和圆的绘制,以及中点画线和画圆的方法。示例代码可以直接运行,并且展示了如何在图形界面上绘制线条和圆形。
摘要由CSDN通过智能技术生成

#include

#include  // 这样引用 EasyX 图形库

#include

#include

#include

#include

using namespace std;

//Bresenham画线

void Bresenham_line(int x0,int y0,int x1,int y1)

{

int x,y,dx,dy;

float k,e;

dx=x1-x0;

dy=y1-y0;

k=dy/dx;//这里是完成k值的初始化

e=-0.5;

x=x0;

y=y0;

//这里的i每次都是加一个格字,直到终点,y这是选择性的加一或者不加

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

{

//画点的函数

putpixel(x,y,255);

x=x+1;

e=e+k;

if(e>=0)

{

y=y+1;

e=e-1;//如果e大于零了就要马上减一

}

}

}

//中点画线

void MidpointLine(int x0,int y0,int x1,int y1)

{

int a,b,delta1,delta2,d,x,y;

a=y0-y1;

b=x1-x0;

d=2*a+b;

//这里的2是为了避免小数的计算

delta1=2*a;

delta2=2*(a+b);

x=x0;

y=y0;

putpixel(x,y,255);

while(x

if(d<0){//这样的话就会选取上面一个点

x++;y++;d+=delta2;

}else{//否者就选取下面的一个点

x++;d+=delta1;

}

putpixel(x,y,255);

}

}

//中点画线

void MidpointLine2(int x1,int y1,int x2,int y2,COLORREF color)  //中点画线法

{

int x = x1, y = y1; //初始化x,y

int a = y1 - y2, b = x2 - x1;      //a,b分别为x和y的增量

//考虑四种情况,分别计算增量

int deltx = (b >= 0 ? 1 : (b = -b, -1));

int delty = (a <= 0 ? 1 : (a = -a, -1));

for(int i=0;i<=400;i++)

{putpixel(i, 200, color);putpixel(200, i, color);}

putpixel(x+200, y+200, color);

int d, delt1, delt2;

if (-a <= b)  // 斜率绝对值 <= 1

{

d = 2 * a + b;

delt1 = 2 * a;

delt2 = 2 * (a + b);

while(x != x2)

{

if (d < 0)

y += delty, d += delt2;

else

d += delt1;

x += deltx;

putpixel(x+200, y+200, color);

}

}

else    // 斜率绝对值 > 1

{

d = 2 * b + a;

delt1 = 2 * b;

delt2 = 2 * (a + b);

while(y != y2)

{

if(d < 0)

d += delt1;

else

x += deltx, d += delt2;

y += delty;

putpixel(x+200, y+200, color);

}

}

}

//中点画圆

void MidpointCircle(int x0,int y0,int r,int color)

{

int x=0,y=r;

float d=5.0/4-r;

while(x<=y){

putpixel(x0+x,y0+y,color);

putpixel(x0+x,y0-y,color);

putpixel(x0-x,y0+y,color);

putpixel(x0-x,y0-y,color);

putpixel(x0+y,y0+x,color);

putpixel(x0+y,y0-x,color);

putpixel(x0-y,y0+x,color);

putpixel(x0-y,y0-x,color);

if(d<0)

d+=x*2.0+3;

else{

d+=2.0*(x-y)+5;y--;

}

x++;

}

}

//Bresenhem画圆

void BresenhemCircle(int centerx, int centery, int radius, int color)

{

int x =0;

int y = radius;

int delta = 2*(1-radius);

int direction;

while (y >= 0) {

putpixel(centerx+x, centery+y, color);

putpixel(centerx-x, centery+y, color);

putpixel(centerx-x, centery-y, color);

putpixel(centerx+x, centery-y, color);

if (delta < 0) {

if ((2*(delta+y)-1) < 0) {

direction = 1;

}

else {

direction = 2;

}

}

else if(delta > 0) {

if ((2*(delta-x)-1) <= 0) {

direction = 2;

}

else {

direction = 3;

}

}

else {

direction=2;

}

switch(direction) {

case 1:

x++;

delta += (2*x+1);

break;

case 2:

x++;

y--;

delta += 2*(x-y+1);

break;

case 3:

y--;

delta += (-2*y+1);

break;

}

}

}

void main()

{

int x0,y0,x1,y1;

initgraph(640, 480);

Bresenham_line(10,10,56,56);

MidpointLine2(0,100,369,0,255);

MidpointCircle(100,100,50,255);

BresenhemCircle(100,100,100,255);

getch();    // 按任意键继续

closegraph();   // 关闭图形界面

}

多的也不说了,源码直接可以使用,而且还是带有坐标轴的

2fb36ffdaf3f65fa1ca96fa05e57ccdf.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值