2012-02-17 1 views
0

Как сделать прямоугольник из 4 точек? Я создаю изменчивый прямоугольник по углам.Как сделать прямоугольник из 4 точек в какао? для resizable rect

я могу сделать это с двумя точками, как это:

NSMakeRect(MIN(point1.x, point3.x), 
         MIN(point1.y, point3.y), 
         fabs(point1.x - point3.x), 
         fabs(point1.y - point3.y)); 

Это хорошо работает, если я перееду 1 (слева внизу) или 3 (правый верхний) угол, но если 2 (слева вверху) или 4 (справа внизу) - нет. Как сделать это с помощью 4 NSPoints - углов?

+0

Вы хотите создать прямоугольник или многоугольник? – Tharabas

+0

@Tharabas Я хочу создать прямоугольник. –

ответ

1

Предыдущие ответы дали вам прямоугольниками, но говорят, что они не делают то, что вы хотите, но не то, почему они не правы ... Так У меня есть предположение, на всякий случай, я думаю, правильно:

Я предполагаю, что у вас есть прямоугольник, и вы хотите переместить один из его углов, как вы могли бы, когда перетаскиваете мышью в графической программе. Я также предполагаю, что на основе вашего примера кода стороны прямоугольника параллельны осям.

В этом сценарии точка, расположенная по диагонали напротив той, которую вы двигаете, является якорем - она ​​остается на месте. Очевидно, что вы двигаетесь, а остальные два двигаются, чтобы сохранить форму прямоугольной.

Если это так, вы вычисляете прямоугольник, основанный исключительно на точке, в которой вы двигаетесь, и ее диагонально противоположной точке. Код, который вы указываете в своем вопросе, обрабатывает случай, если точка 1 или точка3 перемещены. Вам просто нужно код для случая point2 или Point4 перемещается, которые вы получаете от простой замены:

NSMakeRect(MIN(point2.x, point4.x), 
        MIN(point2.y, point4.y), 
        fabs(point2.x - point4.x), 
        fabs(point2.y - point4.y)); 

Теперь просто нужно знать, чего вы переместили и выберите соответствующий код.

+0

Спасибо, это именно то, что мне нужно! –

0

Я не пишу Objective-C, так что это не гарантированно синтаксически правильно, и это зависит от 4-х точек, определяющих прямоугольник, а не какой-либо другой плоской фигуры:

NSMakeRect(MIN(point1.x, MIN(point2.x, MIN(point3.x, point4.x)))), 
      MIN(point1.y, MIN(point2.y, MIN(point3.y, point4.y)))), 
      MAX(point1.x, MAX(point2.x, MAX(point3.x, point4.x)))), 
      MAX(point1.y, MAX(point2.y, MAX(point3.y, point4.y))))) 

Я ожидаю, что мой скобки не совпадают.

+0

Спасибо за вашу помощь, но это не сработало. –

+0

Ну, я попытался опросить сам ответ, но, судя по всему, я не позволю. –

1

Чтобы построить прямоугольник, который включает в себя все ваши данных NSPoints - независимо от того, сколько - вы должны найти максимальные значения по минимум и .

// start by initializing their opposite MIN/MAX values 
CGFloat xmin = CGFLOAT_MAX, xmax = CGFLOAT_MIN, 
     ymin = CGFLOAT_MAX, ymax = CGFLOAT_MIN; 
NSUInteger pointCount = ? // you'd have to add this 
NSPoint points[pointCount] = { ... } // suppose you know your values :D 

for (NSUInteger i = 0; i < pointCount; i++) { 
    xmin = MIN(xmin, points[i].x); 
    xmax = MAX(xmax, points[i].x); 
    ymin = MIN(ymin, points[i].y); 
    ymax = MAX(ymax, points[i].y); 
} 

// now create a rect from those points 
NSRect rect = NSMakeRect(xmin, ymin, xmax - xmin, ymax - ymin); 
+0

hmm .. этот код делает правильный, но не тот, который мне нужен. Извините, мне сказали слишком мало, чтобы правильно понять, что мне нужно. Ваш пример рисует прямоугольник по максимальной точке. Мне нужно, чтобы он рисовал x, y. Я создаю resizable прямоугольник, поэтому, если я изменить размер точки он остается с другой точки. Спасибо за помощь, но, может быть, вы знаете, как это решить? Я обновил свой вопрос. –

0

Я думаю, что основная проблема для вас - это очки, проверьте их.

прямоугольник из 4-х точек можно рисовать, как это:

NSMakeRect(MIN(MIN(points[0].x, points[2].x), MIN(points[1].x, points[3].x)), 
      MIN(MIN(points[0].y, points[2].y), MIN(points[1].y, points[3].y)), 
      MAX(fabs((points[0].x - points[2].x)),fabs(points[1].x - points[3].x)), 
      MAX(fabs((points[0].y - points[2].y)), fabs((points[1].y - points[3].y))));