Шаг один: ось выравнивать свои две точки так, что один из них находится на (0,0), а другой на ([.. .], 0). Скажем, у нас есть две точки,
P1 = {a,b)
P2 = {c,d}
мы переводим их так, что p1 на 0,0:
P1 = {0,0}
P2 = {c-a,d-b}
тогда поворачиваются p2 о (0,0), так что в конце концов, лежа на ось х:
a = -atan2(dy,dx) = atan2(d-b, c-a)
P2' = { p2.x * cos(a) - p2.y * sin(a), p2.x * sin(a) + p2.y * cos(a) }
примечание - перед atan2
вызова, потому что мы не хотим знать угол «от оси до точки», но от точки до оси х. Теперь у нас есть две выровненный по осям точек (назовём, что повернута х-координата для новой P2 «V»):
P1 = { 0 , 0 }
P2' = { v , 0 }
Теперь мы можем делать все, что мы хотим с точки зрения кривой строительства. Хотя обычно довольно уродливо, мы можем построить квадратичную кривую с контрольной точкой, которая находится на (v/2, ...)
и имеет высоту «независимо от того, насколько вы хотите, исходя из того, насколько сильна вы хотите, чтобы кривизна была. Это даст нам координату относительно преобразований-инвариантных координат , так что мы просто применить вращение/перевод в обратном направлении:
C = (v/2,h) -> rotate by -a -> translate by (a,b)
(обратите внимание, что - опять знак) мы уже знаем, где P1 и P2 были, поэтому нам не нужно делать какие-либо вычисления там кривые Безье.. определяются их «точками корпуса» и хорошо ведут себя в отношении линейных преобразований, поэтому весь этот бизнес трансляции/вращения не имеет никакого отношения к алгоритму, который рисует кривые. Просто подключите шесть значений к квадратичным функциям рисования и прео. от P1 до P2, контролируемого C.
Конечно, вы, вероятно, хотите кубическую кривую, а не потому, что квадратичные кривые довольно некрасиво, поэтому вместо того, чтобы определять C, мы можем определить C1 и C2:
C1 = (v/3, 0)
C2 = (2*v/3, 0)
, а затем поднять/опустить их обоих То же количество; то мы будем вращать и антипереводить их и подключать P1, C1, C2, P2, которые мы теперь имеем в кубическую функцию рисования безье: сделано. Довольно кривые.
Две точки определяют только линию. Если вам нужна гладкая кривая, вам нужно больше двух точек, чтобы определить ее. – duskwuff
@ duskwuff Я вижу ... Но то, что я пытаюсь понять, это именно то, что вы говорите.Я хочу найти контрольную точку между этими двумя точками, чтобы иметь изогнутую линию. –
Вам нужно выбрать контрольную точку! Рассмотрим две линии, которые у вас есть между 0 и 5, - как ваша программа должна решить, какую из двух сделать? – duskwuff