如果给出两个不同的CGPoints
,我怎样才能将它们变成CGRect
?
示例:
CGPoint p1 = CGPointMake(0,10);
CGPoint p2 = CGPointMake(10,0);
如何将其转换为CGRect
?
答案 0 :(得分:48)
这将占用两个任意点,并为您提供将它们作为对角的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值将始终是rect的原点(前两个参数)。 x值之间的差值的绝对值将是宽度,y值之间的差值的绝对值是高度。
答案 1 :(得分:9)
对Ken的答案略有修改。让CGGeometry为您“标准化”矩形。
CGRect rect = CGRectStandardize(CGRectMake(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y));
答案 2 :(得分:4)
假设p1是原点而另一个点是矩形的对角,你可以这样做:
CGRect rect = CGRectMake(p1.x, p1.y, fabs(p2.x-p1.x), fabs(p2.y-p1.y));
答案 3 :(得分: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;
}
答案 4 :(得分: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);
答案 5 :(得分:0)
快捷扩展名:
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))
}
}