Radomir 'The Sheep' Dopieralski wrote :
> Search for 'breshenham'
Hi all,
This is my first post here.
Here is the bresenham "toolkit" I use in a roguelike I started to code
recently.
I use it for light raycasting.
This is basic C, but can be easily ported to C++/Pascal/whatever you
like
usage to cast a ray from "from" to "to" positions (you just have to add
a break in the infinite loop if you hit a wall) :
typedef struct { int x,y; } pos_t;
pos_t from={<starting x,y coords>};
pos_t to={<end x,y coords>};
bresenham_init(from,to);
int end=0;
light_map_at_pos(from);
while (! end ) {
end=bresenham_step(&from);
light_map_at_pos(from);
}
and now the "toolkit" :
//=============================
// bresenham line drawing
static int bresen_ix,bresen_iy;
static int bresen_e;
static int bresen_dx,bresen_dy;
static int bresen_xd,bresen_yd;
void bresenham_init(pos_t from, pos_t to) {
int x=from.x,y=from.y;
bresen_xd=to.x;
bresen_yd=to.y;
bresen_dx = to.x-x;
bresen_dy = to.y-y;
if ( bresen_dx > 0 ) {
bresen_ix=1;
} else if ( bresen_dx < 0 ){
bresen_ix=-1;
} else bresen_ix=0;
if ( bresen_dy > 0 ) {
bresen_iy=1;
} else if ( bresen_dy < 0 ){
bresen_iy=-1;
} else bresen_iy = 0;
if ( bresen_ix*bresen_dx > bresen_iy*bresen_dy ) {
bresen_e = bresen_ix*bresen_dx;
bresen_dx *= 2;
bresen_dy *= 2;
} else {
bresen_e = bresen_iy*bresen_dy;
bresen_dx *= 2;
bresen_dy *= 2;
}
}
boolean bresenham_step(pos_t *p) {
if ( bresen_ix*bresen_dx > bresen_iy*bresen_dy ) {
if ( p->x == bresen_xd ) return TRUE;
p->x+=bresen_ix;
bresen_e -= bresen_iy*bresen_dy;
if ( bresen_e < 0) {
p->y+=bresen_iy;
bresen_e+=bresen_ix*bresen_dx;
}
} else {
if ( p->y == bresen_yd ) return TRUE;
p->y+=bresen_iy;
bresen_e -= bresen_ix*bresen_dx;
if ( bresen_e < 0) {
p->x+=bresen_ix;
bresen_e+=bresen_iy*bresen_dy;
}
}
return FALSE;
}
--
Jice
>> Stay informed about: 7DRL: ZeldaRL