📜 ⬆️ ⬇️

Test the training of visual attention

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 code
void 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 { // find another link that is'nt crosses with others crossCharge --; continue; } } m_links.append(newLink); currDot = nextDot; } break; } } int maxRow = -1; int minRow = m_rows; int maxCol = -1; int minCol = m_rows; for (int d = 0; d < dots.count(); ++d) { if (rowByDot(dots.at(d)) < minRow) minRow = rowByDot(dots.at(d)); if (rowByDot(dots.at(d)) > maxRow) maxRow = rowByDot(dots.at(d)); if (colByDot(dots.at(d)) < minCol) minCol = colByDot(dots.at(d)); if (colByDot(dots.at(d)) > maxCol) maxCol = colByDot(dots.at(d)); } if (minCol == 0 && minRow == 0 && maxRow == m_rows - 1 && maxCol == m_cols - 1) break; broadCharge --; continue; } } 

At the moment, the program is able to generate several types of characters:


The following interferences were also implemented:

In addition, it is possible to enable the Tip - Tip Settings (the desired shape is “highlighted” after a specified time).

Interface settings


After passing the table shows statistics. Horizontally guessing, vertical time. Green is the right answer, red is wrong, yellow is a hint.

Statistics display


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

Source: https://habr.com/ru/post/277049/


All Articles