# MiniLibX Helper Function

### Simple put\_pixel function

This is a simple function to put a pixel to the screen by its `x` and `y` coordinates.

I based this function on what I found [here](https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html#writing-pixels-to-a-image), and modified it a bit to make sure we only put a pixel that is inside the screen, without this check, the program could `segfault` if we try to set a value somewhere outside the window.

{% code overflow="wrap" lineNumbers="true" %}

```c
void ft_put_pixel(t_data *data, int x, int y, int color)
{
    char *pxl;
    
    if (x >= 0 && x < WINDOW_WIDTH && y >= 0 && y < WINDOW_HEIGHT
    {
        pxl = data->addr + (y * data->line_length + x * (data->bits_per_pixel / 8));
        *(unsigned int *)pxl = color;
    }
}
```

{% endcode %}

<details>

<summary>Final code to draw a pixel</summary>

{% code overflow="wrap" lineNumbers="true" %}

```c
#include "mlx.h"
#define	WINDOW_WIDTH 1920
#define WINDOW_HEIGHT 1080

typedef struct	s_data {
	void	*img;
	char	*addr;
	int		bits_per_pixel;
	int		line_length;
	int		endian;
}				t_data;

void ft_put_pixel(t_data *data, int x, int y, int color)
{
    char *pxl;

    if (x >= 0 && x < WINDOW_WIDTH && y >= 0 && y < WINDOW_HEIGHT)
    {
        pxl = data->addr + (y * data->line_length + x * (data->bits_per_pixel / 8));
        *(unsigned int *)pxl = color;
    }
}

int	main(void)
{
	void	*mlx;
	void	*mlx_win;
	t_data	img;

	mlx = mlx_init();
	mlx_win = mlx_new_window(mlx, 1920, 1080, "Hello world!");
	img.img = mlx_new_image(mlx, 1920, 1080);
	img.addr = mlx_get_data_addr(img.img, &img.bits_per_pixel, &img.line_length,
								&img.endian);
	ft_put_pixel(&img, WINDOW_WIDTH/2, WINDOW_HEIGHT/2, 0xFF0000);
	mlx_put_image_to_window(mlx, mlx_win, img.img, 0, 0);
	mlx_loop(mlx);
}

```

{% endcode %}

If you look closely, this will draw a red pixel at the very center of the window.

</details>

### Draw Line function (\~Naive line algorithm)

There is no function in MiniLibX to draw a line between two points, but this will be particularly useful when you try to code `FdF`, you'll have to join all your points by lines, so, here you go.

{% hint style="warning" %}
This function uses some function of the math library so make sure you can use it in your project and include it (`#include <math.h>`).\
For `FdF`, `Fractol` and `so-long`, all the math library are authorized.
{% endhint %}

{% code overflow="wrap" lineNumbers="true" %}

```c
void ft_draw_line(t_data *data, int x1, int y1, int x2, int y2, int color)
{
    int step;
    int x;
    int y;
    int i;
    int delta_x;
    int delta_y;
    
    delta_x = x2 - x1;
    delta_y = y2 - y1;
    if (abs(delta_x) >= abs(delta_y))
        step = abs(delta_x);
    else
        step = abs(delta_y);
    delta_x = delta_x / step;
    delta_y = delta_y / step;
    x = x1;
    y = x2;
    i = 0;
    while (i < step)
    {
        ft_put_pixel(data, x, y, color);
        x += delta_x;
        y += delta_y;
        i++;
    }
}
```

{% endcode %}

{% hint style="info" %}
You will have to find a way to make it pass the Norm, you can check how I did this [here](https://github.com/Laendrun/42/blob/main/fdf/src/draw.c#L27).
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://42-cursus.gitbook.io/guide/minilibx/minilibx-helper-function.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
