diff --git a/modules/juce_graphics/geometry/juce_Line.h b/modules/juce_graphics/geometry/juce_Line.h index a6dfadf378..3223f836fd 100644 --- a/modules/juce_graphics/geometry/juce_Line.h +++ b/modules/juce_graphics/geometry/juce_Line.h @@ -50,23 +50,20 @@ public: /** Creates a copy of another line. */ Line (const Line& other) noexcept - : start (other.start), - end (other.end) + : start (other.start), end (other.end) { } /** Creates a line based on the coordinates of its start and end points. */ Line (ValueType startX, ValueType startY, ValueType endX, ValueType endY) noexcept - : start (startX, startY), - end (endX, endY) + : start (startX, startY), end (endX, endY) { } /** Creates a line from its start and end points. */ - Line (const Point startPoint, - const Point endPoint) noexcept - : start (startPoint), - end (endPoint) + Line (Point startPoint, + Point endPoint) noexcept + : start (startPoint), end (endPoint) { } @@ -113,7 +110,7 @@ public: void setEnd (const Point newEnd) noexcept { end = newEnd; } /** Returns a line that is the same as this one, but with the start and end reversed, */ - const Line reversed() const noexcept { return Line (end, start); } + Line reversed() const noexcept { return Line (end, start); } /** Applies an affine transform to the line's start and end points. */ void applyTransform (const AffineTransform& transform) noexcept @@ -142,6 +139,17 @@ public: */ typename Point::FloatType getAngle() const noexcept { return start.getAngleToPoint (end); } + /** Creates a line from a start point, length and angle. + + This angle is the number of radians clockwise from the 12 o'clock direction, + where the line's start point is considered to be at the centre. + */ + static Line fromStartAndAngle (Point startPoint, ValueType length, ValueType angle) noexcept + { + return Line (startPoint, startPoint.getPointOnCircumference (length, angle)); + } + + //============================================================================== /** Casts this line to float coordinates. */ Line toFloat() const noexcept { return Line (start.toFloat(), end.toFloat()); } @@ -150,10 +158,10 @@ public: //============================================================================== /** Compares two lines. */ - bool operator== (const Line& other) const noexcept { return start == other.start && end == other.end; } + bool operator== (Line other) const noexcept { return start == other.start && end == other.end; } /** Compares two lines. */ - bool operator!= (const Line& other) const noexcept { return start != other.start || end != other.end; } + bool operator!= (Line other) const noexcept { return start != other.start || end != other.end; } //============================================================================== /** Finds the intersection between two lines. @@ -161,7 +169,7 @@ public: @param line the line to intersect with @returns the point at which the lines intersect, even if this lies beyond the end of the lines */ - Point getIntersection (const Line& line) const noexcept + Point getIntersection (Line line) const noexcept { Point p; findIntersection (start, end, line.start, line.end, p); @@ -180,13 +188,13 @@ public: don't intersect, the intersection coordinates returned will still be valid */ - bool intersects (const Line& line, Point& intersection) const noexcept + bool intersects (Line line, Point& intersection) const noexcept { return findIntersection (start, end, line.start, line.end, intersection); } /** Returns true if this line intersects another. */ - bool intersects (const Line& other) const noexcept + bool intersects (Line other) const noexcept { Point ignored; return findIntersection (start, end, other.start, other.end, ignored); @@ -257,7 +265,7 @@ public: @returns the point's distance from the line @see getPositionAlongLineOfNearestPoint */ - ValueType getDistanceFromPoint (const Point targetPoint, + ValueType getDistanceFromPoint (Point targetPoint, Point& pointOnLine) const noexcept { const Point delta (end - start); @@ -298,7 +306,7 @@ public: turn this number into a position, use getPointAlongLineProportionally(). @see getDistanceFromPoint, getPointAlongLineProportionally */ - ValueType findNearestProportionalPositionTo (const Point point) const noexcept + ValueType findNearestProportionalPositionTo (Point point) const noexcept { const Point delta (end - start); const double length = delta.x * delta.x + delta.y * delta.y; @@ -312,7 +320,7 @@ public: /** Finds the point on this line which is nearest to a given point. @see getDistanceFromPoint, findNearestProportionalPositionTo */ - Point findNearestPointTo (const Point point) const noexcept + Point findNearestPointTo (Point point) const noexcept { return getPointAlongLineProportionally (findNearestProportionalPositionTo (point)); } @@ -323,7 +331,7 @@ public: coordinate of this line at the given x (assuming the line extends infinitely in both directions). */ - bool isPointAbove (const Point point) const noexcept + bool isPointAbove (Point point) const noexcept { return start.x != end.x && point.y < ((end.y - start.y) @@ -380,19 +388,22 @@ private: intersection = p1.withX (p3.x + along * d2.x); return along >= 0 && along <= static_cast (1); } - else if (d2.y == 0 && d1.y != 0) + + if (d2.y == 0 && d1.y != 0) { const ValueType along = (p3.y - p1.y) / d1.y; intersection = p3.withX (p1.x + along * d1.x); return along >= 0 && along <= static_cast (1); } - else if (d1.x == 0 && d2.x != 0) + + if (d1.x == 0 && d2.x != 0) { const ValueType along = (p1.x - p3.x) / d2.x; intersection = p1.withY (p3.y + along * d2.y); return along >= 0 && along <= static_cast (1); } - else if (d2.x == 0 && d1.x != 0) + + if (d2.x == 0 && d1.x != 0) { const ValueType along = (p3.x - p1.x) / d1.x; intersection = p3.withY (p1.y + along * d1.y);