Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions examples/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,7 @@ SHAPES = \
shapes/shapes_lines_bezier \
shapes/shapes_logo_raylib \
shapes/shapes_logo_raylib_anim \
shapes/shapes_math_sine_cosine \
shapes/shapes_rectangle_advanced \
shapes/shapes_rectangle_scaling \
shapes/shapes_ring_drawing \
Expand Down
4 changes: 4 additions & 0 deletions examples/Makefile.Web
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,7 @@ SHAPES = \
shapes/shapes_lines_bezier \
shapes/shapes_logo_raylib \
shapes/shapes_logo_raylib_anim \
shapes/shapes_math_sine_cosine \
shapes/shapes_rectangle_advanced \
shapes/shapes_rectangle_scaling \
shapes/shapes_ring_drawing \
Expand Down Expand Up @@ -862,6 +863,9 @@ shapes/shapes_logo_raylib: shapes/shapes_logo_raylib.c
shapes/shapes_logo_raylib_anim: shapes/shapes_logo_raylib_anim.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)

shapes/shapes_math_sine_cosine: shapes/shapes_math_sine_cosine.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)

shapes/shapes_rectangle_advanced: shapes/shapes_rectangle_advanced.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)

Expand Down
1 change: 1 addition & 0 deletions examples/examples_list.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ shapes;shapes_digital_clock;★★★★;5.5;5.6;2025;2025;"Hamza RAHAL";@hmz-rh
shapes;shapes_double_pendulum;★★☆☆;5.5;5.5;2025;2025;"JoeCheong";@Joecheong2006
shapes;shapes_dashed_line;★☆☆☆;5.5;5.5;2025;2025;"Luís Almeida";@luis605
shapes;shapes_vector_angle;★★☆☆;1.0;5.0;2023;2025;"Ramon Santamaria";@raysan5
models;shapes_math_sine_cosine;★★★★;5.6-dev;5.6-dev;2025;2025;"Olivier";@oqu
textures;textures_logo_raylib;★☆☆☆;1.0;1.0;2014;2025;"Ramon Santamaria";@raysan5
textures;textures_srcrec_dstrec;★★★☆;1.3;1.3;2015;2025;"Ramon Santamaria";@raysan5
textures;textures_image_drawing;★★☆☆;1.4;1.4;2016;2025;"Ramon Santamaria";@raysan5
Expand Down
180 changes: 180 additions & 0 deletions examples/shapes/shapes_math_sine_cosine.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
/*******************************************************************************************
*
* raylib [shapes] example - math sine cosine
*
* Port of the p5.js "sine and cosine" demo to raylib + raygui
* Sources: https://p5js.org/examples/angles-and-motion-sine-cosine/
*
* Demonstrates uniform circular motion and the correspondence between
* the unit circle and sine / cosine graphs. Right panel contains a
* play/pause toggle implemented with raygui.
*
* Example originally created with raylib 5.6-dev, last time updated with raylib 5.6-dev
*
* Copyright (c) 2025 Olivier (@oqu)
*
********************************************************************************************/

#include "raylib.h"

// Required for GUI controls
#define RAYGUI_IMPLEMENTATION
#include "raygui.h"

#include <math.h>

