Inner product(the angle between the two lines) - function source code

If there are 3 point(c, p1, p2), as shown in the above figure.
This function got the angle between the two lines using inner product.
Even if the name changed from (p1, p2) to (p2, p1),  the function get the narrow angle between the two lines.

I hope this code useful to you.
thank you.

float innerAngle(float px1, float py1, float px2, float py2, float cx1, float cy1)

 float dist1 = sqrt(  (px1-cx1)*(px1-cx1) + (py1-cy1)*(py1-cy1) );
 float dist2 = sqrt(  (px2-cx1)*(px2-cx1) + (py2-cy1)*(py2-cy1) );

 float Ax, Ay;
 float Bx, By;
 float Cx, Cy;

 //find closest point to C
 //printf("dist = %lf %lf\n", dist1, dist2);

 Cx = cx1;
 Cy = cy1;
 if(dist1 < dist2)
  Bx = px1;
  By = py1;  
  Ax = px2;
  Ay = py2;

  Bx = px2;
  By = py2;
  Ax = px1;
  Ay = py1;

 float Q1 = Cx - Ax;
 float Q2 = Cy - Ay;
 float P1 = Bx - Ax;
 float P2 = By - Ay;  

 float A = acos( (P1*Q1 + P2*Q2) / ( sqrt(P1*P1+P2*P2) * sqrt(Q1*Q1+Q2*Q2) ) );

 A = A*180/PI;

 return A;


  1. Anonymous27/5/13 07:50

    hi jeong hyun,

    thanks a lot for your code. are you sure it is correct though? i could not get the right angles for my points until i changed the definition of P1 and P2. maybe it was my mistake though.


  2. em.. could you give me your example point?
    then I will check my code again.
    Thank you for visiting my blog.

  3. The code is not correct I think...

    Points (50,80), (30,60) and (50,60) always give 45 instead of 90. To fix it you have to replace the part with the distances (the if) by:
    Bx = px1; By = py1;
    Ax = px2; Ay = py2;

    Thanks for the rest of the code. :)


Post a Comment

Popular posts from this blog

(OpenCV Study) Background subtractor MOG, MOG2, GMG example source code (BackgroundSubtractorMOG, BackgroundSubtractorMOG2, BackgroundSubtractorGMG)

OpenCV Stitching example (Stitcher class, Panorama)

Example source code of extract HOG feature from images, save descriptor values to xml file, using opencv (using HOGDescriptor )

Real-time N camera stitching Class.

Optical Flow sample source code using OpenCV

OpenCV Drawing Example, (line, circle, rectangle, ellipse, polyline, fillConvexPoly, putText, drawContours)

Video Stabilization example source code, (using cvFindHomography, cvWarpPerspective functions in openCV)

SICK LMS511 sensor data acquisition interface (source code, C++/MFC)

8 point algorithm (Matlab source code) / The method to get the Fundamental Matrix and the Essential matrix

Image warping (using opencv findHomography, warpPerspective)