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
------------
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,
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 )