Vue рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди

рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!

рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рд░рд┐рдПрдХреНрдЯ-рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рдПрдХреНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ред

рд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИ!

рдпрджрд┐ рдЖрдк рднреА рд╣рд░ рдЬрдЧрд╣ рд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдПрдВред рд╡рд╣рд╛рдВ рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд┐рджреНрдзрд╛рдВрдд рдорд┐рд▓реЗрдВрдЧреЗ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛, рдФрд░ рдШрдЯрдХреЛрдВ рдФрд░ рд░рдЪрдирд╛-рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реАрдпреВ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ред


рдЯреАрдПрд▓, рдбреЙ


рдЬреЗрдПрд╕ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛: https://playcode.io/590645/ ред

рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдкреЙрдкрдореЛрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рд▓реЗрдВ ред

рдЖрдкрдХреЛ рдЕрдкрдиреЗ Vue рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ - рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рдкреЙрдкрдореЛрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓реЗрдВ рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд▓рд┐рдЦреЗрдВред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣реИрдВ?


рд╡реЗрдм рдкрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реАрдПрд╕рдПрд╕ рдПрдирд┐рдореЗрд╢рди рд╕рдордп-рд╕рдордп рдкрд░ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рдзрд┐ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рд╕реНрдкреНрд░рд┐рдВрдЧ рднреМрддрд┐рдХреАред

рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреЗ рднреМрддрд┐рдХ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рд╡рд╕рдВрдд рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди, рд╡рд╕рдВрдд рдХреА рд▓реЛрдЪ рдХрд╛ рдЧреБрдгрд╛рдВрдХ, рдордзреНрдпрдо рдХреЗ рдШрд░реНрд╖рдг рдХрд╛ рдЧреБрдгрд╛рдВрдХред рддрдм рд╣рдо рд╡рд╕рдВрдд рдХреЛ рдЙрд╕ рджреВрд░реА рддрдХ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЪреЗрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред

рдлреНрд░рдВрдЯ-рдПрдВрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ, рдореБрдЭреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╛рдпрджреЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:

1. рдЖрдк рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрдиреАрдореЗрд╢рди рдЧрддрд┐ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рд╕рд╛рдЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдЖрдкрдХреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рд╕реЗ рд╕реНрд╡рд╛рдЗрдк рдХрд░рддреА рд╣реИрдВ рдпрд╛ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдШрд╕реАрдЯрддреА рд╣реИрдВ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдирд┐рдореЗрд╢рди рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рджрд┐рдЦреЗрдВрдЧреЗ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рд╛рдЗрдк рд╕реНрдкреАрдб рдпрд╛ рдорд╛рдЙрд╕ рд╕реНрдкреАрдб рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред


рд╕реАрдПрд╕рдПрд╕ рдПрдиреАрдореЗрд╢рди рдЬреЛ рдорд╛рдЙрд╕ рдХреА рдЧрддрд┐ рдХреЛ рдмрдирд╛рдП рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ


рд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдиреАрдореЗрд╢рди, рдЬрд┐рд╕рдореЗрдВ рдорд╛рдЙрд╕ рдХреА рдЧрддрд┐ рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ

2 рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЖрдк рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк CSS рдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ - рдЬрдм рдЖрдк рдХрд░реНрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдиреАрдореЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ рдЭрдЯрдХреЗ рд▓рдЧ рд░рд╣реЗ рд╣реИрдВред

рд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ - рдпрджрд┐ рдЖрдкрдХреЛ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд╕рдВрдд рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдЗрдВрдбреЗрдВрдЯ рдореЗрдВ рдЦрд┐рдВрдЪрд╛рд╡ рдпрд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рддреЗ рд╣реИрдВред


рдПрдХ рддрддреНрд╡ рдХреЛ рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг; рд╢реАрд░реНрд╖ - рд╕реАрдПрд╕рдПрд╕ рдПрдиреАрдореЗрд╢рди, рдиреАрдЪреЗ - рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди

рд╡рд╕рдВрдд рднреМрддрд┐рдХреА


рдПрдХ рд▓реЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕рдВрдд рд▓реЗрдВред рд╡рд╣ рдЕрдм рднреА рдЖрд░рд╛рдо рдХрд░ рд░рд╣реА рд╣реИред

