Учитывая линейную функцию f (x), как получить квадратичную контрольную точку Безье
Я провел много исследований по этой теме и нашел пару сообщений, которые были полезны, но я просто не могу получить это правильно.
Я разрабатываю очень простое приложение для структурного анализа. В этом приложении мне нужно отобразить график, показывающий внутреннее напряжение луча. График получается по формуле:
y = (100 * X / 2) * (L - X)
Где L
- известная длина луча (для простоты назовем ее 1). И X
- это значение между 0 и длиной луча be. Таким образом, окончательная формула будет быть:
y = (100 * X / 2) * (1 - x) where 0 < X < 1.
Предполагая, что мои начальная и конечная точки являются P0 = (0,0)
и P2 = (1,0)
. Как я могу получить P2
(контрольную точку)?? Я искал на странице Википедии, но я не уверен, как получить контрольную точку из квадратичной формулы кривой Безье:
B(t) = (1 - t)^2 * P0 + 2*(1 - t)*t * P1 + t^2 * P2
Я уверен, что это должно быть такая легкая проблема, чтобы исправить... может кто-нибудь помочь мне?
P.S.: Я также нашел это, Как найти математическую функцию, определяющую кривую Безье , которая, кажется, объясняет, как сделать обратное о том, чего я пытаюсь достичь. Я просто не могу понять, как это изменить.2 ответа:
Мы хотим, чтобы квадратичная кривая, определенная
y
, соответствовала квадратичной кривой Безье определяетсяB(t)
.Среди множества точек, которые должны совпадать, есть пик, который происходит в
x = 0.5
. Когдаx = 0.5
,Поэтому давайте договоримся дляy = (100 * x / 2) * (1 - x) 100 1 25 y = ---- * --- = ---- = 12.5 4 2 2
B(0.5) = (0.5, 12.5)
:B(t) = (1-t)^2*(0,0) + 2*(1-t)*t*(Px, Py) + t^2*(1,0) (0.5, 12.5) = B(0.5) = (0,0) + 2*(0.5)*(0.5)*(Px, Py) + (0.25)*(1,0) 0.5 = 0.5 * Px + 0.25 12.5 = 0.5 * Py
Решая для
Px
иPy
, получим(Px, Py) = (0.5, 25)
И вот визуальное подтверждение (в Python), что мы нашли правильную точку:
# test.py import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 1, 100) y = (100*x/2)*(1-x) t = np.linspace(0, 1, 100) P0 = np.array([0,0]) P1 = np.array([0.5,25]) P2 = np.array([1,0]) B = ((1-t)**2)[:,np.newaxis]*P0 + 2*((1-t)*t)[:,np.newaxis]*P1 + (t**2)[:,np.newaxis]*P2 plt.plot(x, y) plt.plot(B[:,0], B[:,1]) plt.show()
Запустив
python test.py
, мы видим, что две кривые перекрываются:
Как я узнал, что нужно выбрать
Ну, в основном это было основано на интуиции, но вот более формальный способ доказать это:t = 0.5
в качестве значения параметра, когдаB(t)
достигает своей максимальной высоты?Y-компонент
B'(t)
равен 0, КогдаB(t)
достигает своей максимальной высоты. Итак, взяв производную отB(t)
, мы видим0 = 2*(1-2t)*Py t = 0.5 or Py = 0
Если Py = 0, то B (t) - горизонтальная линия от (0,0) до (1,0). Отвергая этот вырожденный случай, мы видим, что
B(t)
достигает своей максимальной высоты, когдаt = 0.5
.
Ваша квадратичная формула кривой Безье имеет опечатку в среднем члене. Так и должно быть:
B(t) = (1 - t)^2 * P0 + 2 * (1 - t) * t * P1 + t^2 * P2
Это означает, что вы должны взятьP1=(1,50)
, который нашел @unutbu, и разделить координаты пополам, чтобы получитьP1=(.5,25)
. (Это не будет иметь значения, если вы строите параметрическое уравнение самостоятельно, но если вы хотите что-то вроде LaTeX\qbezier(0,0)(.5,25)(1,0)
, то вам понадобится скорректированная точка.)Управляющая точка
В ответ на ваш комментарий, если у вас есть квадратичнаяP1
определяется так, что касательные линии вP0
иP2
пересекаются вP1
. Какие средства что если(P1)x=(P2)x
, то график должен быть вертикальным с правой стороны (чего вы не хотите).y=f(x)
, то она симметрична относительно своей оси (почти тавтологически). Таким образом, максимум/минимум будет происходить в среднем по корням (а также в контрольной точке).