2013-06-24 204 views
2

我有一个CGPoint数组,并且希望根据离外部点最近的距离对它进行排序。我做了以下,但它返回不正确的结果。根据外部点对CGPoint数组进行排序

NSArray *sortedArray = [self.availableRenderPoints sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) 
{ 
    CGPoint p1 = [obj1 CGPointValue]; 
    CGPoint p2 = [obj2 CGPointValue]; 

    CGFloat distance1 = ccpDistance(startPoint, p1); 
    CGFloat distance2 = ccpDistance(startPoint, p2); 

    if (distance1 <= distance2) return p1.y < p2.y; 
    if (distance2 <= distance1) return p2.y < p1.y; 

    return p1.x < p2.x; 
}]; 

这怎么能根据距离startPoint最近的距离排序?

回答

5

它不应该只是

NSArray *sortedArray = [self.availableRenderPoints sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) 
{ 
    CGPoint p1 = [obj1 CGPointValue]; 
    CGPoint p2 = [obj2 CGPointValue]; 

    CGFloat distance1 = ccpDistance(startPoint, p1); 
    CGFloat distance2 = ccpDistance(startPoint, p2); 

    if (distance1 < distance2) return NSOrderedAscending; 
    if (distance2 < distance1) return NSOrderedDescending; 

    return NSOrderedSame; 
}]; 

+0

应该可能只是'<(不是'<=') – Wain

+0

@ Wain:是的,愚蠢的错误,更正了(谢谢!) –

0

马丁R的答案看起来不错,但使用ccpDistance意味着采取平方根,这是不必要的。您可以通过比较平方距离获得更好的性能:

NSArray *sortedArray = [self.availableRenderPoints sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) { 
    CGPoint p1 = [obj1 CGPointValue]; 
    CGPoint p2 = [obj2 CGPointValue]; 

    CGFloat squaredDistance1 = ccpLengthSQ(ccpSub(p1, startPoint)); 
    CGFloat squaredDistance2 = ccpLengthSQ(ccpSub(p2, startPoint)); 

    // Sort by nearness to startPoint. 
    // If equally near, sort by Y coordinate. 
    // If equal Y coordinate, sort by X coordinate. 
    return 
     distance1 < distance2 ? NSOrderedAscending 
     : distance2 > distance1 ? NSOrderedDescending 
     : p1.y < p2.y ? NSOrderedAscending 
     : p2.y < p1.y ? NSOrderedDescending 
     : p1.x < p2.x ? NSOrderedAscending 
     : p2.x < p1.x ? NSOrderedDescending 
     : NSOrderedSame; 
}]; 

在另一方面,如果你的阵列小或平方根是速度不够快,避免了平方根可能不会作出明显的区别。

相关问题