{"id":264216,"date":"2015-08-25T11:57:02","date_gmt":"2015-08-25T07:57:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=264216"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=264216","title":{"rendered":"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439"},"content":{"rendered":"<p>     \t\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u0438\u0434\u0435\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u043e\u0431 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439. \u0418 \u0442\u0430\u043c \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 Java. <br \/>  \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e, \u0447\u0442\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>  <a href=\"http:\/\/habrahabr.ru\/post\/257655\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ead\/37a\/577\/ead37a57744d4b75b29830e6a2a1d696.jpg\"\/><\/a><br \/>  <a name=\"habracut\"><\/a><\/p>\n<h1>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h1>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u0442\u0435\u043e\u0440\u0435\u043c\u0435 \u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0439 \u043e\u0441\u0438. \u0414\u043b\u044f 3D \u0441\u043b\u0443\u0447\u0430\u044f \u044d\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c.<br \/>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0435: \u0435\u0441\u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0444\u0438\u0433\u0443\u0440\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c (\u0434\u043b\u044f 2D \u043f\u0440\u044f\u043c\u0430\u044f), \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b \u043b\u0435\u0436\u0430\u0442 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f. <\/p>\n<p>  \u0421\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442: \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043d\u0430\u0448\u0443 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a \u043d\u0435\u0439 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u0443\u044e, \u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0444\u0438\u0433\u0443\u0440 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0442\u043e\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 (\u0438\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438, \u0435\u0441\u043b\u0438 \u0444\u0438\u0433\u0443\u0440\u044b \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f) \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a \u043d\u0438\u043c \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u044b. \u042d\u0442\u0438 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044f\u043c\u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043d\u0442\u0440. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/231\/cfe\/ff8\/231cfeff843d49848733fa4d526bf993.png\"\/><\/div>\n<p>  \u0417\u0435\u043b\u0435\u043d\u044b\u043c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0444\u0438\u0433\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041a\u0440\u0430\u0441\u043d\u044b\u043c \u2014 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c. \u0421\u0438\u043d\u0438\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c \u0441\u0438\u043d\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0442\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u043d\u0430\u043c\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e \u0434\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u041d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0443 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c, \u0433\u0434\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0436\u0435 \u0442\u0435\u043e\u0440\u0435\u043c\u0443, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f 2D \u0441\u043b\u0443\u0447\u0430\u044f (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438). \u0415\u0441\u043b\u0438 \u043c\u044b \u0442\u0430\u043a\u0443\u044e \u043d\u0430\u0439\u0434\u0435\u043c, \u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043c \u2014 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f.<\/p>\n<h1>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/h1>\n<p>  \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u0435\u043e\u0440\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<ul>\n<li> \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. (\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0441 \u043e\u0431\u043e\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432)<\/li>\n<li> \u041f\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044f\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438.<\/li>\n<\/ul>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e.<\/p>\n<ul>\n<li> \u0418\u0449\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c. <\/li>\n<li> \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043d\u0430\u0448\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f. <\/li>\n<\/ul>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439:<\/p>\n<p>  \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439 \u0438 \u0434\u0430\u043b\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<ul>\n<li> \u0418\u0449\u0435\u043c \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440 \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u0435.<\/li>\n<li> \u0421\u0442\u0440\u043e\u0438\u043c \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0444\u0438\u0433\u0443\u0440. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u043d\u0430\u0448\u0438 \u0444\u0438\u0433\u0443\u0440\u044b \u0442\u043e\u0436\u0435.<\/li>\n<\/ul>\n<h1>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h1>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439.<\/p>\n<p>  \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435:<br \/>  \u0412\u044b\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0442\u044c (\u0434\u044c\u044f\u0432\u043e\u043b \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445), \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a\u0438\u0445 \u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u0432\u0430\u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u044f \u043d\u0435 \u0432\u044b\u043b\u043e\u0436\u0443, \u043d\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/Nirklav\/Tanks\">GitHub<\/a>, \u0442\u0430\u043a\u0436\u0435 \u044f \u0431\u0443\u0434\u0443 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u044b.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443, \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u043c\u044b \u0437\u043d\u0430\u0435\u043c (\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0438\u0445 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0434\u0435\u043b\u0438).<br \/>  \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u0441\u0435\u044f\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0432 \u043f\u043b\u0430\u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0442, \u0438 \u043b\u044e\u0431\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u0435\u0441\u0442\u043d\u0430. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0430 \u043d\u0435 \u043b\u044e\u0431\u0430\u044f \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0445 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b.<br \/>  \u0414\u043b\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u0438\u0433\u0440\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0435\u043f\u0438\u043f\u0435\u0434\u044b, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c 6 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0438\u0436\u0435.  <\/p>\n<pre><code class=\"java\">public interface ICollidable {   \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439.    \/\/ \u0415\u0441\u043b\u0438 \u0441\u0444\u0435\u0440\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u0442\u043e \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f.   float getRadius();    Vector3 getPosition();    ArrayList&lt;Vector2&gt; getConvexHull(Plane plane); \/\/ \u041f\u043e\u0438\u0441\u043a \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c (\u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043d\u0438\u0436\u0435)   ArrayList&lt;Vector3&gt; getNormals();    void normalizeLocation(); } <\/code><\/pre>\n<pre><code class=\"java\">  private static ArrayList&lt;Plane&gt; getPlanes(ICollidable firstPh, ICollidable secondPh)   {     ArrayList&lt;Plane&gt; planes = new ArrayList&lt;&gt;();     ArrayList&lt;Vector3&gt; firstNormals = firstPh.getNormals();     ArrayList&lt;Vector3&gt; secondNormals = secondPh.getNormals();     Plane plane = new Plane();     int size = firstNormals.size() + secondNormals.size();      for(int i = 0; i &lt; size; i++)     {       setPlane(plane, firstNormals, secondNormals, i);        if (!planes.contains(plane))         planes.add(new Plane(plane));     }     return planes;   }    private static void setPlane(Plane plane, ArrayList&lt;Vector3&gt; firstNormals, ArrayList&lt;Vector3&gt; secondNormals, int num)   {     \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0438\u0437 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 (\u043d\u0430\u043c \u043d\u0435 \u0432\u0430\u0436\u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 x, y \u043e\u0441\u0435\u0439)     if (num &lt; firstNormals.size())       plane.setFrom(firstNormals.get(num));     else     {       num -= firstNormals.size();       plane.setFrom(secondNormals.get(num));     }     \/\/ \u0411\u0435\u0440\u0435\u043c \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c.     plane.swapZY();   } <\/code><\/pre>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"https:\/\/github.com\/Nirklav\/Tanks\/blob\/master\/app\/src\/main\/java\/com\/ThirtyNineEighty\/Common\/Math\/Plane.java\">Plane<\/a>, <a href=\"https:\/\/github.com\/Nirklav\/Tanks\/blob\/master\/app\/src\/main\/java\/com\/ThirtyNineEighty\/Common\/Math\/Vector2.java\">Vector3<\/a><\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u0442\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e, \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u043a\u0442\u043e\u0440. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>  \u0412\u0435\u043a\u0442\u043e\u0440 \u043c\u044b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u043e\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 X \u0438 Y \u043d\u0430\u043c \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0435\u043a\u0442\u043e\u0440 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 3D \u0438 \u043e\u043d\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f.<\/p>\n<p>  \u041a\u043b\u0430\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439: <a href=\"https:\/\/github.com\/Nirklav\/Tanks\/blob\/master\/app\/src\/main\/java\/com\/ThirtyNineEighty\/Game\/Collisions\/Collision3D.java\">Collision3D<\/a><br \/>  \u041a\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u0448\u0435:<\/p>\n<pre><code class=\"java\">  private static CheckResult check(ICollidable firstPh, ICollidable secondPh)   {     \/\/ \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c     ArrayList&lt;Plane&gt; planes = getPlanes(firstPh, secondPh);      Collision2D min = null;     Plane minPlane = new Plane();      for (Plane plane : planes)     {       \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c.       ArrayList&lt;Vector2&gt; resultOne = firstPh.getConvexHull(plane);       ArrayList&lt;Vector2&gt; resultTwo = secondPh.getConvexHull(plane);        \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043d\u0435\u0442. (\u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u043d\u0438\u0436\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 &quot;check&quot;)       Collision2D collision = new Collision2D(resultOne, resultTwo);        Vector.release(resultOne);       Vector.release(resultTwo);        if (!collision.isCollide())         return null;        \/\/ \u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u0438\u0449\u0435\u043c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044e \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f       if (min == null || collision.getMTVLength() &lt; min.getMTVLength())       {         min = collision;         minPlane.setFrom(plane);       }        plane.release();     }      return new CheckResult(min, minPlane);   } <\/code><\/pre>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435 \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438. <a href=\"https:\/\/github.com\/Nirklav\/Tanks\/blob\/master\/app\/src\/main\/java\/com\/ThirtyNineEighty\/Game\/Collisions\/Collidable.java\">\u0422\u0443\u0442 \u043f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.<\/a><br \/>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u0430\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u043e\u0442 \u0441\u0430\u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0442\u043e\u043b\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0444\u0438\u0433\u0443\u0440\u044b. \u0422\u0430\u043a\u0436\u0435 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u0443\u043a\u043b\u043e\u0439, \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443.<\/p>\n<table>\n<tr>\n<td>\u0412\u043e\u0433\u0443\u043d\u0442\u0430\u044f<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/155\/18b\/20f\/15518b20fc1e4a3d98b1a2dad1a70c3d.png\"\/><\/div>\n<\/td>\n<td>\u0412\u044b\u043f\u0443\u043a\u043b\u0430\u044f<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/b44\/268\/b63\/b44268b63bce48c8bc29744d76ccc049.png\"\/><\/div>\n<\/td>\n<\/tr>\n<\/table>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0438\u0441\u0443\u043d\u043a\u0435 (\u0441 \u0432\u043e\u0433\u043d\u0443\u0442\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u043e\u0439) \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0447\u0442\u043e \u0444\u0438\u0433\u0443\u0440\u044b \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u0445\u043e\u0442\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0443\u044e \u043e\u0441\u044c \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u0436\u0435\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u043e\u0441\u044c \u0438\u0449\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d \u0444\u0438\u0433\u0443\u0440\u044b, \u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a \u043e\u0441\u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0442. \u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043f\u043e \u0432\u043e\u0433\u043d\u0443\u0442\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 <abbr title=\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u0443\u043a\u043b\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430\">\u041c\u0412\u041e<\/abbr>. \u0417\u0434\u0435\u0441\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0439\u0434\u0435\u0442 \u043e\u0441\u044c. \u0414\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0413\u0440\u044d\u0445\u0435\u043c\u0430.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u2014 \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u043e\u0447\u0435\u043a \u0441\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c.<\/p>\n<pre><code class=\"java\">  private ArrayList&lt;Vector2&gt; getDistinctProjection(Plane plane)   {     Vector2 vector = Vector.getInstance(2);      \/\/ \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HashSet \u043d\u043e \u044f \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0442\u043e\u0447\u0435\u043a \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e)     ArrayList&lt;Vector2&gt; result = new ArrayList&lt;&gt;();      for (Vector3 current : vertices)     {       plane.getProjection(vector, current);       if (!result.contains(vector)) \/\/ \u041e\u0442\u0441\u0435\u0438\u0432\u0430\u0435\u043c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u043e\u0447\u043a\u0438       {         Vector2 copy = Vector.getInstance(2, vector);         result.add(copy);       }     }      Vector.release(vector);     return result;   }    \/\/ \u041c\u0435\u0442\u043e\u0434 \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 Plane:   public void getProjection(Vector2 result, Vector3 vector)   {     throwIfReleased();      float x = vector.getX() * xAxis.getX() + vector.getY() * xAxis.getY() + vector.getZ() * xAxis.getZ();     float y = vector.getX() * yAxis.getX() + vector.getY() * yAxis.getY() + vector.getZ() * yAxis.getZ();      result.setFrom(x, y);   } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f <abbr title=\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u0443\u043a\u043b\u0430\u044f \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430\">\u041c\u0412\u041e<\/abbr>.<br \/>  \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u0448\u0430\u0433\u0430.  <\/p>\n<ol>\n<li>\u041f\u043e\u0438\u0441\u043a \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438.<\/li>\n<li>\u0412\u044b\u0431\u043e\u0440 \u043e\u043f\u043e\u0440\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.<\/li>\n<li>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u043e\u0440\u043d\u043e\u0439.<\/li>\n<li>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043b\u0438\u0448\u043d\u0438\u0445 \u0442\u043e\u0447\u0435\u043a.<\/li>\n<\/ol>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u041c\u0412\u041e<\/b><\/p>\n<div class=\"spoiler_text\">\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e:  <\/p>\n<blockquote><p>\u0412\u044b\u043f\u0443\u043a\u043b\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u043e\u0439 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 X \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u0432\u044b\u043f\u0443\u043a\u043b\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 X. \u00ab\u041d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u00bb \u0437\u0434\u0435\u0441\u044c \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u043f\u0443\u043a\u043b\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 \u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443, \u0447\u0442\u043e \u043e\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u0432\u044b\u043f\u0443\u043a\u043b\u043e\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u043c \u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443.<\/p><\/blockquote>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<blockquote><p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435 \u0434\u043e\u0441\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0431\u0438\u0442\u043e \u2014 \u043d\u043e \u043d\u0435 \u043f\u043e \u0441\u0430\u043c\u0443\u044e \u0448\u043b\u044f\u043f\u043a\u0443 \u2014 \u043c\u043d\u043e\u0433\u043e \u0433\u0432\u043e\u0437\u0434\u0435\u0439. \u0412\u043e\u0437\u044c\u043c\u0438\u0442\u0435 \u0432\u0435\u0440\u0451\u0432\u043a\u0443, \u0441\u0432\u044f\u0436\u0438\u0442\u0435 \u043d\u0430 \u043d\u0435\u0439 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0443\u044e \u043f\u0435\u0442\u043b\u044e (\u043b\u0430\u0441\u0441\u043e) \u0438 \u043d\u0430\u0431\u0440\u043e\u0441\u044c\u0442\u0435 \u0435\u0451 \u043d\u0430 \u0434\u043e\u0441\u043a\u0443, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0442\u044f\u043d\u0438\u0442\u0435. \u0412\u0435\u0440\u0451\u0432\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0430\u0435\u0442 \u0432\u0441\u0435 \u0433\u0432\u043e\u0437\u0434\u0438, \u043d\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u0441\u0430\u043c\u044b\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445. \u0422\u0435 \u0433\u0432\u043e\u0437\u0434\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432\u044b\u043f\u0443\u043a\u043b\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0433\u0432\u043e\u0437\u0434\u0435\u0439[1].  <\/p><\/blockquote>\n<p>  \u0425\u043e\u0440\u043e\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e <a href=\"http:\/\/habrahabr.ru\/post\/144921\/\">\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u044b\u043f\u0443\u043a\u043b\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438<\/a>.  <\/div>\n<\/div>\n<pre><code class=\"java\">  @Override   public ArrayList&lt;Vector2&gt; getConvexHull(Plane plane)   {     \/\/ \u0418\u0449\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e     ArrayList&lt;Vector2&gt; projection = getDistinctProjection(plane);     ArrayList&lt;Vector2&gt; convexHull = new ArrayList&lt;&gt;(projection.size());     if (projection.size() &lt; 2)       throw new IllegalStateException(&quot;projection size less than 2&quot;);      \/\/ \u0418\u0449\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f 100% \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u041c\u0412\u041e     \/\/ \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0435 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438     \/\/ \u0442\u0430\u043a\u0436\u0435 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u043f\u043e\u0440\u043d\u043e\u0439, \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.     int firstIndex = getFirstPointIndex(projection);     Vector2 first = projection.remove(firstIndex);     convexHull.add(first);      \/\/ \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438     Collections.sort(projection, new AngleComparator(first));      \/\/ \u0417\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u0442.\u043a. \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u043d\u0438\u0436\u0435 \u043e\u043d\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b.     Vector2 second = projection.remove(0);     convexHull.add(second);      Vector2 prevVector = Vector.getInstance(2);     Vector2 currentVector = Vector.getInstance(2);      for(Vector2 current : projection)     {       Vector2 firstPrevPoint = convexHull.get(convexHull.size() - 1);       Vector2 secondPrevPoint = convexHull.get(convexHull.size() - 2);        \/\/ \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440       prevVector.setFrom(firstPrevPoint);       prevVector.subtract(secondPrevPoint);        \/\/ \u041d\u043e\u0432\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440       currentVector.setFrom(current);       currentVector.subtract(firstPrevPoint);        \/\/ \u0415\u0441\u043b\u0438 \u0443\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0438 \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439, \u043c\u044b \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0443       float angle = prevVector.getAngle(currentVector);       if (angle &gt;= 180 && angle &lt; 360)         convexHull.remove(convexHull.size() - 1);        \/\/ \u0418 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e       convexHull.add(current);     }      Vector.release(prevVector);     Vector.release(currentVector);      return convexHull;   } <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">getAngle<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">  \/\/ \u041f\u043e\u0438\u0441\u043a \u0443\u0433\u043b\u0430 \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 Vector2   public float getAngle(Vector2 other)   {     throwIfReleased();      float scalar = getScalar(other);     float lengthOne = this.getLength();     float lengthTwo = other.getLength();     float angle = (float)Math.toDegrees(Math.acos(scalar \/ (lengthOne * lengthTwo)));      return Angle.correct(getCross(other) &gt; 0 ? angle : 360 - angle);   } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0435\u0440\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u041c\u0412\u041e, \u044f \u0432\u044b\u0431\u0438\u0440\u0430\u044e \u0441\u0430\u043c\u0443\u044e \u043f\u0440\u0430\u0432\u0443\u044e. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u0438\u0445 \u043d\u0430\u0448\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u043e\u0434\u043d\u0430, \u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u0441\u0430\u043c\u0443\u044e \u0432\u0435\u0440\u0445\u043d\u044e\u044e.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u044b\u0431\u043e\u0440 \u043f\u0435\u0440\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">  private static int getFirstPointIndex(ArrayList&lt;Vector2&gt; projection)   {     Vector2 minVector = null;     int minVectorIndex = 0;      int size = projection.size();     for (int i = 0; i &lt; size; i++)     {       Vector2 current = projection.get(i);        if (minVector == null)       {         minVector = current;         continue;       }        int compareX = Float.compare(current.getX(), minVector.getX());       if (compareX &lt; 0)       {         minVector = current;         minVectorIndex = i;       }        if (compareX == 0)       {         int compareY = Float.compare(current.getY(), minVector.getY());         if (compareY == 0)           throw new IllegalArgumentException(&quot;projection has the same points&quot;);          if (compareY &gt; 0)         {           minVector = current;           minVectorIndex = i;         }       }     }      return minVectorIndex;   } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421\u0430\u043c\u044b\u043c \u0437\u0430\u0431\u0430\u0433\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043c\u0435\u0441\u0442\u043e\u043c \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0442\u043e\u0447\u0435\u043a \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u0441\u0435\u0431\u044f \u0434\u0430\u0436\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0447\u0442\u043e \u043a \u0447\u0435\u043c\u0443.<\/p>\n<p>  \u0421\u043e\u0440\u0442\u0438\u0440\u0443\u044e \u0442\u043e\u0447\u043a\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e \u0443\u0433\u043b\u0430\u043c. \u0415\u0441\u043b\u0438 \u0443 \u0442\u043e\u0447\u0435\u043a \u0443\u0433\u043b\u044b \u0440\u0430\u0432\u043d\u044b, \u0442\u043e \u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u0438\u0445 \u043f\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0440\u0438\u0447\u0435\u043c \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0442\u043e\u0447\u043a\u0438 \u043b\u0435\u0436\u0430\u0442 \u2014 \u0432\u044b\u0448\u0435 \u0438\u043b\u0438 \u043d\u0438\u0436\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0439. \u0415\u0441\u043b\u0438 \u043d\u0438\u0436\u0435, \u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0434\u0442\u0438 \u0442\u0430, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b\u0448\u0435 \u2014 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\"  src=\"https:\/\/habrastorage.org\/files\/28e\/002\/cc4\/28e002cc416842fea6bd85599f228b42.png\"\/><\/div>\n<p>  \u0421\u0438\u043d\u044f\u044f \u0442\u043e\u0447\u043a\u0430 \u2014 \u043e\u043f\u043e\u0440\u043d\u0430\u044f. \u0417\u0435\u043b\u0435\u043d\u044b\u0435 \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438. \u041a\u0440\u0430\u0441\u043d\u044b\u0435 \u2014 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0443\u0433\u043b\u0430\u043c\u0438. \u0421\u0445\u0435\u043c\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0433\u043b\u044b \u0434\u043b\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0432 \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<pre><code class=\"java\">  private static class AngleComparator implements Comparator&lt;Vector2&gt;   {     private Vector2 first;     private Vector2 left;     private Vector2 right;      public AngleComparator(Vector2 first)     {       this.first = first;       left = Vector.getInstance(2);       right = Vector.getInstance(2);     }      @Override     public int compare(Vector2 lhs, Vector2 rhs)     {       \/\/ \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0438        \/\/ \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u043a \u0446\u0435\u043d\u0442\u0440\u0443       left.setFrom(lhs);       left.subtract(first);        right.setFrom(rhs);       right.subtract(first);        \/\/ \u0438\u0449\u0435\u043c \u0443\u0433\u043b\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0438 \u0425       float firstAngle = Vector2.xAxis.getAngle(left);       float secondAngle = Vector2.xAxis.getAngle(right);        \/\/ \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0443\u0433\u043b\u044b       \/\/ \u041f\u0440\u0438\u043c\u0435\u0440: 15, 45, 315, 345 (\u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f) =&gt; -45, -15, 15, 45 (\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f)       if (firstAngle &gt; 90)         firstAngle -= 360;        if (secondAngle &gt; 90)         secondAngle -= 360;        \/\/ \u0435\u0441\u043b\u0438 \u0443\u0433\u043b\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u0445 \u043f\u043e \u0434\u043b\u0438\u043d\u043d\u0435       \/\/ \u043f\u0440\u0438\u0447\u0435\u043c \u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0432\u044b\u0448\u0435 \u043e\u0441\u0438 \u0425 \u0442\u043e \u0442\u0430 \u0447\u0442\u043e \u0431\u043b\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0442\u0438 \u043f\u043e\u0437\u0436\u0435       \/\/ \u0438 \u043d\u0430 \u043e\u0431\u043e\u0440\u043e\u0442 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \u043a\u043e\u0433\u0434\u0430 \u0442\u043e\u0447\u043a\u0430 \u043d\u0438\u0436\u0435 \u043e\u0441\u0438 \u0425.       \/\/ \u0412\u044b\u0448\u0435 \u0438\u043b\u0438 \u043d\u0438\u0436\u0435, \u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u043f\u043e \u0443\u0433\u043b\u0443        \/\/ \u0415\u0441\u043b\u0438 \u0443\u0433\u043b\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u043e \u0434\u043b\u0438\u043d\u043d\u0435       if (Math.abs(firstAngle - secondAngle) &lt;= Vector.epsilon)       {         float leftLength = left.getLength();         float rightLength = right.getLength();          \/\/ \u0415\u0441\u043b\u0438 \u0443\u0433\u043e\u043b \u0431\u043e\u043b\u044c\u0448\u0435 0, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443         if (firstAngle &gt;= 0)           return Float.compare(rightLength, leftLength);          return Float.compare(leftLength, rightLength);       }        \/\/ \u0435\u0441\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043d\u0435\u0442\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u043e \u0443\u0433\u043b\u0430\u043c       return Float.compare(firstAngle, secondAngle);     }   } <\/code><\/pre>\n<p>  \u0421 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439. \u041b\u043e\u0433\u0438\u043a\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u0430\u043a \u0438 \u043f\u0440\u0438 3D.<\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u044f \u044d\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439, \u0438\u0437\u0432\u0438\u043d\u044f\u044e\u0441\u044c \u0437\u0430 \u0442\u0430\u0432\u0442\u043e\u043b\u043e\u0433\u0438\u044e.<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u044f \u0432\u0441\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440 \u0438\u0449\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u0438. \u0414\u0430\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u0443\u044e \u043d\u043e\u0440\u043c\u0430\u043b\u044c, \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0445\u043e\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u0440\u044f\u043c\u0430\u044f \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0442\u043e \u0438 \u0447\u0442\u043e? \u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e, \u043d\u043e \u0438 \u0444\u0438\u0433\u0443\u0440\u044b (\u043a\u0430\u043a \u0438 3D \u043c\u043e\u0434\u0435\u043b\u0438) \u043d\u0435 \u043f\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \ud83d\ude42<\/p>\n<p>  \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0443\u0442: <a href=\"https:\/\/github.com\/Nirklav\/Tanks\/blob\/master\/app\/src\/main\/java\/com\/ThirtyNineEighty\/Game\/Collisions\/Collision2D.java\">Collision2D<\/a><\/p>\n<pre><code class=\"java\">  private static CheckResult check(ArrayList&lt;Vector2&gt; firstVertices, ArrayList&lt;Vector2&gt; secondVertices)   {     Vector2 mtv = null;     Vector2 normal = Vector.getInstance(2);     float minMTVLength = 0.0f;     int count = firstVertices.size() + secondVertices.size();      for (int i = 0; i &lt; count; i ++)     {       setNormal(normal, firstVertices, secondVertices, i);        \/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0444\u0438\u0433\u0443\u0440 \u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u0438 \u0441\u0442\u043e\u0440\u043e\u043d. X - \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Y - \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f.       Vector2 firstProjection = normal.getProjection(firstVertices);       Vector2 secondProjection = normal.getProjection(secondVertices);        \/\/ \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u0437\u043d\u0430\u0447\u0438\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0430\u044f \u043e\u0441\u044c, \u0438 \u0444\u0438\u0433\u0443\u0440\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f.       if (firstProjection.getX() &lt; secondProjection.getY() || secondProjection.getX() &lt; firstProjection.getY())         return null;        \/\/ \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440. \u0414\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435.       if (mtv == null)       {         mtv = Vector.getInstance(2, normal);         minMTVLength = getIntersectionLength(firstProjection, secondProjection);       }       else       {         float mtvLength = getIntersectionLength(firstProjection, secondProjection);         if (Math.abs(mtvLength) &lt; Math.abs(minMTVLength))         {           mtv = Vector.getInstance(2, normal);           minMTVLength = mtvLength;         }       }     }      return new CheckResult(mtv, minMTVLength);   }    \/\/ \u041c\u0435\u0442\u043e\u0434 \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 Vector2   public Vector2 getProjection(ArrayList&lt;Vector2&gt; vertices)   {     Vector2 result = null;      for (Vector2 current : vertices)     {       float projection = getScalar(current);        if (result == null)         result = new Vector2(projection, projection);        \/\/ x - max       if (projection &gt; result.getX())         result.setX(projection);        \/\/ y - min       if (projection &lt; result.getY())         result.setY(projection);     }      return result;   } <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">getIntersectionLength, setNormal<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">  private static float getIntersectionLength(Vector2 firstProjection, Vector2 secondProjection)   {     return (secondProjection.getY() - firstProjection.getX() &gt; 0)       ? secondProjection.getY() - firstProjection.getX()       : firstProjection.getY() - secondProjection.getX();   }    private static void setNormal(Vector2 normal, ArrayList&lt;Vector2&gt; vertices, int num)   {     Vector2 firstPoint = vertices.get(num);     Vector2 secondPoint = vertices.get(num + 1 == vertices.size() ? 0 : num + 1);      Vector2 edge = secondPoint.getSubtract(firstPoint);      normal.setX(-edge.getY());     normal.setY(edge.getX());      normal.normalize();   } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u0436\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u0432\u044b\u0448\u0435 \u043c\u044b \u0438\u0449\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043e\u043d \u043d\u0430\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f. \u0410 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u043b\u0438\u0441\u044c, \u0442\u043e \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 3D, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0438\u0436\u0435.<\/p>\n<pre><code class=\"java\">  private static Vector3 getMTV(CheckResult result)   {     Vector2 mtv2 = result.collision.getMTV();     Vector3 mtv3 = new Vector3(mtv2.getX(), mtv2.getY(), 0);      Vector3 planeX = result.plane.xAxis();     Vector3 planeY = result.plane.yAxis();     Vector3 planeZ = result.plane.zAxis();      float[] matrix = new float[16];     matrix[0] = planeX.getX();     matrix[1] = planeX.getY();     matrix[2] = planeX.getZ();      matrix[4] = planeY.getX();     matrix[5] = planeY.getY();     matrix[6] = planeY.getZ();      matrix[8] = planeZ.getX();     matrix[9] = planeZ.getY();     matrix[10] = planeZ.getZ();      matrix[15] = 1.0f;      Matrix.multiplyMV(mtv3.getRaw(), 0, matrix, 0, mtv3.getRaw(), 0);      mtv3.normalize();     return mtv3;   } <\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0438 \u0432\u0441\u0435, \u0432\u0441\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e \u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3D \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/p>\n<h1>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430<\/h1>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u043d\u0430\u043f\u0438\u0448\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0438\u0436\u043d \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e \u0440\u044f\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0440\u0430\u0441\u0447\u0435\u0442 \u0440\u0430\u0434\u0438\u0443\u0441\u0430 \u0441\u0444\u0435\u0440\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0432\u043e\u043a\u0440\u0443\u0433 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0444\u0435\u0440 \u0432\u0435\u0434\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435. \u0423 \u0442\u0435\u0445 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0444\u0435\u0440\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 <a href=\"https:\/\/github.com\/Nirklav\/Tanks\/blob\/master\/app\/src\/main\/java\/com\/ThirtyNineEighty\/Game\/Collisions\/CollisionManager.java#L99\">\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e<\/a>.<\/p>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438\u0433\u0440\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0442\u0443\u0442: <a href=\"https:\/\/github.com\/Nirklav\/Tanks\">github.com\/Nirklav\/Tanks<\/a>     \t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/257655\/\"> http:\/\/habrahabr.ru\/post\/257655\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>  \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u0438\u0434\u0435\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u043e\u0431 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439. \u0418 \u0442\u0430\u043c \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 Java. <br \/>  \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e, \u0447\u0442\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>  <a href=\"http:\/\/habrahabr.ru\/post\/257655\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ead\/37a\/577\/ead37a57744d4b75b29830e6a2a1d696.jpg\"\/><\/a>  <\/p>\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-264216","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/264216","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=264216"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/264216\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=264216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=264216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=264216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}