Как бы я мог получить самые низкие и самые высокие числа координат из точек соприкосновения?

#swift #xcode #uigesturerecognizer #cgrect

Вопрос:

Я хочу получить самые низкие и самые высокие координаты x и y из события touchesmoved, независимо от того, какая фигура нарисована. В принципе, я хочу создать cgrect, который охватывает форму. Я понятия не имею, как это сделать.

Ответ №1:

Для этого существуют различные способы.

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

Если вам нужно самостоятельно отслеживать границы, настройте некоторые переменные и отрегулируйте их по мере необходимости:

 var minY = CGFloat.greatestFiniteMagnitude
var maxY = -CGFloat.greatestFiniteMagnitude

var minX = CGFloat.greatestFiniteMagnitude
var maxX = -CGFloat.greatestFiniteMagnitude
 

По мере того как вы набираете баллы у своего пользователя, если x координата < minX указана , обновите minX ее . Если это так > maxX , обновите maxX . Сделайте то же minY самое для maxY и.

Как только у вас будут максимальные и минимальные значения x , и y будет тривиально преобразовать эти значения в ограничивающий прямоугольник. Некоторые примеры кода:

 extension CGRect {
    init(minX: CGFloat,
         minY: CGFloat,
         maxX: CGFloat,
         maxY: CGFloat) {
        self.init()
       origin = CGPoint(x: minX, y: minY)
       size = CGSize(width: maxX - minX, height: maxY - minY)
   }
}


let aMinX: CGFloat = CGFloat(Int.random(in: 0...50))
let aMinY: CGFloat = CGFloat(Int.random(in: 0...50))
let aMaxX: CGFloat = CGFloat(Int.random(in: 60...200))
let aMaxY: CGFloat = CGFloat(Int.random(in: 60...200))
let aRect: CGRect = CGRect(minX: aMinX,
                           minY: aMinY,
                           maxX: aMaxX,
                           maxY: aMaxY)
print(aRect)
 

Комментарии:

1. Спасибо за ответ, но что-то не так. Используя этот код в событии touchesmoved, я получаю большую разницу каждый раз, когда отслеживаю один и тот же путь. Я понимаю, что с помощью мыши я не собираюсь получать точные данные, но при 5-кратном прослеживании изображения получаются значительно разные размеры прямой кишки.(15,43,56,76) (28,9,32,55)(41,42,125,134)(5,4,10,71)(38,48,128,73) Мысли?

2. Я набрал этот код примерно за 5 минут. Это непроверено и предназначено только в качестве руководства по вашему подходу. (И я не предоставил код, который обнаруживает прикосновения, превышающие максимумы/минимумы.) Вам нужно будет протестировать и отладить его. Я бы предложил, чтобы ваша тестовая версия нарисовала полупрозрачный прямоугольник вокруг ограничивающего прямоугольника, который она создает, чтобы вы могли видеть, что она делает.

3. Похоже, я использовал неправильные константы для начальных значений. Вы должны использовать greatestFiniteMagnitude и -greatestFiniteMagnitude вместо этого. Я отредактирую свой ответ.

4. Хорошо, я нашел то, что мне было нужно, и спасибо за вашу помощь. В итоге я просто использовал path.bounds.size(ширина и высота).

5. Да, использование границ пути было моим первым предложением.