]> Shamusworld >> Repos - architektonas/blobdiff - src/circle.cpp
Initial bring-back of line to line intersection detection.
[architektonas] / src / circle.cpp
index 94a9ec8f807b47b5e867bb3e5fab79b951c46c3a..ed37be3fcd7268faf59cfcb3906316f69a447045 100644 (file)
@@ -100,6 +100,9 @@ Circle::~Circle()
        if (snapToGrid)
                point = SnapPointToGrid(point);
 
+       if (snapPointIsValid)
+               point = snapPoint;
+
        draggingCenter = hitCenter;
        draggingEdge = hitCircle;
 
@@ -132,11 +135,23 @@ Circle::~Circle()
                return false;
        }
 
+/*
+Note that we can separate this out in the TLC, and it would probably make more sense
+to do it there as then we can be assured that all hit testing is done before we do
+any snapping. !!! FIX !!!
+*/
        // Hit test tells us what we hit (if anything) through boolean variables. It
        // also tells us whether or not the state changed.
        SaveHitState();
        bool hovered = HitTest(point);
        needUpdate = HitStateChanged();
+
+       if (snapToGrid)
+               point = SnapPointToGrid(point);
+
+       if (snapPointIsValid)
+               point = snapPoint;
+
        objectWasDragged = (draggingEdge | draggingCenter);
 
        if (objectWasDragged)
@@ -173,8 +188,8 @@ Circle::~Circle()
        double length = Vector::Magnitude(position, point);
 //printf("Circle::length = %lf, radius = %lf\n", length, radius);
 //How to translate this into pixels from Document space???
-//Maybe we need to pass a scaling factor in here from the caller? That would make sense, as
-//the caller knows about the zoom factor and all that good kinda crap
+//Maybe we need to pass a scaling factor in here from the caller? That would make
+//sense, as the caller knows about the zoom factor and all that good kinda crap
 /*
 Document passes in the correct Cartesian coordinates being pointed to by the mouse.
 So all we have to be concerned with is properly scaling our hot zones/handle sizes,
@@ -186,7 +201,16 @@ the radius will be 5.0. By multiplying the length by the zoom factor, we align o
 pointed at length with our on screen length.
 */
        if ((length * Painter::zoom) < 8.0)
+       {
                hitCenter = true;
+
+               // Make sure we don't try to snap to ourselves...!
+               if (!draggingCenter)
+               {
+                       snapPoint = position;
+                       snapPointIsValid = true;
+               }
+       }
 //wrong:       else if ((length < (radius + 2.0)) && (length > (radius - 2.0)))
 /*NB: The following should be identical to what we have down below, but it doesn't work out that way... :-P */
 //close, but no        else if (((length * Painter::zoom) < ((radius * Painter::zoom) + 2.0)) && ((length * Painter::zoom) > ((radius * Painter::zoom) - 2.0)))