23

我怎么能,给定两个不同CGPoints的,把它们变成一个CGRect

例子:

CGPoint p1 = CGPointMake(0,10);
CGPoint p2 = CGPointMake(10,0);

我怎样才能把它变成一个CGRect

4

7 回答 7

52

这将采用两个任意点,并为您提供将它们作为对角的 CGRect。

CGRect r = CGRectMake(MIN(p1.x, p2.x), 
                      MIN(p1.y, p2.y), 
                      fabs(p1.x - p2.x), 
                      fabs(p1.y - p2.y));

与较小 y 值配对的较小 x 值将始终是矩形的原点(前两个参数)。x 值之间的差异的绝对值将是宽度,y 值之间的差异是高度。

于 2011-11-11T22:48:29.017 回答
10

对肯的回答稍作修改。让 CGGeometry 为您“标准化”矩形。

CGRect rect = CGRectStandardize(CGRectMake(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y));

于 2012-11-08T22:15:51.227 回答
5

快速扩展:

extension CGRect {
    init(p1: CGPoint, p2: CGPoint) {
        self.init(x: min(p1.x, p2.x),
                  y: min(p1.y, p2.y),
                  width: abs(p1.x - p2.x),
                  height: abs(p1.y - p2.y))
    }
}
于 2019-04-08T15:03:52.350 回答
4

假设 p1 是原点,另一点是矩形的对角,您可以这样做:

CGRect rect = CGRectMake(p1.x, p1.y,  fabs(p2.x-p1.x), fabs(p2.y-p1.y));
于 2011-11-11T22:46:32.910 回答
4

此函数接受任意数量的 CGPoints 并返回最小的 CGRect。

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;
}
于 2012-12-12T13:30:06.107 回答
1

如果两个点在一条线上,这将返回一个宽度或高度为 0 的矩形

float x,y,h,w;
if (p1.x > p2.x) {
    x = p2.x;
    w = p1.x-p2.x;
} else {
    x = p1.x;
    w = p2.x-p1.x;
}
if (p1.y > p2.y) {
    y = p2.y;
    h = p1.y-p2.y;
} else {
    y = p1.y;
    h = p2.y-p1.y;
}

CGRect newRect = CGRectMake(x,y,w,h);
于 2011-11-11T22:48:10.623 回答
0
let r0 = CGRect(origin: p0, size: .zero)
let r1 = CGRect(origin: p1, size: .zero)
let rect = r0.union(r1).standardized
于 2021-11-18T17:21:43.927 回答