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;
{
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)
/ 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;
}
{
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;