1

本质上,我正在尝试计算两点之间的平分线。我有两种方法,一种有效,另一种无效。我不太明白为什么另一个不起作用。有效的计算量更大一些,并且由于此例程运行很多,我想使用更简单的一个……除非它不起作用。我可能遗漏了一些简单的东西,但我觉得这很有趣,因为我似乎比高中代数掌握得更好。

注意:函数传递的是端点(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;
};
4

2 回答 2

0

该死,这很简单。我重新格式化了我的实际生产代码,这样我就可以把它放在 Stack Exchange 上,并在这个过程中编辑了我的错误。我在问题中发布的代码实际上运行良好。最初这行:m = -1 / m;被折叠到原来的分配中,如下所示:CGFloat m = -1 / (endPoint1.y - endPoint2.y) / (endPoint1.x - endPoint2.x);。当然,现在问题很明显......我忘记了括号。我在堆栈交换中将这条线分成两部分,这样我就可以在评论中解释我的“推理”,希望能找到问题所在。

对不起,所有的烦恼。

于 2012-04-19T16:52:10.513 回答
0

斜截形式对此很脆弱;使用向量。

〈V〉 = B - A

中点 = 〈V〉/2 + A

⟂〈V〉 = 〈V y , -V x〉</p>

于 2012-04-19T16:23:45.983 回答