рдЙрд╕реЗ рдереЛрдбрд╝рд╛ рдиреАрдЪреЗ рдЦреАрдВрдЪреЛред рдПрдХ рд▓реЛрдЪрджрд╛рд░ рдмрд▓ (FтЖТ=тИТk╬ФXтЖТ), рдЬреЛ рд╡рд╕рдВрдд рдХреЛ рдЙрд╕рдХреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЬрдм рд╣рдо рд╡рд╕рдВрдд рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╛рдЗрдирд╕реЙрдЗрдб рдХреЗ рд╕рд╛рде рд╕реНрд╡рд┐рдВрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛:


рдШрд░реНрд╖рдг рдмрд▓ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ рд╕реАрдзреЗ рд╡рд╕рдВрдд рдХреА рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реЛрдиреЗ рджреЗрдВ (FтЖТ=тИТ╬▒VтЖТ) рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдордп рдХреЗ рд╕рд╛рде рджреЛрд▓рдиреЛрдВ рдХрд╛ рдХреНрд╖рдп рд╣реЛрдЧрд╛:


рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдирд┐рдореЗрд╢рди рдЙрд╕реА рддрд░рд╣ рдПрдирд┐рдореЗрдЯреЗрдб рд╣реЛ, рдЬрд┐рд╕ рддрд░рд╣ рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рд▓реЛрдЪ рдФрд░ рдШрд░реНрд╖рдг рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рд╣рдо рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд╕рдВрдд рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ


рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдиреАрдореЗрд╢рди рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╡рд╕рдВрдд рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддрдирд╛рд╡ рд╣реИ X0тЖТред

рдПрдиреАрдореЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╡рд╕рдВрдд рджреНрд░рд╡реНрдпрдорд╛рдиm, рд▓реЛрдЪ рдХрд╛ рд╡рд╕рдВрдд рдЧреБрдгрд╛рдВрдХ k, рдорд╛рдзреНрдпрдо рдХрд╛ рдШрд░реНрд╖рдг рдЧреБрдгрд╛рдВрдХ ╬▒рддрдирд╛рд╡ рдлреВрдЯрддрд╛ рд╣реИ X0тЖТ, рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЧрддрд┐ V0тЖТред

рдПрдиреАрдореЗрд╢рди рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХрдИ рдмрд╛рд░ рджрд╕рд┐рдпреЛрдВ рдмрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИред рдПрдиреАрдореЗрд╢рди рдЧрдгрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ╬Фtред

рдкреНрд░рддреНрдпреЗрдХ рдирдИ рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╕рдВрдд рдХреА рдЧрддрд┐ рд╣реИVтЖТ рдФрд░ рд╡рд╕рдВрдд рддрдирд╛рд╡ XтЖТрдЕрдВрддрд┐рдо рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдкрд░ред рдПрдиреАрдореЗрд╢рди рдХреА рдкрд╣рд▓реА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдПXтЖТ=X0тЖТ, VтЖТ=V0тЖТред

рд╣рдо рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП рдПрдиреАрдореЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!

рдиреНрдпреВрдЯрди рдХреЗ рджреВрд╕рд░реЗ рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рднреА рд▓рд╛рдЧреВ рдмрд▓реЛрдВ рдХрд╛ рдпреЛрдЧ рдЗрд╕рдХреЗ рддреНрд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдП рдЧрдП рд╢рд░реАрд░ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

FтЖТ=maтЖТ


рджреЛ рдмрд▓ рдПрдХ рд╡рд╕рдВрдд рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ - рд▓реЛрдЪрджрд╛рд░ рдмрд▓ рдФрд░ рдШрд░реНрд╖рдг рдмрд▓:

FтЖТ+FтЖТ=maтЖТ


рд╣рдо рдмрд▓реЛрдВ рдХреЛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ рддреНрд╡рд░рдг рдЬреНрдЮрд╛рдд рдХрд░реЗрдВрдЧреЗ:

тИТkXтЖТтИТ╬▒VтЖТ=maтЖТ


aтЖТ=тИТkXтЖТтИТ╬▒VтЖТm


рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдПрдХ рдирдИ рдЧрддрд┐ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрд┐рдЫрд▓реЗ рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдЧрддрд┐ рдХреЗ рдпреЛрдЧ рдФрд░ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдЧреБрдгрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

VтЖТ=VтЖТ+aтЖТтИЧ╬Фt


рдЧрддрд┐ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╡рд╕рдВрдд рдХреА рдирдИ рд╕реНрдерд┐рддрд┐ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

XтЖТ=XтЖТ+VтЖТтИЧ╬Фt



рд╣рдореЗрдВ рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдорд┐рд▓реА, рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдПрдВ!

рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдирдпрд╛ рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рд╢реБрд░реВ рдХрд░реЗрдВред рдПрдХ рдирдП рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдПXтЖТ=XтЖТ, VтЖТ=VтЖТред

рдПрдиреАрдореЗрд╢рди рдХрдм рдмрдВрдж рд╣реЛрдиреЗ рд▓рд╛рдпрдХ рд╣реИтАЦXтЖТтАЦ рддрдерд╛ тАЦVтЖТтАЦрдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕ рд╕рдордп рд╡рд╕рдВрдд рдХреЗ рджреЛрд▓рди рд▓рдЧрднрдЧ рдЕрджреГрд╢реНрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЬреЗрдПрд╕ рд╡рд╕рдВрдд рдПрдирд┐рдореЗрд╢рди


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рд╕реВрддреНрд░ рд╣реИрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:

class Spring {
  constructor({ mass, tension, friction, initVelocity, from, to, onUpdate }) {
    this.mass = mass;                 //  
    this.tension = tension;           //  
    this.friction = friction;         //  
    this.initVelocity = initVelocity; //  

    this.from = from;                 //    
    this.to = to;                     //    
    this.onUpdate = onUpdate;         // ,    
  }

  startAnimation() {
    const callDoAnimationTick = () => {
      const isFinished = this.doAnimationTick();

      if (isFinished) {
        return;
      }

      this.nextTick = window.requestAnimationFrame(callDoAnimationTick);
    };

    callDoAnimationTick();
  }

  stopAnimation() {
    const { nextTick } = this;

    if (nextTick) {
      window.cancelAnimationFrame(nextTick);
    }

    this.isFinished = true;
  }

  doAnimationTick() {
    const {
      mass, tension, friction, initVelocity, from, to,
      previousTimestamp, prevVelocity, prevValue, onUpdate,
    } = this;

    //  ╬Фt
    const currentTimestamp = performance.now();
    const deltaT = (currentTimestamp - (previousTimestamp || currentTimestamp))
      / 1000;
    //   ╬Фt 46 
    const normalizedDeltaT = Math.min(deltaT, 0.046);

    let prevSafeVelocity = prevVelocity || initVelocity || 0;
    let prevSafeValue = prevValue || from;

    //   ,    
    const springRestoringForce = -1 * tension * (prevSafeValue - to);
    const dampingForce = -1 * prevSafeVelocity * friction;
    const acceleration = (springRestoringForce + dampingForce) / mass;

    //       
    const newVelocity = prevSafeVelocity + acceleration * normalizedDeltaT;
    const newValue  = prevSafeValue + newVelocity * normalizedDeltaT;

    //    
    const precision = 0.001;
    const isFinished = Math.abs(newVelocity) < precision
      && Math.abs(newValue - to) < precision;

    onUpdate({ value: newValue, isFinished });

    this.previousTimestamp = currentTimestamp;
    this.prevValue = newValue;
    this.prevVelocity = newVelocity;
    this.isFinished = isFinished;

    return isFinished;
  }
}

рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХреЛрдб рд╡рд╛рд▓рд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
https://playcode.io/590645

рдорд╛рдЗрдирд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдЗрдореНрдкреНрд░реВрд╡рдореЗрдВрдЯ


рд╣рдорд╛рд░реЗ рд╡рд╕рдВрдд рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ - ╬ФtрдПрдиреАрдореЗрд╢рди рдХреА рдирдИ рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рд╣рд░ рдмрд╛рд░ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред

