View Full Version : Removing last Painted point
ebsaith
28th June 2013, 09:41
Good Day
I store points in an array (points taken from position of mouse click)
In my paintEvent I draw points from array
painter.setPen(myPen);
foreach(tempMark, myPoints)
{
painter.drawEllipse(tempMark, 2, 2);
}
I created an UNDO Button that deletes the last point from array
I tested it, by writing points to file, That point is deleted
But my paintEvent still displays that point while I'm creating new points
(note all points must be displayed at all times during the run of the program)
If I click Undo, it should Remove only the last point
(which it does from the array - Button is working) But the point is still displayed on the screen
PushButton_Undo:(
myPoints.removeLast();
this->repaint(); //-> probably this->repaint() not working! maybe
Do I add something to the paint Event?
Any Ideas?
Many Thanks
ecspertiza
28th June 2013, 10:36
Hi, i think that PushButton_Undo not call. Can add to you code
qDebug() << Q_FUNC_INFO;
and view console log.
ebsaith
28th June 2013, 13:09
The push Button is being called, Since the array is being updated
The problem is the paint function not rendering the updated array.
Ideas welcome
Thanks
wysota
28th June 2013, 14:56
Add the qDebug() call to the paint event and see if it is called or not. By the way, use update() instead of repaint().
ebsaith
28th June 2013, 15:43
added update(); ;)
Added the above qDebug line of code, program compiles
though im not sure what i'm supposed to look for/where/...?
some guidance please
Kind Regards
wysota
29th June 2013, 16:19
You should observe whether calling your undo results in the debug statement you put in the paint event being printed.
ebsaith
1st July 2013, 14:56
Thanks for your help...
Please inform me,
How would I go about creating a function that can remove ANY point from screen.
Example: In running program, user creates 7+ points
User is able to click one of the previous points to remove it
Note: all points are stored in an array
How would I test The mouse position against array to delete point:confused:
Ideas Welcome;)
Kind Regards
wysota
1st July 2013, 15:28
Use mouse events to determine which of the stored point the user clicked on, remove that point from the stored list, redraw.
ebsaith
2nd July 2013, 08:53
My program crashes when I try removing point:confused:
//using popUpMenu to remove point
Here is my code:
void LabelClass::RemovePoint()
{
QList<int> lengthArray;
int min = 0;
int indexMin = 0
int tempLength = 0;
int index = 0;
while (index < myArrayCounter)
{
//Using Distance Formula to determine nearest point
//x1 and y1 are coordinates of mouse position at the time of click on popUpMenu
tempLength = sqrt(pow((x1 - myArray),2) + pow((y1 - myArray[index+1]), 2));
lengthArray.append(tempLength);
//[I]Find Smallest
min = lengthArray[index];
if (lengthArray[index] < minRe)
{
min = lengthArray[index];
indexMin = index;
}
index += 2;
//Array stored as |x|y|x|y|...
}
//delete x & y value & decrement counters
myCounter -= 1;
myArrayCounter -= 2;
myArray.removeAt(indexMin);
myArray.removeAt(indexMin);
I create this same algorithm per category of points (pointsA, pointsB,.. stored in differentArrays)
compare the smallest length of each array and delete at index of that array
Help, please
Ideas on a more efficient algorithm, most welcome!:D
Kind Regards
wysota
2nd July 2013, 10:08
I would use QPoint and QPoint::manhattanLength() to calculate the distance.
int closestPoint(const QList<QPoint> &points, const QPoint &pt) {
if(points.isEmpty()) return -1;
int minIdx = 0;
int minDistance = (points.at(0)-pt).manhattanLength();
for(int i=1;i<points.size();++i) {
int dist = (points.at(i)-pt).manhattanLength();
if(dist < minDistance) { minIdx = i; minDistance = dist; }
}
// cutoff: if(minDistance > 10) return -1;
return minIdx;
}
And then:
QList<QPoint> points;
QPoint clickedPoint;
int closest = closestPoint(points, clickedPoint);
if(closest >=0) points.removeAt(closest);
You'll probably want some cutoff on the distance not to remove points that are quite far away from the destination but are still closer than all other points.
ebsaith
2nd July 2013, 10:37
Yes, Will try it -> looks much more efficient
Kind Regards;)
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions Inc. All rights reserved.