diff --git a/modules/core/doc/drawing_functions.rst b/modules/core/doc/drawing_functions.rst index f06d0fa601..10e4af59e7 100644 --- a/modules/core/doc/drawing_functions.rst +++ b/modules/core/doc/drawing_functions.rst @@ -371,6 +371,36 @@ Draws a line segment connecting two points. The function ``line`` draws the line segment between ``pt1`` and ``pt2`` points in the image. The line is clipped by the image boundaries. For non-antialiased lines with integer coordinates, the 8-connected or 4-connected Bresenham algorithm is used. Thick lines are drawn with rounding endings. Antialiased lines are drawn using Gaussian filtering. To specify the line color, you may use the macro ``CV_RGB(r, g, b)`` . +arrowedLine +---------------- +Draws a arrow segment pointing from the first point to the second one. + +.. ocv:function:: void arrowedLine(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0, double tipLength=0.1) + + :param img: Image. + + :param pt1: The point the arrow starts from. + + :param pt2: The point the arrow points to. + + :param color: Line color. + + :param thickness: Line thickness. + + :param lineType: Type of the line: + + * **8** (or omitted) - 8-connected line. + + * **4** - 4-connected line. + + * **CV_AA** - antialiased line. + + :param shift: Number of fractional bits in the point coordinates. + + :param tipLength: The length of the arrow tip in relation to the arrow length + +The function ``arrowedLine`` draws an arrow between ``pt1`` and ``pt2`` points in the image. See also :ocv:func:`line`. + LineIterator ------------ diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index 5667e9e50f..e2fecfd2f8 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -2590,6 +2590,10 @@ CV_EXPORTS_AS(randShuffle) void randShuffle_(InputOutputArray dst, double iterFa CV_EXPORTS_W void line(CV_IN_OUT Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0); +//! draws an arrow from pt1 to pt2 in the image +CV_EXPORTS_W void arrowedLine(CV_IN_OUT Mat& img, Point pt1, Point pt2, const Scalar& color, + int thickness=1, int line_type=8, int shift=0, double tipLength=0.1); + //! draws the rectangle outline or a solid rectangle with the opposite corners pt1 and pt2 in the image CV_EXPORTS_W void rectangle(CV_IN_OUT Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, diff --git a/modules/core/src/drawing.cpp b/modules/core/src/drawing.cpp index 144fa964fd..eac12e74e8 100644 --- a/modules/core/src/drawing.cpp +++ b/modules/core/src/drawing.cpp @@ -1580,6 +1580,25 @@ void line( Mat& img, Point pt1, Point pt2, const Scalar& color, ThickLine( img, pt1, pt2, buf, thickness, line_type, 3, shift ); } +void arrowedLine(Mat& img, Point pt1, Point pt2, const Scalar& color, + int thickness, int line_type, int shift, double tipLength) +{ + const double tipSize = norm(pt1-pt2)*tipLength;// Factor to normalize the size of the tip depending on the length of the arrow + + line(img, pt1, pt2, color, thickness, line_type, shift); + + const double angle = atan2( (double) pt1.y - pt2.y, (double) pt1.x - pt2.x ); + + Point p(cvRound(pt2.x + tipSize * cos(angle + CV_PI / 4)), + cvRound(pt2.y + tipSize * sin(angle + CV_PI / 4))); + line(img, p, pt2, color, thickness, line_type, shift); + + p.x = cvRound(pt2.x + tipSize * cos(angle - CV_PI / 4)); + p.y = cvRound(pt2.y + tipSize * sin(angle - CV_PI / 4)); + line(img, p, pt2, color, thickness, line_type, shift); + +} + void rectangle( Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness, int lineType, int shift )