18#ifndef _OBJECT_POS_SELECTOR_H
19#define _OBJECT_POS_SELECTOR_H
36 UsedPos(
float sign_,
float size_,
float dist_) : sign(sign_),
size(size_), dist(dist_) { }
48 void AddUsedPos(
float size,
float angle,
float dist);
49 void InitializeAngle();
51 bool FirstAngle(
float& angle);
52 bool NextAngle(
float& angle);
53 bool NextUsedAngle(
float& angle);
55 bool NextPosibleAngle(
float& angle);
57 bool CheckAngle(UsedPosList::value_type
const& nextUsedPos,
float sign,
float angle )
const
59 float angle_step2 = GetAngle(nextUsedPos.second);
61 float next_angle = nextUsedPos.first;
62 if (nextUsedPos.second.sign * sign < 0)
63 next_angle = 2 * float(
M_PI) - next_angle;
65 return std::fabs(angle) + angle_step2 <= next_angle;
78 float angle_step = GetAngle(usedPos.second);
81 angle = usedPos.first * usedPos.second.sign + angle_step * sign;
83 UsedPosList::value_type
const* nextNode = nextUsedPos(uptype);
87 if (!CheckAngle(*nextNode, sign, angle))
89 m_smallStepOk[uptype] =
false;
95 m_smallStepOk[uptype] =
true;
96 m_smallStepAngle[uptype] = angle;
97 m_smallStepNextUsedPos[uptype] = nextNode;
105 angle = m_smallStepAngle[uptype] + m_anglestep * sign;
107 if (std::fabs(angle) >
float(
M_PI))
109 m_smallStepOk[uptype] =
false;
113 if (m_smallStepNextUsedPos[uptype])
115 if (std::fabs(angle) >= m_smallStepNextUsedPos[uptype]->first)
117 m_smallStepOk[uptype] =
false;
122 if (!CheckAngle(*m_smallStepNextUsedPos[uptype], sign, angle))
124 m_smallStepOk[uptype] =
false;
130 m_smallStepAngle[uptype] = angle;
135 UsedPosList::value_type
const* nextUsedPos(
UsedPosType uptype);
147 UsedPosList::const_iterator m_nextUsedPos[2];
150 float m_smallStepAngle[2];
151 bool m_smallStepOk[2];
152 UsedPosList::value_type
const* m_smallStepNextUsedPos[2];
UsedPosType operator~(UsedPosType uptype)
constexpr std::size_t size()
UsedPos(float sign_, float size_, float dist_)
bool IsNonBalanced() const
bool NextAngleFor(UsedPosList::value_type const &usedPos, float sign, UsedPosType uptype, float &angle)
bool CheckAngle(UsedPosList::value_type const &nextUsedPos, float sign, float angle) const
std::multimap< float, UsedPos > UsedPosList
bool NextSmallStepAngle(float sign, UsedPosType uptype, float &angle)
bool CheckOriginal() const
float GetAngle(UsedPos const &usedPos) const