// shape.hpp - Sistema de formes vectorials // © 2025 Port a C++20 amb SDL3 #pragma once #include #include #include "core/types.hpp" namespace Graphics { // Tipus de primitiva dins d'una forma enum class PrimitiveType { POLYLINE, // Seqüència de punts connectats LINE // Línia individual (2 punts) }; // Primitiva individual (polyline o line) struct ShapePrimitive { PrimitiveType type; std::vector points; // 2+ punts per polyline, exactament 2 per line }; // Classe Shape - representa una forma vectorial carregada des de .shp class Shape { public: // Constructors Shape() = default; explicit Shape(const std::string& filepath); // Carregar forma des de fitxer .shp bool carregar(const std::string& filepath); // Parsejar forma des de buffer de memòria (per al sistema de recursos) bool parsejar_fitxer(const std::string& contingut); // Getters [[nodiscard]] const std::vector& get_primitives() const { return primitives_; } [[nodiscard]] const Punt& get_centre() const { return centre_; } [[nodiscard]] float get_escala_defecte() const { return escala_defecte_; } [[nodiscard]] bool es_valida() const { return !primitives_.empty(); } // Info de depuració [[nodiscard]] std::string get_nom() const { return nom_; } [[nodiscard]] size_t get_num_primitives() const { return primitives_.size(); } private: std::vector primitives_; Punt centre_; // Centre/origen de la forma float escala_defecte_; // Escala per defecte (normalment 1.0) std::string nom_; // Nom de la forma (per depuració) // Helpers privats per parsejar [[nodiscard]] std::string trim(const std::string& str) const; [[nodiscard]] bool starts_with(const std::string& str, const std::string& prefix) const; [[nodiscard]] std::string extract_value(const std::string& line) const; void parse_center(const std::string& value); [[nodiscard]] std::vector parse_points(const std::string& str) const; }; } // namespace Graphics