In the beginning of a software project, it is tempting to set a directory structure according to logic of software modules, objects and classes. In majority of cases, this does not work well.
A practical setting of directories is defined by technical factors, as: - degree of support, which chosen software development tools (compiler, linker, IDE, make, Version Control System) provide for a complicated directory structure - how often a subset of files will be modified - is there a possibility to pick a wrong file by mistyping a file name, etc.
To prevent typing mistakes we separate files with names, which differ only in extensions,
into different directories (as header files and source files).
We separate files of stable libraries into their own directories. We separate files belonging to different software modules, which are developed by different developers, into their own directories.
It is reasonable to keep the directory structure as flat as possible. The logic of the project should be presented not with directories, but with other tools, as HTML based documentation, for example.