{"id":471323,"date":"2025-08-20T09:00:12","date_gmt":"2025-08-20T09:00:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=471323"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=471323","title":{"rendered":"<span>1 \u043c\u0438\u043d\u0443\u0442\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0412\u0435\u0440\u043b\u0435\u0301<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435\u0301 \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0430\u0442\u044c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0438 \u0432 \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0444\u0438\u0437\u0438\u043a\u0438, \u0438 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435 (cloth sim). \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0438\u0434\u0435\u043e \u0441 \u0435\u0433\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 (\u0441\u043c. YouTube Shorts \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0438 <a href=\"https:\/\/jerryi.github.io\/wljs-demo\/verlet.mp4\" rel=\"noopener noreferrer nofollow\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e \u043d\u0430 GitHub<\/a>). <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0438\u0434\u0435\u044f \u00ab\u0447\u0438\u0441\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e\u00bb \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0441\u0435\u0442\u043a\u0430\u043c\u0438 \u0438 \u0438\u0433\u0440\u043e\u0439 \u0432 \u0431\u0438\u043b\u044c\u044f\u0440\u0434.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0438\u0434\u0435\u043e<\/summary>\n<div class=\"spoiler__content\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/68a4727d79b5b6ab9acde914\" data-style=\"\" id=\"68a4727d79b5b6ab9acde914\" width=\"\"><\/div>\n<p><strong>\u0417\u0435\u0440\u043a\u0430\u043b\u043e \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 \ud83e\ude9e <\/strong><a href=\"https:\/\/jerryi.github.io\/wljs-demo\/verlet.mp4\" rel=\"noopener noreferrer nofollow\">https:\/\/jerryi.github.io\/wljs-demo\/verlet.mp4<\/a><\/p>\n<\/div>\n<\/details>\n<blockquote>\n<p>\u042f \u0443\u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u043f\u043e\u0441\u0442 \u043e \u043c\u0435\u0442\u043e\u0434\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/906322\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u0440\u043b\u0435<\/a> \u2702\ufe0f, \u043a\u0440\u0430\u0442\u043a\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0432 \u0438\u0434\u0435\u0438, \u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u0432 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435.<\/p>\n<\/blockquote>\n<hr\/>\n<p>\u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0442\u0435\u043c\u0443, \u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 10 \u043b\u0435\u0442<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/841544\/\" rel=\"noopener noreferrer nofollow\">\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0442\u043a\u0430\u043d\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0421\u0442\u0451\u0440\u043c\u0435\u0440\u0430 \u2014 \u0412\u0435\u0440\u043b\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/775228\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u0440\u043b\u0435: \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/184724\/\" rel=\"noopener noreferrer nofollow\">\u0420\u044d\u0433\u0434\u043e\u043b\u043b \u0444\u0438\u0437\u0438\u043a\u0430 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<h4>\u041e\u0441\u043d\u043e\u0432\u044b<\/h4>\n<p>\u0412\u0441\u0435 \u0437\u0430\u0441\u043b\u0443\u0433\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u044d\u0442\u0438\u043c \u043b\u044e\u0434\u044f\u043c:  <\/p>\n<div class=\"persona\"><img decoding=\"async\" class=\"image persona__image\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f4\/33a\/754\/7f433a75467bcb4293805452cffe2045.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7f4\/33a\/754\/7f433a75467bcb4293805452cffe2045.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f4\/33a\/754\/7f433a75467bcb4293805452cffe2045.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<h5 class=\"persona__heading\">\u041b\u0443\u043f \u0412\u0435\u0440\u043b\u0435<\/h5>\n<p class=\"persona__text\">\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439 \u0444\u0438\u0437\u0438\u043a, \u043f\u0438\u043e\u043d\u0435\u0440 \u0432\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%BE%D0%BB%D0%B5%D0%BA%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE-%D0%BA%D0%B8%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%5C_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e-\u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438<\/a> (1967)<\/p>\n<\/div>\n<div class=\"persona\"><img decoding=\"async\" class=\"image persona__image\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/467\/c8c\/5cf\/467c8c5cfe4076b7ca403b40d06f8c3a.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/467\/c8c\/5cf\/467c8c5cfe4076b7ca403b40d06f8c3a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/467\/c8c\/5cf\/467c8c5cfe4076b7ca403b40d06f8c3a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<h5 class=\"persona__heading\">\u041a\u0430\u0440\u043b \u0421\u0442\u0451\u0440\u043c\u0435\u0440<\/h5>\n<p class=\"persona__text\">\u043d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a \u0438 \u0444\u0438\u0437\u0438\u043a (1907)<\/p>\n<\/div>\n<p>\u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0432\u0438\u0434\u0435\u043e, \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u0437 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2e4\/e97\/9af\/2e4e979af03d312083cd195817a3ab9f.png\" alt=\"\u041a\u0430\u0434\u0440 \u0438\u0437 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438\" title=\"\u041a\u0430\u0434\u0440 \u0438\u0437 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438\" width=\"1115\" height=\"660\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2e4\/e97\/9af\/2e4e979af03d312083cd195817a3ab9f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2e4\/e97\/9af\/2e4e979af03d312083cd195817a3ab9f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041a\u0430\u0434\u0440 \u0438\u0437 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043a\u0430\u043a \u043a\u0438\u043d\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445, \u0442\u0430\u043a \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"x_{n+1} = 2 x_{n} - x_{n-1} + \\delta^{2} f_{n}\/m\" alt=\"x_{n+1} = 2 x_{n} - x_{n-1} + \\delta^{2} f_{n}\/m\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ddc\/a1a\/153\/ddca1a153283a93e814a080e0577f756.svg\" width=\"248\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ddc\/a1a\/153\/ddca1a153283a93e814a080e0577f756.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ddc\/a1a\/153\/ddca1a153283a93e814a080e0577f756.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0433\u0434\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"n\" alt=\"n\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a23\/147\/a8d\/a23147a8dc83611ce5eb301865cc918a.svg\" width=\"12\" height=\"12\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a23\/147\/a8d\/a23147a8dc83611ce5eb301865cc918a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a23\/147\/a8d\/a23147a8dc83611ce5eb301865cc918a.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u043d\u043e\u043c\u0435\u0440 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0448\u0430\u0433\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (<img decoding=\"async\" class=\"formula inline\" source=\"\\delta\" alt=\"\\delta\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dfa\/ef4\/64f\/dfaef464f87a8c39f6844aceae4d90de.svg\" width=\"9\" height=\"18\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dfa\/ef4\/64f\/dfaef464f87a8c39f6844aceae4d90de.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dfa\/ef4\/64f\/dfaef464f87a8c39f6844aceae4d90de.svg 781w\" loading=\"lazy\" decode=\"async\"\/>). \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043d\u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0441\u0438\u043b\u044b.<\/p>\n<hr\/>\n<h3>\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e<\/h3>\n<blockquote>\n<p>\u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/wljs.io\/\" rel=\"noopener noreferrer nofollow\">WLJS Notebook<\/a> \ud83d\udce6 \u0432 \u0441\u0438\u043b\u0443 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435<\/p>\n<\/blockquote>\n<p>\u042d\u0442\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"dart\">With[{uid = CreateUUID[], ball = Unique[\"ball\"]},    (* \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0448\u0430\u0440\u0438\u043a\u0430 x3 *)      ball = Table[{0, 0}, {3}];    (* \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 *)          EventHandler[uid, Function[Null,     (* \u043c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435 *)                                     ball[[3]] = ball[[2]];     ball[[2]] = ball[[1]];      ball[[1]] = 2 ball[[2]] - ball[[3]] + {0, -1} 0.01;     If[ball[[1, 2]] &lt; -1.0, ball[[{1, 2}]] = ball[[{2, 1}]]];      (* \u0434\u0435\u0440\u0433\u0430\u0435\u043c \u0435\u0449\u0435 \u0440\u0430\u0437, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0448\u0430\u0440\u0438\u043a \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 *)                                         ball = ball;   ]];    (* \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 *)         Graphics[{     {Gray, Line[{{-1, 0}, {1, 0}}]},     Point[ball[[1]] \/\/ Offload],     AnimationFrameListener[ball \/\/ Offload, \"Event\" -&gt; uid]   }, PlotRange -&gt; {{-1, 1}, {-1, 1}}] ] <\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0442\u0440\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"x_{n+1}\" alt=\"x_{n+1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0c9\/95c\/4e0\/0c995c4e0d5efd2f68165200dce38bcb.svg\" width=\"39\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0c9\/95c\/4e0\/0c995c4e0d5efd2f68165200dce38bcb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0c9\/95c\/4e0\/0c995c4e0d5efd2f68165200dce38bcb.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, <img decoding=\"async\" class=\"formula inline\" source=\"x_{n}\" alt=\"x_{n}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a75\/712\/276\/a75712276c7de3b8d878721ca21f55f5.svg\" width=\"21\" height=\"15\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a75\/712\/276\/a75712276c7de3b8d878721ca21f55f5.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a75\/712\/276\/a75712276c7de3b8d878721ca21f55f5.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, <img decoding=\"async\" class=\"formula inline\" source=\"x_{n-1}\" alt=\"x_{n-1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/974\/551\/168\/974551168dbce020654c9493a180b189.svg\" width=\"39\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/974\/551\/168\/974551168dbce020654c9493a180b189.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/974\/551\/168\/974551168dbce020654c9493a180b189.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0440\u0438\u043a\u0430 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u0435 <code>ball<\/code>. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0412\u0435\u0440\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{align*} &amp;ball_{n-1} &amp;=&amp; ~ ball_{n} \\\\ &amp;ball_{n} &amp;=&amp; ~ball_{n+1} \\\\ &amp;ball_{n+1} &amp;=&amp; ~2 ball_{n} - ball_{n-1} + \\begin{bmatrix}0 \\\\ -1 \\end{bmatrix} \\alpha^2 \\end{align*}\" alt=\"\\begin{align*} &amp;ball_{n-1} &amp;=&amp; ~ ball_{n} \\\\ &amp;ball_{n} &amp;=&amp; ~ball_{n+1} \\\\ &amp;ball_{n+1} &amp;=&amp; ~2 ball_{n} - ball_{n-1} + \\begin{bmatrix}0 \\\\ -1 \\end{bmatrix} \\alpha^2 \\end{align*}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d4c\/86a\/386\/d4c86a38646daa6f12dc380a296e56bd.svg\" width=\"357\" height=\"101\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d4c\/86a\/386\/d4c86a38646daa6f12dc380a296e56bd.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d4c\/86a\/386\/d4c86a38646daa6f12dc380a296e56bd.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0433\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0447\u043b\u0435\u043d <img decoding=\"async\" class=\"formula inline\" source=\"\\alpha^2\" alt=\"\\alpha^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8fa\/1e9\/6c3\/8fa1e96c38c1f7e440c48dfa11d6dc8b.svg\" width=\"21\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8fa\/1e9\/6c3\/8fa1e96c38c1f7e440c48dfa11d6dc8b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8fa\/1e9\/6c3\/8fa1e96c38c1f7e440c48dfa11d6dc8b.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u0441\u0438\u043b\u044b \u0442\u044f\u0436\u0435\u0441\u0442\u0438 \u043d\u0430 \u0448\u0430\u0440 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u044b \u043f\u043e\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430\u043a\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\alpha^2 = g \\delta t^2 \/ m\" alt=\"\\alpha^2 = g \\delta t^2 \/ m\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0dc\/1a3\/367\/0dc1a336739161a19f58ffb532445f80.svg\" width=\"109\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0dc\/1a3\/367\/0dc1a336739161a19f58ffb532445f80.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0dc\/1a3\/367\/0dc1a336739161a19f58ffb532445f80.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.<\/p>\n<p><strong>\u0413\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f:<\/strong> \u0435\u0441\u043b\u0438 \u0448\u0430\u0440\u0438\u043a \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0437\u0435\u043c\u043b\u0438, \u043c\u044b \u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"ball_n\" alt=\"ball_n\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4f3\/2ca\/892\/4f32ca89281c448a3a02724f4956fafc.svg\" width=\"41\" height=\"20\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4f3\/2ca\/892\/4f32ca89281c448a3a02724f4956fafc.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4f3\/2ca\/892\/4f32ca89281c448a3a02724f4956fafc.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 <img decoding=\"async\" class=\"formula inline\" source=\"ball_{n+1}\" alt=\"ball_{n+1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b39\/d75\/134\/b39d75134d645f5853f5ee66b7250330.svg\" width=\"58\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b39\/d75\/134\/b39d75134d645f5853f5ee66b7250330.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b39\/d75\/134\/b39d75134d645f5853f5ee66b7250330.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u044d\u0442\u043e \u043d\u0435\u044f\u0432\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u043f\u0435\u0440\u0435\u0432\u043e\u0440\u043e\u0442\u00bb \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7b8\/e5b\/2a4\/7b8e5b2a4049fc6f5328f934dd318ff4.png\" alt=\"\u041e\u0442\u0432\u043e\u0440\u043e\u0442-\u043f\u043e\u0432\u043e\u0440\u043e\u0442\" title=\"\u041e\u0442\u0432\u043e\u0440\u043e\u0442-\u043f\u043e\u0432\u043e\u0440\u043e\u0442\" width=\"730\" height=\"339\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7b8\/e5b\/2a4\/7b8e5b2a4049fc6f5328f934dd318ff4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7b8\/e5b\/2a4\/7b8e5b2a4049fc6f5328f934dd318ff4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0442\u0432\u043e\u0440\u043e\u0442-\u043f\u043e\u0432\u043e\u0440\u043e\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/570\/5b8\/d5d\/5705b8d5dec7dc26d506147197ce19b4.gif\" width=\"800\" height=\"287\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/570\/5b8\/d5d\/5705b8d5dec7dc26d506147197ce19b4.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/570\/5b8\/d5d\/5705b8d5dec7dc26d506147197ce19b4.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>\u041f\u043e\u0442\u0435\u0440\u0438 \u043d\u0430 \u0442\u0435\u043f\u043b\u043e<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0447\u0435\u0441\u0442\u044c \u043d\u0435\u0443\u043f\u0440\u0443\u0433\u043e\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0442\u0440\u0430\u0436\u0451\u043d\u043d\u044b\u0439 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 (\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c), \u0441\u043a\u0430\u0436\u0435\u043c \u0432 0.95 &#8212; 0.8 \u0440\u0430\u0437<\/p>\n<pre><code class=\"dart\">  If[ball[[1, 2]] &lt; -1.0,      With[{vel = ball[[1]]-ball[[2]]},       ball[[2]] = ball[[1]];       ball[[1]] = ball[[1]] - 0.95 vel;     ];   ];<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4f1\/afe\/65a\/4f1afe65a3643d9bfccb24f9a646aed7.gif\" width=\"800\" height=\"287\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4f1\/afe\/65a\/4f1afe65a3643d9bfccb24f9a646aed7.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4f1\/afe\/65a\/4f1afe65a3643d9bfccb24f9a646aed7.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/h4>\n<p>\u0414\u0430\u0436\u0435 \u043f\u0440\u0438 \u043c\u0430\u043b\u043e\u043c \u0448\u0430\u0433\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"\\delta t\" alt=\"\\delta t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/150\/03f\/ac7\/15003fac71d0b753fecd22760db935d7.svg\" width=\"16\" height=\"18\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/150\/03f\/ac7\/15003fac71d0b753fecd22760db935d7.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/150\/03f\/ac7\/15003fac71d0b753fecd22760db935d7.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u0440\u0430:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd4\/8fc\/9ff\/cd48fc9ffe7c9a581dbfa0a56c13de80.png\" width=\"708\" height=\"239\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cd4\/8fc\/9ff\/cd48fc9ffe7c9a581dbfa0a56c13de80.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cd4\/8fc\/9ff\/cd48fc9ffe7c9a581dbfa0a56c13de80.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<blockquote>\n<p>\u0414\u0430, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u00ab\u0436\u0443\u043b\u044c\u043d\u0438\u0447\u0430\u0442\u044c\u00bb, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0436\u0430\u0442\u044c (clamp) \u043e\u0434\u043d\u0443 \u0438\u0437 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043c\u0438\u043c\u043e \u043b\u044e\u0431\u043e\u0439 \u0444\u0438\u0437\u0438\u043a\u0438<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/857\/575\/1d3\/8575751d3e6fc211f960d99bd892e7e4.png\" width=\"657\" height=\"217\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/857\/575\/1d3\/8575751d3e6fc211f960d99bd892e7e4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/857\/575\/1d3\/8575751d3e6fc211f960d99bd892e7e4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u043e\u0439<\/p>\n<pre><code class=\"haskell\">  If[ball[[1, 2]] &lt; -1.0,      With[{vel = ball[[1]]-ball[[2]]},       ball[[2]] = ball[[1]];       ball[[1]] = Clip[ball[[1]] - 0.95 vel, {-1, Infinity}]; (* &lt;-- *)     ];   ];<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445  \ud83e\uddd9\ud83c\udffc\u200d\u2642\ufe0f<\/p>\n<h3>\u041e\u0431\u0449\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043a\u043b\u043e\u043d\u0435\u043d\u0430, \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438. \u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fdd\/9b4\/ae0\/fdd9b4ae081849dfb44b1c294c811293.png\" alt=\"\u0417\u0430\u0434\u0430\u0447\u043a\u0430\" title=\"\u0417\u0430\u0434\u0430\u0447\u043a\u0430\" width=\"859\" height=\"360\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/fdd\/9b4\/ae0\/fdd9b4ae081849dfb44b1c294c811293.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fdd\/9b4\/ae0\/fdd9b4ae081849dfb44b1c294c811293.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0417\u0430\u0434\u0430\u0447\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0442\u0432\u0435\u0442:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\mathbf{v}^{\\prime} = \\mathbf{v} - 2~\\mathbf{n} (\\mathbf{n} \\cdot \\mathbf{v})\" alt=\"\\mathbf{v}^{\\prime} = \\mathbf{v} - 2~\\mathbf{n} (\\mathbf{n} \\cdot \\mathbf{v})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/02d\/684\/d3c\/02d684d3c22e394b53b58253175fd31b.svg\" width=\"161\" height=\"23\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/02d\/684\/d3c\/02d684d3c22e394b53b58253175fd31b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/02d\/684\/d3c\/02d684d3c22e394b53b58253175fd31b.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<hr\/>\n<h3>\u0428\u0430\u0440\u0438\u043a \u0432 \u043e\u0431\u043e\u0434\u0435<\/h3>\n<p>\u0421\u043a\u0430\u0436\u0435\u043c<\/p>\n<pre><code class=\"dart\">Circle[] \/\/ Graphics<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c50\/6d5\/cf9\/c506d5cf929747a03f1c52cbdae6db86.png\" width=\"622\" height=\"232\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c50\/6d5\/cf9\/c506d5cf929747a03f1c52cbdae6db86.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c50\/6d5\/cf9\/c506d5cf929747a03f1c52cbdae6db86.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448\u0438\u043c \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c. \u0422.\u0435. \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 &#171;\u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439&#187; \u043e\u0431\u043e\u0434\u0430<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">With[{   p = Unique[\"bbb\"],    frame = CreateUUID[],   circ = {0,0} },   p = Table[{0,0}, {3}];    EventHandler[frame, Function[Null,     Module[{b = p, \\[Delta]t = 0.01},       Do[         If[Norm[b[[1]]-circ] &gt; 1.0,           With[{n = -Normalize[b[[1]]-circ], delta = b[[1]]-b[[2]]},             b[[2]] = b[[1]];             b[[1]] = b[[1]] -  n (n.delta);           ]         ];          b[[3]] = b[[2]];         b[[2]] = b[[1]];         b[[1]] = 2 b[[2]] - b[[3]] + {0,-1} \\[Delta]t \\[Delta]t;       , {5}];            p = b;     ];   ]];    Graphics[{     Circle[circ, 1.0],      Lighter[Lighter[Red]], Disk[p[[3]]\/\/Offload, 0.01],     Lighter[Red], Disk[p[[2]]\/\/Offload, 0.01],     Red, Disk[p[[1]]\/\/Offload, 0.01],     AnimationFrameListener[p\/\/Offload, \"Event\"-&gt;frame]   }, PlotRange-&gt;{{-1,1}, {-1,1}}, AspectRatio-&gt;1] ]<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430 \u0435\u0441\u043b\u0438 \u043e\u0431\u043e\u0434 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u043d, \u043c\u044b \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e, \u043a\u043e\u0433\u0434\u0430 \u0448\u0430\u0440\u0438\u043a \u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e&#8230; \u0410 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0431\u043e\u0434 <strong>\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u043c<\/strong><\/p>\n<pre><code class=\"dart\">With[{   p = Unique[\"bbb\"],    frame = CreateUUID[],   circ = Unique[\"bbb\"] },   circ = {0,0};   p = Table[{0,0}, {3}];    EventHandler[frame, Function[Null,     Module[{b = p, \\[Delta]t = 0.01},       Do[         If[Norm[b[[1]]-circ] &gt; 1.0,           With[{n = -Normalize[b[[1]]-circ], delta = b[[1]]-b[[2]]},             b[[2]] = b[[1]];             b[[1]] = b[[1]] -  n (n.delta);           ]         ];          b[[3]] = b[[2]];         b[[2]] = b[[1]];         b[[1]] = 2 b[[2]] - b[[3]] + {0,-1} \\[Delta]t \\[Delta]t;       , {5}];            p = b;     ];   ]];   {   Graphics[{     Circle[circ\/\/Offload, 1.0],      Lighter[Lighter[Red]], Disk[p[[3]]\/\/Offload, 0.01],     Lighter[Red], Disk[p[[2]]\/\/Offload, 0.01],     Red, Disk[p[[1]]\/\/Offload, 0.01],     AnimationFrameListener[p\/\/Offload, \"Event\"-&gt;frame]   }, PlotRange-&gt;{{-1,1}, {-1,1}}, AspectRatio-&gt;1],    (* \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0432\u043e\u0434\u0430 *)               EventHandler[InputJoystick[], Function[xy, circ = xy]]  } \/\/ Column ]<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/264\/cbc\/931\/264cbc93102af9a8f3fbe16bc651fb32.gif\" width=\"800\" height=\"433\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/264\/cbc\/931\/264cbc93102af9a8f3fbe16bc651fb32.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/264\/cbc\/931\/264cbc93102af9a8f3fbe16bc651fb32.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u041f\u043e\u0447\u0442\u0438&#8230; \u041d\u043e \u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0421\u0430\u043c \u043e\u0431\u043e\u0434 (\u0438\u043b\u0438 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 \u0443\u0433\u043e\u0434\u043d\u043e) \u0442\u043e\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u0438\u043c\u043f\u0443\u043b\u044c\u0441. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0438\u0445 \u0448\u0430\u0440\u0438\u043a\u0443.<\/p>\n<hr\/>\n<h3>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430<\/h3>\n<p><em>\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u043e  \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0442\u0441\u0447\u0451\u0442\u0430 (\u0421\u041e).<\/em><\/p>\n<p>\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0451\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0442\u0441\u0447\u0451\u0442\u0430 \u043e\u0431\u043e\u0434\u0430 (\u0434\u0432\u0438\u0436\u0443\u0449\u0443\u044e\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c)<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5db\/408\/0a9\/5db4080a94cc4779d261beb6a1cef1fa.png\" width=\"835\" height=\"356\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5db\/408\/0a9\/5db4080a94cc4779d261beb6a1cef1fa.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5db\/408\/0a9\/5db4080a94cc4779d261beb6a1cef1fa.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u043e\u0434\u0430 \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e, \u043e\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u043d. \u041c\u044b \u0440\u0435\u0448\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438 \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e (\u0441\u0442\u0430\u0446\u0438\u043e\u043d\u0430\u0440\u043d\u0443\u044e) \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0442\u0441\u0447\u0451\u0442\u0430<\/p>\n<pre><code class=\"dart\">u[[1]] = u[[1]] - rimVel;                  With[{   n = -Normalize[u[[1]]-circ[[2]]],    delta = u[[1]]-u[[2]] },   u[[2]] = u[[1]];   u[[1]] = u[[1]] -  0.8 n (n.delta); ];    u[[1]] = u[[1]] + rimVel;<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0448\u0430\u0440\u0438\u043a\u043e\u0432<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">With[{   p = Unique[\"bbb\"],   circ = Unique[\"bbb\"],   target = Unique[\"bbb\"],   frame = CreateUUID[] },   p = Table[RandomReal[{-1,1}, 2]0.001, {3}, {100}];   circ = {{0,0}, {0,0}};   target = {0,0};      EventHandler[frame, Function[Null,     Module[{b = p, \\[Delta]t = 0.005},       Do[         circ[[1]] = circ[[1]] + \\[Delta]t (target - circ[[1]]);          (* \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0440\u0438\u043a\u0430 *)                  b[[{1,2}]] = MapThread[If[Norm[#1-circ[[2]]] &gt; 1.0, Module[{           u = {#1, #2},           vel = (circ[[1]] - circ[[2]])         },            (* \u043c\u0435\u043d\u044f\u0435\u043c \u0421\u041e *)                                                                               u[[1]] = u[[1]] - vel;                                 With[{n = -Normalize[u[[1]]-circ[[2]]], delta = u[[1]]-u[[2]]},             u[[2]] = u[[1]];             u[[1]] = u[[1]] -  0.8 n (n.delta);           ];            (* \u043c\u0435\u043d\u044f\u0435\u043c \u0421\u041e \u043e\u0431\u0440\u0430\u0442\u043d\u043e *)                                                                                   u[[1]] = u[[1]] + vel;            (* \u043a\u043b\u0438\u043f\u0443\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b\u0448\u043b\u0430 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b *)                                                                                 If[Norm[u[[1]]-circ[[2]]] &gt; 1.0,              u[[1]] += (1.0 - Norm[u[[1]]-circ[[2]]]) Normalize[u[[1]]-circ[[2]]];           ];              u         ], {#1, #2}]&amp;, {b[[1]], b[[2]]}] \/\/ Transpose;          (* \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435 *)                  b[[3]] = b[[2]];         b[[2]] = b[[1]];         b[[1]] = 2 b[[2]] - b[[3]] + Table[{0,-1}, {Length[b[[1]]]}] \\[Delta]t \\[Delta]t;               circ[[2]] = circ[[1]];       , {10}];          circ = circ;          p = b;     ];   ]];    {     Graphics[{       Circle[circ[[1]] \/\/ Offload, 1.0],        Pink, Point[p[[1]] \/\/ Offload],       AnimationFrameListener[p\/\/Offload, \"Event\"-&gt;frame]     }, PlotRange-&gt;{1.4{-1,1}, 1.4{-1,1}}, AspectRatio-&gt;1, ImageSize-&gt;Medium, TransitionType-&gt;None],        EventHandler[InputJoystick[], Function[xy, target = xy;]]   } \/\/ Row ]<\/code><\/pre>\n<\/div>\n<\/details>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/91f\/e2c\/1ec\/91fe2c1ec1ab9d1ba54ccb7a2c8463e4.gif\" width=\"800\" height=\"433\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/91f\/e2c\/1ec\/91fe2c1ec1ab9d1ba54ccb7a2c8463e4.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/91f\/e2c\/1ec\/91fe2c1ec1ab9d1ba54ccb7a2c8463e4.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0430\u043a \u0442\u043e \u043b\u0443\u0447\u0448\u0435!<\/p>\n<h4>\u0428\u0430\u0440\u0438\u043a\u0438 \u0438 \u0441\u0442\u0435\u0440\u0436\u043d\u0438 (Constraint Algorithm)<\/h4>\n<p>\u041f\u0440\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u0448\u0430\u0440\u0438\u043a\u0430\u043c\u0438, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0435\u0440\u0436\u043d\u044f\u043c\u0438, \u044f\u0432\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043d\u0430\u0442\u044f\u0436\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 &#8212; \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0441\u0438\u0432\u043e. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0440\u0430\u0441\u0447\u0451\u0442\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u044f \u0432\u043e\u0437\u043d\u044f \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0441\u0438\u043b\u0430\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 <em>\u0437\u0430 \u043a\u0430\u0434\u0440\u043e\u043c<\/em>. <\/p>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/906322\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0443<\/a> \u2702\ufe0f<\/p>\n<blockquote>\n<p>&#8230; \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0433\u0440\u0430\u0444\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0431\u044b \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0439, \u043d\u043e \u043c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e\u00a0<em><img decoding=\"async\" class=\"formula inline\" source=\"x_i\" alt=\"x_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4ce\/4fd\/fa9\/4ce4fdfa94ca2a468087123b0a463e9d.svg\" width=\"18\" height=\"15\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4ce\/4fd\/fa9\/4ce4fdfa94ca2a468087123b0a463e9d.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4ce\/4fd\/fa9\/4ce4fdfa94ca2a468087123b0a463e9d.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/em><\/p>\n<p>\u0416\u0435\u0441\u0442\u043a\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0445 \u0441\u0432\u044f\u0437\u0435\u0439 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044b \u044d\u0442\u0438\u0445 \u0441\u0432\u044f\u0437\u0435\u0439. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0451\u0442 \u0435\u0441\u0442\u044c\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Constraint%5C_(computational%5C_chemistry)\" rel=\"noopener noreferrer nofollow\">\u0446\u0435\u043b\u0430\u044f \u043d\u0430\u0443\u043a\u0430<\/a>, \u043a\u0430\u043a \u043d\u0435 \u0440\u0435\u0448\u0430\u0442\u044c \u0434\u0438\u0444\u0444\u0443\u0440\u044b, \u0430 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0438\u0432\u043d\u044b\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<\/p>\n<\/blockquote>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c5b\/efb\/e83\/c5befbe837ddc357f2d8c6829231a492.png\" alt=\"\u0414\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u0441\u043e \u0448\u043f\u0438\u0446\u0440\u0443\u0442\u0435\u043d\u0430\u043c\u0438\" title=\"\u0414\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u0441\u043e \u0448\u043f\u0438\u0446\u0440\u0443\u0442\u0435\u043d\u0430\u043c\u0438\" width=\"783\" height=\"298\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c5b\/efb\/e83\/c5befbe837ddc357f2d8c6829231a492.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c5b\/efb\/e83\/c5befbe837ddc357f2d8c6829231a492.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u0441\u043e \u0448\u043f\u0438\u0446\u0440\u0443\u0442\u0435\u043d\u0430\u043c\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e \u043c\u0435\u0442\u043e\u0434\u0443 \u0412\u0435\u0440\u043b\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c &#8212; <em>\u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u0441\u043e \u0448\u043f\u0438\u0446\u0440\u0443\u0442\u0435\u043d\u0430\u043c\u0438<\/em>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0432\u043b\u0438\u044f\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u043e\u0431\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u00ab\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u00bb (\u0438\u043c\u043f\u0443\u043b\u044c\u0441, \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0438 \u0442.\u0434.) \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0443\u0437\u043b\u043e\u0432. \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0435\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448\u0430 \u0441\u0435\u0442\u043a\u0430 \u0438\u0437 \u0441\u0432\u044f\u0437\u0435\u0439 \u0443\u0434\u0430\u0440\u044f\u0435\u0442\u0441\u044f \u043e \u0437\u0435\u043c\u043b\u044e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d, \u0432\u0441\u0451 \u0442\u0435\u043b\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0442\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e.<\/p>\n<p>\u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u0442\u043e\u0442, \u0447\u0442\u043e \u0432\u044b (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e) \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 YT Shorts:<\/p>\n<h4>Image to Mesh<\/h4>\n<p><em>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0451\u0440\u043d\u043e-\u0431\u0435\u043b\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0435\u0442\u043a\u0443 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d<\/em><\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"dart\">dude = \"1:eJztXWeIHVUU3uxmk6hBYwM7idg7iknEmkQJCRp1N7GAhU3ydo0ku7q7EQv+UYP\/NFhTFLGggg2JgjVGNBqjoGAEEeIaBXuNdU053uOcj3fezZ15896Wd2fevfDtm51y55zz3XPb3DkzYW5XS\/vIhoaGnmbzZ8aito5CeyP\/O9b8mbV4UaF7wbwp3d1tN8xtMjvmC\/gCIsoaRhg0GYwUNDrQ5IGceUej2D\/t+U3CXTX3GSFo9EBvH6HtwpxMN2g3WGqw1mCd4F2D1Qaz1fnVcBIQD9Q9BxksMfiE0qVeg90q4AR+caTBWwZvynbwkx25mGbwk7L1NoMtgq0ObJPzNhkcm9KmqN8eVfd51JKjngH7TTH4U+zzr7J1ufSP\/N4t+ZRre3A\/ru\/A65vWsawBfZumAeqA9nRfgx\/ErlvTkKAS+w5zt4LK84H77WnwpcF2yWO9Ol5r29YSsF2v2OXfVAyUJvhRH0XtCGzuuh\/qo+PU\/ZiTpZY8WQF84XCDRwyepPT1dhIfK8UuW9IQ4EjwqTll7Iq24145H\/xPUcdrbeNq+FirbLHeOlYNH8skr2r54OuYz6co3q7g4lTrXl8b7ELJfuUrIO\/bog+3pf0GhyXYIQ0fyy0bVZrgHx9Ycrru9SxF3PXLdVdUKbsPgE5zRP9++V1epU6Dzcc6cvOB+1xkyf1KlXL7Avj0KIONFJUz9BnHU3FeqVI+BlpfJfEBeSYYfE9R+w8+zqLsz4PBhteJTn\/L752yv7mKvFZIHgPl430q5QPl4wCDz+UcjFeq9WnfgPmG\/Q1+FVug33g5ldo5LR93i40G2p4\/TqU2Rv4vy3nwi88MdlW61Nqmg+UjnaLfP2IPHtMdbNkkCTjnLMkn7ZjcTuCxRckHP10kx\/pFxj4lY1bH40mcPCz6oh74WB1Lwwls8gYV26NKErjgOd9myQ9c8HxYv5wDH55kyZ8XwNd57mGj2ATjK64fDkqpt+0jlfABf+J5r6Mln9HyO9XgLyr2bTndKMcqaeOyBJTtQwx+t3Tn9nMCFTlJqhtw7Hm5Ng0n4IL7E2fL9aOolAtO8NtVVMp\/XoHyf6WyFWywSdkKtgA3uh3FfMtYitpabW9XwjzgLwZnWPKcT8V5YsjxGkVj8Ly03+WAMnca7divZNvx84UTHNeNUEAdwn00PO9wpe2C3yhqH8YY7GMwk6LxHRL89HWDnSTvPLXfaTnhOupTZROUc7Yv83KZwRGUXG+8qK6JS5w3zz1xn\/sXtR\/PrzixX9QjFwDqrnEUzf1q2+n6h7eZs\/cc4PnJ7+S87eROfL3NFfpRSM8Z7Ez1ywWgdWdf+FDZSM\/jlUtxXJRLXGedo2Soh\/aiHPTzEK6XmJd3qDi3Um2Cj\/EYh+dY+LnJMgH3ZU9RMtRL210J7DaC25aZYjtuI7B+x1Vv\/Si2136C+ujphHtiHV2tdfcVsE+lZXWJxYHmZjNF401ur0ZRcQ1j4KEyYG5bj0FsjJTfMymqn+xxCNqeVskzb\/MevgF+xOX+C7G95gRzuZj7CHwMPdAXWCMc6P6YfvYU2uzhAcr8rWJ7VxvyB0XrthoCJ0MO+Md4iuaiMEdic4K589CODy1Q3vkZHtbzuviYGPgYVj72MPg58FFzgI\/dAx9eIPDhFwIffiHw4RcCH34h8OEXAh9+IfDhFwIffiHw4RcCH34h8OEXAh9+IfDhFwIffiHw4RcCH34h8OEXAh9+IfDhFwIffiEtH5OodM1vWBc3+DxwWW8WG+9Vho+THHkgXmy1cWDrHbBfXIykJD74fU72oT3ld3RMHvX8vlpauN6b4fVvJ1P0ju1tFL0DiPXsrsTvgfys0EfR+7R3GFxIxXc5wXvgxQ1tF8Tb5XgXeCdqsNJGyfsodb\/Q9heBtpe3R4utfrVsiBgmSe+g63M18N6tfS3H8XjG4BgqclLvbYv2CY4N8I6yF2K2VvtObVxCPGUkjukxL0amegJ8gutz9gnEFklqGwY7aV4epCh+BstUT\/WXbkOPp9J30ZPiYeh6R\/tOOWxV58fljft+RMV4N\/XAidbxKoreZyKK94lqYl8lJR3f3U6IC6VjEOW57gIXHIfpBWWHOPvY7wf2URSf7D6DqymKjTVJMNEB3j+Zon4yx3H8KiZvnVB\/cR+MYw\/m9fsGaCs4BhXivCT5BOzC44ceimLNjBmgDDw25Li66DPE9RVw7zWUz3Gj5kK32a6kyy1\/h+MIKy+M2zH3kQZ2TAAu80vUfVz+ibrrEkuHrMPFhUt\/2yeupeJYwBWrrBroOUb+fxYVY5S54guwTBsoPz6CMslx6ZO40Ptepah9gf2Gwg46zhnPdbne1eUEX82Dj4CL8ZT8DQ9wwXxdT6U+MdQyghOOw+TqD9s+ktWxO8o0j\/PWJ3CBfdyXQdy+4e7PgJMnRBa7XYOMl9LwlZPBBOzJ49zXLJ1ceuq+fi3ireJbPhwX1tXfw76XqLSsZQWop1YpfdJwUctyB5kfc8iMOuwLGnh\/e7gBm3aJDojlqRP04zrKl3kJzOtyHDnMy9iJ+7\/4nkkWfMSOp+8aayFuFcdkRR\/Kh\/pYP5d3xeGAP19Apc8GfAbK+EMiu11P6XJ3rkdcaE4Y6ywOtC53WLr6Cvgvxx9GfPC4vvzVHnKh5XmAdvyGGMrRN1TZNz9rrUu3ZXubi5s85ULLNLuMDi3W+T5Cf1\/Nnh9H2dpAxTiJPpYt1Ffch0Jsc1c8wLs85wO23ZuKz7xdsVg7PddDy7bUkp1TuW+D+QK0bdNFXldfkfVCf8rnviL4aLU44IQyxmtd9vCYE+hws7I9ErjhmOzNnsqvgbJyKLm\/0Yp+yolUWhZ9gu6X2Hxg+2GP5XeB25A+kV37exbme5O+FYjt+z2W3wZ8xDX3Bn1u8VifpG9pYnu5da7PgIz3JOjzgpzjo7\/nlY\/5Dn30N7yxBti3NjFvfKDMTxbZXevn+XnyuMDHsPJxcgIfvGbsADnPt\/573vhAeee5uM0OTlBnzaBS\/nyB5sOeh8Mcw8oM8QFOuNx\/JHq4+lgdnupkf9dZP4PCmOpaT2WPA+qg1TF8cBlr81QnPIfi589Yy6S\/Lcc+fyBla90lbMzf4eP6SY\/Vwc3pco5v9ZUuT7yWaZOS\/SfZp8\/JAmDjixUHXL70N195vYbP7+7C3vztgfME+2WQC1uf26k0fUtRXzgLernk813mJKDs8zr5aygaI+6fMb3wfizWNdVanoEib2UsD8Aa+bysqw4IyCRaxzU0NMzp7FnQ0VmYP6Ozt9BR6J7cOtLsnHpDb6G90Wz08H8tixcWenY2G9O6FnZ1t17TNq\/Q2sT7p0+1ThprNjij7oWFtusWdHb8f2R29+LCfwMzo0I=\" \/\/ Uncompress;<\/code><\/pre>\n<p>\u041e\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u0448\u043b\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c, \u043d\u043e \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0447\u0438\u043d\u0438\u0442\u044c<\/p>\n<pre><code class=\"dart\">dude \/\/ Colorize<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95a\/64f\/5ed\/95a64f5ed0be30a7b7865645aaa4c031.png\" width=\"623\" height=\"135\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/95a\/64f\/5ed\/95a64f5ed0be30a7b7865645aaa4c031.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/95a\/64f\/5ed\/95a64f5ed0be30a7b7865645aaa4c031.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0417\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u0435\u0442\u043a\u0443, \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0435\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0433\u0440\u0430\u043d\u0438<\/p>\n<pre><code class=\"dart\">SetAttributes[UndirectedEdge, Orderless];  getMesh[img_Image] := With[{   mesh = TriangulateMesh[ImageMesh[img], MaxCellMeasure-&gt;{\"Area\"-&gt;45}] }, Module[{   vertices = MeshCoordinates[mesh],   edges = (Cases[mesh\/\/MeshCells, _Polygon, 2] \/. {   Polygon[{a_, b_, c_}] :&gt; Sequence[UndirectedEdge[a,b], UndirectedEdge[b,c], UndirectedEdge[a,c]] } \/\/ DeleteDuplicates) \/. {UndirectedEdge -&gt; List} },   {vertices, edges} ] ]<\/code><\/pre>\n<blockquote>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0449\u0435, \u0430\u0432\u0442\u043e\u0440 \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0438 \u0433\u0440\u0430\u0444\u043e\u0432 \u0432 Wolfram. MeshCells \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u0438\u043d\u0438\u0438 \u0438 \u043f\u043e\u043b\u0438\u0433\u043e\u043d\u044b, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u0437\u0430\u043c\u0435\u043d \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0451\u0431\u0440\u0430<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u043e \u043d\u0430 \u043d\u0430\u0448\u0435\u0433\u043e <code>dude<\/code><\/p>\n<pre><code class=\"dart\">dudeMesh = dude \/\/ getMesh; Graphics[GraphicsComplex[%[[1]], {Line \/@ %[[2]]}]]<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0f7\/445\/0b5\/0f74450b5a3456d0f8da65b8f39546bc.png\" width=\"625\" height=\"404\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0f7\/445\/0b5\/0f74450b5a3456d0f8da65b8f39546bc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0f7\/445\/0b5\/0f74450b5a3456d0f8da65b8f39546bc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433<\/h4>\n<p>\u0423 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Graphics<\/code> \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043b\u0438\u043d\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u0441\u044f \u043e\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 (SVG). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f Canvas API<\/p>\n<pre><code class=\"dart\">Needs[\"Canvas2D`\"-&gt;\"ctx`\"] \/\/ Quiet;<\/code><\/pre>\n<p>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0432\u0441\u0435\u0445 \u0441\u0442\u0435\u0440\u0436\u043d\u0435\u0439 \u0438 \u0448\u0430\u0440\u0438\u043a\u043e\u0432<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">drawBonds[context_, vert_, edges_] := Module[{},    ctx`ClearRect[context, {0,0}, {500,500}];    ctx`BeginPath[context];   ctx`SetLineWidth[context, 4];   ctx`SetStrokeStyle[context, RGBColor[0.4, 0.6, 0.9]];    Do[     ctx`MoveTo[context, {0, 500} - {-5, 5} vert[[p[[1]]]]];     ctx`LineTo[context, {0, 500} - {-5, 5} vert[[p[[2]]]]];   , {p, edges}];    ctx`Stroke[context];    ctx`SetFillStyle[context, RGBColor[0.4, 0.9, 0.6]];    (     ctx`BeginPath[context];     ctx`Arc[context, {0, 500} - {-5, 5} #, 6, 0, 2.0 Pi];     ctx`Fill[context];   ) &amp;\/@ vert;    ctx`Dispatch[context]; ];<\/code><\/pre>\n<\/div>\n<\/details>\n<h4>\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f<\/h4>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u2014 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438<\/p>\n<details class=\"spoiler\">\n<summary>\u0424\u0443\u043d\u043a\u0446\u0438\u044f &#8212; \u0444\u0430\u0431\u0440\u0438\u043a\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">generatorSimulation[finalVerts_, finalBonds_] := Module[{   coords, coords3, coords2 },  coords = finalVerts; coords2 = finalVerts; coords3 = finalVerts;  Function[Null, Do[     (* \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435 *)        coords3 = coords2;     coords2 = coords;          Module[{       new = 2 coords2 - coords3 + Table[{0,-1}, Length[coords]] 0.0001     },                   (* \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0432\u044f\u0437\u0438 *)            MapThread[Function[{i,j,l}, With[{d = new[[i]]-new[[j]]}, With[{m = Min[(l\/(Norm[d]+0.001)) - 1), 0.1]},         new[[i]] +=  0.5 m d;         new[[j]] -=  0.5 m d;       ] ]], RandomSample[finalBonds]\/\/ Transpose];               new = Map[Function[xy,         If[xy[[2]] &lt; 0.0, {xy[[1]], 0.0}, xy]       ], new];              coords = new;     ];      , {2 5}];      coords ]]<\/code><\/pre>\n<\/div>\n<\/details>\n<pre><code class=\"dart\">{finalVerts, finalPairs} = dudeMesh;  finalBonds = {     finalPairs[[All,1]], (* \u043f\u0435\u0440\u0432\u044b\u0435 \u0443\u0437\u043b\u044b *)     finalPairs[[All,2]], (* \u0432\u0442\u043e\u0440\u044b\u0435 \u0443\u0437\u043b\u044b *)     (* \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043b\u0438\u043d\u044b *)     Norm[finalVerts[[#[[1]]]] - finalVerts[[#[[2]]]]] &amp;\/@ finalPairs } \/\/ Transpose;  With[{   context2D = ctx`Canvas2D[],   frame = CreateUUID[],   calc = generatorSimulation[{#[[1]], #[[2]] + 50.0} &amp;\/@ finalVerts, finalBonds] },         EventHandler[frame, Function[Null,     drawBonds[context2D, calc[], finalPairs]   ]];         Image[context2D, ImageResolution-&gt;{500,500}, Epilog-&gt;{     AnimationFrameListener[context2D, \"Event\"-&gt;frame]   }] ]<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fdd\/4a1\/a5e\/fdd4a1a5e1045c3d587cdd6a40656205.gif\" width=\"800\" height=\"315\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fdd\/4a1\/a5e\/fdd4a1a5e1045c3d587cdd6a40656205.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fdd\/4a1\/a5e\/fdd4a1a5e1045c3d587cdd6a40656205.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u0417\u0430\u0434\u0430\u0447\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 \u0442\u0435\u043b<\/h3>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0438 \u0448\u0438\u0440\u043e\u043a\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0438\u0437\u0438\u043a\u0435 (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c) \u2014 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438, \u0433\u0434\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043f\u043e\u043f\u0430\u0440\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0441\u043e <em>\u0448\u043f\u0438\u0446\u0440\u0443\u0442\u0435\u043d\u0430\u043c\u0438<\/em>, \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0448\u0430\u0440\u043e\u0432 \u0438\u043b\u0438 \u0434\u0438\u0441\u043a\u043e\u0432 <strong>\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439<\/strong>. \u0422\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c, \u043d\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0451\u043d\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0447\u0430\u0441\u0442\u0438\u0446\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0443\u043f\u0440\u0443\u0433\u043e, \u0442\u0435\u0440\u044f\u044f \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u0438 \u044d\u043d\u0435\u0440\u0433\u0438\u044e \u0432 \u0442\u0435\u043f\u043b\u043e:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/125\/013\/d01\/125013d01af123af9de7e42fca16b62b.png\" width=\"871\" height=\"300\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/125\/013\/d01\/125013d01af123af9de7e42fca16b62b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/125\/013\/d01\/125013d01af123af9de7e42fca16b62b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u043a\u0430\u043a<br \/> <strong>N\u00b2<\/strong>, \u0433\u0434\u0435 <strong>N<\/strong> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0447\u0430\u0441\u0442\u0438\u0446. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c, \u043d\u043e \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u2014 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443.<\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0432 Wolfram Language \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>Compile<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043b\u0438\u0431\u043e \u0432 C, \u043b\u0438\u0431\u043e \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0430\u0439\u0442\u043a\u043e\u0434. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u044f\u0434 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">compiled = Compile[{   {p, _Real, 3}, {c, _Real, 2}, {target, _Real, 1} }, Module[{b = p, \\[Delta]t = 0.005, circ = c},     Do[              (* \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0434\u0430 *)              circ[[1]] = circ[[1]] + \\[Delta]t (target - circ[[1]]);              b[[{1,2}]] = MapThread[If[Norm[#1-circ[[2]]] &gt; 1.0, Module[{         u = {#1, #2},         vel = (circ[[1]] - circ[[2]])       },                   u[[1]] = u[[1]] - vel;                           With[{n = -Normalize[u[[1]]-circ[[2]]], delta = u[[1]]-u[[2]]},           u[[2]] = u[[1]];           u[[1]] = u[[1]] -  0.9 n (n.delta);         ];          u[[1]] = u[[1]] + vel;          If[Norm[u[[1]]-circ[[2]]] &gt; 1.0, (*clamp to the region *)           u[[1]] += (1.0 - Norm[u[[1]]-circ[[2]]]) Normalize[u[[1]]-circ[[2]]];         ];          u       ], {#1, #2}]&amp;, {b[[1]], b[[2]]}] \/\/ Transpose;        b[[3]] = b[[2]];       b[[2]] = b[[1]];       b[[1]] = 2 b[[2]] - b[[3]] + Table[{0,-1}, {Length[b[[1]]]}] \\[Delta]t \\[Delta]t;       (* \u0421\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0448\u0430\u0440\u0438\u043a\u043e\u0432 *)            Do[       Do[         If[i &lt; j,           Module[{pi = b[[1, i]], pj = b[[1, j]], d, dist, n, overlap},             d = pj - pi;             dist = Norm[d];             If[dist &lt; 0.05, (* \u044f\u0432\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441 *)               n = Normalize[d];               overlap = 0.05 - dist;               b[[1, i]] -= 0.5 overlap n;               b[[1, j]] += 0.5 overlap n;             ];           ]         ],         {j, Length[b[[1]]]}       ],       {i, Length[b[[1]]]}     ];            circ[[2]] = circ[[1]];            , {10}];      (* \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 *)     b[[-1, 1]] = circ[[1]];     b[[-1, 2]] = circ[[2]];      b   ], CompilationOptions -&gt; {\"InlineExternalDefinitions\" -&gt; True},      \"CompilationTarget\" -&gt; \"C\",\"RuntimeOptions\" -&gt; \"Speed\"];<\/code><\/pre>\n<p>\u0412 Wolfram Language \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0434\u0442\u0438 \u043d\u0430 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c: \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0442\u0435\u043d\u0437\u043e\u0440, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>Part<\/code>. <\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0443\u0436\u0435 \u043e\u0442 \u043d\u0430\u0441 \u2014 \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0430\u0448\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b:<\/p>\n<pre><code class=\"dart\">With[{   p = Unique[\"ppp\"],   toDraw = Unique[\"ppp\"],   circ = Unique[\"ppp\"],   target = Unique[\"ppp\"],   frame = CreateUUID[] },   p = Table[Exp[-i\/80.0]{Sin[i], Cos[i]}, {3}, {i, 100}];   toDraw = p[[1]];   circ = {{0,0}, {0,0}};   target = {0,0};    EventHandler[frame, Function[Null,       With[{         c = compiled[Join[p, {p[[3]]}], circ, target]       },         (* \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 *)            circ = c[[4, {1,2}]];         p = c[[1;;3]];         toDraw = p[[1]];       ]   ]];    {     Graphics[{       PointSize[0.03],       Circle[circ[[1]] \/\/ Offload, 1.0],        Pink, Point[toDraw \/\/ Offload],       AnimationFrameListener[p\/\/Offload, \"Event\"-&gt;frame]     },        PlotRange-&gt;{1.4{-1,1}, 1.4{-1,1}},        AspectRatio-&gt;1, ImageSize-&gt;Medium,        TransitionType-&gt;None     ],      EventHandler[InputJoystick[], Function[xy, target = xy;]]   } \/\/ Row ]<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/98e\/13a\/967\/98e13a96777ff2b1c77b2a44eeaf4d05.gif\" width=\"800\" height=\"315\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/98e\/13a\/967\/98e13a96777ff2b1c77b2a44eeaf4d05.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/98e\/13a\/967\/98e13a96777ff2b1c77b2a44eeaf4d05.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0441 \u044d\u0442\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u043b\u0435\u043a\u043e.<\/p>\n<h3>\u0411\u043e\u043d\u0443\u0441: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c Nintendo JoyCon<\/h3>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 3 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0439\u0442\u0438 \u0435\u0449\u0435 \u0434\u0430\u043b\u044c\u0448\u0435, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c Nintendo JoyCon <a href=\"https:\/\/habr.com\/ru\/articles\/904196\/\" rel=\"noopener noreferrer nofollow\"><strong>\u043a\u0430\u043a \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/strong><\/a> \u0438 \u0432\u0437\u044f\u0442\u044c \u0437\u0430 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0434\u0430 (\u0441\u0444\u0435\u0440\u044b) \u0432\u0435\u043a\u0442\u043e\u0440 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/646\/743\/4ae\/6467434ae3d3efbd4e90af1b26f10cb1.gif\" width=\"800\" height=\"450\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/646\/743\/4ae\/6467434ae3d3efbd4e90af1b26f10cb1.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/646\/743\/4ae\/6467434ae3d3efbd4e90af1b26f10cb1.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u0411\u043e\u043d\u0443\u0441: \u043f\u043e\u0438\u0433\u0440\u0430\u0435\u043c \u0432 \u0431\u0438\u043b\u044c\u044f\u0440\u0434<\/h3>\n<p><strong>\u0412\u044b\u043a\u0438\u043d\u0435\u043c \u043e\u0431\u043e\u0434<\/strong>, <strong>\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043c \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u044e<\/strong> \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043a\u043e\u0434 \u0432 \u043f\u043e\u0440\u044f\u0434\u043e\u043a<\/p>\n<details class=\"spoiler\">\n<summary>compiled<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">compiled = Compile[{   {p, _Real, 3} }, Module[{b = p},     Do[        b[[3]] = b[[2]];       b[[2]] = b[[1]];       b[[1]] = 2 b[[2]] - b[[3]];      (* Particle-particle collisions *)     Do[       Do[         If[i &lt; j,           Module[{pi = b[[1, i]], pj = b[[1, j]], d, dist, n, overlap},             d = pj - pi;             dist = Norm[d];             If[dist &lt; 0.1,               n = Normalize[d];               overlap = 0.1 - dist;               b[[1, i]] -= 0.5 overlap n;               b[[1, j]] += 0.5 overlap n;             ];           ]         ],         {j, Length[b[[1]]]}       ],       {i, Length[b[[1]]]}     ];        , {3}];      b   ], CompilationOptions -&gt; {\"InlineExternalDefinitions\" -&gt; True},      \"CompilationTarget\" -&gt; \"C\",\"RuntimeOptions\" -&gt; \"Speed\"];<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u0448\u0438 \u0448\u0430\u0440\u044b \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a<\/p>\n<pre><code class=\"dart\">p = With[{s =    Join @@ Table[Table[{1-y,x}, {x, -1.0 + y,1.0 - y, 0.1}], {y, 0,1.0, 0.1}] }, {s,s,s}];<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/346\/58f\/a33\/34658fa33ed380334519ae71783b7049.png\" width=\"605\" height=\"214\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/346\/58f\/a33\/34658fa33ed380334519ae71783b7049.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/346\/58f\/a33\/34658fa33ed380334519ae71783b7049.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0440, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435<\/p>\n<pre><code class=\"dart\">p[[1, -1]] = {-2,0}; p[[2, -1]] = {-2.05,0}; p[[3, -1]] = {-2,0};<\/code><\/pre>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435<\/p>\n<pre><code class=\"dart\">p = Module[{s =      Join @@ Table[Table[{1-y,x}, {x,-1.0 + y, 1.0 - y,0.1}], {y, 0,1.0,0.1}] },     s = Append[s, {0,0}];     {s,s,s} ];  p[[1, -1]] = {-2,0}; p[[2, -1]] = {-2.05,0}; p[[3, -1]] = {-2,0};  pDraw = p[[1]];  EventHandler[\"frame\", Function[Null,     p = compiled[p];     pDraw = p[[1]]; ]];  Graphics[{     PointSize[0.03],     Pink, Point[pDraw \/\/ Offload],     AnimationFrameListener[pDraw\/\/Offload, \"Event\"-&gt;\"frame\"]   } , PlotRange-&gt;3{{-1,1}, {-1,1}},    AspectRatio-&gt;1, ImageSize-&gt;Medium,    TransitionType-&gt;None ]<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a6\/f26\/472\/3a6f264722a76289981d64a9f175bfac.gif\" width=\"570\" height=\"268\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a6\/f26\/472\/3a6f264722a76289981d64a9f175bfac.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a6\/f26\/472\/3a6f264722a76289981d64a9f175bfac.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0438\u0434\u0438\u043c\u043e \u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0432 \u0431\u0438\u043b\u044c\u044f\u0440\u0434\u0435 \ud83e\udee4<\/p>\n<p>\u0410\u0445 \u0434\u0430, \u0448\u0430\u0440\u044b&#8230; \u041f\u043e\u043f\u0440\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0443 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u0432 \u043d\u0430\u0447\u0430\u043b\u0435<\/p>\n<pre><code class=\"dart\">p = Module[{s =    With[{r=0.04}, {d=2r}, Flatten[    Table[      {d i, (j - i\/2) d Sqrt[3]},         {i, 0, 8},                          {j, 0, i}                        ],    1   ]] },      s = Append[s, {0,0}];     {s,s,s} ];<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/31d\/eb1\/888\/31deb1888334ffe7ed7351561e897a7d.gif\" width=\"570\" height=\"268\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/31d\/eb1\/888\/31deb1888334ffe7ed7351561e897a7d.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/31d\/eb1\/888\/31deb1888334ffe7ed7351561e897a7d.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0430\u043a \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \ud83e\udd73<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/938678\/\"> https:\/\/habr.com\/ru\/articles\/938678\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435\u0301 \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0448\u0430\u0442\u044c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0438 \u0432 \u043c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u0444\u0438\u0437\u0438\u043a\u0438, \u0438 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435 (cloth sim). \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0438\u0434\u0435\u043e \u0441 \u0435\u0433\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 (\u0441\u043c. YouTube Shorts \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0438 <a href=\"https:\/\/jerryi.github.io\/wljs-demo\/verlet.mp4\" rel=\"noopener noreferrer nofollow\">\u0437\u0435\u0440\u043a\u0430\u043b\u043e \u043d\u0430 GitHub<\/a>). <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0438\u0434\u0435\u044f \u00ab\u0447\u0438\u0441\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e\u00bb \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0441\u0435\u0442\u043a\u0430\u043c\u0438 \u0438 \u0438\u0433\u0440\u043e\u0439 \u0432 \u0431\u0438\u043b\u044c\u044f\u0440\u0434.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0438\u0434\u0435\u043e<\/summary>\n<div class=\"spoiler__content\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/68a4727d79b5b6ab9acde914\" data-style=\"\" id=\"68a4727d79b5b6ab9acde914\" width=\"\"><\/div>\n<p><strong>\u0417\u0435\u0440\u043a\u0430\u043b\u043e \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 \ud83e\ude9e <\/strong><a href=\"https:\/\/jerryi.github.io\/wljs-demo\/verlet.mp4\" rel=\"noopener noreferrer nofollow\">https:\/\/jerryi.github.io\/wljs-demo\/verlet.mp4<\/a><\/p>\n<\/div>\n<\/details>\n<blockquote>\n<p>\u042f \u0443\u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u043f\u043e\u0441\u0442 \u043e \u043c\u0435\u0442\u043e\u0434\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/906322\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u0440\u043b\u0435<\/a> \u2702\ufe0f, \u043a\u0440\u0430\u0442\u043a\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0432 \u0438\u0434\u0435\u0438, \u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u0432 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435.<\/p>\n<\/blockquote>\n<hr\/>\n<p>\u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0442\u0435\u043c\u0443, \u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 10 \u043b\u0435\u0442<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/841544\/\" rel=\"noopener noreferrer nofollow\">\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0442\u043a\u0430\u043d\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0421\u0442\u0451\u0440\u043c\u0435\u0440\u0430 \u2014 \u0412\u0435\u0440\u043b\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/775228\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u0440\u043b\u0435: \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/184724\/\" rel=\"noopener noreferrer nofollow\">\u0420\u044d\u0433\u0434\u043e\u043b\u043b \u0444\u0438\u0437\u0438\u043a\u0430 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<h4>\u041e\u0441\u043d\u043e\u0432\u044b<\/h4>\n<p>\u0412\u0441\u0435 \u0437\u0430\u0441\u043b\u0443\u0433\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u044d\u0442\u0438\u043c \u043b\u044e\u0434\u044f\u043c:  <\/p>\n<div class=\"persona\">\n<h5 class=\"persona__heading\">\u041b\u0443\u043f \u0412\u0435\u0440\u043b\u0435<\/h5>\n<p class=\"persona__text\">\u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439 \u0444\u0438\u0437\u0438\u043a, \u043f\u0438\u043e\u043d\u0435\u0440 \u0432\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%BE%D0%BB%D0%B5%D0%BA%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE-%D0%BA%D0%B8%D0%BD%D0%B5%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%5C_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u043b\u0435\u043a\u0443\u043b\u044f\u0440\u043d\u043e-\u043a\u0438\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438<\/a> (1967)<\/p>\n<\/div>\n<div class=\"persona\">\n<h5 class=\"persona__heading\">\u041a\u0430\u0440\u043b \u0421\u0442\u0451\u0440\u043c\u0435\u0440<\/h5>\n<p class=\"persona__text\">\u043d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a \u0438 \u0444\u0438\u0437\u0438\u043a (1907)<\/p>\n<\/div>\n<p>\u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0432\u0438\u0434\u0435\u043e, \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u0437 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041a\u0430\u0434\u0440 \u0438\u0437 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043d\u0430\u0441 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043a\u0430\u043a \u043a\u0438\u043d\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445, \u0442\u0430\u043a \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447:<\/p>\n<p>\u0433\u0434\u0435  \u2014 \u043d\u043e\u043c\u0435\u0440 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0448\u0430\u0433\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (). \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043d\u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0441\u0438\u043b\u044b.<\/p>\n<hr\/>\n<h3>\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e<\/h3>\n<blockquote>\n<p>\u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/wljs.io\/\" rel=\"noopener noreferrer nofollow\">WLJS Notebook<\/a> \ud83d\udce6 \u0432 \u0441\u0438\u043b\u0443 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435<\/p>\n<\/blockquote>\n<p>\u042d\u0442\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"dart\">With[{uid = CreateUUID[], ball = Unique[\"ball\"]},    (* \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0448\u0430\u0440\u0438\u043a\u0430 x3 *)      ball = Table[{0, 0}, {3}];    (* \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 *)          EventHandler[uid, Function[Null,     (* \u043c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435 *)                                     ball[[3]] = ball[[2]];     ball[[2]] = ball[[1]];      ball[[1]] = 2 ball[[2]] - ball[[3]] + {0, -1} 0.01;     If[ball[[1, 2]] &lt; -1.0, ball[[{1, 2}]] = ball[[{2, 1}]]];      (* \u0434\u0435\u0440\u0433\u0430\u0435\u043c \u0435\u0449\u0435 \u0440\u0430\u0437, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0448\u0430\u0440\u0438\u043a \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 *)                                         ball = ball;   ]];    (* \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 *)         Graphics[{     {Gray, Line[{{-1, 0}, {1, 0}}]},     Point[ball[[1]] \/\/ Offload],     AnimationFrameListener[ball \/\/ Offload, \"Event\" -&gt; uid]   }, PlotRange -&gt; {{-1, 1}, {-1, 1}}] ] <\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0442\u0440\u0438 , ,  \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0440\u0438\u043a\u0430 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u0435 <code>ball<\/code>. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0412\u0435\u0440\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432<\/p>\n<p>\u0433\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0447\u043b\u0435\u043d  \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u0441\u0438\u043b\u044b \u0442\u044f\u0436\u0435\u0441\u0442\u0438 \u043d\u0430 \u0448\u0430\u0440 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u044b \u043f\u043e\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430\u043a\u0430 .<\/p>\n<p><strong>\u0413\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f:<\/strong> \u0435\u0441\u043b\u0438 \u0448\u0430\u0440\u0438\u043a \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0437\u0435\u043c\u043b\u0438, \u043c\u044b \u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438  \u0438  \u2014 \u044d\u0442\u043e \u043d\u0435\u044f\u0432\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u043f\u0435\u0440\u0435\u0432\u043e\u0440\u043e\u0442\u00bb \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0442\u0432\u043e\u0440\u043e\u0442-\u043f\u043e\u0432\u043e\u0440\u043e\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/p>\n<figure class=\"full-width\"><\/figure>\n<h4>\u041f\u043e\u0442\u0435\u0440\u0438 \u043d\u0430 \u0442\u0435\u043f\u043b\u043e<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0447\u0435\u0441\u0442\u044c \u043d\u0435\u0443\u043f\u0440\u0443\u0433\u043e\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0442\u0440\u0430\u0436\u0451\u043d\u043d\u044b\u0439 \u0438\u043c\u043f\u0443\u043b\u044c\u0441 (\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c), \u0441\u043a\u0430\u0436\u0435\u043c \u0432 0.95 &#8212; 0.8 \u0440\u0430\u0437<\/p>\n<pre><code class=\"dart\">  If[ball[[1, 2]] &lt; -1.0,      With[{vel = ball[[1]]-ball[[2]]},       ball[[2]] = ball[[1]];       ball[[1]] = ball[[1]] - 0.95 vel;     ];   ];<\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<h4>\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/h4>\n<p>\u0414\u0430\u0436\u0435 \u043f\u0440\u0438 \u043c\u0430\u043b\u043e\u043c \u0448\u0430\u0433\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438  \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0434\u0430\u0440\u0430:<\/p>\n<figure class=\"full-width\"><\/figure>\n<blockquote>\n<p>\u0414\u0430, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u00ab\u0436\u0443\u043b\u044c\u043d\u0438\u0447\u0430\u0442\u044c\u00bb, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0436\u0430\u0442\u044c (clamp) \u043e\u0434\u043d\u0443 \u0438\u0437 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043c\u0438\u043c\u043e \u043b\u044e\u0431\u043e\u0439 \u0444\u0438\u0437\u0438\u043a\u0438<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u043e\u0439<\/p>\n<pre><code class=\"haskell\">  If[ball[[1, 2]] &lt; -1.0,      With[{vel = ball[[1]]-ball[[2]]},       ball[[2]] = ball[[1]];       ball[[1]] = Clip[ball[[1]] - 0.95 vel, {-1, Infinity}]; (* &lt;-- *)     ];   ];<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445  \ud83e\uddd9\ud83c\udffc\u200d\u2642\ufe0f<\/p>\n<h3>\u041e\u0431\u0449\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043a\u043b\u043e\u043d\u0435\u043d\u0430, \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438. \u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0417\u0430\u0434\u0430\u0447\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0442\u0432\u0435\u0442:<\/p>\n<hr\/>\n<h3>\u0428\u0430\u0440\u0438\u043a \u0432 \u043e\u0431\u043e\u0434\u0435<\/h3>\n<p>\u0421\u043a\u0430\u0436\u0435\u043c<\/p>\n<pre><code class=\"dart\">Circle[] \/\/ Graphics<\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<p>\u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448\u0438\u043c \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c. \u0422.\u0435. \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 &#171;\u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439&#187; \u043e\u0431\u043e\u0434\u0430<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">With[{   p = Unique[\"bbb\"],    frame = CreateUUID[],   circ = {0,0} },   p = Table[{0,0}, {3}];    EventHandler[frame, Function[Null,     Module[{b = p, \\[Delta]t = 0.01},       Do[         If[Norm[b[[1]]-circ] &gt; 1.0,           With[{n = -Normalize[b[[1]]-circ], delta = b[[1]]-b[[2]]},             b[[2]] = b[[1]];             b[[1]] = b[[1]] -  n (n.delta);           ]         ];          b[[3]] = b[[2]];         b[[2]] = b[[1]];         b[[1]] = 2 b[[2]] - b[[3]] + {0,-1} \\[Delta]t \\[Delta]t;       , {5}];            p = b;     ];   ]];    Graphics[{     Circle[circ, 1.0],      Lighter[Lighter[Red]], Disk[p[[3]]\/\/Offload, 0.01],     Lighter[Red], Disk[p[[2]]\/\/Offload, 0.01],     Red, Disk[p[[1]]\/\/Offload, 0.01],     AnimationFrameListener[p\/\/Offload, \"Event\"-&gt;frame]   }, PlotRange-&gt;{{-1,1}, {-1,1}}, AspectRatio-&gt;1] ]<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430 \u0435\u0441\u043b\u0438 \u043e\u0431\u043e\u0434 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u043d, \u043c\u044b \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e, \u043a\u043e\u0433\u0434\u0430 \u0448\u0430\u0440\u0438\u043a \u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e&#8230; \u0410 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0431\u043e\u0434 <strong>\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u043c<\/strong><\/p>\n<pre><code class=\"dart\">With[{   p = Unique[\"bbb\"],    frame = CreateUUID[],   circ = Unique[\"bbb\"] },   circ = {0,0};   p = Table[{0,0}, {3}];    EventHandler[frame, Function[Null,     Module[{b = p, \\[Delta]t = 0.01},       Do[         If[Norm[b[[1]]-circ] &gt; 1.0,           With[{n = -Normalize[b[[1]]-circ], delta = b[[1]]-b[[2]]},             b[[2]] = b[[1]];             b[[1]] = b[[1]] -  n (n.delta);           ]         ];          b[[3]] = b[[2]];         b[[2]] = b[[1]];         b[[1]] = 2 b[[2]] - b[[3]] + {0,-1} \\[Delta]t \\[Delta]t;       , {5}];            p = b;     ];   ]];   {   Graphics[{     Circle[circ\/\/Offload, 1.0],      Lighter[Lighter[Red]], Disk[p[[3]]\/\/Offload, 0.01],     Lighter[Red], Disk[p[[2]]\/\/Offload, 0.01],     Red, Disk[p[[1]]\/\/Offload, 0.01],     AnimationFrameListener[p\/\/Offload, \"Event\"-&gt;frame]   }, PlotRange-&gt;{{-1,1}, {-1,1}}, AspectRatio-&gt;1],    (* \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0432\u043e\u0434\u0430 *)               EventHandler[InputJoystick[], Function[xy, circ = xy]]  } \/\/ Column ]<\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u041f\u043e\u0447\u0442\u0438&#8230; \u041d\u043e \u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0421\u0430\u043c \u043e\u0431\u043e\u0434 (\u0438\u043b\u0438 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c, \u0435\u0441\u043b\u0438 \u0443\u0433\u043e\u0434\u043d\u043e) \u0442\u043e\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u0438\u043c\u043f\u0443\u043b\u044c\u0441. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0438\u0445 \u0448\u0430\u0440\u0438\u043a\u0443.<\/p>\n<hr\/>\n<h3>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430<\/h3>\n<p><em>\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0441\u043b\u043e\u0436\u043d\u043e  \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0442\u0441\u0447\u0451\u0442\u0430 (\u0421\u041e).<\/em><\/p>\n<p>\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0451\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0442\u0441\u0447\u0451\u0442\u0430 \u043e\u0431\u043e\u0434\u0430 (\u0434\u0432\u0438\u0436\u0443\u0449\u0443\u044e\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c)<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412 \u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u043e\u0434\u0430 \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e, \u043e\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u043d. \u041c\u044b \u0440\u0435\u0448\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438 \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e (\u0441\u0442\u0430\u0446\u0438\u043e\u043d\u0430\u0440\u043d\u0443\u044e) \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0442\u0441\u0447\u0451\u0442\u0430<\/p>\n<pre><code class=\"dart\">u[[1]] = u[[1]] - rimVel;                  With[{   n = -Normalize[u[[1]]-circ[[2]]],    delta = u[[1]]-u[[2]] },   u[[2]] = u[[1]];   u[[1]] = u[[1]] -  0.8 n (n.delta); ];    u[[1]] = u[[1]] + rimVel;<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0448\u0430\u0440\u0438\u043a\u043e\u0432<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"dart\">With[{   p = Unique[\"bbb\"],   circ = Unique[\"bbb\"],   target = Unique[\"bbb\"],   frame = CreateUUID[] },   p = Table[RandomReal[{-1,1}, 2]0.001, {3}, {100}];   circ = {{0,0}, {0,0}};   target = {0,0};      EventHandler[frame, Function[Null,     Module[{b = p, \\[Delta]t = 0.005},       Do[         circ[[1]] = circ[[1]] + \\[Delta]t (target - circ[[1]]);          (* \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0440\u0438\u043a\u0430 *)                  b[[{1,2}]] = MapThread[If[Norm[#1-circ[[2]]] &gt; 1.0, Module[{           u = {#1, #2},           vel = (circ[[1]] - circ[[2]])         },            (* \u043c\u0435\u043d\u044f\u0435\u043c \u0421\u041e *)                                                                               u[[1]] = u[[1]] - vel;                                 With[{n = -Normalize[u[[1]]-circ[[2]]], delta = u[[1]]-u[[2]]},             u[[2]] = u[[1]];             u[[1]] = u[[1]] -  0.8 n (n.delta);           ];            (* \u043c\u0435\u043d\u044f\u0435\u043c \u0421\u041e \u043e\u0431\u0440\u0430\u0442\u043d\u043e *)                                                                                   u[[1]] = u[[1]] + vel;            (* \u043a\u043b\u0438\u043f\u0443\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b\u0448\u043b\u0430 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b *)                                                                                 If[Norm[u[[1]]-circ[[2]]] &gt; 1.0,              u[[1]] += (1.0 - Norm[u[[1]]-circ[[2]]]) Normalize[u[[1]]-circ[[2]]];           ];              u         ], {#1, #2}]&amp;, {b[[1]], b[[2]]}] \/\/ Transpose;          (* \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435 *)                  b[[3]] = b[[2]];         b[[2]] = b[[1]];         b[[1]] = 2 b[[2]] - b[[3]] + Table[{0,-1}, {Length[b[[1]]]}] \\[Delta]t \\[Delta]t;               circ[[2]] = circ[[1]];       , {10}];          circ = circ;          p = b;     ];   ]];    {     Graphics[{       Circle[circ[[1]] \/\/ Offload, 1.0],        Pink, Point[p[[1]] \/\/ Offload],       AnimationFrameListener[p\/\/Offload, \"Event\"-&gt;frame]     }, PlotRange-&gt;{1.4{-1,1}, 1.4{-1,1}}, AspectRatio-&gt;1, ImageSize-&gt;Medium, TransitionType-&gt;None],        EventHandler[InputJoystick[], Function[xy, target = xy;]]   } \/\/ Row ]<\/code><\/pre>\n<\/div>\n<\/details>\n<figure class=\"full-width\"><\/figure>\n<p>\u0422\u0430\u043a \u0442\u043e \u043b\u0443\u0447\u0448\u0435!<\/p>\n<h4>\u0428\u0430\u0440\u0438\u043a\u0438 \u0438 \u0441\u0442\u0435\u0440\u0436\u043d\u0438 (Constraint Algorithm)<\/h4>\n<p>\u041f\u0440\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u0448\u0430\u0440\u0438\u043a\u0430\u043c\u0438, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0435\u0440\u0436\u043d\u044f\u043c\u0438, \u044f\u0432\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043d\u0430\u0442\u044f\u0436\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 &#8212; \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0441\u0438\u0432\u043e. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0440\u0430\u0441\u0447\u0451\u0442\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u044f \u0432\u043e\u0437\u043d\u044f \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0441\u0438\u043b\u0430\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 <em>\u0437\u0430 \u043a\u0430\u0434\u0440\u043e\u043c<\/em>. <\/p>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/906322\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0443<\/a> \u2702\ufe0f<\/p>\n<blockquote>\n<p>&#8230; \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0433\u0440\u0430\u0444\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0431\u044b \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0439, \u043d\u043e \u043c\u0435\u0442\u043e\u0434 \u0412\u0435\u0440\u043b\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e\u00a0<em><\/em><\/p>\n<p>\u0416\u0435\u0441\u0442\u043a\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0445 \u0441\u0432\u044f\u0437\u0435\u0439 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044b \u044d\u0442\u0438\u0445 \u0441\u0432\u044f\u0437\u0435\u0439. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0451\u0442 \u0435\u0441\u0442\u044c\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Constraint%5C_(computational%5C_chemistry)\" rel=\"noopener noreferrer nofollow\">\u0446\u0435\u043b\u0430\u044f \u043d\u0430\u0443\u043a\u0430<\/a>, \u043a\u0430\u043a \u043d\u0435 \u0440\u0435\u0448\u0430\u0442\u044c \u0434\u0438\u0444\u0444\u0443\u0440\u044b, \u0430 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0438\u0432\u043d\u044b\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<\/p>\n<\/blockquote>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u0441\u043e \u0448\u043f\u0438\u0446\u0440\u0443\u0442\u0435\u043d\u0430\u043c\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e \u043c\u0435\u0442\u043e\u0434\u0443 \u0412\u0435\u0440\u043b\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c &#8212; <em>\u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u0441\u043e \u0448\u043f\u0438\u0446\u0440\u0443\u0442\u0435\u043d\u0430\u043c\u0438<\/em>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0432\u043b\u0438\u044f\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u043e\u0431\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u00ab\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u00bb (\u0438\u043c\u043f\u0443\u043b\u044c\u0441, \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 \u0438 \u0442.\u0434.) \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0443\u0437\u043b\u043e\u0432. \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0435\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448\u0430 \u0441\u0435\u0442\u043a\u0430 \u0438\u0437 \u0441\u0432\u044f\u0437\u0435\u0439 \u0443\u0434\u0430\u0440\u044f\u0435\u0442\u0441\u044f \u043e \u0437\u0435\u043c\u043b\u044e \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d, \u0432\u0441\u0451 \u0442\u0435\u043b\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0442\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e.<\/p>\n<p>\u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u0442\u043e\u0442, \u0447\u0442\u043e \u0432\u044b (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e) \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 YT Shorts:<\/p>\n<h4>Image to<\/h><\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-471323","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=471323"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471323\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=471323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=471323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=471323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}