2012-04-19 40 views
1

本质上,我试图计算两点之间的平分线。我有两种方法,一种是另一种不行。我无法弄清楚为什么另一个不工作。一个工作是计算密集一点,因为这个例程运行了很多,我想用更简单的一个...除非它不工作。我可能错过了一些简单的东西,但是我觉得这很有趣,因为我似乎比我高中代数的掌握更好。计算垂直于另一条线的中点的线

注意:函数传递结束点(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的变化等于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; 
}; 
+0

你能给我们两个defs吗?特别是,看看第二个LineDef是否是第一个LineDef的倍数。如果是这样,那么他们是同一条线,只是系数不同而已。 – 2012-04-19 16:21:34

+1

如果直接计算斜率,你会得到更好的结果:'CGFloat m =(endPoint2.x - endPoint1.x)/(endPoint1.y - endPoint2.y);'? – 2012-04-19 16:35:41

+0

@NoOneinParticular如果你确实需要它,我可以,但它们不是同一条线。我用wolfram-alpha对它们进行了绘图以确保(在几种情况下)。此外,由于我正在创建依赖于此的Core图形形状,因此我可以快速判断是否有错误。 – 2012-04-19 16:36:50

回答

0

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

对不起,所有的麻烦。

0

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

= B - 甲

中点= /2 + A

= ÿ,-V X>

相关问题