图形学画直线c语言,计算机图形学:3种画直线算法(转)

//---------------------------------------------------------------------

//绘制直线的DDA算法基本函数

//---------------------------------------------------------------------

void LineDDA(int x0,int y0,int x1,int y1,int color,HDC hdc)

{

float dy,dx,x,y,m;

dx=x1-x0;

dy=y1-y0;

m=dy/dx;

if(x0

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x<=x1;x++)

{

SetPixel(hdc,x,int(y+0.5),color);

y+=m;

}

}

}

if(x0>x1)

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x>=x1;x--)

{

SetPixel(hdc,x,int(y+0.5),color);

y-=m;

}

}

}

if(y0

{

if(m>=1||m<=-1)

{

m=1/m;

x=x0;

for(y=y0;y<=y1;y++)

{

SetPixel(hdc,int(x+0.5),y,color);

x+=m;

}

}

}

if(y0>y1)

{

if(m<=-1||m>=1)

{

m=1/m;

x=x0;

for(y=y0;y>=y1;y--)

{

SetPixel(hdc,int(x+0.5),y,color);

x-=m;

}

}

}

}

//---------------------------------------------------------------------

//DDA算法对应的演示功能函数

//---------------------------------------------------------------------

void LineDDA_Demo(int x0,int y0,int x1,int y1,int color,HDC hdc,bool demo)

