24 #include "../base/assert.h" 25 #include "../base/Ptr.h" 26 #include "../base/vector.h" 28 #include "../tools/alert.h" 29 #include "../tools/mem_track.h" 45 template <
typename BODY_TYPE>
54 , target_dist(0) { ; }
56 : type(t), from(_frm), to(_to), cur_dist(cur), target_dist(target) { ; }
75 Body2D_Base() : birth_time(0.0), orientation(), velocity(), mass(1.0), color_id(0), repro_count(0)
76 , shift(), cum_shift(), total_abs_shift(), pressure(0), detach_on_divide(true) { ; }
114 double target_radius;
122 : perimeter(_p), target_radius(_p.GetRadius()), from_links(0), to_links(0)
128 while (from_links.
size()) RemoveLink(from_links[0]);
129 while (to_links.
size()) RemoveLink(to_links[0]);
149 for (
auto cur_link : from_links)
if (cur_link->to == &link_org)
return true;
154 return IsLinkedFrom(link_org) || IsLinkedTo(link_org);
163 auto new_link = NewPtr< BodyLink<CircleBody2D> >(type,
this, &link_org, cur_dist, target_dist);
165 link_org.to_links.push_back(new_link);
171 if (link->to ==
ToPtr(
this)) {
172 link->from->RemoveLink(link);
177 for (
size_t i = 0; i < from_links.
size(); i++) {
178 if (from_links[i]->to == link->to) {
179 from_links[i] = from_links.
back();
186 const size_t to_size = link->to->to_links.size();
187 for (
size_t i = 0; i < to_size; i++) {
188 if (link->to->to_links[i]->from ==
ToPtr(
this)) {
189 auto & other_links = link->to->to_links;
190 other_links[i] = other_links.back();
191 other_links.pop_back();
201 for (
auto link : from_links)
if ( link->to == &link_org)
return *link;
207 for (
auto link : from_links)
if ( link->to ==
ToPtr(&link_org) )
return *link;
213 return FindLink(link_org).cur_dist;
217 return FindLink(link_org).target_dist;
220 auto & link = FindLink(link_org);
221 link.cur_dist += change;
229 auto offspring = NewPtr<CircleBody2D>(perimeter);
231 offspring->Translate(offset);
240 if ((
int) target_radius > (
int) GetRadius()) SetRadius(GetRadius() + change_factor);
241 else if ((
int) target_radius < (
int) GetRadius()) SetRadius(GetRadius() - change_factor);
244 for (
size_t i = 0; i < from_links.
size(); i++) {
245 auto link = from_links[i];
246 if (link->cur_dist == link->target_dist)
continue;
249 if (std::abs(link->cur_dist - link->target_dist) <= change_factor) {
250 link->cur_dist = link->target_dist;
262 if (link->cur_dist < link->target_dist) link->cur_dist += change_factor;
263 else link->cur_dist -= change_factor;
281 else {
velocity *= 1.0 - ((double) friction) / ((double) velocity_mag); }
288 const double max_x = max_coords.
GetX() - GetRadius();
289 const double max_y = max_coords.
GetY() - GetRadius();
304 for (
auto link : from_links) {
305 if (GetAnchor() == link->to->GetAnchor()) {
307 Translate(
Point(0.01, 0.01));
311 const double start_dist = GetAnchor().Distance(link->to->GetAnchor());
312 const double link_dist = link->cur_dist;
313 const double frac_change = (1.0 - ((double) link_dist) / ((double) start_dist)) / 2.0;
315 Point dist_move = (GetAnchor() - link->to->GetAnchor()) * frac_change;
318 link->to->perimeter.
Translate(dist_move);
322 if (GetCenter().GetX() < GetRadius()) {
325 }
else if (GetCenter().GetX() > max_x) {
330 if (GetCenter().GetY() < GetRadius()) {
333 }
else if (GetCenter().GetY() > max_y) {
341 for (
auto link : from_links) {
constexpr bool NonZero() const
Definition: Point2D.h:48
Angle & RotateDegrees(double degrees)
Definition: Angle2D.h:131
Ptr< T > ToPtr(T *_in, bool own=false)
Convert a T* to a Ptr<T>. By default, don't track.
Definition: Ptr.h:816
const Circle2D< double > & GetPerimeter() const
Definition: Body2D.h:134
Ptr< BODY_TYPE > to
Definition: Body2D.h:49
Body2D_Base()
Definition: Body2D.h:75
CircleBody2D(const Circle2D< double > &_p)
Definition: Body2D.h:121
void Translate(const Point &t)
Definition: Body2D.h:145
uint32_t color_id
Definition: Body2D.h:65
void BodyUpdate(double change_factor=1)
Definition: Body2D.h:238
bool GetDetachOnDivide() const
Definition: Body2D.h:88
void SetRadius(double r)
Definition: Body2D.h:141
Point total_abs_shift
Definition: Body2D.h:70
double cur_dist
Definition: Body2D.h:50
double GetTargetRadius() const
Definition: Body2D.h:138
Circle2D< TYPE > & Translate(Point2D< TYPE > shift)
Definition: Circle2D.h:40
constexpr TYPE GetX() const
Definition: Point2D.h:39
double target_dist
Definition: Body2D.h:51
BodyLink(LINK_TYPE t, Ptr< BODY_TYPE > _frm, Ptr< BODY_TYPE > _to, double cur=0, double target=0)
Definition: Body2D.h:55
void SetVelocity(double x, double y)
Definition: Body2D.h:101
Point2D & NegateX()
Definition: Point2D.h:74
void TurnRight(int steps=1)
Definition: Body2D.h:95
constexpr double SquareMagnitude() const
Definition: Point2D.h:45
bool OK()
Definition: Body2D.h:340
double birth_time
Definition: Body2D.h:61
void SetVelocity(const Point &v)
Definition: Body2D.h:102
bool IsLinkedFrom(const CircleBody2D &link_org) const
Definition: Body2D.h:148
LINK_TYPE type
Definition: Body2D.h:47
Circle2D< TYPE > & SetCenterX(TYPE x)
Definition: Circle2D.h:34
void TurnLeft(int steps=1)
Definition: Body2D.h:94
const Angle & GetOrientation() const
Definition: Body2D.h:80
void SetTargetRadius(double t)
Definition: Body2D.h:142
double pressure
Definition: Body2D.h:71
void IncSpeed(const Point &offset)
Definition: Body2D.h:98
void AddShift(const Point &s)
Definition: Body2D.h:105
Circle2D< TYPE > & SetRadius(TYPE new_radius)
Definition: Circle2D.h:36
Point shift
Definition: Body2D.h:68
void push_back(PB_Ts &&...args)
Definition: vector.h:189
bool detach_on_divide
Definition: Body2D.h:73
Point GetShift() const
Definition: Body2D.h:86
void SetPosition(const Point &p)
Definition: Body2D.h:140
size_t size() const
Definition: vector.h:151
Point2D & Set(TYPE _x, TYPE _y)
Definition: Point2D.h:43
Point2D<> Point
Definition: Point2D.h:99
const Point & GetVelocity() const
Definition: Body2D.h:81
double GetPressure() const
Definition: Body2D.h:87
double GetTargetLinkDist(const CircleBody2D &link_org) const
Definition: Body2D.h:215
~BodyLink()
Definition: Body2D.h:58
const Point & GetCenter() const
Definition: Body2D.h:136
bool IsLinkedTo(const CircleBody2D &link_org) const
Definition: Body2D.h:152
Ptr< CircleBody2D > BuildOffspring(Point offset)
Definition: Body2D.h:224
void ShiftLinkDist(CircleBody2D &link_org, double change)
Definition: Body2D.h:219
Circle2D< TYPE > & SetCenter(const Point2D< TYPE > &c)
Definition: Circle2D.h:32
void pop_back()
Definition: vector.h:194
double GetRadius() const
Definition: Body2D.h:137
bool IsLinked(const CircleBody2D &link_org) const
Definition: Body2D.h:153
Point2D & ToOrigin()
Definition: Point2D.h:73
void ProcessStep(double friction=0)
Definition: Body2D.h:272
constexpr Point2D Abs() const
Definition: Point2D.h:65
void IncSpeed()
Definition: Body2D.h:99
Ptr< BODY_TYPE > from
Definition: Body2D.h:48
bool IsReproducing() const
Definition: Body2D.h:84
Angle orientation
Definition: Body2D.h:62
virtual ~Body2D_Base()
Definition: Body2D.h:77
~CircleBody2D()
Definition: Body2D.h:126
void SetBirthTime(double in_time)
Definition: Body2D.h:90
void SetDetachOnDivide(bool in=true)
Definition: Body2D.h:108
Circle2D< TYPE > & SetCenterY(TYPE y)
Definition: Circle2D.h:35
double GetMass() const
Definition: Body2D.h:82
double mass
Definition: Body2D.h:64
If we are in emscripten, make sure to include the header.
Definition: array.h:37
constexpr const Point2D< TYPE > & GetCenter() const
Definition: Circle2D.h:26
void RemoveLink(Ptr< BodyLink< CircleBody2D > > link)
Definition: Body2D.h:169
void AddLink(LINK_TYPE type, CircleBody2D &link_org, double cur_dist, double target_dist)
Definition: Body2D.h:159
void FinalizePosition(const Point &max_coords)
Definition: Body2D.h:287
Build a debug wrapper emp::vector around std::vector.
Definition: vector.h:42
int GetReproCount() const
Definition: Body2D.h:85
const BodyLink< CircleBody2D > & FindLink(const CircleBody2D &link_org) const
Definition: Body2D.h:199
void DecSpeed()
Definition: Body2D.h:100
#define emp_assert(...)
Definition: assert.h:199
LINK_TYPE
Definition: Body2D.h:43
T & back()
Definition: vector.h:183
uint32_t GetColorID() const
Definition: Body2D.h:83
BodyLink< CircleBody2D > & FindLink(CircleBody2D &link_org)
Definition: Body2D.h:205
Point cum_shift
Definition: Body2D.h:69
BodyLink()
Definition: Body2D.h:53
const Point & GetAnchor() const
Definition: Body2D.h:135
size_t GetLinkCount() const
Definition: Body2D.h:157
Point velocity
Definition: Body2D.h:63
void SetColorID(uint32_t in_id)
Definition: Body2D.h:91
Point2D & NegateY()
Definition: Point2D.h:75
constexpr TYPE GetY() const
Definition: Point2D.h:40
constexpr TYPE GetRadius() const
Definition: Circle2D.h:29
int repro_count
Definition: Body2D.h:66
double GetBirthTime() const
Definition: Body2D.h:79
double GetLinkDist(const CircleBody2D &link_org) const
Definition: Body2D.h:211
constexpr double Magnitude() const
Definition: Point2D.h:46
Point GetPoint(double distance=1.0) const
Definition: Angle2D.h:167