From e28d8fe82d877a2095714fff7de6d5fab1289e67 Mon Sep 17 00:00:00 2001 From: Heng_Xin_666 <282000500@qq.com> Date: Fri, 6 Jun 2025 19:57:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E5=9B=9E=E5=AE=B6?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A:=20=E7=BB=98=E5=88=B6OpenCV=20Logo=E5=B9=B6?= =?UTF-8?q?=E4=B8=94=E5=B8=A6=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- glm/CMakeLists.txt | 4 +- src/main.cpp | 100 ++++++++++++++++++++++++++++++++------------- 2 files changed, 74 insertions(+), 30 deletions(-) diff --git a/glm/CMakeLists.txt b/glm/CMakeLists.txt index b7641a2..6ae78e9 100644 --- a/glm/CMakeLists.txt +++ b/glm/CMakeLists.txt @@ -1,5 +1,5 @@ -cmake_minimum_required(VERSION 3.2 FATAL_ERROR) -cmake_policy(VERSION 3.2) +# cmake_minimum_required(VERSION 3.2 FATAL_ERROR) +# cmake_policy(VERSION 3.2) file(READ "glm/detail/setup.hpp" GLM_SETUP_FILE) diff --git a/src/main.cpp b/src/main.cpp index 38751f0..6a7656b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,41 +2,85 @@ #include #include "check_gl.hpp" // includes glad/glad.h #include // must be placed behind glad/glad.h -#include #include #include #include +constexpr int Fineness = 120; +constexpr float pi = 3.1415926535897f; + +/** + * @brief 通过度数范围计算为对应百分比 + * @param du [0, 360] + * @return constexpr int + */ +constexpr int getShowRoundPercentage(float du) { + return static_cast(Fineness * (du / 360.f)); +} + +/** + * @brief 画一个圆, 位于 (x, y), 半径是 r, 环半径是 r - dr + * @tparam IsClockwise 是否是顺时针 + * @param x [-1, 1] + * @param y [-1, 1] + * @param r [-1, 1] + * @param dr [-1, 1] + * @param step 渲染步数 + * @param begin 渲染起始位置 + * @param end 渲染结束位置 [0, Fineness] + */ + template +void showRound( + float x, float y, + float r, float dr, + int step, + int begin, int end +) { + constexpr auto mod = Fineness + 1; + for (int i = begin; step && i != end; i = (i + (2 * IsClockwise - 1) + mod) % mod, --step) { + float angle = static_cast(i) / Fineness * pi * 2; + float angleNext = static_cast(i + 1) / Fineness * pi * 2; + + glVertex3f(dr * std::sin(angle) + x, dr * std::cos(angle) + y, 0.f); + glVertex3f(r * std::sin(angle) + x, r * std::cos(angle) + y, 0.f); + glVertex3f(r * std::sin(angleNext) + x, r * std::cos(angleNext) + y, 0.f); + + glVertex3f(dr * std::sin(angle) + x, dr * std::cos(angle) + y, 0.f); + glVertex3f(dr * std::sin(angleNext) + x, dr * std::cos(angleNext) + y, 0.f); + glVertex3f(r * std::sin(angleNext) + x, r * std::cos(angleNext) + y, 0.f); + } +} + static void render() { glBegin(GL_TRIANGLES); - glColor3f(1.0f, 0.0f, 0.0f); - glVertex3f(0.0f, 0.5f, 0.0f); - glColor3f(0.0f, 1.0f, 0.0f); - glVertex3f(-0.5f, -0.5f, 0.0f); - glColor3f(0.0f, 0.0f, 1.0f); - glVertex3f(0.5f, -0.5f, 0.0f); + constexpr float r = 0.3f, dr = 0.15f; + float xDown = std::sqrt(3.f) * 0.25f; + + static int cntR = 0, cntG = 0, cntB = 0, tmp = 0; // 控制动画和间隔时间 + + glColor3f(1.f, 0.f, 0.f); + showRound(0.f, 0.5f, r, dr, cntR, + getShowRoundPercentage(150), getShowRoundPercentage(210)); + + glColor3f(0.f, 1.f, 0.f); + showRound(-xDown, -0.25f, r, dr, cntG, + getShowRoundPercentage(30), getShowRoundPercentage(90)); + + glColor3f(0.f, 0.f, 1.f); + showRound(xDown, -0.25f, r, dr, cntB, + getShowRoundPercentage(330), getShowRoundPercentage(30)); + + constexpr int MaxStep = static_cast(Fineness / 360.f * (360 - 60)); + + if (++cntR > MaxStep + && ++cntG > MaxStep + && ++cntB > MaxStep + && ++tmp > MaxStep + ) { + cntR = cntG = cntB = tmp = 0; + } + CHECK_GL(glEnd()); - /* glBegin(GL_TRIANGLES); */ - /* constexpr int n = 100; */ - /* constexpr float pi = 3.1415926535897f; */ - /* float radius = 0.5f; */ - /* float inner_radius = 0.25f; */ - /* static int x = 0; */ - /* x++; */ - /* if (x > n) */ - /* x -= n; */ - /* for (int i = 0; i < x; i++) { */ - /* float angle = i / (float)n * pi * 2; */ - /* float angle_next = (i + 1) / (float)n * pi * 2; */ - /* glVertex3f(0.0f, 0.0f, 0.0f); */ - /* glVertex3f(radius * sinf(angle), radius * cosf(angle), 0.0f); */ - /* glVertex3f(radius * sinf(angle_next), radius * cosf(angle_next), 0.0f); */ - /* glVertex3f(inner_radius * sinf(angle), inner_radius * cosf(angle), 0.0f); */ - /* glVertex3f(inner_radius * sinf(angle_next), inner_radius * cosf(angle_next), 0.0f); */ - /* glVertex3f(inner_radius * sinf(angle), inner_radius * cosf(angle), 0.0f); */ - /* glVertex3f(radius * sinf(angle_next), radius * cosf(angle_next), 0.0f); */ - /* } */ - /* CHECK_GL(glEnd()); */ } int main() {