Как сделать прямоугольник из 4 точек в какао?для изменяемого размера прямоугольника - PullRequest
0 голосов
/ 17 февраля 2012

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

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

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 - углами?

Ответы [ 3 ]

1 голос
/ 18 февраля 2012

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

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

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

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

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

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

1 голос
/ 17 февраля 2012

Чтобы построить прямоугольник, включающий все заданные вами 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 голосов
/ 18 февраля 2012

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

Прямоугольник из 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))));
...