Finding an angle with 3 CGPoints

前端 未结 5 1007
长情又很酷
长情又很酷 2021-01-03 14:27

In my application, a user taps 3 times and an angle will be created by the 3 points that were tapped. It draws the angle perfectly. I am trying to calculate the angle at the

相关标签:
5条回答
  • 2021-01-03 14:32

    Not sure if this is the main problem but it is a problem

    Your answer gives the angle at the wrong point:

    enter image description here

    To get the angle in green (which is probably angle you want based on your variable names "first", "second" and "third), use:

    CGFloat angle = acos(((a*a)+(c*c)-(b*b))/((2*(a)*(c))));

    0 讨论(0)
  • 2021-01-03 14:36

    The way I have done it is to calculate the two angles separately using atan2(y,x) then using this function.

    static inline double
    AngleDiff(const double Angle1, const double Angle2)
    {
        double diff = 0;
        diff = fabs(Angle1 - Angle2);
        if (diff > <Pi>) {
            diff = (<2Pi>) - diff;
        }
        return diff;
    }
    

    The function deals in radians, but you can change <Pi> to 180 and <2Pi> to 360

    0 讨论(0)
  • 2021-01-03 14:42

    Here's a way that circumvents the law of cosines and instead calculates the angles of the two vectors. The difference between the angles is the searched value:

    CGVector vec1 = { first.x - second.x, first.y - second.y };
    CGVector vec2 = { third.x - second.x, third.y - second.y };
    
    CGFloat theta1 = atan2f(vec1.dy, vec1.dx);
    CGFloat theta2 = atan2f(vec2.dy, vec2.dx);
    
    CGFloat angle = theta1 - theta2;
    NSLog(@"angle: %.1f°, ", angle / M_PI * 180);
    

    Note the atan2 function that takes the x and y components as separate arguments and thus avoids the 0/90/180/270° ambiguity.

    0 讨论(0)
  • 2021-01-03 14:45

    Using this answer to compute angle of the vector:

    CGFloat angleForVector(CGFloat dx, CGFloat dy) {
        return atan2(dx, -dy) * 180.0/M_PI;
    }
    
    // Compute angle at point Corner, that is between AC and BC:
    
    CGFloat angle = angleForVector(A.x - Corner.x, A.y - Corner.y)
                  - angleForVector(B.x - Corner.x, B.y - Corner.y);
    
    NSLog(@"FULL ANGLE IS: %f, ANGLE IS: %.2f",angle, angle);
    
    0 讨论(0)
  • 2021-01-03 14:47

    The cosine formula implementation looks right; did you take into account that acos() returns the angle in radians, not in degrees? In order to convert into degrees, multiply the angle by 180 and divide by Pi (3.14159...).

    0 讨论(0)
提交回复
热议问题