diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-21 23:40:30 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-21 23:43:31 +0800 |
commit | 6b78788d049c90dab3aec01d7bb7193f3927dc75 (patch) | |
tree | 977cfe754ccafb94e3e6743937d9132d2184df2f /include | |
parent | e31b0b8b37ae52e9402dc351e5fb0f361d30d0e0 (diff) | |
download | cru-6b78788d049c90dab3aec01d7bb7193f3927dc75.tar.gz cru-6b78788d049c90dab3aec01d7bb7193f3927dc75.tar.bz2 cru-6b78788d049c90dab3aec01d7bb7193f3927dc75.zip |
HALF WORK!geo-arc
Diffstat (limited to 'include')
-rw-r--r-- | include/cru/platform/GraphicsBase.h | 10 | ||||
-rw-r--r-- | include/cru/platform/graphics/Geometry.h | 12 | ||||
-rw-r--r-- | include/cru/platform/graphics/quartz/Geometry.h | 2 |
3 files changed, 24 insertions, 0 deletions
diff --git a/include/cru/platform/GraphicsBase.h b/include/cru/platform/GraphicsBase.h index b0f653ef..d9057beb 100644 --- a/include/cru/platform/GraphicsBase.h +++ b/include/cru/platform/GraphicsBase.h @@ -5,6 +5,7 @@ #include "cru/base/Range.h" #include "cru/base/String.h" +#include <cmath> #include <format> #include <limits> @@ -24,6 +25,11 @@ struct Point final { constexpr Point Negate() const { return Point(-x, -y); } + static constexpr float Distance(const Point& p1, const Point& p2) { + auto dx = p1.x - p2.x, dy = p1.y - p2.y; + return std::sqrt(dx * dx + dy * dy); + } + float x = 0; float y = 0; }; @@ -36,6 +42,10 @@ constexpr Point operator-(const Point& left, const Point& right) { return Point(left.x - right.x, left.y - right.y); } +constexpr Point operator/(const Point& point, float scale) { + return Point(point.x / scale, point.y / scale); +} + constexpr bool operator==(const Point& left, const Point& right) { return left.x == right.x && left.y == right.y; } diff --git a/include/cru/platform/graphics/Geometry.h b/include/cru/platform/graphics/Geometry.h index b4b05194..6550a8ce 100644 --- a/include/cru/platform/graphics/Geometry.h +++ b/include/cru/platform/graphics/Geometry.h @@ -63,6 +63,18 @@ struct CRU_PLATFORM_GRAPHICS_API IGeometry : virtual IGraphicsResource { * virtual so it can override them. */ struct CRU_PLATFORM_GRAPHICS_API IGeometryBuilder : virtual IGraphicsResource { + struct ArcInfo { + Point center; + // In radian. + float start_angle; + // In radian. + float end_angle; + }; + + static ArcInfo CalculateArcInfo(const Point& start_point, const Point& radius, + float angle, bool is_large_arc, bool is_clockwise, + const Point& end_point); + virtual Point GetCurrentPosition() = 0; virtual void MoveTo(const Point& point) = 0; diff --git a/include/cru/platform/graphics/quartz/Geometry.h b/include/cru/platform/graphics/quartz/Geometry.h index 18e2e25e..14d06deb 100644 --- a/include/cru/platform/graphics/quartz/Geometry.h +++ b/include/cru/platform/graphics/quartz/Geometry.h @@ -47,6 +47,8 @@ class QuartzGeometryBuilder : public OsxQuartzResource, const Point &end_point) override; void QuadraticBezierTo(const Point &control_point, const Point &end_point) override; + void ArcTo(const Point &radius, float angle, bool is_large_arc, + bool is_clockwise, const Point &end_point) override; void CloseFigure(bool close) override; std::unique_ptr<IGeometry> Build() override; |