Добър ден, harbachitatel.
Изявление на проблема
Има множество Y-Kow точки разположени равномерно върху ос X. на това е необходимо да се получи гладка графика, която преминава през всички дадени точки. Примерът по-долу:
Всички, които се интересуват, аз съм котка.
Има редица от стандартни решения за плавна крива през точките (в това отношение много интересни неща, написани на вече споменатата статия), като, например, сплайн интерполация. Когато третата Курсът е изобретен този алгоритъм, думата "интерполация" ме изпълва с ужас, и gugleniya при поискване "изглаждане графики" не даде резултати в рамките на правомощията на разбиране. Но след като аз имам да криви на Безие и много ми хареса. Чертае бърз алгоритъм е интуитивен ... Какво друго е необходимо за щастие. Е, по някакъв начин е започнало.
централната идея
Счупете идеята в три под-елемент, за да стане ясно и разбираемо.
Така се оказва, че проблемът се свежда до намиране на линията (B1 C1) и, всъщност, за подкрепа на точките B1 и C1. които след това ще се изгражда на Безие криви.
Търсене направо
Както е известно, линия на равнината, изразено от у = KX + б. където к - допирателна права ъгъл спрямо оста X. Когато открием к на. След това, знаейки, че линията минава през точка А и да знае своите координати, ние можем лесно да намерите б. б = YA -kXA. Така че всичко се свежда до намиране на коефициента.
Търсене фактор к
Кажа предварително, че к = TG (φ) = TG ((α-β) / 2) = (Sqrt ((ΔX 2 + (YA -YB) 2) * (ΔX 2 + (YA -YC) 2)) - Dx 2 - (YA -YB) * (YA -YC)) / (ΔX * ((Я -YB) - (Я -YC))). където ΔX - X разстояние между точките (не забравяйте, че ние сме равномерно разположени точки на X). По-долу е математически доказателства за верността на формулата, но ако не сте в настроение, може просто да го пропуснете.
Математически елиминиране коефициент к
(7) ∠DAC = ∠O2 CA = β - гъвкави вътрешни ъгли, образувани от две успоредни линии (AD) и (О2 С) и рязане (AC)
Под квадратните скоби се отнася до дължината на сегмента (не искам да използвам вертикални линии - Надявам се, че читателят ще ми прости)
И така, к сме намерили; б, ние също знаем (виж по-горе), което означава, директен, в които се намират на контролната точка, ние знаем.
Търсим отправни точки
Малко по математика, която докаже,
ние си спомняме от тригонометрията, че:
Ако приемем [АС1] равна на половината от височината на точките X между основната графиката (точки В и С. А. и т.н.), тогава:
За приятното!
изпълнение Пример за JSFiddle