Как быстро найти точку пересечения (CGPoint) между QuadCurve и Line UIBezierPaths?

У меня есть QuadCurve и Line, нарисованные с использованием UIBezierPath в моем пользовательском классе просмотра. Как я могу получить их точку пересечения как CGPoint?

Пути Безье

Для QuadCurve:

let path = UIBezierPath()
path.lineWidth = 3.0
path.move(to: CGPoint(x: 0, y: self.frame.size.height))
path.addQuadCurve(to: CGPoint(x: self.frame.size.width, y: 0), controlPoint: CGPoint(x: self.frame.size.width-self.frame.size.width/3, y: self.frame.size.height))

Для линии:

let path2 = UIBezierPath()
path2.lineWidth = 3.0
path2.move(to: CGPoint(x: 250, y: 0))
path2.addLine(to: CGPoint(x: 250, y: self.frame.size.height))

person bijesh    schedule 21.12.2018    source источник
comment
проверьте этот stackoverflow. com/questions/6279999/   -  person canister_exister    schedule 21.12.2018
comment
@canister_exister, спасибо за ваш комментарий, но мое требование кривое. Я пытался сделать то же самое с дугой, но я не получаю ожидаемого результата.   -  person bijesh    schedule 24.12.2018


Ответы (1)


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

P(t) = P0*(1-t)^2 + 2*P1*(1-t)*t + P2*t^2 = 
       t^2 * (P0 - 2*P1 + P2) + t * (-2*P0 + 2*P1)  + P0

где P0, P1, P2 — начальная, контрольная и конечная точки.

Значит надо решить квадратное уравнение

t^2 * (P0.X - 2*P1.X + P2.X) + t * (-2*P0.X + 2*P1.X)  + (P0.X - LineX) = 0

для неизвестного t получить корень в диапазоне 0..1 и применить значение t к аналогичному выражению для координаты Y

Y = P0.Y*(1-t)^2 + 2*P1.Y*(1-t)*t + P2.Y*t^2

Для произвольной линии составьте систему уравнений для параметрического представления линии и кривой и решите эту систему

person MBo    schedule 24.12.2018