orton_runner/lib/my_csfml/my_polygon_getline.c

93 lines
2.3 KiB
C

/*
** EPITECH PROJECT, 2018
** task01
** File description:
** I do task
*/
#include "../../include/lib/s_sfml.h"
#include "../../include/lib/my_graphics.h"
static void set_line_dy(polygon_t *polygon, void *ptr[], int var[6])
{
char *empty = (char*)ptr[2];
int *xmin = (int*)ptr[1];
int *xmax = (int*)ptr[0];
int cumul;
int i;
i = 0;
cumul = var[3] >> 1;
while (++i < var[3]){
var[1] += var[5];
cumul += var[2];
if (cumul > var[3]){
cumul -= var[3];
var[0] += var[4];
}
xmax[var[1] - polygon->ymin] = var[0];
if (empty[var[1] - polygon->ymin]){
xmin[var[1] - polygon->ymin] = var[0];
empty[var[1] - polygon->ymin] = 0;
}
}
}
static void set_line_dx(polygon_t *polygon, void *ptr[], int var[6])
{
char *empty = (char*)ptr[2];
int *xmin = (int*)ptr[1];
int *xmax = (int*)ptr[0];
int cumul;
int i;
i = 0;
cumul = var[2] >> 1;
while (++i < var[2]){
var[0] += var[4];
cumul += var[3];
if (cumul > var[2]){
cumul -= var[2];
var[1] += var[5];
}
xmax[var[1] - polygon->ymin] = var[0];
if (empty[var[1] - polygon->ymin]){
xmin[var[1] - polygon->ymin] = var[0];
empty[var[1] - polygon->ymin] = 0;
}
}
}
static void polygon_init_var(polygon_t *polygon, int var[6], int i)
{
var[0] = polygon->x[i];
var[1] = polygon->y[i];
var[2] = polygon->x[(i + 1) % polygon->nb_vertices] - var[0];
var[3] = polygon->y[(i + 1) % polygon->nb_vertices] - var[1];
var[4] = (var[2] > 0) ? 1 : -1;
var[5] = (var[3] > 0) ? 1 : -1;
var[2] = (var[2] > 0) ? var[2] : -var[2];
var[3] = (var[3] > 0) ? var[3] : -var[3];
}
void get_drawline(polygon_t *polygon, int *xmax, int *xmin, char *empty)
{
void *ptr[]= {(void*)xmax, (void*)xmin, (void*)empty};
int var[6];
int i;
i = -1;
while (++i < polygon->nb_vertices){
polygon_init_var(polygon, var, i);
xmax[var[1] - polygon->ymin] = var[0];
if (empty[var[1] - polygon->ymin]){
xmin[var[1] - polygon->ymin] = var[0];
empty[var[1] - polygon->ymin] = 0;
}
if (var[2] > var[3])
set_line_dx(polygon, ptr, var);
else
set_line_dy(polygon, ptr, var);
}
}