Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
0,0 1,0 2,0 3,0 4,0
0,1 1,1 2,1 3,1
-1,2 0,2 1,2 2,2 3,2
-1,3 0,3 1,3 2,3
-2,4 -1,4 0,4 1,4 2,4
int sign(int a) { return a<0 ? -1 : 1; }
void Line(int x0,int y0,int x1,int y1) {
int dx=x1-x0,dy=y1-y0;
int p=sign(dy),q=sign(dx),r=sign(dx+dy);
int ax=(q+r)/2,ay=(p-q)/2,bx=-ay,by=(p+r)/2;
int da=ay*dx-ax*dy;
int db=by*dx-bx*dy;
int lim=da+db;
int a=0;
SetPixel(x0,y0);
while(x0!=x1 || y0!=y1) {
if(db==0 || (da!=0 && 2*a<lim)) {
x0+=bx; y0+=by; a+=db;
} else {
x0+=ax; y0+=ay; a+=da;
}
SetPixel(x0,y0);
}
}
int s(int a) { return a<0 ? -1 : 1; }
void L(int x,int y,int f,int e) {
int g=f-x,h=e-y;
int p=sign(h),q=sign(g),r=sign(g+h);
int i=(q+r)/2,j=(p-q)/2,k=-j,l=(p+r)/2;
int m=j*g-i*h;
int n=l*g-k*h;
int z=m+n;
int a=0;
SetPixel(x,y);
while(x!=f || y!=e) {
if(n==0 || (m!=0 && 2*a<z)) {
x+=k; y+=l; a+=n;
} else {
x+=i; y+=j; a+=m;
}
SetPixel(x,y);
}
} void L(int x,int y,int f,int e) {
int g=f-x,h=e-y;
int i=(g>0)+(g+h>0)-1,j=(h>0)-(g>0);
int m=j*g-i*h,n=(i+j)*g+j*h;
int z=m+n,a=0;
SetPixel(x,y);
while((x-f)|(y-e)) {
if(!n || (m && 2*a<z)) {
x-=j; y+=i+j; a+=n;
} else {
x+=i; y+=j; a+=m;
}
SetPixel(x,y);
}
}
void L(int x,int y,int f,int e) {
int g=f-x,h=e-y;
int i=(g>0)+(g+h>0)-1,j=(h>0)-(g>0);
int m=j*g-i*h,n=(i+j)*g+j*h;
int z=m+n,a=0;
SetPixel(x,y);
for(;(x-f)*(y-e);) {
if(!n || (m && (a<<1)<z)) {
x-=j; y+=i+j; a+=n;
} else {
x+=i; y+=j; a+=m;
}
SetPixel(x,y);
}
} void Line(int x0,int y0,int x1,int y1) {
int dx=x1-x0,dy=y1-y0;
int ax=(dx>0)-(dx+dy<0),ay=(dy>0)-(dx>0);
int da=ay*dx-ax*dy;
int db=(ax+ay)*dx+ay*dy;
int a=-((da+db)>>1); // we need -floor((da+db)/2)!
SetPixel(x0,y0);
while((x0-x1)|(y0-y1)) {
if(!db || (da && a<=0)) {
x0-=ay; y0+=ax+ay; a+=db;
} else {
x0+=ax; y0+=ay; a+=da;
}
SetPixel(x0,y0);
}
}
int ax=(dx>>31)-~((dx+dy)>>31),ay=(dy>>31)-(dx>>31);
я думаю мы тут «оптимизируем» на си
int ay=(dy>>31)-(dx>>31);
int ay=(dy>=0)-(dx>=0);
Прямые в гексагональном растре