From cd309c04f2597f4029655f2aca797b677371bd95 Mon Sep 17 00:00:00 2001 From: Simon Hardt Date: Thu, 3 Mar 2022 22:24:30 +0100 Subject: [PATCH] add: Circle --- frame/src/Vector.hpp | 11 +++++++--- frame/src/main.cpp | 10 ++++----- frame/src/render/RenderTarget.cpp | 36 ++++++++++++++++++++++++++++--- frame/src/render/RenderTarget.hpp | 4 ++++ 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/frame/src/Vector.hpp b/frame/src/Vector.hpp index 15d1173..a07d0b6 100644 --- a/frame/src/Vector.hpp +++ b/frame/src/Vector.hpp @@ -1,8 +1,8 @@ #pragma once -#include - #include "Size.hpp" +#include + namespace frame { struct Vector @@ -56,7 +56,12 @@ namespace frame inline std::ostream& operator<<(std::ostream& os, Vector const& v) { - return os << "x: "<< v.x << " y: " << v.y; + return os << "x: " << v.x << " y: " << v.y; + } + + inline Vector operator+(Vector const& a, Vector const& b) + { + return {a.x + b.x, a.y + b.y}; } } // namespace frame diff --git a/frame/src/main.cpp b/frame/src/main.cpp index edd52be..5e59351 100644 --- a/frame/src/main.cpp +++ b/frame/src/main.cpp @@ -1,20 +1,19 @@ -#include #include +#include #include #include #include + using namespace std::chrono_literals; #include "display/EPD_7in5_V2.hpp" #include "render/RenderTarget.hpp" - int main() { constexpr double pi = 3.14159; - frame::display::EPD_7in5_V2 display{}; display.Init(); @@ -25,7 +24,6 @@ int main() frame::Vector const center = (display.getSize() / 2); - target.DrawPixel({10, 10}, frame::BLACK); target.DrawLine({10, 12}, {100, 12}, frame::BLACK); @@ -33,7 +31,7 @@ int main() { auto end = center; - double const x = std::cos(i * pi / 180.f) * 200.f; + double const x = std::cos(i * pi / 180.f) * 200.f; double const y = std::sin(i * pi / 180.f) * 200.f; end.x += (int)x; @@ -42,6 +40,8 @@ int main() target.DrawLine(center, end); } + target.DrawCircle(center, 210); + display.Display(target.getImage()); std::this_thread::sleep_for(10s); diff --git a/frame/src/render/RenderTarget.cpp b/frame/src/render/RenderTarget.cpp index 3483591..09af0d6 100644 --- a/frame/src/render/RenderTarget.cpp +++ b/frame/src/render/RenderTarget.cpp @@ -55,8 +55,7 @@ namespace frame::render { pos.x += rX; pos.y += rY; - } - else + } else { pos.y += rX; pos.x += rY; @@ -65,11 +64,42 @@ namespace frame::render E += 2 * deltaY - 2 * deltaX; } - if(pos.x < 0 || pos.y < 0 || pos.x >= image.getWidth() || pos.y >= image.getHeight()) + if(pos.x < 0 || pos.y < 0 || pos.x >= image.getWidth() + || pos.y >= image.getHeight()) break; DrawPixel(pos, color); } } + void RenderTarget::DrawCircle(Vector const& center, + int32_t radius, + Color color) + { + int32_t const r_2 = radius * radius; + Vector pos{0, -radius}; + + pos.x += 1; + float E = + pos.x * pos.x + ((float)pos.y - 0.5f) * ((float)pos.y - 0.5f) - r_2; + + while(pos.x <= radius / std::sqrt(2.f)) + { + if(E < 0) + { + pos.x += 1; + + E += 3; + } else + { + pos.x += 1; + pos.y -= 1; + + E -= 2 * (-radius) + 5; + } + + DrawPixel(center + pos, color); + } + } + } // namespace frame::render diff --git a/frame/src/render/RenderTarget.hpp b/frame/src/render/RenderTarget.hpp index bae9a8d..1ed53d5 100644 --- a/frame/src/render/RenderTarget.hpp +++ b/frame/src/render/RenderTarget.hpp @@ -20,6 +20,10 @@ namespace frame::render Vector const& end, Color color = BLACK); + void DrawCircle(Vector const& center, + int32_t radius, + Color color = BLACK); + Image const& getImage() { return image;