]> Shamusworld >> Repos - architektonas/commitdiff
Fixed hit detection for Circles.
authorShamus Hammons <jlhamm@acm.org>
Thu, 7 May 2015 17:06:40 +0000 (12:06 -0500)
committerShamus Hammons <jlhamm@acm.org>
Thu, 7 May 2015 17:06:40 +0000 (12:06 -0500)
src/drawingview.cpp

index 8104f82b2ca7644698f60b67e1fecb46582d32f2..15579c9ab7dd5a8ef6790e408652fdc22b58dd00 100644 (file)
@@ -354,31 +354,26 @@ void DrawingView::RenderObjects(Painter * painter, std::vector<void *> & v)
                switch (obj->type)
                {
                case OTLine:
-               {
-                       Line * l = (Line *)obj;
-                       painter->DrawLine(l->p[0], l->p[1]);
+                       painter->DrawLine(obj->p[0], obj->p[1]);
 
-                       if (l->hitPoint[0])
-                               painter->DrawHandle(l->p[0]);
+                       if (obj->hitPoint[0])
+                               painter->DrawHandle(obj->p[0]);
 
-                       if (l->hitPoint[1])
-                               painter->DrawHandle(l->p[1]);
+                       if (obj->hitPoint[1])
+                               painter->DrawHandle(obj->p[1]);
 
                        break;
-               }
                case OTCircle:
-               {
-                       Circle * ci = (Circle *)obj;
                        painter->SetBrush(QBrush(Qt::NoBrush));
-                       painter->DrawEllipse(ci->p[0], ci->radius[0], ci->radius[0]);
+                       painter->DrawEllipse(obj->p[0], obj->radius[0], obj->radius[0]);
+
+                       if (obj->hitPoint[0])
+                               painter->DrawHandle(obj->p[0]);
+
                        break;
-               }
                case OTArc:
-               {
-                       Arc * a = (Arc *)obj;
-                       painter->DrawArc(a->p[0], a->radius[0], a->angle[0], a->angle[1]);
+                       painter->DrawArc(obj->p[0], obj->radius[0], obj->angle[0], obj->angle[1]);
                        break;
-               }
                case OTDimension:
                {
                        Dimension * d = (Dimension *)obj;
@@ -1160,13 +1155,12 @@ bool DrawingView::HitTestObjects(Point point)
                {
                case OTLine:
                {
-                       Line * l = (Line *)obj;
-                       bool oldHP0 = l->hitPoint[0], oldHP1 = l->hitPoint[1], oldHO = l->hitObject;
-                       l->hitPoint[0] = l->hitPoint[1] = l->hitObject = false;
-                       Vector lineSegment = l->p[1] - l->p[0];
-                       Vector v1 = point - l->p[0];
-                       Vector v2 = point - l->p[1];
-                       double t = Geometry::ParameterOfLineAndPoint(l->p[0], l->p[1], point);
+                       bool oldHP0 = obj->hitPoint[0], oldHP1 = obj->hitPoint[1], oldHO = obj->hitObject;
+                       obj->hitPoint[0] = obj->hitPoint[1] = obj->hitObject = false;
+                       Vector lineSegment = obj->p[1] - obj->p[0];
+                       Vector v1 = point - obj->p[0];
+                       Vector v2 = point - obj->p[1];
+                       double t = Geometry::ParameterOfLineAndPoint(obj->p[0], obj->p[1], point);
                        double distance;
 
                        if (t < 0.0)
@@ -1179,34 +1173,34 @@ bool DrawingView::HitTestObjects(Point point)
                                        / lineSegment.Magnitude());
 
                        if ((v1.Magnitude() * Global::zoom) < 8.0)
-                       {
-                               l->hitPoint[0] = true;
-//             snapPoint = l->p1;
-//             snapPointIsValid = true;
-                       }
+                               obj->hitPoint[0] = true;
                        else if ((v2.Magnitude() * Global::zoom) < 8.0)
-                       {
-                               l->hitPoint[1] = true;
-//             snapPoint = l->p2;
-//             snapPointIsValid = true;
-                       }
+                               obj->hitPoint[1] = true;
                        else if ((distance * Global::zoom) < 5.0)
-                               l->hitObject = true;
+                               obj->hitObject = true;
 
-//                     bool oldHovered = l->hovered;
-                       l->hovered = (l->hitPoint[0] || l->hitPoint[1] || l->hitObject ? true : false);
-//                     l->hovered = l->hitObject;
+                       obj->hovered = (obj->hitPoint[0] || obj->hitPoint[1] || obj->hitObject ? true : false);
 
-//                     if (oldHovered != l->hovered)
-                       if ((oldHP0 != l->hitPoint[0]) || (oldHP1 != l->hitPoint[1]) || (oldHO != l->hitObject))
+                       if ((oldHP0 != obj->hitPoint[0]) || (oldHP1 != obj->hitPoint[1]) || (oldHO != obj->hitObject))
                                needUpdate = true;
 
                        break;
                }
                case OTCircle:
                {
-                       Circle * c = (Circle *)obj;
+                       bool oldHP = obj->hitPoint[0], oldHO = obj->hitObject;
+                       obj->hitPoint[0] = obj->hitObject = false;
+                       double length = Vector::Magnitude(obj->p[0], point);
+
+                       if ((length * Global::zoom) < 8.0)
+                               obj->hitPoint[0] = true;
+                       else if ((fabs(length - obj->radius[0]) * Global::zoom) < 2.0)
+                               obj->hitObject = true;
 
+                       obj->hovered = (obj->hitPoint[0] || obj->hitObject ? true : false);
+
+                       if ((oldHP != obj->hitPoint[0]) || (oldHO != obj->hitObject))
+                               needUpdate = true;
 
                        break;
                }
@@ -1239,16 +1233,16 @@ void DrawingView::HandleObjectMovement(Point point)
        {
        case OTLine:
        {
-               Line * l = (Line *)obj;
+//             Line * l = (Line *)obj;
 
-               if (l->hitPoint[0])
-                       l->p[0] = point;
-               else if (l->hitPoint[1])
-                       l->p[1] = point;
-               else if (l->hitObject)
+               if (obj->hitPoint[0])
+                       obj->p[0] = point;
+               else if (obj->hitPoint[1])
+                       obj->p[1] = point;
+               else if (obj->hitObject)
                {
-                       l->p[0] += delta;
-                       l->p[1] += delta;
+                       obj->p[0] += delta;
+                       obj->p[1] += delta;
                }
 
                break;