?? graphalgorithm.cpp
字號:
#include <Windows.h>
#include <stdlib.h>
#include <math.h>
#include "GraphAlgorithm.h"
void DDALine(float x1,float y1,float x2,float y2,int color,HDC hdc)
{
float m;
float dx,dy;
float x,y;
int i,iterUp;
x1=(int)(x1+0.5);
y1=(int)(y1+0.5);
x=x1;
y=y1;
dx=x2-x1;
dy=y2-y1;
if(fabs(dx)>=fabs(dy))
{
m=dy/dx;
iterUp=(int)fabs(dx);
}
else
{
m=dx/dy;
iterUp=(int)fabs(dy);
}
i=0;
while(i<iterUp)
{
SetPixel(hdc,x,y,color);
if(fabs(dx)>=dy)
{
y=y+m;
x++;
}
else
{
x=x+m;
y++;
}
i++;
}
}
void MIDLine(float x1,float y1,float x2,float y2,float xOffset,float yOffset,int color,HDC hdc)
{
float a,b;
float deta1,deta2;
float d;
float x,y;
float k;
int i,iterUp;
float tmp;
int pattern=1;
/*
to adjust to the different k value.
*/
k=(y2-y1)/(x2-x1);
if(k<-1)
{
pattern=0;
reValuePoint(&x1,y1,&y1,-x1);
reValuePoint(&x2,y2,&y2,-x2);
}
else if(k<0)
{
reValuePoint(&x1,x1,&y1,-y1);
reValuePoint(&x2,x2,&y2,-y2);
}
else if(k<=1||y1==y2)/*including x1==x2*/
{
/*
do nothing.
*/
}
else if(k>1||x1==x2)/*k>1 including y1==y2*/
{
pattern=0;
reValuePoint(&x1,y1,&y1,x1);
reValuePoint(&x2,y2,&y2,x2);
}
/*let x1<=x2*/
if(x1>x2)
{
swapFloat(&x1,&x2);
swapFloat(&y1,&y2);
}
/*data init*/
a=y1-y2;
b=x2-x1;
d=2*a+b;//init d
deta1=2*a; //if d>0 ,d+=deta1
deta2=2*(a+b); //if d<=0,d+=deta2
//start draw point
x=x1;
y=y1;
i=0;
iterUp=fabs(b);
while(i<iterUp)
{
if(pattern==1)
SetPixel(hdc,x+xOffset,y+yOffset,color);
else if(pattern==0)
SetPixel(hdc,y+yOffset,x+xOffset,color);
if(d<0)
{
x+=1;
y+=1;
d+=deta2;
}
else
{
x+=1;
//y+=0;
d+=deta1;
}
i++;
}
}
void BresenhamLine(float x1,float y1,float x2,float y2,int color,HDC hdc)
{
float P;//pan ding value
int i,iterUp;
float dy,dx;
float x,y;
dy=y2-y1;
dx=x2-x1;
//data init
x=x1;
y=y1;
if(fabs(dx)>fabs(dy))
{
P=2*dy-dx;
iterUp=fabs(dx);
}
else
{
P=2*dx-dy;
iterUp=fabs(dy);
}
i=0;
if(fabs(dx)>fabs(dy))
{
while(i<iterUp)
{
if(P<0)
{
SetPixel(hdc,x+1,y,color);
x++;
P+=2*dy;
}
else
{
SetPixel(hdc,x+1,y+1,color);
x++;
y++;
P+=2*dy-2*dx;
}
i++;
}
}
else
{ while(i<iterUp)
{
if(P<0)
{
SetPixel(hdc,x,y+1,color);
y++;
P+=2*dx;
}
else
{
SetPixel(hdc,x+1,y+1,color);
x++;
y++;
P+=2*dx-2*dy;
}
i++;
}
}
}
void MidCircle(float x,float y,float r,int color,HDC hdc)
{
float Fn;
float mX,mY;
mX=0;
mY=r;
Fn=1-r;
while(mX<=mY)
{
//up half circle.
SetPixel(hdc,mX+x,mY+y,color);
SetPixel(hdc,mY+y,mX+x,color);
SetPixel(hdc,-mX+x,mY+y,color);
SetPixel(hdc,mY+y,-mX+x,color);
//down half circle.
SetPixel(hdc,mX+x,-mY+y,color);
SetPixel(hdc,-mY+y,mX+x,color);
SetPixel(hdc,-mX+x,-mY+y,color);
SetPixel(hdc,-mY+y,-mX+x,color);
if(Fn<0)
{
mX+=1;
Fn+=2*mX+1;
}
else
{
mX+=1;
mY-=1;
Fn+=2*mX+1-2*mY;
}
}
}
void swapFloat(float* x,float* y)
{
float tmp;
tmp=*x;
*x=*y;
*y=tmp;
}
void reValuePoint(float* oldX,float newX,float* oldY,float newY)
{
*oldX=newX;
*oldY=newY;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -