Repository navigation
Expand file tree
/
Copy pathgradient.c
More file actions
87 lines (79 loc) · 2.71 KB
/
Copy pathgradient.c
File metadata and controls
87 lines (79 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/* ************************************************************************** */
/* */
/* :::::::: */
/* gradient.c :+: :+: */
/* +:+ */
/* By: fhignett <fhignett@student.codam.nl> +#+ */
/* +#+ */
/* Created: 2019/03/18 21:58:18 by FlintLouis #+# #+# */
/* Updated: 2019/10/31 12:16:30 by fhignett ######## odam.nl */
/* */
/* ************************************************************************** */
#include "fdf.h"
#include <math.h>
static t_colour colour(t_byte r, t_byte g, t_byte b)
{
t_colour c;
c.r = r;
c.g = g;
c.b = b;
return (c);
}
t_gradient *init_gradient(t_map *map)
{
int i;
t_gradient *gradient;
t_range range;
i = 0;
gradient = NEW(t_gradient);
range = get_range_of_map(map);
gradient->max_z = range.max;
gradient->middle_z = (int)round((range.max + range.min) / 2);
gradient->min_z = range.min;
gradient->max_colour = colour(255, 255, 255);
gradient->middle_colour = colour(125, 0, 125);
gradient->min_colour = colour(255, 0, 0);
return (gradient);
}
static float clamp(int min, int max, float z)
{
if (z < min)
return (min);
else if (z > max)
return (max);
return (z);
}
/*
** first: scale z to the range [0, 1]
** second: clamp to make sure it doesn't go beyond 0 or 1 (floats aren't safe)
** return: calculate how much r,g,b, for the z it's currently on
*/
t_colour calculate_colour(t_gradient *gradient, float z)
{
if (gradient->min_z == gradient->max_z
|| gradient->middle_z == gradient->max_z
|| gradient->min_z == gradient->middle_z)
return (gradient->min_colour);
else if (z < gradient->middle_z)
{
z = (z - gradient->min_z) / (gradient->middle_z - gradient->min_z);
z = clamp(0, 1, z);
return (colour((char)(gradient->min_colour.r * (1 - z)
+ gradient->middle_colour.r * z),
(char)(gradient->min_colour.g * (1 - z)
+ gradient->middle_colour.g * z),
(char)(gradient->min_colour.b * (1 - z)
+ gradient->middle_colour.b * z)));
}
else
{
z = (z - gradient->middle_z) / (gradient->max_z - gradient->middle_z);
z = clamp(0, 1, z);
return (colour((char)(gradient->middle_colour.r * (1 - z)
+ gradient->max_colour.r * z),
(char)(gradient->middle_colour.g * (1 - z)
+ gradient->max_colour.g * z),
(char)(gradient->middle_colour.b * (1 - z)
+ gradient->max_colour.b * z)));
}
}