Найдите точку CGPoint на прямоугольнике UIView, пересеченном прямой линией под заданным углом от центральной точки

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

Скажем, я знаю центральную точку, размер прямоугольника и угол (начиная с 0 градусов для востока и идя против часовой стрелки через 90 для севера и 180 для запада и 270 для юга и снова до 360 градусов для востока). Мне нужно знать координаты точки пересечения.

Несколько запутанный (для меня) математический, но предположительно точный ответ на Поиск точек на прямоугольнике под заданным углом заставил меня попробовать следующий код, но он не работает должным образом. Этот вопрос похож на тот, но я ищу исправленный метод Objective-C / iOS, а не общий математический ответ.

Я думаю, что часть проблемы кода связана с использованием единственного ввода угла от 0 до 360 градусов (в радианах без возможности получения отрицательного числа), но, вероятно, будут и другие проблемы. В приведенном ниже коде в основном используются обозначения, определенные в ответе belisarius , включая мою попытку вычислить точки пересечения для каждой из четырех определенных там областей.

Этот код находится в моем подклассе UIImageView:

- (CGPoint) startingPointGivenAngleInDegrees:(double)angle {
    double angleInRads = angle/180.0*M_PI;
    float height = self.frame.size.height;
    float width = self.frame.size.width;
    float x0 = self.center.x;
    float y0 = self.center.y;
    // region 1 
    if (angleInRads >= -atan2(height, width) && angleInRads <= atan2(height, width)) {
        return CGPointMake(x0 + width/2, y0 + width/2 * tan(angleInRads));
    }
    // region 2
    if (angleInRads >= atan2(height, width) && angleInRads <= M_PI - atan2(height, width)) {
        return CGPointMake(x0 + height / (2*tan(angleInRads)),y0+height/2);
    }
    // region 3
    if (angleInRads >= M_PI - atan2(height, width) && angleInRads <= M_PI + atan2(height, width)) {
        return CGPointMake(x0 - width/2, y0 + width/2 * tan(angleInRads));
    }
    // region 4
    return CGPointMake(x0 + height / (2*tan(angleInRads)),y0-height/2);    
}

10
задан Community 23 May 2017 в 12:23
поделиться