2017-11-01 9 views
0

하나의 작업이 있으며 Floormap 스케치가 있습니다. 유효한 다른 제품 선반이 있습니다. 사용자 위치에서 사용자의 Wishlist 제품 랙으로 경로를 그려야합니다.선이 CGRect와 교차하는 경우 CGPoint 가져 오기

현재 소스에서 목적지 (사용자 위치를 사용자의 위시리스트 제품 랙으로)에서 그릴 수 있습니다. 하지만 그 직선, 라인 사이에 랙이있는 것처럼 정확한 경로를 그릴 필요가 라인이 중복되지 않습니다. 라인이 더 나은 이해를 위해 이미지를 참조 랙 교차하는

for (int i = 0; i < arrAllRackPosition.count; i++) { 
    if ([self RectContainsLineRect:[arrAllRackPosition[i] CGRectValue] StartPoint:CGPointMake(X + HALF(width) + distance, Y) EndPoint:CGPointMake(destX, destY)]) { 

     //check rack point where line intersect 
     NSLog(@"Line start point : %@",NSStringFromCGPoint(CGPointMake(X + HALF(width) + distance, Y))); 
     NSLog(@"Line end point : %@",NSStringFromCGPoint(CGPointMake(destX, destY))); 
     NSLog(@"Path Intersect Rack : %@",NSStringFromCGRect([arrAllRackPosition[i] CGRectValue])); 
    } 
    else 
    { 
     NSLog(@"path not intersect"); 
    } 
} 

가 지금은 CGPoint를 얻을 필요가 :

path drawn from source to destination

여기 내 코드입니다.

누군가가 그것에 대해 생각해 본다면 코드 예제로 답하십시오. 사용하려는 MTGeometry

그리고 기능입니다 :

답변

1

오픈 소스 코드를 사용하여 두려워하지 않는 경우는, 당신이 활용할 수있는 라이브러리가 당신을 위해이 작업을 수행있다

CGPoint CGLineIntersectsRectAtPoint(CGRect rect, CGLine line) 
{ 
    CGLine top  = CGLineMake(CGPointMake(CGRectGetMinX(rect), CGRectGetMinY(rect)), CGPointMake(CGRectGetMaxX(rect), CGRectGetMinY(rect))); 
    CGLine right = CGLineMake(CGPointMake(CGRectGetMaxX(rect), CGRectGetMinY(rect)), CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect))); 
    CGLine bottom = CGLineMake(CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect)), CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect))); 
    CGLine left  = CGLineMake(CGPointMake(CGRectGetMinX(rect), CGRectGetMinY(rect)), CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect))); 

    // ensure the line extends beyond outside the rectangle 
    CGFloat topLeftToBottomRight = CGPointDistance(CGRectTopLeftPoint(rect), CGRectBottomRightPoint(rect)); 
    CGFloat bottomLeftToTopRight = CGPointDistance(CGRectBottomLeftPoint(rect), CGRectTopRightPoint(rect)); 
    CGFloat maxDimension = MT_MAX(topLeftToBottomRight, bottomLeftToTopRight); 
    CGFloat scaleFactor = maxDimension/MT_MIN(CGLineLength(line), maxDimension); 
    CGLine extendedLine = CGLineScale(line, scaleFactor + 3); 

    CGPoint points[4] = { CGLinesIntersectAtPoint(top, extendedLine), CGLinesIntersectAtPoint(right, extendedLine), CGLinesIntersectAtPoint(bottom, extendedLine), CGLinesIntersectAtPoint(left, extendedLine) }; 

    for (int i = 0; i < 4; i++) { 
     CGPoint p = points[i]; 
     if (!CGPointEqualToPoint(p, NULL_POINT)) { 
      return p; 
     } 
    } 

    return NULL_POINT; 
} 

할 수 있습니다 잠재적으로시 :

CGPoint CGLineIntersectsRectAtPoint(CGRect rect, CGLine line);

이 사실은 다음과 같습니다 C 함수입니다 이 함수를 약간의 수정 (C 인터페이스를 Objective-C로 변경, MT_MAXNULL_POINT으로 변경)을 사용하여 자신의 코드에이 함수를 집어 넣기 만하면됩니다. 더 쉬운 일은 .c 파일을 .c 파일과 함께 컴파일하는 것입니다. 나머지 프로젝트.

+0

감사합니다. @Michael Dautermann 정말 도움이됩니다. 내 시간을 절약 할 수 있습니다. :) –