-
Notifications
You must be signed in to change notification settings - Fork 186
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Ball placement obstacle with Stadium Shape on their ball placement (#…
- Loading branch information
Showing
7 changed files
with
172 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
#pragma once | ||
|
||
#include <memory> | ||
#include <set> | ||
#include <vector> | ||
|
||
#include "point.hpp" | ||
#include "polygon.hpp" | ||
#include "segment.hpp" | ||
#include "shape.hpp" | ||
#include "shape_set.hpp" | ||
|
||
namespace rj_geometry { | ||
|
||
/** | ||
* A rj_geometry::StadiumShape is a Shape that is made up of 2 circles and a polygon. It represents | ||
* the shape of a track from track and field. | ||
*/ | ||
class StadiumShape : public Shape { | ||
public: | ||
~StadiumShape() = default; | ||
|
||
StadiumShape() = default; | ||
|
||
StadiumShape(Point c1, Point c2, float r) { init(c1, c2, r); } | ||
|
||
StadiumShape(const StadiumShape& other) { | ||
for (const auto& shape : other.subshapes_) { | ||
std::shared_ptr<Shape> itr_shape = std::shared_ptr<Shape>(shape->clone()); | ||
subshapes_.push_back(itr_shape); | ||
} | ||
drawshapes_ = other.drawshapes_; | ||
} | ||
|
||
[[nodiscard]] Shape* clone() const override; | ||
|
||
[[nodiscard]] bool contains_point(Point pt) const override; | ||
[[nodiscard]] bool near_point(Point pt, float threshold) const override; | ||
|
||
using const_iterator = std::vector<std::shared_ptr<Shape>>::const_iterator; | ||
using iterator = std::vector<std::shared_ptr<Shape>>::iterator; | ||
|
||
[[nodiscard]] const_iterator begin() const { return subshapes_.begin(); } | ||
[[nodiscard]] const_iterator end() const { return subshapes_.end(); } | ||
|
||
iterator begin() { return subshapes_.begin(); } | ||
iterator end() { return subshapes_.end(); } | ||
|
||
[[nodiscard]] const std::vector<std::shared_ptr<Shape>>& subshapes() const { | ||
return subshapes_; | ||
} | ||
|
||
[[nodiscard]] const rj_geometry::ShapeSet drawshapes() const { return drawshapes_; } | ||
|
||
std::shared_ptr<Shape> operator[](unsigned int index) { return subshapes_[index]; } | ||
|
||
std::shared_ptr<const Shape> operator[](unsigned int index) const { return subshapes_[index]; } | ||
|
||
template <typename T> | ||
[[nodiscard]] bool hit(const T& obj) const { | ||
for (const auto& it : *this) { | ||
if (it->hit(obj)) { | ||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
|
||
[[nodiscard]] bool hit(Point pt) const override { return hit<Point>(pt); } | ||
|
||
[[nodiscard]] bool hit(const Segment& seg) const override { return hit<Segment>(seg); } | ||
|
||
std::string to_string() override { | ||
std::stringstream str; | ||
str << "StadiumShape<"; | ||
for (auto& subshape : subshapes_) { | ||
str << subshape->to_string() << ", "; | ||
} | ||
str << ">"; | ||
|
||
return str.str(); | ||
} | ||
|
||
protected: | ||
void init(Point c1, Point c2, float r); | ||
|
||
private: | ||
std::vector<std::shared_ptr<Shape>> subshapes_; | ||
rj_geometry::ShapeSet drawshapes_; | ||
}; | ||
|
||
} // namespace rj_geometry |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
#include <rj_geometry/stadium_shape.hpp> | ||
|
||
namespace rj_geometry { | ||
|
||
Shape* StadiumShape::clone() const { return new StadiumShape(*this); } | ||
|
||
void StadiumShape::init(Point c1, Point c2, float r) { | ||
rj_geometry::Circle first_circle = rj_geometry::Circle{c1, static_cast<float>(r)}; | ||
rj_geometry::Circle second_circle = rj_geometry::Circle{c2, static_cast<float>(r)}; | ||
|
||
rj_geometry::Segment vect{c1, c2}; | ||
|
||
rj_geometry::Point end1{c1.x() + r * (c2.x() - c1.x()) / vect.length(), | ||
c1.y() + r * (c2.y() - c1.y()) / vect.length()}; | ||
rj_geometry::Point end2{c2.x() - r * (c2.x() - c1.x()) / vect.length(), | ||
c2.y() - r * (c2.y() - c1.y()) / vect.length()}; | ||
|
||
rj_geometry::Segment vect_updated{end1, end2}; | ||
rj_geometry::Polygon rect_obs{vect_updated, r}; | ||
|
||
std::shared_ptr<rj_geometry::Circle> c1_obs_ptr = | ||
std::make_shared<rj_geometry::Circle>(first_circle); | ||
std::shared_ptr<rj_geometry::Polygon> rect_obs_ptr = | ||
std::make_shared<rj_geometry::Polygon>(rect_obs); | ||
std::shared_ptr<rj_geometry::Circle> c2_obs_ptr = | ||
std::make_shared<rj_geometry::Circle>(second_circle); | ||
|
||
subshapes_.push_back(c1_obs_ptr); | ||
subshapes_.push_back(rect_obs_ptr); | ||
subshapes_.push_back(c2_obs_ptr); | ||
|
||
drawshapes_.add(c1_obs_ptr); | ||
drawshapes_.add(rect_obs_ptr); | ||
drawshapes_.add(c2_obs_ptr); | ||
} | ||
|
||
bool StadiumShape::contains_point(Point pt) const { | ||
for (const auto& subshape : subshapes_) { | ||
if (subshape->contains_point(pt)) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
|
||
bool StadiumShape::near_point(Point pt, float threshold) const { | ||
for (const auto& subshape : subshapes_) { | ||
if (subshape->near_point(pt, threshold)) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
|
||
} // namespace rj_geometry |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters