2014-09-14 5 views
0

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

Я пробовал много вещей, таких как QuadCurves2D, кривая Безье и т. Д., Но я не могу найти контрольную точку.

Идея заключается в том, чтобы нарисовать кривую линию между двумя точками, независимо друг от друга, где они находятся или под каким углом между ними (пользователь может изменить положение точек, нажав Alt и перетащить его на экране)

Это то, что Я до сих пор ... Wrong curve between two points

Как вы можете видеть выше, кривая абсолютно неверна.

Что я ожидаю что-то вроде этого:

Correct curve

+0

Две точки определяют только линию. Если вам нужна гладкая кривая, вам нужно больше двух точек, чтобы определить ее. – duskwuff

+0

@ duskwuff Я вижу ... Но то, что я пытаюсь понять, это именно то, что вы говорите.Я хочу найти контрольную точку между этими двумя точками, чтобы иметь изогнутую линию. –

+0

Вам нужно выбрать контрольную точку! Рассмотрим две линии, которые у вас есть между 0 и 5, - как ваша программа должна решить, какую из двух сделать? – duskwuff

ответ

1

Шаг один: ось выравнивать свои две точки так, что один из них находится на (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, которые мы теперь имеем в кубическую функцию рисования безье: сделано. Довольно кривые.

+0

Спасибо за ваш очень хорошо построенный ответ, Майк. Я собираюсь выполнить ваше предложение. Я скоро вернусь, чтобы проверить ваш ответ как правильный. –

Смежные вопросы