If I write 2, then 4, then 6, then we will feel good, because we know what comes next 8. We can foresee this, we are not in the hands of fate. However, unfortunately, this has nothing to do with the truth ...
x / f "Oxford killings"

Task: to find the central figure among the grayish figures around.
This project - PsyMatchArea - was conceived as an alternative to the famous
Schulte tables . With the same goals (training of visual peripheral attention), but with other, more “frostbitten” initial premises. First, it was necessary to get away from the numbers and letters, symbols familiar to everyone from practically the nursery and therefore recognized on the machine without actively involving the consciousness in the process. Secondly, in order for attention to be replaced as little as possible by memory (and not relaxed at all), it was necessary to ensure appropriate “interferences” - change of positions, blinking, imposition, etc.
Mode with multiple simultaneous interference Perhaps the most interesting from the point of view of programming was to create an algorithm that would produce a fairly diverse set of abstract symbols of one type or another. For example, rune symbols are grown as follows: at the input, it is proposed to generate five consecutive connections in the 3 x 3 node matrix with some topological “constraints” (limit on the number of intersections and increased probability of hooking all sides of the matrix perimeter). If, during a certain number of attempts, the algorithm comes to a dead end, it shows “tolerance” and skips the last dead end to the exit (as the saying goes, that has grown, then it has grown).
')
Rune generator codevoid CRunePattern::genSolidLink(int linkCount, int crossesCount) { if (this->isEmpty()) return; int broadCharge = 5; while (broadCharge) { m_links.clear(); QVector <int> dots; int currDot = qrand()%(m_cols*m_rows); for (int i = 0; i < linkCount; ++i) { dots.append(currDot); int crossCharge = 5; while (crossCharge) { int nextDotCharge = 5; int nextDot = qrand()%(m_cols*m_rows); while (nextDotCharge && dots.contains(nextDot)) { nextDot = qrand()%(m_cols*m_rows); nextDotCharge --; } if (nextDotCharge) { CDotLink newLink = CDotLink(currDot, nextDot); if (this->hasCrossLink(newLink)) { if (crossesCount) { crossesCount --; } else {
At the moment, the program is able to generate several types of characters:

The following interferences were also implemented:
- Swap interference - shuffle shapes
- Hide center pattern - the disappearance of the central figure
- Thrill interference - rattling of figures
- Color interference - color shimmer (garland)
- Cover interference - concentric circles
In addition, it is possible to enable the Tip - Tip Settings (the desired shape is “highlighted” after a specified time).
After passing the table shows statistics. Horizontally guessing, vertical time. Green is the right answer, red is wrong, yellow is a hint.
A couple of methodological notes. You should not look for a figure, scattering the gaze in all directions - this, firstly, quickly exhausts and, secondly, it will not give anything in terms of the development of background attention. It is advisable to relax and disperse the locus of visual attention around the window, keeping the desired figure “in mind”.
GitHub
source code (Qt 4.8)
Build under Win32