{

float dy,dx,x,y,m,Time;

Time=timeGetTime();

dx=x1-x0;

dy=y1-y0;

m=dy/dx;

if(x0

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x<=x1;x++)

{

BitBlt(hdc,x*10,int(y+0.5)*10,10,10,MemDC,0,0,SRCCOPY);

y+=m;

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(x0>x1)

{

if(m<=1&&m>=-1)

{

y=y0;

for(x=x0;x>=x1;x--)

{

BitBlt(hdc,x*10,int(y+0.5)*10,10,10,MemDC,0,0,SRCCOPY);

y-=m;

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(y0

{

if(m>=1||m<=-1)

{

m=1/m;

x=x0;

for(y=y0;y<=y1;y++)

{

BitBlt(hdc,int(x+0.5)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

x+=m;

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(y0>y1)

{

if(m<=-1||m>=1)

{

m=1/m;

x=x0;

for(y=y0;y>=y1;y--)

{

BitBlt(hdc,int(x+0.5)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

x-=m;

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

}以上代码仅供参考,编程环境VC.NET,希望能给还没有任何思路的同学一点帮助,完整源文件不提供,请勿开口索要。

//---------------------------------------------------------------------

//绘制直线的中点算法基本函数

//---------------------------------------------------------------------

void LineMID(int x0,int y0,int x1,int y1,int color,HDC hdc)

{

float dx,dy,incrE,incrNE,d,x,y,m;

if(true)

{

dx=x1-x0;

if(x0>x1)

dx=-dx;

dy=y1-y0;

if(y0>y1)

dy=-dy;

m=dy/dx;

d=dx-2*dy;

incrE=-2*dy;

incrNE=2*(dx-dy);

x=x0,y=y0;

SetPixel(hdc,x,y,color);

if(m<=1&&m>=-1)

{

if(x0

{

while(x

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

y++;

}

x++;

if(y0

SetPixel(hdc,x,y,color);

if(y0>=y1)

SetPixel(hdc,x,(2*y0-y),color);

}

}

if(x0>=x1)

{

while(x>x1)

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

y++;

}

x--;

if(y0

SetPixel(hdc,x,y,color);

if(y0>=y1)

SetPixel(hdc,x,(2*y0-y),color);

}

}

}

if(m1)

{

dx=x1-x0;

if(x0>x1)

dx=-dx;

dy=y1-y0;

if(y0>y1)

dy=-dy;

d=dy-2*dx;     //与斜率小于1时候的情况相比,dx与dy的值刚好互换

incrE=-2*dx;

incrNE=2*(dy-dx);

x=x0,y=y0;

if(y0

{

while(y

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

x++;

}

y++;

if(x0

SetPixel(hdc,x,y,color);

if(x0>=x1)

SetPixel(hdc,(2*x0-x),y,color);

}

}

if(y0>=y1)

{

while(y>y1)

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

x++;

}

y--;

if(x0

SetPixel(hdc,x,y,color);

if(x0>=x1)

SetPixel(hdc,(2*x0-x),y,color);

}

}

}

}

}

//---------------------------------------------------------------------

//中点算法对应的演示功能函数

//---------------------------------------------------------------------

void LineMID_Demo(int x0,int y0,int x1,int y1,int color,HDC hdc,bool demo)

{

float dx,dy,incrE,incrNE,d,x,y,m,Time;

Time=timeGetTime();

if(true)

{

dx=x1-x0;

if(x0>x1)

dx=-dx;

dy=y1-y0;

if(y0>y1)

dy=-dy;

m=dy/dx;

d=dx-2*dy;

incrE=-2*dy;

incrNE=2*(dx-dy);

x=x0,y=y0;

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(m<=1&&m>=-1)

{

if(x0

{

while(x

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

y++;

}

x++;

if(y0

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(y0>=y1)

BitBlt(hdc,x*10,(2*y0-y)*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

if(x0>=x1)

{

while(x>x1)

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

y++;

}

x--;

if(y0

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(y0>=y1)

BitBlt(hdc,x*10,(2*y0-y)*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(m1)

{

dx=x1-x0;

if(x0>x1)

dx=-dx;

dy=y1-y0;

if(y0>y1)

dy=-dy;

d=dy-2*dx;

incrE=-2*dx;

incrNE=2*(dy-dx);

x=x0,y=y0;

if(y0

{

while(y

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

x++;

}

y++;

if(x0

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(x0>=x1)

BitBlt(hdc,(2*x0-x)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

if(y0>=y1)

{

while(y>y1)

{

if(d>0)

d+=incrE;

else

{

d+=incrNE;

x++;

}

y--;

if(x0

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(x0>=x1)

BitBlt(hdc,(2*x0-x)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

}

}

//---------------------------------------------------------------------

bresenham算法是计算机图形学中为了“显示器(屏幕或打印机)系由像素构成”的这个特性而设计出来的算法,使得在求直线各点的过程中全部以整数来运算,因而大幅度提升计算速度

Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换方法。原理是:

过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。该算法的优点在于可以采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列所求的像 //绘制直线的Bresenham算法基本函数

//---------------------------------------------------------------------void LineBRE(int x0,int y0,int x1,int y1,int color,HDC hdc)

{

float dy,dx,x,y,m,d;

dx=x1-x0;

if(x1

dx=-dx;

dy=y1-y0;

if(y1

dy=-dy;

m=dy/dx;

d=-dx;

x=x0,y=y0;

if(x0

{

if(m<=1&&m>=-1)

{

for(x=x0;x<=x1;x++)

{

if(d>=0)

{

y++;

d-=2*dx;

}

d+=2*dy;

if(y1

SetPixel(hdc,x,(2*y0-y),color);

else

SetPixel(hdc,x,y,color);

}

}

}

if(x0>=x1)

{

if(m<=1&&m>=-1)

{

for(x=x0;x>=x1;x--)

{

if(d>=0)

{

y++;

d-=2*dx;

}

d+=2*dy;

if(y1

SetPixel(hdc,x,(2*y0-y),color);

else

SetPixel(hdc,x,y,color);

}

}

}

if(y0

{

if(m1)

{

for(y=y0;y<=y1;y++)

{

if(d>=0)

{

x++;

d-=2*dy;

}

d+=2*dx;

if(x1

SetPixel(hdc,(2*x0-x),y,color);

else

SetPixel(hdc,x,y,color);

}

}

}

if(y0>=y1)

{

if(m1)

{

for(y=y0;y>=y1;y--)

{

if(d>=0)

{

x++;

d-=2*dy;

}

d+=2*dx;

if(x1

SetPixel(hdc,(2*x0-x),y,color);

else

SetPixel(hdc,x,y,color);

}

}

}

}

//---------------------------------------------------------------------

//Bresenham算法对应的演示功能函数

//---------------------------------------------------------------------

void LineBRE_Demo(int x0,int y0,int x1,int y1,int color,HDC hdc,bool demo)

{

float dy,dx,x,y,m,d,Time;

Time=timeGetTime();

dx=x1-x0;

if(x1

dx=-dx;

dy=y1-y0;

if(y1

dy=-dy;

m=dy/dx;

d=-dx;

x=x0,y=y0;

if(x0

{

if(m<=1&&m>=-1)

{

for(x=x0;x<=x1;x++)

{

if(d>=0)

{

y++;

d-=2*dx;

}

d+=2*dy;

if(y1

BitBlt(hdc,x*10,(2*y0-y)*10,10,10,MemDC,0,0,SRCCOPY);

else

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(x0>=x1)

{

if(m<=1&&m>=-1)

{

for(x=x0;x>=x1;x--)

{

if(d>=0)

{

y++;

d-=2*dx;

}

d+=2*dy;

if(y1

BitBlt(hdc,x*10,(2*y0-y)*10,10,10,MemDC,0,0,SRCCOPY);

else

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(y0

{

if(m1)

{

for(y=y0;y<=y1;y++)

{

if(d>=0)

{

x++;

d-=2*dy;

}

d+=2*dx;

if(x1

BitBlt(hdc,(2*x0-x)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

else

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

if(y0>=y1)

{

if(m1)

{

for(y=y0;y>=y1;y--)

{

if(d>=0)

{

x++;

d-=2*dy;

}

d+=2*dx;

if(x1

BitBlt(hdc,(2*x0-x)*10,y*10,10,10,MemDC,0,0,SRCCOPY);

else

BitBlt(hdc,x*10,y*10,10,10,MemDC,0,0,SRCCOPY);

if(demo)

{

while((timeGetTime()-Time)

int a=1;

}

Time=timeGetTime();

}

}

}

}

计算机图形学中,五角星通常涉及到计算顶点的位置以及绘制边的过程。五角星由五个顶点构成,每个顶点与相邻顶点相连,同时每个顶点还与第三个顶点相连,形成星形。在计算机图形学中,可以通过以下步骤来绘制五角星: 1. 定义五角星的中心点坐标和外圈半径。 2. 计算五角星五个顶点的坐标。这可以通过将圆周分成五个等分,然后根据角度计算出每个顶点的位置。 3. 为了绘制五角星,需要定义五条边连接相邻顶点,以及五条边连接非相邻顶点。可以通过计算每个顶点的下一个和下一个下一个顶点来确定这些边。 4. 使用图形API(如OpenGL, DirectX, HTML5 Canvas, SVG等)提供的绘图函数来绘制线条,将这些顶点依次连接起来。 例如,在一个简单的二维绘图环境中,你可以使用以下伪代码来绘制一个五角星: ``` // 设置绘图环境,例如图形库的初始化等 // 定义中心点坐标和半径 centerX = 100; centerY = 100; radius = 50; // 计算五角星每个顶点坐标 for (int i = 0; i < 5; i++) { // 计算角度 double angle = i * (Math.PI * 2 / 5); // 计算顶点坐标 int x = (int)(centerX + radius * Math.cos(angle)); int y = (int)(centerY + radius * Math.sin(angle)); // 保存顶点坐标 vertices[i] = new Point(x, y); } // 绘制五角星的边 for (int i = 0; i < 5; i++) { // 绘制连接相邻顶点的边 drawLine(vertices[i], vertices[(i + 1) % 5]); // 绘制连接非相邻顶点的边 drawLine(vertices[i], vertices[(i + 2) % 5]); } // 结束绘图环境的使用,例如图形库的清理等 // 辅助函数,用于绘制两点之间的线段 void drawLine(Point p1, Point p2) { // 使用图形库的绘线函数 } ``` 这个过程展示了五角星绘制的基本概念,具体实现将依赖于所使用的编程语言和图形库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值