Я делаю программу рисования для рисования трехмерных сеток с помощью круглой кисти.Из-за того, как я указываю область, которую нужно изменить на цвет кисти, я считаю, что события MouseMove запускаются быстрее, чем программа может закончить рисование, таким образом, вместо простого изменения круга на другой цвет, он переполняется и заканчиваетсяраскраска всей сетки.
В mouseMove вызывается следующее:
void Mesh::setCircle(Face *face, int radius, Color color) {
for (unsigned int i = 0; i < mouseOvers.size(); i++)
faceList[mouseOvers[i]].mouseOver = false;
mouseOvers.clear();
...
// finds the faces on the mesh around the centerIndex on the circle (just the outline of the circle)
// calls face->mouseOver = true; for each of those faces
// adds the indices of the faces to mouseOvers
}
Выше приведено описание контура кисти на сетке, чтобы пользователи знали, что онисобирается рисовать.Когда пользователь нажимает кнопку мыши, вызывается следующее:
void Mesh::getAdjacent(Face *face, vector<Face *> &adjacent) {
for (unsigned int i = 0; i < mouseOvers.size(); i++)
adjacent.push_back(&faceList[mouseOvers[i]]);
int currentUp = face->listIndex;
int currentDown = currentUp;
helperGetAdjacent(currentUp, adjacent);
while (!faceList[currentUp].mouseOver) {
//up
if (currentUp >= numCols) {
currentUp -= numCols;
helperGetAdjacent(currentUp, adjacent);
}
else
break;
}
while (!faceList[currentDown].mouseOver) {
//down
if (currentDown < numCols * (numRows-1)) {
currentDown += numCols;
helperGetAdjacent(currentDown, adjacent);
}
else
break;
}
}
void Mesh::helperGetAdjacent(int trunk, vector<Face *> &adjacent) {
int currentRight = trunk;
int currentLeft = trunk;
adjacent.push_back(&faceList[trunk]);
while (!faceList[currentRight].mouseOver) {
// check right
if (currentRight % numCols != numCols - 1) {
adjacent.push_back(&faceList[currentRight + 1]);
currentRight++;
}
else
break;
}
while (!faceList[currentLeft].mouseOver) {
//check left
if (currentLeft % numCols != 0) {
adjacent.push_back(&faceList[currentLeft - 1]);
currentLeft--;
}
else
break;
}
}
Краткая сводка кода выше, я использую свойство mouseOver на гранях, чтобы определить, когда прекратить добавлять грани к * 1009.* (который возвращается и окрашивается в другой функции).
Теперь это работает, когда пользователь просто щелкает мышью.Когда пользователь перетаскивает его, удерживая, я просто вызываю эту функцию getAdjacent
снова.Если пользователь перемещает мышь достаточно медленно, ожидаемое поведение (грани окрашиваются мышью, как кисть), но если пользователь перетаскивает быстрее (а это не очень быстро), вся сетка будет окрашена.
Я подозреваю, что событие mousemove вызывается в другом потоке, в результате чего функция setCircle
вызывается до завершения функции getAdjacent
.Элемент mouseOver в Face изменяется на false и getAdjacent
не останавливается в нужном месте.
Как я могу исправить эту проблему?
Большое спасибо!