X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Farc.cpp;h=e4a6b6f4788de7b89f1196fa75a8018217fad421;hb=c58b8a9f8b1ae5494857fc423ed8e33b2bbcf329;hp=ad08a572979dc651c6a13592a8126a3001b06d9b;hpb=eb711912d64f17cf9c18c74c4d78d9867bd066ad;p=architektonas diff --git a/src/arc.cpp b/src/arc.cpp index ad08a57..e4a6b6f 100644 --- a/src/arc.cpp +++ b/src/arc.cpp @@ -16,6 +16,7 @@ #include "arc.h" #include +#include "geometry.h" #include "mathconstants.h" #include "painter.h" @@ -71,7 +72,8 @@ Arc::~Arc() Vector oldLine = (p3 * (radius * 1.25)) + position; pen = QPen(QColor(0x80, 0x80, 0x80), 1.0, Qt::DashLine); painter->SetPen(pen); - painter->DrawLine((int)position.x, (int)position.y, (int)oldLine.x, (int)oldLine.y); +// painter->DrawLine((int)position.x, (int)position.y, (int)oldLine.x, (int)oldLine.y); + painter->DrawLine(position, oldLine); } // In rotating and setting the span, we draw a line showing where @@ -109,6 +111,7 @@ Arc::~Arc() text = text.arg(radius, 0, 'd', 4).arg(radius / oldRadius * 100.0, 0, 'd', 0); } +#if 0 pen = QPen(QColor(0x00, 0xFF, 0x00), 1.0, Qt::SolidLine); painter->SetPen(pen); painter->SetBrush(QBrush(QColor(0x40, 0xFF, 0x40, 0x9F))); @@ -120,6 +123,9 @@ Arc::~Arc() pen = QPen(QColor(0x00, 0x5F, 0xDF)); painter->SetPen(pen); painter->DrawText(textRect, Qt::AlignVCenter, text); +#else + painter->DrawInformativeText(text); +#endif } } @@ -146,53 +152,21 @@ Also: should put the snap logic into the Object base class (as a static method). /*virtual*/ bool Arc::Collided(Vector point) { - objectWasDragged = false; -// Vector v1 = point - position; // Head minus tail (vector points at "point") + // Someone told us to fuck off, so we'll fuck off. :-) + if (ignoreClicks) + return false; -#if 1 + objectWasDragged = false; bool hitSomething = HitTest(point); draggingCenter = hitCenter; draggingEdge = hitArc; draggingRotate = hitRotate; draggingSpan = hitSpan; -#else - // Check for collision with various things... - hitHandle1 = false; // Moving - hitHandle2 = false; // Rotation - hitHandle3 = false; // Setting span of the arc - hitHandle4 = false; // Resizing -/* -What we have: -the center of the arc -the starting angle -the span of the arc -The point on a unit circle given an angle a is x = cos(a), y = sin(a) -This vector is already unitized, so all we need to do to get our point is to multiply it by -radius (to get the length correct) and add it to the center point (to get the correct position). -*/ - Vector v1 = point - position; // Head minus tail (vector points at "point") - Point p1(cos(startAngle), sin(startAngle)); - Point p2(cos(startAngle + angleSpan), sin(startAngle + angleSpan)); - Vector handle2 = (p1 * radius) + position; - Vector handle3 = (p2 * radius) + position; - double pointerAngle = v1.Angle(); -#if 1 - // Center handle - if (v1.Magnitude() < 10.0) - hitHandle1 = true; - // Span handle - else if (Vector(handle3 - point).Magnitude() < 10.0) - hitHandle3 = true; - // Rotate handle - else if (Vector(handle2 - point).Magnitude() < 10.0) - hitHandle2 = true; - // Resize handle (the arc itself) - else if ((v1.Magnitude() < radius + 3.0) && (v1.Magnitude() > radius - 3.0) - && AngleInArcSpan(pointerAngle)) - hitHandle4 = true; -#endif -#endif + // Now that we've done our hit testing on the non-snapped point, snap it if + // necessary... + if (snapToGrid) + point = SnapPointToGrid(point); /* State Management: @@ -226,7 +200,6 @@ Selected| | | | so let's do like this: */ -// if (hitCenter || hitArc || hitRotate || hitSpan) if (hitSomething) { oldState = state; @@ -463,7 +436,7 @@ bool Arc::HitStateChanged(void) /*virtual*/ void Arc::Enumerate(FILE * file) { - fprintf(file, "ARC (%lf,%lf) %lf, %lf, %lf\n", position.x, position.y, radius, startAngle, angleSpan); + fprintf(file, "ARC %i (%lf,%lf) %lf, %lf, %lf\n", layer, position.x, position.y, radius, startAngle, angleSpan); } @@ -482,3 +455,45 @@ same reference number. return new Arc(position, radius, startAngle, angleSpan, parent); } + +/*virtual*/ void Arc::Rotate(Point point, double angle) +{ + Point c1 = Geometry::RotatePointAroundPoint(position, point, angle); + Point ap1(cos(startAngle), sin(startAngle)); + Point angleStartPoint = (ap1 * radius) + position; + Point c2 = Geometry::RotatePointAroundPoint(angleStartPoint, point, angle); + + position = c1; + startAngle = Vector(c2, c1).Angle(); +} + + +/*virtual*/ void Arc::Mirror(Point p1, Point p2) +{ + Point c1 = Geometry::MirrorPointAroundLine(position, p1, p2); + Point ap1(cos(startAngle + angleSpan), sin(startAngle + angleSpan)); + Point angleEndPoint = (ap1 * radius) + position; + Point c2 = Geometry::MirrorPointAroundLine(angleEndPoint, p1, p2); + + position = c1; + startAngle = Vector(c2, c1).Angle(); +} + + +/*virtual*/ void Arc::Save(void) +{ + Object::Save(); + oldRadius2 = radius; + oldStartAngle = startAngle; + oldAngleSpan = angleSpan; +} + + +/*virtual*/ void Arc::Restore(void) +{ + Object::Restore(); + radius = oldRadius2; + startAngle = oldStartAngle; + angleSpan = oldAngleSpan; +} +