add drawing rotation shape example
This commit is contained in:
parent
9e2591e612
commit
d880e3ff3b
|
|
@ -536,7 +536,8 @@ SHAPES = \
|
||||||
shapes/shapes_rectangle_scaling \
|
shapes/shapes_rectangle_scaling \
|
||||||
shapes/shapes_splines_drawing \
|
shapes/shapes_splines_drawing \
|
||||||
shapes/shapes_top_down_lights \
|
shapes/shapes_top_down_lights \
|
||||||
shapes/shapes_rectangle_advanced
|
shapes/shapes_rectangle_advanced \
|
||||||
|
shapes/shapes_custom_rotation
|
||||||
|
|
||||||
TEXTURES = \
|
TEXTURES = \
|
||||||
textures/textures_background_scrolling \
|
textures/textures_background_scrolling \
|
||||||
|
|
|
||||||
187
examples/shapes/shapes_custom_rotation.c
Normal file
187
examples/shapes/shapes_custom_rotation.c
Normal file
|
|
@ -0,0 +1,187 @@
|
||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [shapes] example - draw rotation shapes
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.5
|
||||||
|
*
|
||||||
|
* Example contributed by Vlad Adrian (@demizdor) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022-2024 Lu Hong (@CManLH)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
#include "rlgl.h"
|
||||||
|
|
||||||
|
// Fetch new coordinates of a point after it rotates around a center point by a certain angle
|
||||||
|
Vector2 RotatePointAroundPoint(Vector2 point, Vector2 center, float angle);
|
||||||
|
|
||||||
|
// Draw ellipse with rotation
|
||||||
|
void DrawEllipseRotation(Vector2 center, float radiusH, float radiusV, Color color, float angle);
|
||||||
|
|
||||||
|
// Draw ellipse outline with rotation
|
||||||
|
void DrawEllipseLinesRotation(Vector2 center, float radiusH, float radiusV, Color color, float angle);
|
||||||
|
|
||||||
|
// Draw rectangle with rotation
|
||||||
|
void DrawRectangleRotation(Vector2 point, float width, float height, Color color, float angle);
|
||||||
|
|
||||||
|
// Draw rectangle outline with rotation
|
||||||
|
void DrawRectangleLinesRotation(Vector2 point, float width, float height, Color color, float angle);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 1024;
|
||||||
|
const int screenHeight = 480;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [shapes] example - draw rotation shapes");
|
||||||
|
|
||||||
|
float angle = PI / 6.0f;
|
||||||
|
|
||||||
|
float ellipseRadiusH = 32.0f;
|
||||||
|
float ellipseRadiusV = 72.0f;
|
||||||
|
|
||||||
|
float rectangleWidth = 64.0f;
|
||||||
|
float rectangleHeight = 128.0f;
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
// Draw rectangle
|
||||||
|
DrawRectangleRotation((Vector2){128, 20}, rectangleWidth, rectangleHeight, SKYBLUE, angle);
|
||||||
|
DrawText("Rotation Rectangle", 64, 84, 20, BLACK);
|
||||||
|
|
||||||
|
// Draw rectangle outline
|
||||||
|
DrawRectangleLinesRotation((Vector2){128, 256}, rectangleWidth, rectangleHeight, DARKGREEN, angle);
|
||||||
|
DrawText("Rotation Rectangle Outline", 16, 320, 20, BLACK);
|
||||||
|
|
||||||
|
// Draw ellipse with rotation
|
||||||
|
DrawEllipseRotation((Vector2){432, 84}, ellipseRadiusH, ellipseRadiusV, SKYBLUE, angle);
|
||||||
|
DrawText("Rotation Ellipse", 336, 84, 20, BLACK);
|
||||||
|
|
||||||
|
// Draw ellipse outline with rotation
|
||||||
|
DrawEllipseLinesRotation((Vector2){432, 320}, ellipseRadiusH, ellipseRadiusV, DARKGREEN, angle);
|
||||||
|
DrawText("Rotation Ellipse outline", 320, 320, 20, BLACK);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawEllipseRotation(Vector2 center, float radiusH, float radiusV, Color color, float angle)
|
||||||
|
{
|
||||||
|
rlBegin(RL_TRIANGLES);
|
||||||
|
rlColor4ub(color.r, color.g, color.b, color.a);
|
||||||
|
Vector2 startPoint = RotatePointAroundPoint((Vector2){center.x + radiusH, center.y}, center, angle);
|
||||||
|
for (int i = 0; i < 360; i += 10)
|
||||||
|
{
|
||||||
|
Vector2 endPoint = RotatePointAroundPoint((Vector2){center.x + cosf(DEG2RAD * (i + 10)) * radiusH, center.y + sinf(DEG2RAD * (i + 10)) * radiusV}, center, angle);
|
||||||
|
rlVertex2f(center.x, center.y);
|
||||||
|
rlVertex2f(endPoint.x, endPoint.y);
|
||||||
|
rlVertex2f(startPoint.x, startPoint.y);
|
||||||
|
|
||||||
|
startPoint = endPoint;
|
||||||
|
}
|
||||||
|
rlEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawEllipseLinesRotation(Vector2 center, float radiusH, float radiusV, Color color, float angle)
|
||||||
|
{
|
||||||
|
rlBegin(RL_LINES);
|
||||||
|
rlColor4ub(color.r, color.g, color.b, color.a);
|
||||||
|
Vector2 startPoint = RotatePointAroundPoint((Vector2){center.x + radiusH, center.y}, center, angle);
|
||||||
|
for (int i = 0; i < 360; i += 10)
|
||||||
|
{
|
||||||
|
Vector2 endPoint = RotatePointAroundPoint((Vector2){center.x + cosf(DEG2RAD * (i + 10)) * radiusH, center.y + sinf(DEG2RAD * (i + 10)) * radiusV}, center, angle);
|
||||||
|
rlVertex2f(startPoint.x, startPoint.y);
|
||||||
|
rlVertex2f(endPoint.x, endPoint.y);
|
||||||
|
|
||||||
|
startPoint = endPoint;
|
||||||
|
}
|
||||||
|
rlEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawRectangleRotation(Vector2 point, float width, float height, Color color, float angle)
|
||||||
|
{
|
||||||
|
rlBegin(RL_TRIANGLES);
|
||||||
|
rlColor4ub(color.r, color.g, color.b, color.a);
|
||||||
|
|
||||||
|
Vector2 center = (Vector2){point.x + width / 2.0f, point.y + height / 2.0f};
|
||||||
|
Vector2 newTopLeft = RotatePointAroundPoint(point, center, angle);
|
||||||
|
Vector2 newTopRight = RotatePointAroundPoint((Vector2){point.x + width, point.y}, center, angle);
|
||||||
|
Vector2 newBottomLeft = RotatePointAroundPoint((Vector2){point.x, point.y + height}, center, angle);
|
||||||
|
Vector2 newBottomRight = RotatePointAroundPoint((Vector2){point.x + width, point.y + height}, center, angle);
|
||||||
|
|
||||||
|
rlVertex2f(newTopLeft.x, newTopLeft.y);
|
||||||
|
rlVertex2f(newBottomLeft.x, newBottomLeft.y);
|
||||||
|
rlVertex2f(newTopRight.x, newTopRight.y);
|
||||||
|
|
||||||
|
rlVertex2f(newTopRight.x, newTopRight.y);
|
||||||
|
rlVertex2f(newBottomLeft.x, newBottomLeft.y);
|
||||||
|
rlVertex2f(newBottomRight.x, newBottomRight.y);
|
||||||
|
rlEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawRectangleLinesRotation(Vector2 point, float width, float height, Color color, float angle)
|
||||||
|
{
|
||||||
|
rlBegin(RL_LINES);
|
||||||
|
rlColor4ub(color.r, color.g, color.b, color.a);
|
||||||
|
|
||||||
|
Vector2 center = (Vector2){point.x + width / 2.0f, point.y + height / 2.0f};
|
||||||
|
Vector2 newLeftTop = RotatePointAroundPoint(point, center, angle);
|
||||||
|
Vector2 newRightTop = RotatePointAroundPoint((Vector2){point.x + width, point.y}, center, angle);
|
||||||
|
Vector2 newLeftBottom = RotatePointAroundPoint((Vector2){point.x, point.y + height}, center, angle);
|
||||||
|
Vector2 newRightBottom = RotatePointAroundPoint((Vector2){point.x + width, point.y + height}, center, angle);
|
||||||
|
|
||||||
|
rlVertex2f(newLeftTop.x, newLeftTop.y);
|
||||||
|
rlVertex2f(newRightTop.x, newRightTop.y);
|
||||||
|
|
||||||
|
rlVertex2f(newRightTop.x, newRightTop.y);
|
||||||
|
rlVertex2f(newRightBottom.x, newRightBottom.y);
|
||||||
|
|
||||||
|
rlVertex2f(newRightBottom.x, newRightBottom.y);
|
||||||
|
rlVertex2f(newLeftBottom.x, newLeftBottom.y);
|
||||||
|
|
||||||
|
rlVertex2f(newLeftBottom.x, newLeftBottom.y);
|
||||||
|
rlVertex2f(newLeftTop.x, newLeftTop.y);
|
||||||
|
rlEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 RotatePointAroundPoint(Vector2 point, Vector2 center, float angle)
|
||||||
|
{
|
||||||
|
// Vector center->point
|
||||||
|
float x = point.x - center.x;
|
||||||
|
float y = point.y - center.y;
|
||||||
|
|
||||||
|
// new vector after rotation
|
||||||
|
float cosres = cosf(angle);
|
||||||
|
float sinres = sinf(angle);
|
||||||
|
float newX = x * cosres - y * sinres;
|
||||||
|
float newY = x * sinres + y * cosres;
|
||||||
|
|
||||||
|
// new point
|
||||||
|
return (Vector2){newX + center.x, newY + center.y};
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user