Línur á kleinuhring, Klein flösku og varpsléttunni
2022-06-23Þetta verkefni kemur til vegna þess að þegar ég var að gera Moiré mynstra forritið um daginn varð mér hugsað til einfalds Rust forrits sem ég gerði til að teikna sömu línuna eins og hún birtist í fyrsta lagi á kleinuhring, í öðru lagi á Klein flösku, og í þriðja lagi á varpsléttunni. Í rauninni hefði ég átt að hafa talninguna í öfugri röð, því hvatningin fyrir því forriti var hversu litla athygli varpsléttan fær miðað við hinar þjappanirnar á sléttunni. Þess vegna ákvað ég að prófa að þýða það forrit yfir í vafrann, og vonandi fá betri grafík.
En hvað eru einu sinni varpslétta eða Klein flaska, og af hverju er ég að blanda kleinuhring í dæmið án þess að hafa kaffi með? Nefnilega, hugsaðu til leikjanna Asteroids, eða Pacman. Þegar þú ferð upp fyrir toppinn í þessum leikjum kemurðu aftur á botninum, og þegar þú ferð út fyrir leiksvæðið til hægri kemurðu aftur inn til vinstri. Þetta þýðir að þessi leikplön eru grannfræðilega séð kleinuhringir (eða hjólfletir ef maður vill vera sérfræðingur að sunnan) því toppurinn er tengdur við botninn og hægri hliðin við þá vinstri. Ef við hugsum um alla sléttuna, þá er hægt að lýsa þessu sem jafngildisvenslum á sléttunni þannig að punktar með ákveðnu millibili upp eða niður eru gerðir jafnir, og punktar með ákveðnu millibili til hliðanna. Vegna þess að allir punktar sléttunnar eru jafngildir einhverjum samsvarandi punkti í endanlegu flatarmáli undir þessum venslum þá kallast þetta þjöppun á sléttunni.
Það að nota svona jafngildisvensl til að skilgreina nýja hluti (nánar sagt, nýjar grannvíðáttur), er nokkuð almenn og áhugaverð aðferð, sérstaklega ef jafngildisvenslin eru dálítið spes. Þannig er til dæmis sívalningur í rauninni eins og öll sléttan nema með jafngildisvenslum sem gera punkta með ákveðnu millibili í eina átt jafngilda (og þá er það millibil ummál sívalningsins). En nú hefurðu kannski heyrt um Möbius (því miður ekki Morbius) borða, sem maður getur búið til með því að klippa út pappírsræmu, snúa öðrum endanum um hálfhring og líma endana saman. Það er hægt að skilgreina Möbius borða stærðfræðilega með svipuðum hætti og sívalninginn, nema að í staðinn fyrir að punktar með ákveðnu millibili séu jafngildir hver öðrum, þá eru punktarnir jafngildir ef þeir eru með ákveðnu millibili og speglaðir um ás eftir því hversu mörgum lotum frá viðmiðunarpunkti þeir eru. Það hljómar mjög flókið, en hugsaðu um það að það er mjög auðveldlega hægt að búa til raunverulegan hlut sem uppfyllir nákvæmlega þessi skilyrði með límbandi og pappír.
Þá er kleinuhringur eins og að taka sívalning og líma toppinn við botninn, en getum við gert eitthvað álíka fyrir Möbius borða? Það kemur í ljós að, já, það er ekki bara hægt, heldur er hægt að gera það á tvenna máta. Sá fyrsti er að líma saman toppinn og botninn án snúnings (þetta er miklu auðveldara að sjá fyrir sér með jafngildisvenslamyndinni, ég læt fylgja með skýringarmyndir úr „Geometry, Topology and Physics“ eftir Mikio Nakahara), og það gefur manni Klein flösku. En við getum líka bætt við öðrum snúningi og búið til varpsléttu. Það er því miður ekki hægt að búa til líkön af þessum hlutum í raunverunni án þess að fletirnir skeri sjálfa sig, en það væri hægt í fjórum víddum.
Nú er ekkert mál að sjá fyrir sér kleinuhring, og það eru margir hobbýistar búnir að gera líkön af Klein flöskunni, hvort sem það er með þrívíddarprentun, glerblæstri eða einhverju allt öðru sem ég hef ekki séð áður. Það er aftur á móti miklu erfiðara að sjá varpsléttuna fyrir sér, og það er sárafátt um góð líkön af henni. Þess vegna gerði ég upprunalega Rust forrit til að teikna mynd af línu á varpsléttunni eins og hún birtist á ferningi. Það var nokkuð frumstætt forrit sem teiknaði bara einn eða nokkra pixla í hverju skrefi, en hinsvegar skiptu pixlarnir um lit eftir því sem lengra var farið eftir línunni, þannig að maður gat fylgst með því hvernig línan vafðist um sléttuna. Að teikna í Javascript er talsvert öðruvísi því hérna er ég ekki með per-pixel stjórn á teikningunni og þarf í staðinn að finna út skurðpunkta þar sem línan sker jaðra sléttunnar, en á móti er ég með mikil tækifæri til að bæta við gagnvirkni og fá út almennilega teiknaðar línur.
Föllin sem ég notaði í Rust til að setja jafngildisvenslin á sléttuna var hægt að nota nánast óbreytt. Ég lenti hinsvegar í ljótri villu sem tók mig nokkuð langan tíma að finna út úr vegna leyfavirkjans (%) í Javascript. Það er nefnilega stundum sagt að Javascript hafi ekkert með Java að gera, en það eru samt klárlega ýmsar venjur fengnar að láni þaðan. Til dæmis sú að „leyfin“ sem % gefur manni er ekki raunverulega leyfin ef deilistofninn er neikvæður, þannig að -1%5 er -1 samkvæmt Javascript, en ekki 4 eins og Rust, C/++ og hvaða stærðfræðikennari sem er gæti sagt manni. Síðan reyndist dálítið moj að gera strategíu til að teikna línurnar á skynsamlegan hátt, en ég fann út úr því að mestu leyti, nema að hún fer í smá kleinu ef línan fer akkúrat í eitthvert hornanna. Ég hugsa að ég muni ekki reyna að finna út úr því. Þú teiknar línuna með því að smella á eða snerta teikniflötinn. Þú getur snúið línunni með því að skruna og stytt og lengt hana með því að skruna og halda niðri shift takkanum. Á snertiskjá geturðu snúið og skalað línuna með tveimur fingrum.