Essentially I’m trying to calculate the bisector line between two points. I’ve got two methods, one works the other doesn’t. I can’t quite figure out why the other one doesn’t work. The one that works is a little more computationally intensive and since this routine is run a lot, I’d like to use the simpler one… except it doesn’t work. I’m probably missing something simple but I find this amusing since I seem to have a better grasp of trig than I do of high school algebra.
Note: the function is passed the end points (endPoint1, endPoint2).
Here’s the one that works (using trig to calculate the bisector):
CGPoint midPoint = CGPointMake((endPoint1.x + endPoint2.x) / 2, (endPoint1.y + endPoint2.y) / 2);
//Normalize an end point
CGPoint nPoint = CGPointMake(endPoint1.x - endPoint2.x, endPoint1.y - endPoint2.y);
//Find theta and rotate 90°
CGFloat theta = atanf(nPoint.y / nPoint.x);
if (nPoint.x < 0.0f) theta += M_PI;
else if (nPoint.x > 0.0f && nPoint.y < 0.0f) theta += (M_PI * 2);
theta += M_PI_2;
//Calculate another point along new theta and de-normalize the point
CGPoint centerPoint = CGPointMake(cosf(theta) * 10, sinf(theta) * 10);
centerPoint.x += midPoint.x;
centerPoint.y += midPoint.y;
//Create the line definition
LineDef def = LineDefForPoints(midPoint, centerPoint);
Here’s the one that doesn’t, but I’d like it to:
CGPoint midPoint = CGPointMake((endPoint1.x + endPoint2.x) / 2, (endPoint1.y + endPoint2.y) / 2);
//Calculate the slope and invert
CGFloat m = (endPoint1.y - endPoint2.y) / (endPoint1.x - endPoint2.x);
//Take the negative reciprocal
m = -1/m;
//Calculate another point on the line
CGPoint centerPoint = CGPointMake(midPoint.x + 10, midPoint.y + (m * 10));
//Create the line definition
LineDef def = LineDefForPoints(midPoint, centerPoint);
So I’d swear this should work. The change in Y is equal to m times the change in x. I’ve calculated the mid point, figured out the slope of the perpendicular line and calculated another point on that line. However the line definitions created aren’t equivalent when given the same end points, so I’m missing something.
By the way, LindeDef is a simple struct with three CGFloat variables for the a, b & c components of a straight line. And creating a LineDef from two points is trivial (I happen to be using a block to do this):
LineDef (^LineDefForPoints)(CGPoint, CGPoint) = ^LineDef(CGPoint p1, CGPoint p2){
LineDef line = {0,0,0};
line.a = p2.y - p1.y;
line.b = p1.x - p2.x;
line.c = line.a*p1.x + line.b*p1.y;
return line;
};
Dammit, it was something simple. I reformatted my actual production code so I could put it on Stack Exchange and in the process edited out my mistake. The code I posted in the question actually works perfectly. Originally the line:
m = -1 / m;was folded into the original assignment like so:CGFloat m = -1 / (endPoint1.y - endPoint2.y) / (endPoint1.x - endPoint2.x);. Of course, now the problem is obvious…I forgot parenthesis. I separated the line into two in stack exchange so I could explain my ‘reasoning’ in the comments, hoping to find the problem.Sorry, for all the trouble.