c语言如何画图

Python010

c语言如何画图,第1张

c语言画图 要选对 C语言编程工具。 目前最方便的是“习语言”,它能编译所有C代码,又能在C代码中使用它支持的绘图函数。

也可以使用二十年前的C语言编程工具来绘图,通常是在DOS窗口中绘图。

framebuffer(帧缓冲)。

帧的最低数量为24(人肉眼可见)(低于24则感觉到画面不流畅)。

显卡与帧的关系:由cpu调节其数据传输速率来输出其三基色的配比。

三基色:RGB(红绿蓝)。

在没有桌面和图形文件的系统界面,可以通过C语言的编程来实现在黑色背景上画图!

用下面的代码,在需要的地方(有注释)适当修改,就能画出自己喜欢的图形!

PS:同样要编译运行后才能出效果。

#include <stdio.h>

#include <sys/mman.h>

#include <fcntl.h>

#include <linux/fb.h>

#include <stdlib.h>

#define RGB888(r,g,b) ((r &0xff) <<16 | (g &0xff) <<8 | (b &0xff))

#define RGB565(r,g,b) ((r &0x1f) <<11 | (g &0x3f) <<5 | (b &0x1f))

int main()

{

int fd = open("/dev/fb0", O_RDWR)

if(fd <0){

perror("open err. \n")

exit(EXIT_FAILURE)

printf("xres: %d\n", info.xres)

printf("yres: %d\n", info.yres)

printf("bits_per_pixel: %d\n", info.bits_per_pixel)

size_t len = info.xres*info.yres*info.bits_per_pixel >>3

unsigned long* addr = NULL

addr = mmap(NULL, len, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0)

if(addr == (void*)-1){

perror("mmap err. \n")

【C语言的用MoveTo()和LineTo()】

#include<graphics.h>

#include<math.h>

/*

###############################################################################

功 能:本函数的作用是用逐点比较法来画一条直线

格 式:void myline1(int x1,int y1,int x2,int y2,int color)

参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色

调用示例:myline1(10,20,500,440,4)

###############################################################################

*/

void myline1(int x1,int y1,int x2,int y2,int color)

{

/*变量定义开始(2007/10/16增加)*/

int iTx/*x轴终点的相对坐标xa或临时变量*/

int iTy/*y轴终点的相对坐标ya或临时变量*/

int iDx/*x轴方向步长dx*/

int iDy/*y轴方向的步长dy*/

int iFt/*偏差Fm*/

int iSt/*记数循环数(dx+dy)S*/

int iXt/*x方向循环变量xm*/

int iYt/*y方向循环变量ym*/

/*变量定义结束*/

/*变量初始化开始*/

/*如果是第三象限或第四象限则换成第一或第二象限*/

if(y2<y1)

{

iTx=x1

x1=x2

x2=iTx

iTy=y1

y1=y2

y2=iTy

}

iTx=x2-x1/*取x轴的相对坐标*/

iTy=y2-y1/*取y轴的相对坐标*/

iDx=1

iDy=1

iFt=0

iSt=iTx+iTy

if(iTx<0)iSt=-1*iTx+iTy/*如果在第二象限,则x轴方向步长取负值*/

iXt=0

iYt=0

/*变量初始化结束*/

/*数据处理开始*/

while(iSt>0)

{

putpixel(x1+iXt,y1+iYt,color)

if(iTx>=0) /*如果在第一象限*/

{

if(iFt<0) /*如果偏差小于0*/

{

iYt+=iDy/*y方向走一步*/

iFt+=iTx

}

else /*如果偏差大于或等于0*/

{

iXt+=iDx/*x方向走一步*/

iFt-=iTy

}

}

else

{

if(iFt<0) /*如果偏差小于0*/

{

iXt-=iDx/*负x方向走一步*/

iFt+=iTy

}

else /*如果偏差大于或等于0*/

{

iYt+=iDy/*y方向走一步*/

iFt+=iTx

}

}

iSt--

}

}

/*

###############################################################################

功 能:本函数的作用是用来画一条直线

格 式:void myline2(int x1,int y1,int x2,int y2,int color)

参数说明:x1,y1是起始点坐标,x2,y2是终止点,color是画线的颜色

调用示例:myline2(10,20,500,440,4)

###############################################################################

*/

int myline2(int x1,int y1,int x2,int y2,int color)

{

int iX/*x方向的坐标变量*/

int iY/*y方向的坐标变量*/

int iTx/*x方向的步长变量*/

int iTy/*y方向的步长变量*/

float fDx/*x方向的差分变量*/

float fDy/*y方向的差分变量*/

float fMinf/*算法中的f*/

float fMaxF/*算法中的F*/

float fS/*终点判断变量*/

fMinf=0.5/*f=0.5*/

iX=x1

iY=y1

putpixel(x1,y1,color)

if(x1==x2&&y1==y2) /*如果终点和起始点相同*/

{

return(1)

}

iTx=1

iTy=1

fDx=(float)(x2-x1)

fDy=(float)(y2-y1)

fMaxF=fDy/fDx>0?fDy/fDx:(-fDy/fDx)/*F=|dy/dx|*/

if(fDx<0)iTx=-1

if(fDy<0)iTy=-1

fS=fDx>0?fDx:(-fDx)

if(fMaxF==1) /*如果F=1*/

{

iX=x1

iY=y1

while(fS>0)

{

iX+=iTx/*x方向走一步*/

iY+=iTy/*y方向走一步*/

putpixel(iX,iY,color)

fS--

}

}

else if(fMaxF>1) /*如果F>1*/

{

fS+=fDy>0?fDy:(-fDy)

while(fS>0)

{

iY+=iTy/*y方向走一步*/

putpixel(iX,iY,color)

fMinf+=1/fMaxF/*f=f+1/F*/

fS--

if(fMinf>=1) /*如果f>=1*/

{

iX+=iTx/*x方向走一步*/

fMinf--/*f=f-1*/

putpixel(iX,iY,color)

fS--

}

}

}

else /*如果F<1*/

{

fS+=fDy>0?fDy:(-fDy)

while(fS>0)

{

iX+=iTx/*x方向走一步*/

putpixel(iX,iY,color)

fMinf+=fMaxF/*f=f+F*/

fS--

if(fMinf>=1) /*如果f>=1*/

{

iY+=iTy/*y方向走一步*/

fMinf--/*f=f-1*/

putpixel(iX,iY,color)

fS--

}

}

}

}【能够画出任意斜率的直线算法程序】

int dx,dy,incrE,incrNE,d,x,y

if ((point[1].x-point[0].x)==0){//垂直的直线

x=point[0].x

for(y=point[0].yy<point[1].yy++)

pDC->SetPixel(x,y,50)

}

else if(abs((point[1].y-point[0].y)/(point[1].x-point[0].x))<=1){ //斜率 -1到 1 之间

dx=point[1].x-point[0].x

dy=point[0].y-point[1].y

d=dx-2*dyincrE=-2*dy

incrNE=2*(dx-dy)

x=point[0].x,y=point[0].y

pDC->SetPixel(x,y,50)

if(point[0].y>point[1].y){

while(x<point[1].x)

{

if(d>=0){

d+=incrE

x++

}

else

{d+=incrNE<br> x++<br> y--<br> }

pDC->SetPixel(x,y,50)

}

}

else if(point[0].y<=point[1].y){

dy=point[1].y-point[0].y

incrE=-2*dy

incrNE=2*(dx-dy)

x=point[0].x,y=point[0].y

pDC->SetPixel(x,y,50)

while(x<point[1].x)

{

if(d>=0){

d+=incrE

x++

}

else

{d+=incrNE<br> x++<br> y++<br> }

pDC->SetPixel(x,y,50)

}

}

}

else { //斜率 <-1 和 >1的直线

if(point[1].x>=point[0].x){

dx=point[1].x-point[0].x

dy=point[1].y-point[0].y

d=2*dx-dy

incrE=2*dx

incrNE=2*(dx-dy)

x=point[0].x,y=point[0].y

pDC->SetPixel(x,y,50)

while(x<point[1].x)

{

if(d<0){

d+=incrE

y++

}

else

{d+=incrNE<br> pDC->SetPixel(x,y,50)<br> x++<br> y++<br> }

pDC->SetPixel(x,y,50)

}

}

else if((point[1].y-point[0].y)/(point[1].x-point[0].x)<-1){

dx=point[1].x-point[0].x

dy=point[0].y-point[1].y

d=2*dx-dy

incrE=2*dx

incrNE=2*(dx-dy)

x=point[0].x,y=point[0].y

pDC->SetPixel(x,y,50)

while(y<point[1].y)

{

if(d>0){

d+=incrE

y++

}

else

{d+=incrNE<br> x--<br> y++<br> }

pDC->SetPixel(x,y,50)

} }

}