CGRect的多个CGPoints

时间:2012-01-09 21:02:17

标签: iphone objective-c cocoa-touch cocoa

我有一组CGPoint s代表一个有点像倒置'T'形状的形状,现在我想将这些点转换成适合形状的CGRect ,所以要创建一个CGRect,其中包含整个形状,我只需循环,并计算出左上角最低xy以及最高x和{{y 1}}对于右下角这是伟大的但是在图像外面留下白色区域,我怎么能找出没有白色区域的最大矩形,所以最终的形状更像是'|'形状?到目前为止我的代码:

CGPoint topLeft = CGPointZero;
CGPoint bottomRight = CGPointZero;
for( NSValue *value in points ) {
    CGPoint point = [value CGPointValue];
    if( topLeft.x == 0 || topLeft.x > point.x ) shapeRect.x = point.x;
    if( topLeft.y == 0 || topLeft.y > point.y ) shapeRect.y = point.y;
    if( bottomRight.x < point.x ) bottomRight.x = point.x;
    if( bottomRight.y < point.y ) bottomRight.y = point.y;
}
CGRect shapeRect = CGRectMake(topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y);
编辑:我画了一些照片来展示我想要实现的目标。灰色区域显示CGRect

这是图像形状,我有形状中每个点的坐标:

Image Hosted by ImageShack.us http://img684.imageshack.us/img684/121/crop1.png

以上是我上面的代码产生的内容:

Image Hosted by ImageShack.us http://img26.imageshack.us/img26/2521/crop2j.png

这就是我想要实现的目标:

Image Hosted by ImageShack.us http://img689.imageshack.us/img689/5499/crop3.png

5 个答案:

答案 0 :(得分:5)

很难掌握你实际要问的内容。关于标题,此函数将为任意数量的CGPoints创建最小的rect。

CGRect CGRectSmallestWithCGPoints(CGPoint pointsArray[], int numberOfPoints)
{
    CGFloat greatestXValue = pointsArray[0].x;
    CGFloat greatestYValue = pointsArray[0].y;
    CGFloat smallestXValue = pointsArray[0].x;
    CGFloat smallestYValue = pointsArray[0].y;

    for(int i = 1; i < numberOfPoints; i++)
    {
        CGPoint point = pointsArray[i];
        greatestXValue = MAX(greatestXValue, point.x);
        greatestYValue = MAX(greatestYValue, point.y);
        smallestXValue = MIN(smallestXValue, point.x);
        smallestYValue = MIN(smallestYValue, point.y);
    }

    CGRect rect;
    rect.origin = CGPointMake(smallestXValue, smallestYValue);
    rect.size.width = greatestXValue - smallestXValue;
    rect.size.height = greatestYValue - smallestYValue;

    return rect;
}

可以像这样使用

CGPoint poinstArray[] = {topLeft, bottomRight};
CGRect smallestRect = CGRectSmallestWithCGPoints(poinstArray, 2);

答案 1 :(得分:2)

如果我没有误解这个问题,你的目的是找到蓝点:
enter image description here

如果我是正确的,那么你就可以存储两个点(比如topLtopR)和一个值(比如bottom)。

enter image description here

迭代:

  • 检查当前点是否有y < topL.y并最终更新topLtopR
    • 而是y == topL.y检查当前x是否小于topL.x。如果是,请更新topL
    • 否则检查当前x>topR.x;如果是,请更新topR
  • 检查当前是否y>bottom。如果是,则更新bottom

请注意,当我说“更新topL”时,我指的是xy

最后,您可以使用x坐标topLtopR并将y坐标设置为底部来获取左下和右下点。

答案 2 :(得分:2)

如果需要,可以使用Core Graphics:

let path = CGMutablePath()
path.addLines(between: [p1, p2, p3, p4])
return path.boundingBoxOfPath

答案 3 :(得分:1)

希望你只是谈论这一个形状,总是以这种方式定向,否则这将成为一个棘手的计算几何问题(类似于凹多边形中最大的封闭矩形)。

根据您的积分列表,以下内容应该有效:

  1. 一个。找到具有最大 y 值的点 湾找到具有相同大 y 值的另一个点 C。比较这两个的 x 值并确定哪个是最左边的。

  2. 查找所有积分的最小 y 值。

  3. 创建两个新点,每个点的 x 值等于您在步骤1中找到的一个点,并且在步骤中找到 y 值2。

  4. 步骤1中的两个点是左上角和右上角,步骤3中创建的两个点是左下角和右下角。您现在可以构建最终的矩形。

答案 4 :(得分:1)

斯威夫特版的hfossli(效果很好!):

func pointToRect(pointsArray: [CGPoint]) -> CGRect {
    var greatestXValue = pointsArray[0].x
    var greatestYValue = pointsArray[0].y
    var smallestXValue = pointsArray[0].x
    var smallestYValue = pointsArray[0].y
    for point in pointsArray {
        greatestXValue = max(greatestXValue, point.x);
        greatestYValue = max(greatestYValue, point.y);
        smallestXValue = min(smallestXValue, point.x);
        smallestYValue = min(smallestYValue, point.y);
    }
    let origin = CGPoint(x: smallestXValue, y: smallestYValue)
    let size = CGSize(width: greatestXValue - smallestXValue, height: greatestYValue - smallestYValue)
    return CGRect(origin: origin, size: size)
}