рдкреБрд░рд╛рдиреЗ рд╕реЗрд▓ рдлреЛрди рдкрд░ рдЦреЛрд▓реЗрдВ -╬Фtрд╣рдорд╛рд░реА рдЕрдзрд┐рдХрддрдо рд╕реАрдорд╛ 46 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреАред рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЦреЛрд▓реЗрдВ -╬Фt16-17 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╣реЛрдЧрд╛ред

рдмрджрд▓рдирд╛╬ФtрдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рдФрд░ рдПрдирд┐рдореЗрдЯреЗрдб рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣рд░ рдмрд╛рд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рд▓реЛ╬Фtрдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВред рдПрдХ рдирдП рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреА рд╣реЛрдЧреА рдХрд┐ рдЕрдВрддрд┐рдо рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмрд╛рдж рдХрд┐рддрдирд╛ рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрд┐рддрдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рд╣реИрдВ╬Фtред рдпрджрд┐ рд╕рдордп рд╕реЗ рд╡рд┐рднрд╛рдЬреНрдп рдирд╣реАрдВ рд╣реИ╬Фt, рдлрд┐рд░ рд╢реЗрд╖ рдХреЛ рдЕрдЧрд▓реЗ рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред

рдлрд┐рд░ рд╣рдо рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВXтЖТ рддрдерд╛ VтЖТрдЬрд┐рддрдиреА рдмрд╛рд░ рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛, рдорд╛рди рд▓рд┐рдпрд╛ред рдЕрдВрддрд┐рдо рдореВрд▓реНрдпXтЖТрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг:

╬ФtрдЪрд▓реЛ 1 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ, 32 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдЕрдВрддрд┐рдо рдФрд░ рдирдП рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рд╣реБрдЖред

рд╣рдореЗрдВ 32 рдмрд╛рд░ рднреМрддрд┐рдХреА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рд╣реИ,XтЖТ рддрдерд╛ VтЖТ; рдЕрдВрддрд┐рдоXтЖТрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ DoAnimationTick рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

class Spring {
  /* ... */

  doAnimationTick() {
    const {
      mass, tension, friction, initVelocity, from, to,
      previousTimestamp, prevVelocity, prevValue, onUpdate,
    } = this;

    const currentTimestamp = performance.now();
    const fractionalDiff = currentTimestamp - (previousTimestamp || currentTimestamp);
    const naturalDiffPart = Math.floor(fractionalDiff);
    const decimalDiffPart = fractionalDiff % 1;
    const normalizedDiff = Math.min(naturalDiffPart, 46);

    let safeVelocity = prevVelocity || initVelocity || 0;
    let safeValue = prevValue || from;

    //     1-  
    for (let i = 0; i < normalizedDiff; i++) {
      const springRestoringForce = -1 * tension * (safeValue - to);
      const dampingForce = -1 * safeVelocity * friction;
      const acceleration = (springRestoringForce + dampingForce) / mass;

      safeVelocity = safeVelocity + acceleration / 1000;
      safeValue  = safeValue + safeVelocity / 1000;
    }

    const precision = 0.001;
    const isFinished = Math.abs(safeVelocity) < precision
      && Math.abs(safeValue - to) < precision;

    onUpdate({ value: safeValue, isFinished });

    //       ,
    //      
    this.previousTimestamp = currentTimestamp - decimalDiffPart;
    this.prevValue = safeValue;
    this.prevVelocity = safeVelocity;
    this.isFinished = isFinished;

    return isFinished;
  }
}

рднреМрддрд┐рдХреА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдпрд╣ рд╡рд┐рдзрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЖрдк рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрд╖реАрдгрди рдЧреБрдгрд╛рдВрдХ рдФрд░ рдЖрдВрддрд░рд┐рдХ рджреЛрд▓рди рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП - рднрд╛рд░ рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди, рд▓реЛрдЪ рдХрд╛ рдЧреБрдгрд╛рдВрдХ рдФрд░ рдорд╛рдзреНрдпрдо рдХреЗ рдШрд░реНрд╖рдг рдХреЗ рдЧреБрдгрд╛рдВрдХ - рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд╕рдВрдд рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рдЗрди рдЪрд░ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рддрдм рддрдХ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдирд┐рдореЗрд╢рди рдХреЗ "рд╕реНрдкреНрд░рд┐рдВрдЧрдиреЗрд╕" рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рди рд╣реЛ рдЬрд╛рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рднреМрддрд┐рдХреА рдореЗрдВ рдПрдХ рдирдо рд╡рд╕рдВрдд рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд░ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдХрд░ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╕рдВрдд рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдиреНрдпреВрдЯрди рдХреЗ рджреВрд╕рд░реЗ рдирд┐рдпрдо рдХреЗ рд╣рдорд╛рд░реЗ рд╕рдореАрдХрд░рдг рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ:

тИТkXтЖТтИТ╬▒VтЖТ=maтЖТ


рд╣рдо рдЗрд╕реЗ рдПрдХ рд╡рд┐рднреЗрджрдХ рд╕рдореАрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

тИТkxтИТ╬▒dxdt=md2xdt2


рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

d2xdt2+2╬╢╧Й0dxdt+╧Й02x=0,


рдХрд╣рд╛рдБ рдкреЗ ╧Й0=kmрдШрд░реНрд╖рдг рдмрд▓ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рдмрд┐рдирд╛ рд╡рд╕рдВрдд рдХреЗ рджреЛрд▓рди рдХреА рдЖрд╡реГрддреНрддрд┐, ╬╢=╬▒2mk- рдХреНрд╖реАрдгрди рдЧреБрдгрд╛рдВрдХред

рдпрджрд┐ рд╣рдо рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рдорд┐рд▓рддреЗ рд╣реИрдВx(t)рдХрд┐ рд╡рд╕рдВрдд рдмрдирд╛рдо рд╕рдордп рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рд╕рдорд╛рдзрд╛рди рдбрд╛рд▓ рджрд┐рдпрд╛, рддрд╛рдХрд┐ рд▓реЗрдЦ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рди рдЦреАрдВрдЪрд╛ рдЬрд╛рдП, рд╣рдо рд╕реАрдзреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдЬрд╛рдПрдВрдЧреЗред

рд╕рдореАрдХрд░рдг рд╕рдорд╛рдзрд╛рди
, :
https://www.youtube.com/watch?v=uI2xt8nTOlQ

:

xтА│+2╬╢╧Й0xтА▓+╧Й02x=0,╧Й0>0,╬╢тЙе0


:

g2+2╬╢╧Й0g+╧Й02=0


D=(2╬╢╧Й0)2тИТ4╧Й02=4╧Й02(╬╢2тИТ1)



:

1. D>0

D>0╬╢>1.

D>0:

x(t)=C1er1t+C2er2t,


r1,2тАФ , :

r1,2=тИТ2╬╢╧Й0┬▒4╧Й02(╬╢2тИТ1)2=тИТ╧Й0(╬╢┬▒╬╢2тИТ1)


:

x(t)=C1eтИТ╧Й0╬▓1t+C2eтИТ╧Й0╬▓2t,


╬▓1,2=╬╢┬▒╬╢2тИТ1.

, 0.

2. D=0

D=0╬╢=1.

D=0:

x(t)=(C1+C2t)ert,


rтАФ , :

r=тИТ╬╢╧Й0


:

x(t)=(C1+C2t)eтИТ╬╢╧Й0t



, 0. , D>0.

, , , 0 , D>0. , ?

3. D<0

D<0╬╢<1.

D<0:

x(t)=e╬▒t(C1cos(╬▓t)+C2тИЧsin(╬▓t))


╬▒╬▓тАФ , :

r1,2=╬▒┬▒╬▓i=тИТ╧Й0╬╢┬▒╧Й0╬╢2тИТ1)=тИТ╧Й0╬╢┬▒╧Й01тИТ╬╢2i


╬▒=тИТ╧Й0╬╢,╬▓=╧Й01тИТ╬╢2


:

x(t)=eтИТ╧Й0╬╢t(C1cos(╧Й01тИТ╬╢2t)+C2sin(╧Й01тИТ╬╢2t))



, 0.

╬╢, eтИТ╧Й0╬╢t0, .. .

╬╢=0.


рдкрд░ ╬╢<1рд╣рдореЗрдВ рдПрдХ рд╕рдореАрдХрд░рдг рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд╕рдВрдд рдХреЗ рдХрдВрдкрд┐рдд рдХрдВрдкрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдХрдо╬╢, рдШрд░реНрд╖рдг рдмрд▓ рдХрдо рдФрд░ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рдХрдВрдкрдиред

