如果线与CGRect相交,则获取CGPoint

时间:2017-11-01 12:35:16

标签: objective-c core-graphics

我有一个任务,它有Floormap草图。有不同的产品架可供选择。 我需要绘制从用户位置到用户愿望清单产品架的路径。

目前,我可以从源到目的地(用户位置到用户的愿望清单产品的机架)绘制线。但是它只是直线,我需要绘制精确的路径,就好如果线之间有任何架子,线不重叠。

path drawn from source to destination

这是我的代码:

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放在与机架相交的位置 为了更好地理解参考图像。

如果有人了解它,请回答代码示例。

1 个答案:

答案 0 :(得分:1)

如果您不担心使用开源代码,那么您可以利用这个库,这对您有用:MTGeometry

您要使用的功能是:

CGPoint CGLineIntersectsRectAtPoint(CGRect rect, CGLine line);

这实际上是一个C函数,如下所示:

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;
}

您可以通过一些小的修改(将C接口更改为Objective-C,定义MT_MAXNULL_POINT)简单地将此函数放入您自己的代码中,但更容易的事情要做的就是简单地将.c文件与项目的其余部分一起编译。