直线函数法c语言程序 直线函数求法

用VC6.0编写的画直线的C语言程序!求大神帮忙!这个简单,用MoveTo和LineTo就行了 。如有下面2个点,x(1,2),y(8,9)
你只要MoveTo(1,2);
LineTo(8,9);
如果你是要任意输入2个点的话,那么先将输入的点先转化为浮点型,用atof函数 , 这个函数使用起来很简单 , 就是把字符型转化为浮点型 。这样就好了 。
利用C语言编写 能够画出任意的直线算法程序(利用画点函数)上次刚写过,在VC下运行的,
int dx,dy,incrE,incrNE,d,x,y;
if ((point[1].x-point[0].x)==0){//垂直的直线
【直线函数法c语言程序 直线函数求法】x=point[0].x;
for(y=point[0].y;ypoint[1].y;y)
pDC-SetPixel(x,y,50);
}
elseif(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*dy;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=point[0].x,y=point[0].y;
pDC-SetPixel(x,y,50);
if(point[0].ypoint[1].y){
while(xpoint[1].x)
{
if(d=0){
d =incrE;
x;
}
else
{d =incrNE;
x;
y--;
}
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(xpoint[1].x)
{
if(d=0){
d =incrE;
x;
}
else
{d =incrNE;
x;
y;
}
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(xpoint[1].x)
{
if(d0){
d =incrE;
y;
}
else
{d =incrNE;
pDC-SetPixel(x,y,50);
x;
y;
}
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(ypoint[1].y)
{
if(d0){
d =incrE;
y;
}
else
{d =incrNE;
x--;
y;
}
pDC-SetPixel(x,y,50);
}
}
}
求一用C语言画直线的程序C语言的话画直线用MoveTo()和LineTo()很简单啊 。
帮你复制一份我学习时老师给的画线两例:
#includegraphics.h
#includemath.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(y2y1)
{
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(iTx0)iSt=-1*iTx iTy;; /*如果在第二象限,则x轴方向步长取负值*/
iXt=0;
iYt=0;
/*变量初始化结束*/
/*数据处理开始*/
while(iSt0)
{
putpixel(x1 iXt,y1 iYt,color);
if(iTx=0) /*如果在第一象限*/
{
if(iFt0) /*如果偏差小于0*/
{
iYt =iDy; /*y方向走一步*/
iFt =iTx;
}
else /*如果偏差大于或等于0*/
{
iXt =iDx; /*x方向走一步*/
iFt-=iTy;
}
}
else
{
if(iFt0) /*如果偏差小于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==x2y1==y2) /*如果终点和起始点相同*/
{
return(1);
}
iTx=1;
iTy=1;
fDx=(float)(x2-x1);
fDy=(float)(y2-y1);
fMaxF=fDy/fDx0?fDy/fDx:(-fDy/fDx); /*F=|dy/dx|*/
if(fDx0)iTx=-1;
if(fDy0)iTy=-1;
fS=fDx0?fDx:(-fDx);
if(fMaxF==1) /*如果F=1*/
{
iX=x1;
iY=y1;
while(fS0)
{
iX =iTx; /*x方向走一步*/
iY =iTy; /*y方向走一步*/
putpixel(iX,iY,color);
fS--;
}
}
else if(fMaxF1) /*如果F1*/
{
fS =fDy0?fDy:(-fDy);
while(fS0)
{
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 /*如果F1*/
{
fS =fDy0?fDy:(-fDy);
while(fS0)
{
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--;
}
}
}
}
两点确定一条直线 C语言源程序该怎么写直线:Ax By C=0
两点:A(Xa,Ya),B(Xb,Yb)
typedef struct
{
volatile float A;
volatile float B;
volatile float C;
} line_t;
void lineFun(float Xa,float Ya, float Xb,float Yb,line_t *line)
{
line-A = Yb - Ya;
line-B= Xa - Xb;
line-C = Xb * Ya - Xa * Yb;
}
怎么用c程序画直线GDI绘图,MFC里获取DC后,有2个函数MoveTo和LineTo是用来画直线的 。WIN32程序也差不多 。
如果在位图中画的画,通过2个端点 , 然后计算要改变的像素位置即可 。
根据两点画出直线,cwindows编程 函数 。帮忙实现CDC类不是有现成的函数么?
CDC *pdc = CDC::FromHandle(hdc);
pdc-MoveTo(ps);
pdc-LineTo(pe);
以下是引用:
直线段的扫描转换算法
1 数值微分(DDA)法
我的理解就是以一个坐标轴为步长值(增量为1),另一个坐标根据直线的斜率(K)为
增量,然后四舍五入进行计算机,确定每一个点的坐标 。
具体算法(我用OPENGL模拟)
void setPixel(GLint xCoord,GLint yCoord)
{
glBegin(GL_POINTS);
glVertex2i(xCoord,yCoord);
glEnd();
}
inline int round(const float a)
{
return int(a 0.5);
}
void lineDDA(int x0,int y0,int xEnd,int yEnd)
{
int dx = xEnd - x0,dy = yEnd - y0,steps,k;
float xIncrement,yIncrement,x = x0,y=y0;
if(abs(dx)abs(dy))
{
steps = abs(dx);
}
else
{
steps = abs(dy);
}
xIncrement = float(dx)/float(steps);
yIncrement = float(dy)/float(steps);
setPixel(round(x),round(y));
for(k= 0;ksteps;k)
{
x =xIncrement;
y =yIncrement;
setPixel(round(x),round(y));
}
}
2中点画线法
同样我理解的算法就是,以一个增量为多的坐标轴为步长值(为1),而另一个坐标
值是加1,还是不变取决于这两个坐标值中点是在这条直线的上方 , 还是下方 。
具体算法如下:
void lineMiddle(int x0,int y0,int xEnd,int yEnd)
{
int a,b,c,d1,d2,d;
a = y0-yEnd;
b = xEnd-x0;
d = 2*a b;//判别试(2a b为初始值)
d1 = 2*a;//中点在直线下方增量值
d2 = 2*a b;//中点在真线上方的增量值
int x,y;
x = x0;y=y0;
setPixel(x,y);
while(xxEnd)
{
if(d0)//中点在直线下方
{
x;
y;
d =d2;
}
else//中点在直线上方
{
x;
d =d1;
}
setPixel(x,y);
}
}
3.Bresenham画线算法程序:
用一个坐标轴来当步长值(即 1),另一个坐标轴是否加1则跟据斜率(k)来确定,K
如果大于0.5,那么也加 1,如果小于0.5那么即不变 。为了方便计算 , 如果d大于1
,那么就减一,归0 。可设e,e=d-0.5,于是就有e0时,加1,e0时不变,这样便
于硬件实现 。
算法实现如下:
void lineBresenham(int x0,int y0,int x1,int y1)
{
int x,y,dx,dy;
float k,e;
dx = x1 - x0;
dy = y1 - y0;;
k = (float)dy/dx;
e = -0.5;
x = x0;
y = y0;
setPixel(x,y);
for(int i =0;idx;i)
{
x = x 1;
e = e k;
if(e=0)
{
y;
e = e-1;
}
setPixel(x,y);
}
}
关于直线函数法c语言程序和直线函数求法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读