-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
kinematics: add simple AABB tree for collision checking #298
base: master
Are you sure you want to change the base?
Conversation
add_library(aabb include/aabb.hpp) | ||
target_link_libraries(aabb configuration) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Přemýšlím, jestli by nestálo za to založit knihovnu geometry
a postupně tam všechny věci stěhovat. A pak mít klidně knihovny jako geometry::aabb
(v CMaku). Důvod: začínáme mít spoustu věcí, kterou jsou spíše obecná geometrie a nesouvisí nutně s konfigurací nebo rekonfigurací.
}; | ||
|
||
// Leaves are expected to be spheres or polygons | ||
template< geometric LeafShape > |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1 za koncept.
std::optional< LeafShape > shape; | ||
std::array< std::unique_ptr< AABB_Node >, 2 > children; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nebylo by idiomatičtější mít AABB_InnerNode
a AABB_Leaf
a children
si držet jako kontejner a std::variant< AABB_InnerNode, AABB_Leaf
? Proč si to myslím: Vnitřní uzly mají jiné metody než listy. A tedy volat leftChild
a rightChild
na uzlu, který je listem je nedefinované chování. Když budu mít variant, budu ho muset visitovat a tedy můžu mít čistší rozhraní pro dva typy uzů.
bound = bounding_box( children[ 0 ]->bound, children[ 1 ]->bound ); | ||
} | ||
|
||
size_t objects() const { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Myslím, že pojmenovat size
by bylo výstižnější (a kompatibilní se standardními konstruktory).
void print( const std::string& prefix = "" ){ | ||
if( children[ 1 ] ){ | ||
children[ 1 ]->print( prefix + " " ); | ||
} | ||
if( shape ){ | ||
std::cout << prefix << "o\n"; | ||
} else { | ||
std::cout << prefix << "B\n"; | ||
} | ||
if( children[ 0 ] ){ | ||
children[ 0 ]->print( prefix + " " ); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Obecně nejsem příznivcem "debugovacích metod" na třídách. Jedna jsou ad-hoc, zanáší závislost na streamech (stream ani není konfigurovatelný v tomto případě) a std::string
.
Lepší řešení mi přijde zavést buď friend toString
anebo přidat rozhraní pro vizitory (které vidí vnitřní strukturu stromu) a napsat "debugovací" funkce pomocí nich (mimo hlavní hlavičku).
|
||
using namespace rofi::configuration::matrices; | ||
|
||
struct Box { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nechceš zvážit mít box jako šablonovaný vectorem (něco jako GenericBox
) a poskytovat using Box = GenericBox< Vector >
? Občas se může hodit mít celočíselný strom. Stejně tak pro ostatní objekty.
No description provided.