рдкрд░╬╢=1рд╣рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрд░реНрд╖рдг рдХреЗ рд╕рд╛рде рд╕рдореАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╡рд╣ рд╕рдореАрдХрд░рдг рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрддреБрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрддрд╛ рд╣реИред

рдкрд░╬╢>1рд╣рдореЗрдВ рдПрдХ рд╕рдореАрдХрд░рдг рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ рд╕рдВрддреБрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрддрд╛ рд╣реИред рдпрд╣ рд╕рд╛рде рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдореА рд╣реЛрдЧреА╬╢=1; рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде╬╢ рд╕рдВрддреБрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрднрд┐рд╕рд░рдг рдХреА рджрд░ рдШрдЯ рдЬрд╛рддреА рд╣реИред


рд╡рд┐рднрд┐рдиреНрди рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг ╬╢ред рдПрдирд┐рдореЗрд╢рди рд╕реНрдкреАрдб 4 рдЧреБрдирд╛ рдХрдо рд╣реЛ рдЧрдИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛╬╢, рд╡рд╕рдВрдд рджреЛрд▓рдиреЛрдВ рдХреА рдПрдХ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рдмрд┐рдирд╛ рдШрд░реНрд╖рдг рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рд╡рд╕рдВрдд рджреЛрд▓рдиреЛрдВ рдХреА рдЕрд╡рдзрд┐:

T=2╧Аmk



рд╣рдореЗрдВ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓реЗ:

тЖТ╬╢, рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдореЗрдВ рдХрд┐рддрдирд╛ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рд╣реЛрдЧрд╛ред

рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рди╬╢0 рд╕реЗ 1.

рдХрдо╬╢, рд╡рд╕рдВрдд рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдЕрдзрд┐рдХ рдХрдВрдкрдиред 0 рдкрд░, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдШрд░реНрд╖рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╡рд╕рдВрдд рдХреНрд╖реАрдгрди рдХреЗ рдмрд┐рдирд╛ рджреЛрд▓рди рдХрд░реЗрдЧрд╛; 1 рдкрд░, рд╡рд╕рдВрдд рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ рд╕рдВрддреБрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

1 рд╕реЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВ - рд╡реЗ 1 рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд╡реНрдпрд░реНрде рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред

тЖТTрдЬреЛ рдХрд╣реЗрдЧрд╛ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдХрд┐рддрдиреЗ рд╕рдордп рддрдХ рдЪрд▓реЗрдЧрд╛ред

рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПTрдШрд░реНрд╖рдг рдмрд▓ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╡рд╕рдВрдд рдХреЗ рдПрдХ рдХрдВрдкрди рдХреА рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреА рдХреБрд▓ рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВред

рдЕрдм рд╣рдо рд▓реЛрдЪ рдХреЗ рдЧреБрдгрд╛рдВрдХ рдФрд░ рдорд╛рдзреНрдпрдо рдХреЗ рдШрд░реНрд╖рдг рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреЛ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ╬╢ рддрдерд╛ TрдФрд░ рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП m=1:

╬╢=╬▒2mk,T=2╧Аmk


k=(2╧АT)2,╬▒=4╧А╬╢T



рд╣рдо рдЗрд╕ рддрд░реНрдХ рдХреЛ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

const getSpringValues = ({ dampingRatio, period }) => {
  const mass = 1;
  const tension = Math.pow(2 * Math.PI / period, 2);
  const friction = 4 * Math.PI * dampingRatio / period;

  return {
    mass,
    tension,
    friction,
  };
};

//  

new Spring({
  ...getSpringValues({
    dampingRatio: 0.3, //   - 
    period: 0.6, //   600 
  }),
  from: 0,
  to: 20,
  onUpdate: () => { /* ... */ },
});

