From: Clive Crous (ccrous@shoprite.co.za)
Date: Tue 30 Nov 1999 - 16:17:20 IST
I've never done this in c before so if it doen't compile, i'm sure you'll
figure out myy dumb mistake ;-)
also, i may have gotten my DEG to RAD & RAD to DEG the wrong way around ;-)
i can never remember which is which.
..and (hehehe) bounds checking is NOT completely accurate but this is a
quick example so :P~
here goes....
-----------------------------------------
#include <stdlib.h>
#include <math.h>
#include <vga.h>
#include <vgagl.h>
#define MAX_X 639
#define MAX_Y 479
int y_min = MAX_Y<<1;
int y_max = -(MAX_Y<<1);
int x_min[MAX_Y+1];
int x_max[MAX_Y+1];
void putsemipixel(int x, int y) {
if ((y<0)||(y>MAX_Y)||(x<0)||(x>MAX_X)) return
if (y<y_min) y_min=y;
if (y>y_max) y_max=y;
if (x<x_min[y]) x_min[y]=x;
if (x>x_max[y]) x_max[y]=x;
}
void putsemiline(int x1, int y1, int x2, int y2) {
int temp;
int counter;
if (y2<y1) {
temp=x1; x1=x2; x2=temp;
temp=y1; y1=y2; y2=temp;
}
for (counter=y1;counter<=y2;counter++)
putsemipixel(x1+((x2-x1)/(y2-y1+1))*(counter-y1),counter);
}
void semifill( int x , int y , int r , int st_ang , int en_ang , int colour)
{
int counter;
int curr_x;
int angle,orang;
int sx,sy,ex,ey;
for (counter=0;counter<=MAX_Y;counter++) {
x_max[counter] = - (x_min[counter]=(MAX_X<<1));
}
for (counter=r;counter>=0;counter--) {
/* I'm not sure if you need to convert RAD to DEG with c ????
(180/PI)
*/ curr_x=r*cos(orang=((180/PI)*asin(counter/r)));
angle=orang;
if ((angle>=st_ang)&&(angle<=en_ang)) putsemipixel(x+curr_x,y-counter);
angle=180-orang;
if ((angle>=st_ang)&&(angle<=en_ang)) putsemipixel(x-curr_x,y-counter);
angle=180+orang
if ((angle>=st_ang)&&(angle<=en_ang)) putsemipixel(x-curr_x,y+counter);
angle=360-orang
if ((angle>=st_ang)&&(angle<=en_ang)) putsemipixel(x+curr_x,y+counter);
}
/* once again these might not need RAD to DEG conversions (PI/180)
*/
sx=cos(st_ang*(PI/180))*r+x;
sy=sin(st_ang*(PI/180))*r+y;
ex=cos(en_ang*(PI/180))*r+x;
ey=sin(en_ang*(PI/180))*r+y;
putsemiline(x,y,sx,sy);
putsemiline(x,y,ex,ey);
for (counter=y_min;counter<=y_max;counter++) {
if (x_max[counter]>=x_min[counter]) {
gl_hline(x_min[counter], counter, x_max[counter], color);
}
}
}
um, yea, that's that
hehehe
This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:22 IST