本质上,我正在尝试计算两点之间的平分线。我有两种方法,一种有效,另一种无效。我不太明白为什么另一个不起作用。有效的计算量更大一些,并且由于此例程运行很多,我想使用更简单的一个……除非它不起作用。我可能遗漏了一些简单的东西,但我觉得这很有趣,因为我似乎比高中代数掌握得更好。
注意:函数传递的是端点(endPoint1,endPoint2)。这是一个有效的方法(使用 trig 计算平分线):
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);
这是没有的,但我希望它:
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);
所以我发誓这应该有效。Y 的变化等于 x 的变化的 m 倍。我计算了中点,计算出垂直线的斜率并计算了该线上的另一个点。但是,当给定相同的端点时,创建的线定义并不等效,所以我遗漏了一些东西。
顺便说一下,LindeDef 是一个简单的结构体,其中包含三个 CGFloat 变量,用于直线的 a、b 和 c 分量。从两点创建 LineDef 是微不足道的(我碰巧正在使用块来执行此操作):
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;
};