本质上,我正在尝试计算两点之间的平分线。我有两种方法,一种有效,另一种无效。我不太明白为什么另一个不起作用。行之有效的方法需要更多的计算,并且由于此例程运行了很多次,所以我想使用更简单的方法……但它不起作用。我可能遗漏了一些简单的东西,但我觉得这很有趣,因为我似乎对三角学的掌握比对高中代数的掌握要好。
注意:函数传递的是端点(endPoint1,endPoint2)。 这是有效的方法(使用三角函数计算平分线):
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 的变化等于 m 乘以 x 的变化。我计算了中点,计算出垂直线的斜率并计算了该线上的另一个点。但是,当给定相同的端点时,创建的线定义并不相同,所以我遗漏了一些东西。
顺便说一句,LindeDef 是一个简单的结构,具有三个 CGFloat 变量,用于直线的 a、b 和 c 分量。从两点创建一个 LineDef 是微不足道的(我碰巧用一个 block 来做这个):
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;
};
最佳答案
坡截距形式对此很脆弱;使用载体。
〈V〉 = B - A
midpoint = 〈V〉/2 + A
⟂〈V〉 = 〈Vy, -Vx〉
关于objective-c - 计算垂直于另一条线的中点的线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232341/