int main(void)
{
// Window initialization
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that Init, Update, Draw sections should be defined by:
//--------------------------------------------------------------------------------------
following the template structure: https://github.com/raysan5/raylib/blob/master/examples/examples_template.c

const int screenWidth = 800;
const int screenHeight = 450;

InitWindow(screenWidth, screenHeight, "raylib [shapes] example - math sine cosine");
const char* playText = "Play";
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, review raylib code conventions: https://github.com/raysan5/raylib/blob/master/CONVENTIONS.md

const char* pauseText = "Pause";

// Scene layout (mimic p5 example positioning)
const float circleX = 200.0f;
const float circleY = 150.0f;
const float circleRadius = 75.0f;

const float graphX = 50.0f;
const float graphY = 300.0f;
const float graphAmplitude = 50.0f;
const float graphPeriod = 300.0f; // width of the graph in pixels

// Animation / UI state
bool playing = true; // play / pause toggle
int frameCountLocal = 0; // local frame counter (used when playing)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, review raylib code conventions: https://github.com/raysan5/raylib/blob/master/CONVENTIONS.md

Comments should start with capital letter


SetTargetFPS(60);

// Main loop
while (!WindowShouldClose())
{
// Handle GUI and input first
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, note that Update and Draw should be in separate sections.

BeginDrawing();

ClearBackground(BLACK);

// Right control panel
float panelX = (float)GetScreenWidth() - 270.0f;
Rectangle panel = {panelX, 10, 260, (float)GetScreenHeight() - 20};
DrawRectangleRec(panel, Fade(LIGHTGRAY, 0.6f));
DrawRectangleLinesEx(panel, 1, GRAY);

int y = 20;
int px = (int)panelX + 10;
DrawText("Sine / Cosine Demo", px, y, 20, DARKGRAY);
y += 34;

// Play / Pause toggle
DrawText("Animation:", px, y, 14, DARKGRAY);
y += 18;
GuiToggle((Rectangle){(float)px, y, 220, 30}, playing ? pauseText : playText, &playing);
y += 40;

// Small description
DrawText("Animated demonstration of a point moving", px, y, 10, DARKGRAY);
y += 14;
DrawText("around the unit circle and the corresponding", px, y, 10, DARKGRAY);
y += 14;
DrawText("sine (red) and cosine (orange) graphs.", px, y, 10, DARKGRAY);
y += 30;

DrawFPS(px, GetScreenHeight() - 30);

// Update frameCount if playing
if (playing)
frameCountLocal++;

// Angle in degrees (like the p5 example)
int angleDeg = frameCountLocal % 360;

// Draw angle label
Color labelCol = WHITE;
DrawText(TextFormat("angle: %d", angleDeg), 25, 25, 20, labelCol);

// --- Draw circle and diameters ---
// circle outer
DrawCircleLines((int)circleX, (int)circleY, circleRadius, Fade(GRAY, 0.6f));
// diameters
DrawLine((int)circleX, (int)(circleY - circleRadius), (int)circleX, (int)(circleY + circleRadius), Fade(GRAY, 0.6f));
DrawLine((int)(circleX - circleRadius), (int)circleY, (int)(circleX + circleRadius), (int)circleY, Fade(GRAY, 0.6f));

// Compute moving point on circle (cos for x, sin for y). Note: cos/sin in C expect radians
float angRad = angleDeg * (PI / 180.0f);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, review raylib code conventions: https://github.com/raysan5/raylib/blob/master/CONVENTIONS.md

* and / should not have spaces

float pointX = circleX + circleRadius * cosf(angRad);
float pointY = circleY - circleRadius * sinf(angRad); // minus to match p5 y-axis direction

// line from center to point
DrawLine((int)circleX, (int)circleY, (int)pointX, (int)pointY, Fade(GRAY, 0.6f));

// moving points
DrawCircleV((Vector2){pointX, pointY}, 6.0f, WHITE);
DrawCircle((int)pointX, (int)circleY, 6.0f, ORANGE);
DrawCircle((int)circleX, (int)pointY, 6.0f, RED);

// --- Draw graph area axes ---
// axes lines
DrawLine((int)graphX, (int)graphY, (int)(graphX + graphPeriod), (int)graphY, Fade(GRAY, 0.6f));
DrawLine((int)graphX, (int)(graphY - graphAmplitude), (int)graphX, (int)(graphY + graphAmplitude), Fade(GRAY, 0.6f));
DrawLine((int)(graphX + graphPeriod), (int)(graphY - graphAmplitude), (int)(graphX + graphPeriod), (int)(graphY + graphAmplitude), Fade(GRAY, 0.6f));

// labels
DrawText("0", (int)graphX - 6, (int)(graphY + graphAmplitude + 6), 14, Fade(GRAY, 0.9f));
DrawText("360", (int)(graphX + graphPeriod) - 12, (int)(graphY + graphAmplitude + 6), 14, Fade(GRAY, 0.9f));
DrawText("1", (int)(graphX / 2) - 6, (int)(graphY - graphAmplitude) - 6, 14, Fade(GRAY, 0.9f));
DrawText("0", (int)(graphX / 2) - 6, (int)(graphY)-6, 14, Fade(GRAY, 0.9f));
DrawText("-1", (int)(graphX / 2) - 10, (int)(graphY + graphAmplitude) - 6, 14, Fade(GRAY, 0.9f));

DrawText("cos", (int)(graphX + graphPeriod + graphX / 2) - 18, (int)(graphY - graphAmplitude) - 10, 20, ORANGE);
DrawText("sin", (int)(graphX + graphPeriod + graphX / 2) - 18, (int)(graphY) - 10, 20, RED);

// --- Draw cosine curve (orange) ---
for (int t = 0; t <= 360; t++)
{
float x = ((float)t / 360.0f) * graphPeriod + graphX;
float y = graphY - graphAmplitude * cosf(t * (PI / 180.0f));
// draw small segments between consecutive points for smoother curve
if (t > 0)
{
int prevT = t - 1;
float px = ((float)prevT / 360.0f) * graphPeriod + graphX;
float py = graphY - graphAmplitude * cosf(prevT * (PI / 180.0f));
DrawLineEx((Vector2){px, py}, (Vector2){x, y}, 2.5f, ORANGE);
}
}

// --- Draw sine curve (red) ---
for (int t = 0; t <= 360; t++)
{
float x = ((float)t / 360.0f) * graphPeriod + graphX;
float y = graphY - graphAmplitude * sinf(t * (PI / 180.0f));
if (t > 0)
{
int prevT = t - 1;
float px = ((float)prevT / 360.0f) * graphPeriod + graphX;
float py = graphY - graphAmplitude * sinf(prevT * (PI / 180.0f));
DrawLineEx((Vector2){px, py}, (Vector2){x, y}, 2.5f, RED);
}
}

// --- Draw moving vertical line on the graph corresponding to the angle ---
float lineX = ((float)angleDeg / 360.0f) * graphPeriod + graphX;
DrawLine((int)lineX, (int)(graphY - graphAmplitude), (int)lineX, (int)(graphY + graphAmplitude), Fade(GRAY, 0.6f));

// moving points on graph
float orangeY = graphY - graphAmplitude * cosf(angRad);
float redY = graphY - graphAmplitude * sinf(angRad);

DrawCircle((int)lineX, (int)orangeY, 6.0f, ORANGE);
DrawCircle((int)lineX, (int)redY, 6.0f, RED);

EndDrawing();
}

CloseWindow();

return 0;
}
Binary file added examples/shapes/shapes_math_sine_cosine.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.