Криві Серпінського — це рекурсивно визначена послідовність неперервних замкнутих плоских фрактальних кривих, відкритих Вацлавом Серпінським.
Крива Серпінського | |
Названо на честь | Вацлав Серпінський |
---|---|
Підтримується Вікіпроєктом | |
Крива Серпінського у Вікісховищі |
Загальний опис
Крива в границі при повністю заповнює одиничний квадрат, так що гранична крива, також звана кривою Серпінського, є прикладом .
Оскільки крива Серпінського заповнює простір, її розмірність Гаусдорфа (в границі при ) дорівнює . Евклідова довжина кривої
- дорівнює ,
т. е. вона зростає екпоненційно за , а границя при площі області, охопленої кривою , становить квадрата (в Евклідовій метриці).
Використання кривої
Крива Серпінського корисна для деяких практичних застосувань, оскільки вона симетричніша, ніж інші криві, що заповнюють простір, які зазвичай розглядають. Наприклад, її використано як базис для швидкої побудови наближеного розв'язку задачі комівояжера (пошук найкоротшого обходу заданих точок) — евристичний розв'язок полягає у відвідуванні точок у тій послідовності, в якій вони зустрічаються на кривій Серпінського. Для здійснення потрібно два кроки. Спочатку обчислюється обернена позиція кожної точки, потім значення сортуються. Цю ідею використано для системи маршрутизації комерційних машин, яка базувалася тільки на картках .
На основі кривої Серпінського можна реалізувати вібраторні або друковані конструкції антен.
Побудова кривої
Крива, що заповнює простір, є неперервним відображенням одиничного інтервалу в одиничний квадрат і (псевдо) оберненим відображенням одиничного квадрата в одиничний інтервал. Один зі способів побудови псевдооберненого відображення такий. Нехай нижній лівий кут (0, 0) одиничного квадрата відповідає 0.0 (і 1.0). Тоді верхній лівий кут (0, 1) має відповідати 0.25, правий верхній кут (1, 1) — 0.50, а нижній правий кут (1, 0) — 0.75. Прообраз внутрішніх точок обчислюється з використанням рекурсивної структури кривої. Нижче наведено функцію на Java, яка обчислює відносне положення будь-якої точки кривої Серпінського (тобто, псевдообернене значення). Функція приймає координати точки (x, y) і кути охоплювального прямокутного рівнобедреного трикутника (ax, ay), (bx, by) і (cx, cy) (Зауважимо, що одиничний квадрат є об'єднанням двох таких трикутників). Інші параметри визначають рівень точності обчислень.
static long sierp_pt2code( double ax, double ay, double bx, double by, double cx, double cy, int currentLevel, int maxLevel, long code, double x, double y ) { if (currentLevel <= maxLevel) { currentLevel++; if ((sqr(x-ax) + sqr(y-ay)) < (sqr(x-cx) + sqr(y-cy))) { code = sierp_pt2code( ax, ay, (ax+cx)/2.0, (ay+cy)/2.0, bx, by, currentLevel, maxLevel, 2 * code + 0, x, y ); } else { code = sierp_pt2code( bx, by, (ax+cx)/2.0, (ay+cy)/2.0, cx, cy, currentLevel, maxLevel, 2 * code + 1, x, y ); } } return code; }
Наступний аплет на мові Java малює криву Серпінського за допомогою чотирьох взаємно рекурсивних методів (методів, що викликають один одного):
import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; public class SierpinskyCurve extends Applet { private SimpleGraphics sg = null; private int dist0 = 128, dist; private Image offscrBuf; private Graphics offscrGfx; public void init() { sg = new SimpleGraphics(getGraphics()); dist0 = 100; resize(4 * dist0, 4 * dist0); } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { if (g == null) throw new NullPointerException(); if (offscrBuf == null) { offscrBuf = createImage(this.getWidth(), this.getHeight()); offscrGfx = offscrBuf.getGraphics(); sg.setGraphics(offscrGfx); } int level = 3; dist = dist0; for (int i = level; i > 0; i--) dist /= 2; sg.goToXY(2 * dist, dist); sierpA(level); // start recursion sg.lineRel('X', +dist, +dist); sierpB(level); // start recursion sg.lineRel('X', -dist, +dist); sierpC(level); // start recursion sg.lineRel('X', -dist, -dist); sierpD(level); // start recursion sg.lineRel('X', +dist, -dist); g.drawImage(offscrBuf, 0, 0, this); } private void sierpA(int level) { if (level > 0) { sierpA(level - 1); sg.lineRel('A', +dist, +dist); sierpB(level - 1); sg.lineRel('A', +2 * dist, 0); sierpD(level - 1); sg.lineRel('A', +dist, -dist); sierpA(level - 1); } } private void sierpB(int level) { if (level > 0) { sierpB(level - 1); sg.lineRel('B', -dist, +dist); sierpC(level - 1); sg.lineRel('B', 0, +2 * dist); sierpA(level - 1); sg.lineRel('B', +dist, +dist); sierpB(level - 1); } } private void sierpC(int level) { if (level > 0) { sierpC(level - 1); sg.lineRel('C', -dist, -dist); sierpD(level - 1); sg.lineRel('C', -2 * dist, 0); sierpB(level - 1); sg.lineRel('C', -dist, +dist); sierpC(level - 1); } } private void sierpD(int level) { if (level > 0) { sierpD(level - 1); sg.lineRel('D', +dist, -dist); sierpA(level - 1); sg.lineRel('D', 0, -2 * dist); sierpC(level - 1); sg.lineRel('D', -dist, -dist); sierpD(level - 1); } } } class SimpleGraphics { private Graphics g = null; private int x = 0, y = 0; public SimpleGraphics(Graphics g) { setGraphics(g); } public void setGraphics(Graphics g) { this.g = g; } public void goToXY(int x, int y) { this.x = x; this.y = y; } public void lineRel(char s, int deltaX, int deltaY) { g.drawLine(x, y, x + deltaX, y + deltaY); x += deltaX; y += deltaY; } }
Наступна програма на мові Лого малює криву Серпінського з використанням рекурсії.
to half.sierpinski :size :level if :level = 0 [forward :size stop] half.sierpinski :size :level - 1 left 45 forward :size * sqrt 2 left 45 half.sierpinski :size :level - 1 right 90 forward :size right 90 half.sierpinski :size :level - 1 left 45 forward :size * sqrt 2 left 45 half.sierpinski :size :level - 1 end
to sierpinski :size :level half.sierpinski :size :level right 90 forward :size right 90 half.sierpinski :size :level right 90 forward :size right 90 end
Див. також
Примітки
- Platzman, Bartholdi, 1989.
- Bartholdi.
- Слюсар, В. (2007). (PDF). Электроника: наука, технология, бизнес. — 2007. — № 6. с. С. 82—89. Архів оригіналу (PDF) за 3 квітня 2018. Процитовано 18 грудня 2020.
{{}}
:|pages=
має зайвий текст ()
Література
- Loren K. Platzman, John J. Bartholdi III. Spacefilling curves and the planar traveling salesman problem // Journal of the Association of Computing Machinery. — 1989. — Т. 36, вип. 4 (16 червня). — С. 719—737.
- John J. Bartholdi III. Some combinatorial applications of spacefilling curves. — Georgia Institute of Technology. Архівовано з джерела 3 серпня 2012.
В іншому мовному розділі є повніша стаття Sierpiński curve(англ.). Ви можете допомогти, розширивши поточну статтю за допомогою з англійської. (липень 2022)
|
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Krivi Serpinskogo ce rekursivno viznachena poslidovnist neperervnih zamknutih ploskih fraktalnih krivih vidkritih Vaclavom Serpinskim Kriva Serpinskogo Nazvano na chestVaclav Serpinskij Pidtrimuyetsya VikiproyektomVikipediya Proyekt Matematika Kriva Serpinskogo u VikishovishiZagalnij opisKriva v granici pri n displaystyle n rightarrow infty povnistyu zapovnyuye odinichnij kvadrat tak sho granichna kriva takozh zvana krivoyu Serpinskogo ye prikladom Oskilki kriva Serpinskogo zapovnyuye prostir yiyi rozmirnist Gausdorfa v granici pri n displaystyle n rightarrow infty dorivnyuye 2 displaystyle 2 Evklidova dovzhina krivoyi S n displaystyle S n dorivnyuye l n 2 3 1 2 2 n 1 3 2 2 1 2 n displaystyle l n 2 over 3 1 sqrt 2 2 n 1 over 3 2 sqrt 2 1 over 2 n t e vona zrostaye ekponencijno za n displaystyle n a granicya pri n displaystyle n rightarrow infty ploshi oblasti ohoplenoyi krivoyu S n displaystyle S n stanovit 5 12 displaystyle 5 12 kvadrata v Evklidovij metrici Kriva Serpinskogo pershij krok Kriva Serpinskogo kroki 1 i 2 Kriva Serpinskogo kroki vid 1 do 3Vikoristannya krivoyiKriva Serpinskogo korisna dlya deyakih praktichnih zastosuvan oskilki vona simetrichnisha nizh inshi krivi sho zapovnyuyut prostir yaki zazvichaj rozglyadayut Napriklad yiyi vikoristano yak bazis dlya shvidkoyi pobudovi nablizhenogo rozv yazku zadachi komivoyazhera poshuk najkorotshogo obhodu zadanih tochok evristichnij rozv yazok polyagaye u vidviduvanni tochok u tij poslidovnosti v yakij voni zustrichayutsya na krivij Serpinskogo Dlya zdijsnennya potribno dva kroki Spochatku obchislyuyetsya obernena poziciya kozhnoyi tochki potim znachennya sortuyutsya Cyu ideyu vikoristano dlya sistemi marshrutizaciyi komercijnih mashin yaka bazuvalasya tilki na kartkah Na osnovi krivoyi Serpinskogo mozhna realizuvati vibratorni abo drukovani konstrukciyi anten Pobudova krivoyiKriva sho zapovnyuye prostir ye neperervnim vidobrazhennyam odinichnogo intervalu v odinichnij kvadrat i psevdo obernenim vidobrazhennyam odinichnogo kvadrata v odinichnij interval Odin zi sposobiv pobudovi psevdoobernenogo vidobrazhennya takij Nehaj nizhnij livij kut 0 0 odinichnogo kvadrata vidpovidaye 0 0 i 1 0 Todi verhnij livij kut 0 1 maye vidpovidati 0 25 pravij verhnij kut 1 1 0 50 a nizhnij pravij kut 1 0 0 75 Proobraz vnutrishnih tochok obchislyuyetsya z vikoristannyam rekursivnoyi strukturi krivoyi Nizhche navedeno funkciyu na Java yaka obchislyuye vidnosne polozhennya bud yakoyi tochki krivoyi Serpinskogo tobto psevdoobernene znachennya Funkciya prijmaye koordinati tochki x y i kuti ohoplyuvalnogo pryamokutnogo rivnobedrenogo trikutnika ax ay bx by i cx cy Zauvazhimo sho odinichnij kvadrat ye ob yednannyam dvoh takih trikutnikiv Inshi parametri viznachayut riven tochnosti obchislen static long sierp pt2code double ax double ay double bx double by double cx double cy int currentLevel int maxLevel long code double x double y if currentLevel lt maxLevel currentLevel if sqr x ax sqr y ay lt sqr x cx sqr y cy code sierp pt2code ax ay ax cx 2 0 ay cy 2 0 bx by currentLevel maxLevel 2 code 0 x y else code sierp pt2code bx by ax cx 2 0 ay cy 2 0 cx cy currentLevel maxLevel 2 code 1 x y return code Nastupnij aplet na movi Java malyuye krivu Serpinskogo za dopomogoyu chotiroh vzayemno rekursivnih metodiv metodiv sho viklikayut odin odnogo import java applet Applet import java awt Graphics import java awt Image public class SierpinskyCurve extends Applet private SimpleGraphics sg null private int dist0 128 dist private Image offscrBuf private Graphics offscrGfx public void init sg new SimpleGraphics getGraphics dist0 100 resize 4 dist0 4 dist0 public void update Graphics g paint g public void paint Graphics g if g null throw new NullPointerException if offscrBuf null offscrBuf createImage this getWidth this getHeight offscrGfx offscrBuf getGraphics sg setGraphics offscrGfx int level 3 dist dist0 for int i level i gt 0 i dist 2 sg goToXY 2 dist dist sierpA level start recursion sg lineRel X dist dist sierpB level start recursion sg lineRel X dist dist sierpC level start recursion sg lineRel X dist dist sierpD level start recursion sg lineRel X dist dist g drawImage offscrBuf 0 0 this private void sierpA int level if level gt 0 sierpA level 1 sg lineRel A dist dist sierpB level 1 sg lineRel A 2 dist 0 sierpD level 1 sg lineRel A dist dist sierpA level 1 private void sierpB int level if level gt 0 sierpB level 1 sg lineRel B dist dist sierpC level 1 sg lineRel B 0 2 dist sierpA level 1 sg lineRel B dist dist sierpB level 1 private void sierpC int level if level gt 0 sierpC level 1 sg lineRel C dist dist sierpD level 1 sg lineRel C 2 dist 0 sierpB level 1 sg lineRel C dist dist sierpC level 1 private void sierpD int level if level gt 0 sierpD level 1 sg lineRel D dist dist sierpA level 1 sg lineRel D 0 2 dist sierpC level 1 sg lineRel D dist dist sierpD level 1 class SimpleGraphics private Graphics g null private int x 0 y 0 public SimpleGraphics Graphics g setGraphics g public void setGraphics Graphics g this g g public void goToXY int x int y this x x this y y public void lineRel char s int deltaX int deltaY g drawLine x y x deltaX y deltaY x deltaX y deltaY Nastupna programa na movi Logo malyuye krivu Serpinskogo z vikoristannyam rekursiyi to half sierpinski size level if level 0 forward size stop half sierpinski size level 1 left 45 forward size sqrt 2 left 45 half sierpinski size level 1 right 90 forward size right 90 half sierpinski size level 1 left 45 forward size sqrt 2 left 45 half sierpinski size level 1 end to sierpinski size level half sierpinski size level right 90 forward size right 90 half sierpinski size level right 90 forward size right 90 endDiv takozhKriva Gilberta Kriva Koha Kriva Mura Kriva Peano en en Rekursivna funkciya Trikutnik SerpinskogoPrimitkiPlatzman Bartholdi 1989 Bartholdi Slyusar V 2007 PDF Elektronika nauka tehnologiya biznes 2007 6 s S 82 89 Arhiv originalu PDF za 3 kvitnya 2018 Procitovano 18 grudnya 2020 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a pages maye zajvij tekst dovidka LiteraturaLoren K Platzman John J Bartholdi III Spacefilling curves and the planar traveling salesman problem Journal of the Association of Computing Machinery 1989 T 36 vip 4 16 chervnya S 719 737 John J Bartholdi III Some combinatorial applications of spacefilling curves Georgia Institute of Technology Arhivovano z dzherela 3 serpnya 2012 V inshomu movnomu rozdili ye povnisha stattya Sierpinski curve angl Vi mozhete dopomogti rozshirivshi potochnu stattyu za dopomogoyu perekladu z anglijskoyi lipen 2022 Divitis avtoperekladenu versiyu statti z movi anglijska Perekladach povinen rozumiti sho vidpovidalnist za kincevij vmist statti u Vikipediyi nese same avtor redaguvan Onlajn pereklad nadayetsya lishe yak korisnij instrument pereglyadu vmistu zrozumiloyu movoyu Ne vikoristovujte nevichitanij i nevidkorigovanij mashinnij pereklad u stattyah ukrayinskoyi Vikipediyi Mashinnij pereklad Google ye korisnoyu vidpravnoyu tochkoyu dlya perekladu ale perekladacham neobhidno vipravlyati pomilki ta pidtverdzhuvati tochnist perekladu a ne prosto skopiyuvati mashinnij pereklad do ukrayinskoyi Vikipediyi Ne perekladajte tekst yakij vidayetsya nedostovirnim abo neyakisnim Yaksho mozhlivo perevirte tekst za posilannyami podanimi v inshomovnij statti Dokladni rekomendaciyi div Vikipediya Pereklad