new Spring({
  ...getSpringValues({
    dampingRatio: 1, //   
    period: 0.2, //   200 
  }),
  from: 0,
  to: 20,
  onUpdate: () => { /* ... */ },
});

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ getSpringValues тАЛтАЛрддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдорд╛рдирд╡-рдкрдардиреАрдп рдХреНрд╖реАрдгрди рдЧреБрдгрд╛рдВрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ ╬╢рдФрд░ рджреЛрд▓рди рдХреА рдЕрд╡рдзрд┐ TрдФрд░ рд╡рд╕рдВрдд рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди, рдШрд░реНрд╖рдг рдХрд╛ рдЧреБрдгрд╛рдВрдХ рдФрд░ рд▓реЛрдЪ рдХрд╛ рдЧреБрдгрд╛рдВрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╡рд┐рдзрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рд╣реИ, рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рд╕реНрдЯрдо рдЧреБрдгреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
https://playcode.io/590645

Vue рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди


Vue рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рджреЛ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдЖрд╡рд░рдг рдШрдЯрдХ рдпрд╛ рд░рдЪрдирд╛-рдПрдкреА рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВ ред

рдШрдЯрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди


рдЖрдЗрдП рдПрдХ рдШрдЯрдХ рд▓рд┐рдЦреЗрдВ рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

<template>
  <div>
    <SpringWrapper
      :mass="1"
      :tension="170"
      :friction="14"
      :animationProps="{ x, y }" 
      :animate="true" 
      v-slot="{ x: newX, y: newY }"
    >
      <div :style="{ transform: `translate(${newX}px, ${newY}px)` }" />
    </SpringWrapper>
  </div>
</template>

<script>
import SpringWrapper from 'path/to/SpringWrapper';

export default {
  components: {
    SpringWrapper,
  },

  data() {
    return {
      x: 0,
      y: 0,
    };
  },

  mounted() {
    setTimeout(() => {
      this.x = 100;
      this.y = 100;
    }, 1000);
  },
};
</script>

рд╣рдо рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ:

  • рдЖрдк рд╡рд╕рдВрдд рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рдПрдирд┐рдореЗрд╢рдирдкреНрд░реЙрдкреНрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ, рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЪреЗрддрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
  • рдЪреЗрддрди рдкреИрд░рд╛рдореАрдЯрд░ рдиреЗ рдорд╛рди рдкрд╛рд╕ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдПрдиреАрдореЗрд╢рдирдкреНрд░реЙрдкреНрд╕ рдХреЛ рдПрдирд┐рдореЗрдЯреЗрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдЬрдм рднреА рдлрд╝реАрд▓реНрдб рдПрдиреАрдореЗрд╢рдирдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреЛрдк рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП, рдШрдЯрдХ рдХреЛ рдЕрднреА рднреА рд╡рд╕рдВрдд рдХреА рдЧрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рд╣рдо рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

const SpringWrapper = {
  props: {
    friction: { type: Number, default: 10 },
    tension: { type: Number, default: 270 },
    mass: { type: Number, default: 1 },
    animationProps: { type: Object, required: true },
    animate: { type: Boolean, required: true },
  },

  data: () => ({
    //    
    actualAnimationProps: null,
  }),

  created() {
    this.actualAnimationProps = this.animationProps;
    // ,     Spring-
    this._springs = {};
  },

  watch: {
    animationProps: {
      deep: true,

      //    animationProps
      handler(animationProps) {
        const {
          friction, tension, mass,
          animate, actualAnimationProps, _springs,
        } = this;

        //     ,    
        if (!animate) {
          this.actualAnimationProps = animationProps;

          return;
        }

        //      
        Object.entries(animationProps).forEach((([key, value]) => {
          const _spring = _springs[key];
          const actualValue = actualAnimationProps[key];

          //      Spring-,
          //      
          if (_spring && !_spring.isFinished) {
            _spring.to = value;

            return;
          }

          const spring = new Spring({
            friction,
            tension,
            mass,
            initVelocity: 0,
            from: actualValue,
            to: value,
            onUpdate: ({ value }) => {
              actualAnimationProps[key] = value;
            },
          });

          spring.startAnimation();

          _springs[key] = spring;
        }));
      }
    },

    animate(val) {
      const { _springs } = this;

      //     ,
      //    Spring-
      if (!val) {
        Object.values(_springs).forEach((spring) => {
          spring.stopAnimation();
        })

        this.actualAnimationProps = this.animationProps;
      }
    },
  },

  render() {
    const { $scopedSlots, actualAnimationProps } = this;

    //     scopedSlot
    return $scopedSlots.default(actualAnimationProps)[0];
  },
};

