如果线与 CGRect 相交,则获取 CGPoint
Get CGPoint if line intersects CGRect
我有一项任务,其中有 Floormap 草图。有不同的产品架可供选择。
我需要绘制从用户位置到用户愿望清单产品架的路径。
目前,我可以画一条从源到目的地的线(用户位置到用户的愿望清单产品的货架)。但它只是一条直线,我需要画出准确的路径,如果线之间有任何架子,线不重叠。
这是我的代码:
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
为了更好地理解参考图片。
如果有人对此有想法,请用代码示例回答。
如果您不害怕使用开源代码,可以利用一个库来为您完成这项工作: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_MAX
和 NULL_POINT
),简单地将此函数提取并放入您自己的代码中,但更简单的方法是简单地编译 .c 文件以及项目的其余部分。
我有一项任务,其中有 Floormap 草图。有不同的产品架可供选择。 我需要绘制从用户位置到用户愿望清单产品架的路径。
目前,我可以画一条从源到目的地的线(用户位置到用户的愿望清单产品的货架)。但它只是一条直线,我需要画出准确的路径,如果线之间有任何架子,线不重叠。
这是我的代码:
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 为了更好地理解参考图片。
如果有人对此有想法,请用代码示例回答。
如果您不害怕使用开源代码,可以利用一个库来为您完成这项工作: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_MAX
和 NULL_POINT
),简单地将此函数提取并放入您自己的代码中,但更简单的方法是简单地编译 .c 文件以及项目的其余部分。