{"id":329181,"date":"2022-02-07T09:00:46","date_gmt":"2022-02-07T09:00:46","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=329181"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2022-02-07T09:00:46","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=329181","title":{"rendered":"<span>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u0438\u0432\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u043f\u043e \u0444\u043e\u0440\u043c\u0435<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0438\u0441\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 pet-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0433\u0438\u043f\u0435\u0440\u043a\u0430\u0437\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u0433\u0440\u0443 \u0441 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u043e\u0439, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043a\u0440\u0438\u0432\u0443\u044e \u043b\u0438\u043d\u0438\u044e. \u0418\u0434\u0435\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u043a\u0440\u0438\u0432\u044b\u0445 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0434\u0435\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0432\u0430\u043b\u044c\u043d\u044b\u0435) \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u044f \u043f\u0440\u0438\u0448\u0435\u043b.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"323\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/636\/391\/1b7\/6363911b7c1c7223b14e46ad1d9c34ce.png\" data-width=\"683\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c?<\/h2>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0438\u0433\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0430\u044f: \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f \u0438 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u043e \u043d\u0435\u0439 \u043f\u0430\u043b\u044c\u0446\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0440\u0438\u0432\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0431\u043b\u0438\u0437\u043a\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043a\u0440\u0438\u0432\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e, \u043d\u043e \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043d\u0430 1\u0441\u043c, \u0442\u043e \u043e\u043d \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439.<\/p>\n<h2>\u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044b?<\/h2>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u0431\u044b\u043b\u0430 &#171;\u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u043b\u044b?&#187;. \u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u044b\u043b\u0430 \u0442\u0430\u043a\u043e\u0439: \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0438\u043d\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0445\u043e\u0436\u0438 \u043f\u043e \u0434\u043b\u0438\u043d\u0435, \u0442\u043e \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u044b \u043b\u0438\u043d\u0438\u0439. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b\u0441\u043b\u044c \u0431\u044b\u043b\u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u0431\u0440\u0435\u0434\u043e\u0432\u0430\u044f, \u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u0442. <\/p>\n<p>\u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u043b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0444\u0438\u0433\u0443\u0440\u044b \u043f\u043e\u0434 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A7%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%82%D1%80%D0%B0%D0%BF%D0%B5%D1%86%D0%B8%D0%B9\" rel=\"noopener noreferrer nofollow\">\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a>. \u041d\u0435 \u0431\u0443\u0434\u0443 \u0442\u0443\u0442 \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, <a href=\"https:\/\/habr.com\/ru\/post\/420867\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0441\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0437\u0430 \u043c\u0435\u043d\u044f<\/a>. <\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u0442\u0430\u0432\u043b\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0442\u0440\u0430\u043f\u0435\u0446\u0438\u0439:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/** * points - \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 [x1, y1, x2, y2,...] *\/ private fun integral(points: LinkedList&lt;Float>): Double {   var area: Double = 0.0    val i: MutableIterator&lt;Float> = points.iterator()   val prevPoint = FloatArray(2)   prevPoint[0] = i.next() as Float   prevPoint[1] = i.next() as Float    val point = FloatArray(2)    while (i.hasNext()) {     point[0] = i.next() as Float     point[1] = i.next() as Float      val integral: Double = integral(point, prevPoint)     area += integral   }    return area }  \/** * p1 - array [x1,y1] * p2 - array [x2,y2] *\/ private fun integral0(p1: FloatArray, p2: FloatArray): Double {   val dx = abs((p1[0] - p2[0]).toDouble())    return (p1[1]+p2[1])*dx\/2 }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0443 \u043a\u0440\u0438\u0432\u043e\u0439 \u0438 \u043d\u0435 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e \u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043a\u0440\u0438\u0432\u043e\u0439 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u043b\u0438\u043d\u0438\u0439 \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b, \u043d\u043e \u0438\u0445 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u043c\u0438 \u043f\u043e \u0444\u043e\u0440\u043c\u0435.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"323\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/954\/a8c\/78b\/954a8c78bb555c71b110782900fffaf7.png\" data-width=\"683\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0422\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u044f<\/h2>\n<p>\u0412\u0442\u043e\u0440\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u044e \u0444\u0438\u0433\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0435\u0441\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0446\u044b \u0434\u0432\u0443\u0445 \u043a\u0440\u0438\u0432\u044b\u0445. \u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u043b\u043e\u0449\u0430\u0434\u044c, \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438, \u0442\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443 \u043f\u043e \u0444\u043e\u0440\u043c\u0435. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\u043d \u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443 \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0444\u0438\u0433\u0443\u0440 \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441\u0435. \u0418\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0437-\u0437\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u043b\u0438\u043d\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u044f \u043e\u0442 \u043d\u0435\u0433\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ol>\n<li>\n<p>\u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041c\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0435\u0432\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f\u0445 \u043a\u0440\u0438\u0432\u044b\u0445. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043a\u0440\u0438\u0432\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u0441\u0435\u0431\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0441\u043b\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u0438, \u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u0430\u0445 (0% \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438). \u0422\u0430\u043a\u0436\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0434\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u0440\u043e\u0433 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u044f\u0432\u043b\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443, \u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u0442\u0435\u043c\u0443 \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0430 \u043f\u043e\u043a\u0430 \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"323\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ca5\/8d2\/46e\/ca58d246efd1fef4f701badadd72e6df.png\" data-width=\"683\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0441\u0442\u0430\u043b\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0444\u043e\u0440\u043c \u043a\u0440\u0438\u0432\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 \u043a \u0442\u043e\u0447\u043a\u0435. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0444\u043e\u0440\u043c\u0443 \u043a\u0440\u0438\u0432\u043e\u0439, \u043e\u043d \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\u043d \u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443, \u043d\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d \u043a \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u0440\u0438\u0432\u043e\u0439 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"323\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/682\/0ec\/618\/6820ec618edc9a6e36e7a65f3b17a3ed.png\" data-width=\"683\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043a\u0440\u0438\u0432\u043e\u0439 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0440\u0438\u0432\u043e\u0439 \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0432\u043e\u0439 \u0432 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0435. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043a\u0440\u0438\u0432\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a.<\/p>\n<pre><code class=\"kotlin\">import java.util.* import kotlin.math.abs  \/** * coordinates - \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 [x1, y1, x2, y2,...] * asc - \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0440\u0438\u0432\u043e\u0439, \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 *\/  class Curve(val coordinates: LinkedList&lt;Float>, asc: Boolean = true) {     val points: LinkedList&lt;Point> = LinkedList() \/\/\u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u043a\u0440\u0438\u0432\u043e\u0439     var length: Double = 0.0 \/\/\u0434\u043b\u0438\u043d\u0430 \u043a\u0440\u0438\u0432\u043e\u0439      init {         val i: MutableIterator&lt;Float> = if(asc) coordinates.iterator() else coordinates.descendingIterator()         val prevPoint = FloatArray(2)         if(asc) {             prevPoint[0] = i.next() as Float             prevPoint[1] = i.next() as Float         } else {             prevPoint[1] = i.next() as Float             prevPoint[0] = i.next() as Float         }         val point = FloatArray(2)        \/*       \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0442\u043e\u0447\u043a\u0430\u043c \u0438 \u0440\u0430\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0443\u0433\u043e\u043b \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0432\u043e\u0439       *\/         while (i.hasNext()) {             if(asc) {                 point[0] = i.next() as Float                 point[1] = i.next() as Float             } else {                 point[1] = i.next() as Float                 point[0] = i.next() as Float             }             val distance = distance(prevPoint, point)             if(distance &lt; 10) continue             length += distance              var angle = StrictMath.atan2(                 (point[1] - prevPoint[1]).toDouble(), (point[0] - prevPoint[0]).toDouble()             )              if (angle &lt; 0.0) angle = abs(alpha)              points.add(                 Point(                   point[0],                   point[1],                   length,                   angle                 )             )              prevPoint[0] = point[0]             prevPoint[1] = point[1]         }                val j: ListIterator&lt;*> = diffs.listIterator()          while (j.hasNext()) (j.next() as Point).dist \/= length      }      private fun distance(p1: FloatArray, p2: FloatArray): Double {         val px = (p1[0] - p2[0]).toDouble()         val py = (p1[1] - p2[1]).toDouble()         return Math.sqrt(px * px + py * py)     }      data class Point(       var x: Float,        var y: Float,       var dist: Double, \/\/percent distance from start       val alpha: Double \/\/atan     ) }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u0441 \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 \u0438\u0433\u0440\u043e\u043a \u043d\u0430\u0447\u0430\u043b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e, \u0442\u043e \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u043a\u043e\u043d\u0435\u0446 \u043b\u0438\u043d\u0438\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u041e\u0442 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0445\u043e\u0434\u0430 \u043b\u0438\u043d\u0438\u0438 \u0438\u0433\u0440\u043e\u043a\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u0438\u043d\u0430 \u043a\u0440\u0438\u0432\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0439, \u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u0435\u043a \u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u0440\u0438\u0432\u044b\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e. <em>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0430 \u041a\u0440\u0438\u0432\u043e\u04391 \u043f\u043e\u043f\u0430\u043b\u0438 \u043d\u0430 \u0442\u043e\u0447\u043a\u0443, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e 10% \u043f\u0443\u0442\u0438, \u0430 \u043d\u0430 \u041a\u0440\u0438\u0432\u043e\u04392 \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0435\u0449\u0435 \u0432 \u0442\u043e\u0447\u043a\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 5% \u043f\u0443\u0442\u0438, \u0442\u043e \u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u041a\u0440\u0438\u0432\u043e\u04392, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043c 10% \u043f\u0443\u0442\u0438. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0435\u0440\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043d\u0430 \u041a\u0440\u0438\u0432\u043e\u04391. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0432\u044b\u0448\u0435 \u0441\u043f\u043b\u043e\u0448\u043d\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043f\u043b\u043e\u0448\u043d\u044b\u043c\u0438, \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u044b\u0435 \u0441 \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u044b\u043c\u0438.<\/em><\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u043a\u043e\u043d\u0435\u0446 \u043b\u0438\u043d\u0438\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0431\u0445\u043e\u0434 \u0441 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430.<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439. <\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044b \u0442\u043e\u0447\u0435\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439, \u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043d\u0430 \u0434\u043e\u043b\u044e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438. \u0418 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u043a \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u0435\u043a \u043d\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u041f\u0438 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043d\u0435 \u0434\u043b\u044f \u0438\u0433\u0440\u044b \u0431\u044b\u043b\u043e \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u0444\u043e\u0440\u043c\u0443, \u043d\u043e \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0440\u0438\u0432\u043e\u0439, \u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043a\u0440\u0438\u0432\u043e\u0439 \u0438\u0433\u0440\u043e\u043a\u0430 \u043e\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">private fun deltaAngles(alpha1: Double, alpha2: Double): Double {     var dAlpha = StrictMath.abs(alpha1 - alpha2)     if (dAlpha > StrictMath.PI) dAlpha = 2.0 * StrictMath.PI - dAlpha     return dAlpha }  \/** * curve1 - \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 [x1, y1, x2, y2,...] * curve2 - \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 [x1, y1, x2, y2,...] * * return - DoubleArray [Form Accuracy, Length Accuracy] *\/ fun compareCurves(curve1: LinkedList&lt;Float>, curve2: LinkedList&lt;Float>): DoubleArray {     if (curve1.isEmpty() || curve2.isEmpty())         throw IllegalStateException(\"curve can't be empty\")      \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u0438 \u043e\u0431\u0430 \u043a\u0440\u0430\u044f \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439     val xc1: Float = curve1.get(0)     val yc1: Float = curve1.get(1)      val xc2: Float = curve2.get(0)     val yc2: Float = curve2.get(1)      val x2c2: Float = curve2.get(curve2.lastIndex - 1)     val y2c2: Float = curve2.last        \/\/\u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u0438 \u043a\u0440\u0430\u044f\u043c\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439     val mod1 = (xc1 - xc2) * (xc1 - xc2) + (yc1 - yc2) * (yc1 - yc2)     val mod2 = (xc1 - x2c2) * (xc1 - x2c2) + (yc1 - y2c2) * (yc1 - y2c2)      val c1 = Curve(curve1)     \/\/\u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u043a\u0440\u0430\u0439 \u0431\u043b\u0438\u0436\u0435 \u043a \u043d\u0430\u0447\u0430\u043b\u0443, \u0441 \u043d\u0435\u0433\u043e \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0431\u0445\u043e\u0434 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439     val c2 = Curve(curve2, mod1 &lt;= mod2)      val i1: ListIterator&lt;*> = c1.points.listIterator()     val i2: ListIterator&lt;*> = c2.points.listIterator()     var point1: Curve.Point = i1.next() as Curve.Point     var point2: Curve.Point = i2.next() as Curve.Point     var diff = 0.0      var currentDistance: Double = StrictMath.min(d1.dist, d2.dist) \/\/\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0436\u0435 \u043f\u0440\u043e\u0448\u043b\u0438     var prevDistance = 0.0     while (currentDistance &lt;= 1.0) {         val d = currentDistance - prevDistance         diff += deltaAngles(             point1.angle,             point2.angle         ) * d          if (currentDistance == 1.0) break          if (point1.dist &lt;= currentDistance) {             point1 = i1.next() as Curve.Point         }         if (point2.dist &lt;= currentDistance) {             point2 = i2.next() as Curve.Point         }          prevDistance = currentDistance         currentDistance = StrictMath.min(point1.dist, point2.dist)     }          val result = DoubleArray(2)     result[0] = 1 - diff \/ Math.PI     result[1] = 1 - abs(c1.length - c2.length) \/ c1.length     return result }<\/code><\/pre>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0432\u044b\u0445, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u0445, \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439 \u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443. \u041f\u043e\u0442\u0435\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0435 \u0442\u0443\u0442 <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.distep.touchtheline\" rel=\"noopener noreferrer nofollow\">Touch The Line<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/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\/post\/650013\/\"> https:\/\/habr.com\/ru\/post\/650013\/<\/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_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0438\u0441\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 pet-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0433\u0438\u043f\u0435\u0440\u043a\u0430\u0437\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u0433\u0440\u0443 \u0441 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u043e\u0439, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043a\u0440\u0438\u0432\u0443\u044e \u043b\u0438\u043d\u0438\u044e. \u0418\u0434\u0435\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u043a\u0440\u0438\u0432\u044b\u0445 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0434\u0435\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b (\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0432\u0430\u043b\u044c\u043d\u044b\u0435) \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u044f \u043f\u0440\u0438\u0448\u0435\u043b.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c?<\/h2>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0438\u0433\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0430\u044f: \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f \u0438 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043f\u043e \u043d\u0435\u0439 \u043f\u0430\u043b\u044c\u0446\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0440\u0438\u0432\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0431\u043b\u0438\u0437\u043a\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043a\u0440\u0438\u0432\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e, \u043d\u043e \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043d\u0430 1\u0441\u043c, \u0442\u043e \u043e\u043d \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439.<\/p>\n<h2>\u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u044b?<\/h2>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043c\u044b\u0441\u043b\u044c \u0431\u044b\u043b\u0430 &#171;\u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u043b\u044b?&#187;. \u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u044b\u043b\u0430 \u0442\u0430\u043a\u043e\u0439: \u0435\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043b\u0438\u043d\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0445\u043e\u0436\u0438 \u043f\u043e \u0434\u043b\u0438\u043d\u0435, \u0442\u043e \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u044b \u043b\u0438\u043d\u0438\u0439. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b\u0441\u043b\u044c \u0431\u044b\u043b\u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u0431\u0440\u0435\u0434\u043e\u0432\u0430\u044f, \u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u0442. <\/p>\n<p>\u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b\u043b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0444\u0438\u0433\u0443\u0440\u044b \u043f\u043e\u0434 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A7%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%82%D1%80%D0%B0%D0%BF%D0%B5%D1%86%D0%B8%D0%B9\" rel=\"noopener noreferrer nofollow\">\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a>. \u041d\u0435 \u0431\u0443\u0434\u0443 \u0442\u0443\u0442 \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, <a href=\"https:\/\/habr.com\/ru\/post\/420867\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0441\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0437\u0430 \u043c\u0435\u043d\u044f<\/a>. <\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u0442\u0430\u0432\u043b\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0442\u0440\u0430\u043f\u0435\u0446\u0438\u0439:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/** * points - \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 [x1, y1, x2, y2,...] *\/ private fun integral(points: LinkedList&lt;Float>): Double {   var area: Double = 0.0    val i: MutableIterator&lt;Float> = points.iterator()   val prevPoint = FloatArray(2)   prevPoint[0] = i.next() as Float   prevPoint[1] = i.next() as Float    val point = FloatArray(2)    while (i.hasNext()) {     point[0] = i.next() as Float     point[1] = i.next() as Float      val integral: Double = integral(point, prevPoint)     area += integral   }    return area }  \/** * p1 - array [x1,y1] * p2 - array [x2,y2] *\/ private fun integral0(p1: FloatArray, p2: FloatArray): Double {   val dx = abs((p1[0] - p2[0]).toDouble())    return (p1[1]+p2[1])*dx\/2 }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0443 \u043a\u0440\u0438\u0432\u043e\u0439 \u0438 \u043d\u0435 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e \u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043a\u0440\u0438\u0432\u043e\u0439 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u043b\u0438\u043d\u0438\u0439 \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b, \u043d\u043e \u0438\u0445 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u043c\u0438 \u043f\u043e \u0444\u043e\u0440\u043c\u0435.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0422\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u044f<\/h2>\n<p>\u0412\u0442\u043e\u0440\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u044e \u0444\u0438\u0433\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0435\u0441\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0446\u044b \u0434\u0432\u0443\u0445 \u043a\u0440\u0438\u0432\u044b\u0445. \u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u043b\u043e\u0449\u0430\u0434\u044c, \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438, \u0442\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443 \u043f\u043e \u0444\u043e\u0440\u043c\u0435. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\u043d \u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443 \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0444\u0438\u0433\u0443\u0440 \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441\u0435. \u0418\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0437-\u0437\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u043b\u0438\u043d\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u044f \u043e\u0442 \u043d\u0435\u0433\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ol>\n<li>\n<p>\u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041c\u043d\u043e\u0433\u043e \u043a\u0440\u0430\u0435\u0432\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f\u0445 \u043a\u0440\u0438\u0432\u044b\u0445. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043a\u0440\u0438\u0432\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u0441\u0435\u0431\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0441\u043b\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0449\u0430\u0434\u0438, \u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f, \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u0430\u0445 (0% \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438). \u0422\u0430\u043a\u0436\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0434\u043b\u0438\u043d\u044b \u043b\u0438\u043d\u0438\u0439, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u0440\u043e\u0433 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u044f\u0432\u043b\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443, \u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u0442\u0435\u043c\u0443 \u0442\u0440\u0438\u0430\u043d\u0433\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0430 \u043f\u043e\u043a\u0430 \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0441\u0442\u0430\u043b\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0444\u043e\u0440\u043c \u043a\u0440\u0438\u0432\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 \u043a \u0442\u043e\u0447\u043a\u0435. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0444\u043e\u0440\u043c\u0443 \u043a\u0440\u0438\u0432\u043e\u0439, \u043e\u043d \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\u043d \u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0443, \u043d\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d \u043a \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u0440\u0438\u0432\u043e\u0439 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043a\u0440\u0438\u0432\u043e\u0439 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0440\u0438\u0432\u043e\u0439 \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0432\u043e\u0439 \u0432 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0435. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043a\u0440\u0438\u0432\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a.<\/p>\n<pre><code class=\"kotlin\">import java.util.* import kotlin.math.abs  \/** * coordinates - \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 [x1, y1, x2, y2,...] * asc - \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0440\u0438\u0432\u043e\u0439, \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 *\/  class Curve(val coordinates: LinkedList&lt;Float>, asc: Boolean = true) {     val points: LinkedList&lt;Point> = LinkedList() \/\/\u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u043a\u0440\u0438\u0432\u043e\u0439     var length: Double = 0.0 \/\/\u0434\u043b\u0438\u043d\u0430 \u043a\u0440\u0438\u0432\u043e\u0439      init {         val i: MutableIterator&lt;Float> = if(asc) coordinates.iterator() else coordinates.descendingIterator()         val prevPoint = FloatArray(2)         if(asc) {             prevPoint[0] = i.next() as Float             prevPoint[1] = i.next() as Float         } else {             prevPoint[1] = i.next() as Float             prevPoint[0] = i.next() as Float         }         val point = FloatArray(2)        \/*       \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0442\u043e\u0447\u043a\u0430\u043c \u0438 \u0440\u0430\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0443\u0433\u043e\u043b \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0432\u043e\u0439       *\/         while (i.hasNext()) {             if(asc) {                 point[0] = i.next() as Float                 point[1] = i.next() as Float             } else {                 point[1] = i.next() as Float                 point[0] = i.next() as Float             }             val distance = distance(prevPoint, point)             if(distance &lt; 10) continue             length += distance              var angle = StrictMath.atan2(                 (point[1] - prevPoint[1]).toDouble(), (point[0] - prevPoint[0]).toDouble()             )              if (angle &lt; 0.0) angle = abs(alpha)              points.add(                 Point(                   point[0],                   point[1],                   length,                   angle                 )             )              prevPoint[0] = point[0]             prevPoint[1] = point[1]         }                val j: ListIterator&lt;*> = diffs.listIterator()          while (j.hasNext()) (j.next() as Point).dist \/= length      }      private fun distance(p1: FloatArray, p2: FloatArray): Double {         val px = (p1[0] - p2[0]).toDouble()         val py = (p1[1] - p2[1]).toDouble()         return Math.sqrt(px * px + py * py)     }      data class Point(       var x: Float,        var y: Float,       var dist: Double, \/\/percent distance from start       val alpha: Double \/\/atan     ) }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u0441 \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 \u0438\u0433\u0440\u043e\u043a \u043d\u0430\u0447\u0430\u043b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e, \u0442\u043e \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u043a\u043e\u043d\u0435\u0446 \u043b\u0438\u043d\u0438\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u041e\u0442 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0445\u043e\u0434\u0430 \u043b\u0438\u043d\u0438\u0438 \u0438\u0433\u0440\u043e\u043a\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u0438\u043d\u0430 \u043a\u0440\u0438\u0432\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0439, \u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u0435\u043a \u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u0440\u0438\u0432\u044b\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e. <em>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0430 \u041a\u0440\u0438\u0432\u043e\u04391 \u043f\u043e\u043f\u0430\u043b\u0438 \u043d\u0430 \u0442\u043e\u0447\u043a\u0443, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e 10% \u043f\u0443\u0442\u0438, \u0430 \u043d\u0430 \u041a\u0440\u0438\u0432\u043e\u04392 \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0435\u0449\u0435 \u0432 \u0442\u043e\u0447\u043a\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 5% \u043f\u0443\u0442\u0438, \u0442\u043e \u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u041a\u0440\u0438\u0432\u043e\u04392, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043c 10% \u043f\u0443\u0442\u0438. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0435\u0440\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043d\u0430 \u041a\u0440\u0438\u0432\u043e\u04391. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0432\u044b\u0448\u0435 \u0441\u043f\u043b\u043e\u0448\u043d\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043f\u043b\u043e\u0448\u043d\u044b\u043c\u0438, \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u044b\u0435 \u0441 \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u044b\u043c\u0438.<\/em><\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u043a\u043e\u043d\u0435\u0446 \u043b\u0438\u043d\u0438\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0431\u0445\u043e\u0434 \u0441 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430.<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439. <\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u044b \u0442\u043e\u0447\u0435\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439, \u043d\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043d\u0430 \u0434\u043e\u043b\u044e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438. \u0418 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u043a \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u043c\u0443 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u0435\u043a \u043d\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u041f\u0438 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043d\u0435 \u0434\u043b\u044f \u0438\u0433\u0440\u044b \u0431\u044b\u043b\u043e \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u0444\u043e\u0440\u043c\u0443, \u043d\u043e \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0440\u0438\u0432\u043e\u0439, \u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043a\u0440\u0438\u0432\u043e\u0439 \u0438\u0433\u0440\u043e\u043a\u0430 \u043e\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">private fun deltaAngles(alpha1: Double, alpha2: Double): Double {     var dAlpha = StrictMath.abs(alpha1 - alpha2)     if (dAlpha > StrictMath.PI) dAlpha = 2.0 * StrictMath.PI - dAlpha     return dAlpha }  \/** * curve1 - \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 [x1, y1, x2, y2,...] * curve2 - \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0447\u0435\u043a \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 [x1, y1, x2, y2,...] * * return - DoubleArray [Form Accuracy, Length Accuracy] *\/ fun compareCurves(curve1: LinkedList&lt;Float>, curve2: LinkedList&lt;Float>): DoubleArray {     if (curve1.isEmpty() || curve2.isEmpty())         throw IllegalStateException(\"curve can't be empty\")      \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u0438 \u043e\u0431\u0430 \u043a\u0440\u0430\u044f \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439     val xc1: Float = curve1.get(0)     val yc1: Float = curve1.get(1)      val xc2: Float = curve2.get(0)     val yc2: Float = curve2.get(1)      val x2c2: Float = curve2.get(curve2.lastIndex - 1)     val y2c2: Float = curve2.last        \/\/\u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439 \u0438 \u043a\u0440\u0430\u044f\u043c\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439     val mod1 = (xc1 - xc2) * (xc1 - xc2) + (yc1 - yc2) * (yc1 - yc2)     val mod2 = (xc1 - x2c2) * (xc1 - x2c2) + (yc1 - y2c2) * (yc1 - y2c2)      val c1 = Curve(curve1)     \/\/\u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u043a\u0440\u0430\u0439 \u0431\u043b\u0438\u0436\u0435 \u043a \u043d\u0430\u0447\u0430\u043b\u0443, \u0441 \u043d\u0435\u0433\u043e \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0431\u0445\u043e\u0434 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439     val c2 = Curve(curve2, mod1 &lt;= mod2)      val i1: ListIterator&lt;*> = c1.points.listIterator()     val i2: ListIterator&lt;*> = c2.points.listIterator()     var point1: Curve.Point = i1.next() as Curve.Point     var point2: Curve.Point = i2.next() as Curve.Point     var diff = 0.0      var currentDistance: Double = StrictMath.min(d1.dist, d2.dist) \/\/\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0436\u0435 \u043f\u0440\u043e\u0448\u043b\u0438     var prevDistance = 0.0     while (currentDistance &lt;= 1.0) {         val d = currentDistance - prevDistance         diff += deltaAngles(             point1.angle,             point2.angle         ) * d          if (currentDistance == 1.0) break          if (point1.dist &lt;= currentDistance) {             point1 = i1.next() as Curve.Point         }         if (point2.dist &lt;= currentDistance) {             point2 = i2.next() as Curve.Point         }          prevDistance = currentDistance         currentDistance = StrictMath.min(point1.dist, point2.dist)     }          val result = DoubleArray(2)     result[0] = 1 - diff \/ Math.PI     result[1] = 1 - abs(c1.length - c2.length) \/ c1.length     return result }<\/code><\/pre>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043a\u0440\u0438\u0432\u044b\u0445, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0446\u0435\u043d\u0438\u0442\u044c<\/p>\n<\/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-329181","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329181","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=329181"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329181\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=329181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=329181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=329181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}