рдПрдХ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
https://playcode.io/591686/

рд░рдЪрдирд╛-рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╕рдВрдд рдПрдиреАрдореЗрд╢рди


рдХрдВрдкреЛрдЬреАрд╢рди-рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛ Vue 3.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд╣рдореЗрдВ рдХрдВрдкреЛрдЬреАрд╢рди-рдПрдкреА рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

рдЗрд╕реЗ рдЦреБрдж рд╕реЗ рдЬреЛрдбрд╝реЗрдВ:

npm i @vue/composition-api

import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api';

Vue.use(VueCompositionApi);

рдЕрдм рдЖрдЗрдП рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреА рдПрдиреАрдореЗрд╢рди рд╡рд┐рдзрд┐ рдХреЛ рдХреИрд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:

<template>
  <div>
    <div :style="{ transform: `translate(${x}px, ${y}px)` }" />
  </div>
</template>

<script>
import useSpring from 'path/to/useSpring';

export default {
  setup() {
    const { x, y, animate } = useSpring({
      mass: 1, 
      tension: 170, 
      friction: 10,
      x: 0,
      y: 0,
    });

    setTimeout(() => {
      x.value = 100;
      y.value = 100;
    }, 1000);

    return {
      x,
      y,
      animate,
    };
  },
};
</script>

рд╣рдо рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ:

  • рдЖрдк рд╡рд╕рдВрдд рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рдлрд╝рдВрдХреНрд╢рди рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдирд┐рдореЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  • рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдХрд▓рд┐рдд рд░реИрдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ред рд╕реЗрдЯрд░реНрд╕ рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреЗрддрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдЧреЗрдЯреНрд╕ рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛
  • рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдЪреЗрддрди рдЪрд░ рд▓реМрдЯрд╛рдпрд╛, рдЬреЛ рдЗрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдШрдЯрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡рд╕рдВрдд рдЧрддрд┐ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рди рдХрд░реЗрдВред

рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

import { reactive, computed, ref, watch } from '@vue/composition-api';
import { Spring } from '@cag-animate/core';

const useSpring = (initialProps) => {
  const {
    mass, tension, friction,
    animate: initialAnimate,
    ...restInitialProps
  } = initialProps;

  //  ,      
  const actualProps = reactive(restInitialProps);

  const springs = {};
  const mirrorProps = {};

  Object.keys(initialProps).forEach(key => {
    //     computed-
    // 
    // Getter     actualProps
    // Setter  Spring-
    mirrorProps[key] = computed({
      get: () => actualProps[key],
      set: val => {
        const _spring = springs[key];
        const actualValue = actualProps[key];

        if (!mirrorProps.animate.value) {
          actualProps[key] = val;

          return
        }

        if (_spring && !_spring.isFinished) {
          _spring.to = val;

          return;
        }

        const spring = new Spring({
          friction,
          tension,
          mass,
          initVelocity: 0,
          from: actualValue,
          to: val,
          onUpdate: ({ value }) => {
            actualProps[key] = value;
          },
        });

        spring.startAnimation();

        springs[key] = spring;
      },
    });
  });

  mirrorProps.animate = ref(initialAnimate || true);

  watch(() => mirrorProps.animate.value, (val) => {
    if (!val) {
      Object.entries(springs).forEach(([key, spring]) => {
        spring.stopAnimation();
        actualProps[key] = spring.to;
      });
    }
  });

  return mirrorProps;
};

export default useSpring;

рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрдореНрдкреЛрдЬреАрд╢рди-рдПрдкреА рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
https://playcode.io/591812/

рдЖрдЦрд╝рд┐рд░реА рд╢рдмреНрдж


рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдФрд░ рдЙрдиреНрд╣реЗрдВ Vue рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИ - Vue- рдШрдЯрдХреЛрдВ рдореЗрдВ рдЖрдк рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдирдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╕рдВрдд рдХреА рдЧрддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдЪ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рд▓рд┐рдЦрдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ: рдкреЙрдкрдореЛрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ ред рдЖрдк Vue рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдХрд┐рдпрд╛ рдерд╛ред

рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА



All Articles