2013-03-26 31 views
0

我想蟒蛇算法(在这里:Extending a line segment to fit into a bounding box)转换到我的iPhone应用程序..但它只能当我startPoint.x>然后endPointx如何在一个矩形拟合线

是什么在这里改变? 我不明白它..

如果我画一条从左上角到右下角的线,它的工作原理!但是,如果我从右上角画一条线,则会失败。因此,它只能在一个方向。我想我必须要改变一些变量如果从右到左

MIN为(0,0)和MAX取决于设备,但对于iPhone的Retina(300568)

- (NSMutableArray *) extendAlgorithm:(CGPoint)start withEnd:(CGPoint)end withBorderMin:(CGPoint)min andBorderMax:(CGPoint)max { 

    int x1 = (int) start.x;  int y1 = (int) start.y; 
    int x2 = (int) end.x;  int y2 = (int) end.y; 
    int xmin = (int) min.x;  int ymin = (int) min.y; 
    int xmax = (int) max.x;  int ymax = (int) max.y; 

    if(y1 == y2) { 
     return [[NSMutableArray alloc] initWithObjects: 
       [NSNumber numberWithDouble:xmin], 
       [NSNumber numberWithDouble:y1], 
       [NSNumber numberWithDouble:xmax], 
       [NSNumber numberWithDouble:y1], 
       nil]; 
    } 

    if(x1 == x2) { 
     return [[NSMutableArray alloc] initWithObjects: 
       [NSNumber numberWithDouble:x1], 
       [NSNumber numberWithDouble:ymin], 
       [NSNumber numberWithDouble:x1], 
       [NSNumber numberWithDouble:ymax], 
       nil]; 
    } 

    double y_for_xmin = y1 + (y2 - y1) * (xmin - x1)/(x2 - x1); 
    double y_for_xmax = y1 + (y2 - y1) * (xmax - x1)/(x2 - x1); 

    double x_for_ymin = x1 + (x2 - x1) * (ymin - y1)/(y2 - y1); 
    double x_for_ymax = x1 + (x2 - x1) * (ymax - y1)/(y2 - y1); 

    if(ymin <= y_for_xmin <= ymax) { 

     if(xmin <= x_for_ymax <= xmax) { 
      return [[NSMutableArray alloc] initWithObjects: 
        [NSNumber numberWithDouble:xmin], 
        [NSNumber numberWithDouble:y_for_xmin], 
        [NSNumber numberWithDouble:x_for_ymax], 
        [NSNumber numberWithDouble:ymax], 
        nil]; 
     } 

     if(xmin <= x_for_ymin <= xmax) { 
      return [[NSMutableArray alloc] initWithObjects: 
        [NSNumber numberWithDouble:xmin], 
        [NSNumber numberWithDouble:y_for_xmin], 
        [NSNumber numberWithDouble:x_for_ymin], 
        [NSNumber numberWithDouble:ymin], 
        nil]; 
     } 
    } 

    if(ymin <= y_for_xmax <= ymax) { 

     if(xmin <= x_for_ymin <= xmax) { 
      return [[NSMutableArray alloc] initWithObjects: 
        [NSNumber numberWithDouble:x_for_ymin], 
        [NSNumber numberWithDouble:ymin], 
        [NSNumber numberWithDouble:xmax], 
        [NSNumber numberWithDouble:y_for_xmax], 
        nil]; 
     } 

     if(xmin <= x_for_ymax <= xmax) { 
      return [[NSMutableArray alloc] initWithObjects: 
        [NSNumber numberWithDouble:x_for_ymax], 
        [NSNumber numberWithDouble:ymax], 
        [NSNumber numberWithDouble:xmax], 
        [NSNumber numberWithDouble:y_for_xmax], 
        nil]; 
     } 
    } 

    return nil; 
} 
+0

会不会是你很难用调试器到达那里,或者在检查这些值时是否有任何问题? – 2013-03-26 17:38:23

+0

那么让我给你一个提示,你没有足够的条件来涵盖所有的情况。 – 2013-03-26 18:05:56

回答

1
​​

不会做你希望是什么(也许在Python,但绝对不是C),你必须写为

if (ymin <= y_for_xmin && y_for_xmin <= ymax) 

我不知道,如果你的算法涵盖所有​​情况,所以我试图独立地找到一个算法。这是我的了:

- (NSArray *) extendAlgorithm:(CGPoint)start withEnd:(CGPoint)end withBorderMin:(CGPoint)min andBorderMax:(CGPoint)max 
{ 
    CGFloat u1 = MAXFLOAT; 
    CGFloat u2 = -MAXFLOAT; 
    CGFloat tmp; 
    if (end.x != start.x) { 
     tmp = (max.x - start.x)/(end.x - start.x); 
     if (tmp > 0 && tmp < u1) 
      u1 = tmp; 
     else if (tmp < 0 && tmp > u2) 
      u2 = tmp; 
     tmp = (min.x - start.x)/(end.x - start.x); 
     if (tmp > 0 && tmp < u1) 
      u1 = tmp; 
     else if (tmp < 0 && tmp > u2) 
      u2 = tmp; 
    } 
    if (end.y != start.y) { 
     tmp = (max.y - start.y)/(end.y - start.y); 
     if (tmp > 0 && tmp < u1) 
      u1 = tmp; 
     else if (tmp < 0 && tmp > u2) 
      u2 = tmp; 
     tmp = (min.y - start.y)/(end.y - start.y); 
     if (tmp > 0 && tmp < u1) 
      u1 = tmp; 
     else if (tmp < 0 && tmp > u2) 
      u2 = tmp; 
    } 
    CGPoint newStart, newEnd; 
    newStart.x = start.x + u2 * (end.x - start.x); 
    newStart.y = start.y + u2 * (end.y - start.y); 
    newEnd.x = start.x + u1 * (end.x - start.x); 
    newEnd.y = start.y + u1 * (end.y - start.y); 
    NSLog(@"%@, %@", NSStringFromCGPoint(newStart), NSStringFromCGPoint(newEnd)); 

    return [[NSArray alloc] initWithObjects: 
      [NSNumber numberWithDouble:newStart.x], 
      [NSNumber numberWithDouble:newStart.y], 
      [NSNumber numberWithDouble:newEnd.x], 
      [NSNumber numberWithDouble:newEnd.y], 
      nil]; 
} 

(我们的想法是可考虑行

(x, y) = (start.x, start.y) + u * (end.x - start.x, end.y - start.y) 

,然后确定参数u1u2其中线越过边界。)

+0

我也尝试过,没有任何区别。 – 2013-03-26 19:28:32

+0

@ Christian'fuzi'Orgler:我试图找出一些东西,我希望那些作品。 – 2013-03-26 19:44:51

+0

@“Martin R”:它的工作非常完美。非常感谢! – 2013-03-26 23:18:18

0

我没有检查有关算法什么,但跳出的东西是这些行:

double y_for_xmin = y1 + (y2 - y1) * (xmin - x1)/(x2 - x1); 
// ... 

该表达的到底是一个整数除法(你施放XMIN,X1,X2等到整数)。这些将有整数结果,截断。所以如果你期待1/2 == 0.5这样的东西,那么你会在(int)0处感到惊讶。

尝试将堆栈变量声明为CGFloat,这就是它们在CGPoint结构中的样子。

+0

我试过用CGFloats,..没有其他结果,看看顶部:我编辑我的问题,因为一些行工作! – 2013-03-26 17:46:40