From e4b06adab54fbd906d75d1d5951f5fc5d3f62183 Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Thu, 7 May 2015 12:06:40 -0500 Subject: [PATCH] Fixed hit detection for Circles. --- src/drawingview.cpp | 90 +++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 48 deletions(-) diff --git a/src/drawingview.cpp b/src/drawingview.cpp index 8104f82..15579c9 100644 --- a/src/drawingview.cpp +++ b/src/drawingview.cpp @@ -354,31 +354,26 @@ void DrawingView::RenderObjects(Painter * painter, std::vector & 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; -- 2.37.2