ããã«ã¡ã¯å人ïŒ
ä»»æã®ã°ã©ãäžã§ãã¹æ€çŽ¢ã®ã©ã€ãã©ãªãäœæããŸãã ã ãããããªããšå
±æããããšæããŸã ã
巚倧ãªã°ã©ãã§ã®äœ¿çšäŸïŒ
ããã§ãã¢ã詊ãããšãã§ããŸãã
ã©ã€ãã©ãªã¯ã NBA*
ãšåŒã°ããããŸãç¥ãããŠããªãããŒãžã§ã³ã®A*
æ€çŽ¢ã䜿çšããŸãã ããã¯åæ¹åã®æ€çŽ¢ã§ããããã¥ãŒãªã¹ãã£ãã¯é¢æ°ã®èŠä»¶ãç·©åãããŠãããéåžžã«ç©æ¥µçãªçµäºåºæºããããŸãã ãã®ææ§ãã«ããããããããã®ã¢ã«ãŽãªãºã ã¯æé©ãªãœãªã¥ãŒã·ã§ã³ã«å¯ŸããŠåªããåæçãæã£ãŠããŸãã
ããŸããŸãªãªãã·ã§ã³ã®èª¬æA*
ããã§è€æ°åäŒã£ã ãã®èšäºã§ã¯ç¹°ãè¿ã説æããªãã®ã§ãç§ã¯ãããæ¬åœã«å¥œãã§ããã ç«ã®äžã§ãã©ã€ãã©ãªãããã«æ©èœããçç±ãšãã¢ã®äœææ¹æ³ã«ã€ããŠè©³ãã説æããŸãã
ã©ã€ãã©ãªãé«éãªã®ã¯ãªãã§ããïŒ
ãã©ãããããããããªã«æ©ãä¿¡ããããªããåãã£ãŠäœãæ°ããªãã®ã¯ééããªãïŒã
æåã«å³æžé€šãèŠãå人ã®åå¿ã
ç§ã¯ããã«èªããªããã°ãªããŸãããç§ã®å®è£
ãå¯èœãªéãéããšã¯æããŸããã ããã眮ãããŠããç°å¢ïŒãã©ãŠã¶ãjavascriptïŒãèæ
®ãããšãååã«é«éã«åäœããŸãã ãã®é床ã¯ã°ã©ãã®ãµã€ãºã«å€§ããäŸåããŸãã ãããŠãã¡ãããçŸåšãªããžããªã«ãããã®ãå éããŠæ¹åããããšãã§ããŸãã
çµ±èš
ããã©ãŒãã³ã¹ã枬å®ããããã«ããã¥ãŒãšãŒã¯ããã®éè·¯ã®ã°ã©ããäœæããŸããïŒçŽ730 000
ãªãã 260 000
ãããïŒã 以äžã®è¡šã¯ãã©ã³ãã ã«éžæããã250ãããã¹ãèŠã€ãã1ã€ã®ã¿ã¹ã¯ã解決ããããã«å¿
èŠãªæéã®çµ±èšã瀺ããŠããŸãã
| å¹³å | äžå€®å€ | å | ããã¯ã¹ | p90 | p99 |
---|
A *é
å»¶ïŒããŒã«ã«ïŒ | 32ms | 24ms | 0ms | 179ms | 73ms | 136ms |
NBA * | 44ms | 34ms | 0ms | 222ms | 107ms | 172ms |
A *åæ¹å | 55ms | 38ms | 0ms | 356ms | 123ms | 287ms |
ãã€ã¯ã¹ãã© | 264ms | 258ms | 0ms | 782ms | 483ms | 631ms |
åã¢ã«ãŽãªãºã ã¯åãåé¡ã解決ããŸããã A*
ã¯æéã§ããã圌ã®ãœãªã¥ãŒã·ã§ã³ã¯åžžã«æé©ãšã¯éããŸããã åºæ¬çã«ãããã¯åæ¹åã®A*
ã§ãããäž¡æ¹ã®æ€çŽ¢ãäžèŽãããšããã«çµäºããŸãã NBA*
åæ¹åãæé©ãªãœãªã¥ãŒã·ã§ã³ã«åæããŸãã 99%
ãæçãã¹ïŒp99ïŒãèŠã€ããã®ã«172
ããªç§ãããããŸããã§ããã
æé©å
ã©ã€ãã©ãªã¯ããã€ãã®çç±ã§æ¯èŒçé«éã§ãã
ãŸãã åªå
床ãã¥ãŒã®ããŒã¿æ§é ã倿ŽããŠããã¥ãŒå
ã®èŠçŽ ã®åªå
åºŠã®æŽæ°ã«O(lg n)
æéãããããã«ããŸããã ããã¯ããã¥ãŒã®åæ§ç¯äžã«åèŠçŽ ãããŒãäžã®äœçœ®ã远跡ãããšããäºå®ã«ãã£ãŠå®çŸãããŸãã
次ã«ãã¹ãã¬ã¹ãã¹ãäžã«ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«ããªãã®æéããããããšã«æ°ä»ããŸããã ã¢ã«ãŽãªãºã ãã°ã©ããåããšãã«å€ãã®å°ããªãªããžã§ã¯ããäœæãããããããã¯é©ãããšã§ã¯ãããŸããã ãªããžã§ã¯ãã®ããŒã«ã䜿çšããŠãã¬ããŒãžã³ã¬ã¯ã¿ãŒã®åé¡ã解決ããŸã ã ããã¯ãäžèŠã«ãªã£ããªããžã§ã¯ããåå©çšã§ããããŒã¿æ§é ã§ãã
ãããŠæåŸã«ã NBA*
æ€çŽ¢ã¢ã«ãŽãªãºã ã«ã¯ããµã€ãã蚪åããããã®éåžžã«çŸããå³ããåºæºããããŸãã
ççŽã«èšã£ãŠãããã¯å®ç§ã®éçã§ã¯ãªããšæããŸãã ããªã¹ã説æããéå±€çãªã¢ãããŒãã䜿çšãããšãããã«å€§ããªã°ã©ãã®æéãççž®ã§ããå¯èœæ§ããããŸãã
ãã¢ã¯ã©ã®ããã«æ©èœããŸããïŒ
ãã¡ãããã©ã€ãã©ãªã®äœæã¯éåžžã«è峿·±ããã®ã§ãã ãããããã®ãã¢ãããžã§ã¯ãã«ã¯å¥ã®èª¬æãå¿
èŠã ãšæããŸãã ç§ã¯ããã€ãã®æèšãåŠã³ãŸããããããã圹ç«ã€ããšãæåŸ
ããŠãçãããšå
±æããããšæããŸãã
å§ããåã«ã 誰ããç§ã«å°ããŸããïŒããããããã¯ã°ã©ãã§ããïŒããããã°ã©ããšããŠã©ã®ããã«è¡šçŸã§ããŸããïŒã å亀差ç¹ãã°ã©ãããŒããšããŠèããã®ãæãç°¡åã§ãã å亀差ç¹ã«ã¯äœçœ®(x, y)
ãŸãã éè·¯ã®åçŽç·åºéãã°ã©ãã®ç«¯ã«ããŸãã éè·¯ã®æ²ããã¯ã亀差ç¹ã®ç¹æ®ãªã±ãŒã¹ãšããŠã¢ãã«åã§ããŸãã
ããŒã¿ã®æºå
ãã¡ããã httpsïŒ//www.openstreetmap.orgã«ã€ããŠèããããšããããŸããããã®å€èгã¯ç§ã«ãšã£ãŠããŸãé
åçã§ã¯ãããŸããã§ããã http://overpass-turbo.eu/ã®ãããªAPIãšããŒã«ãçºèŠãããšãããããç§ã®ç®ã®åã«æ°ããäžçãéãããæ¹æ³ã§ã:)ã 圌ãã¯ODbLã©ã€ã»ã³ã¹ã®äžã§ããŒã¿ãæäŸããŸããããã«ã¯ãèšåããå¿
èŠããããŸãïŒãµãŒãã¹ã«ã€ããŠå€ãã®äººãç¥ã£ãŠããã»ã©ããµãŒãã¹ã¯è¯ããªããŸãïŒã
APIã䜿çšãããšãéåžžã«è€éãªã¯ãšãªãäœæã§ããé©ãã¹ãéã®æ
å ±ãæäŸã§ããŸãã
ããšãã°ããã®ãããªã¯ãšãªã¯ã¢ã¹ã¯ã¯ã®ãã¹ãŠã®èªè»¢è»éè·¯ãæäŸããŸãã
[out:json]; // `a` (area["name"=""])->.a; // a `highway == cycleway` way["highway"="cycleway"](area.a); // ( ) node(w); // , out meta;
APIã®è©³çްã«ã€ããŠã¯ã http ïŒ //wiki.openstreetmap.org/wiki/Overpass_APIãã芧ãã ããã
éœåžãžã®éè·¯ã®ååŸãèªååãã3ã€ã®å°ããªã¹ã¯ãªãããäœæããã°ã©ã圢åŒã«ä¿åããŸããã
ã°ã©ããä¿å
OSMã¯XMLãŸãã¯JSONãšããŠããŒã¿ãéä¿¡ããŸãã æ®å¿µãªãããäž¡æ¹ã®åœ¢åŒã¯å€§ããããŸã-ãã¹ãŠã®éè·¯ãå«ãã¢ã¹ã¯ã¯ã®å°å³ã«ã¯çŽ47MB
ãŸãã ç§ã®ä»äºã¯ãïŒã¢ãã€ã«æ¥ç¶ã§ãã£ãŠãïŒã§ããã ãæ©ããµã€ããããŒãããããšã§ããã
gzip
'ohmã®å§çž®ã詊ã¿ãããšãã§ããŸã-47MBã®ã¢ã¹ã¯ã¯ã®ãããã¯7.1MBã«ãªããŸãã ãããããã®ã¢ãããŒãã§ã¯ãããŒã¿ã®è§£åé床ãå¶åŸ¡ããããšã¯ã§ããŸãããã¯ã©ã€ã¢ã³ãäžã®JavaScriptã§è§£æããå¿
èŠããããåæåé床ã«ã圱é¿ããŸãã
ã°ã©ãçšã«ç¬èªã®åœ¢åŒãäœæããããšã«ããŸããã ã°ã©ãã¯2ã€ã®ãã€ããªãã¡ã€ã«ã«åå²ãããŸãã 1ã€ã¯ãã¹ãŠã®é ç¹ã®åº§æšãæã¡ã2ã€ç®ã¯ãã¹ãŠã®ãšããžã®èª¬æãæã¡ãŸãã
座æšãæã€ãã¡ã€ã«ã¯ã x, y
ãã¢ïŒint32ã座æšããšã«4ãã€ãïŒã®ã·ãŒã±ã³ã¹ã§ãã 座æšã®ãã¢ãäœçœ®ãããªãã»ãããé ç¹ã®èå¥åïŒ nodeId
ïŒãšnodeId
ãŸãã

ã°ã©ãã®ãšããžã¯fromNodeId, toNodeId
ã®ãã¢ã®éåžžã®ã·ãŒã±ã³ã¹ã«fromNodeId, toNodeId
ãŸãã

å³ã®ã·ãŒã±ã³ã¹ã¯ãæåã®ããŒãã2çªç®ãåç
§ãã2çªç®ã3çªç®ãåç
§ããããšãæå³ããŸãã
V
ããŒããšE
ãšããžãæã€ã°ã©ãã®åèšãµã€ãºã¯ã次ã®ããã«èšç®ã§ããŸãã
storage_size = V * 4 * 2 + # 4 E * 4 * 2 = # 4 (V + E) * 8 # ,
ããã¯æãå¹ççãªå§çž®æ¹æ³ã§ã¯ãããŸããããå®è£
ãéåžžã«ç°¡åã§ãã¯ã©ã€ã¢ã³ãã®åæã°ã©ããéåžžã«è¿
éã«åŸ©å
ã§ããŸãã javascript'eã®åä»ãé
åã¯ãJSON'aãè§£æãããããéãåäœããŸãã
æåã¯ããšããžã®éã¿ã远å ãããã£ãã®ã§ãããå°ããªã°ã©ãã§ãã£ãŠãã匱ãã¢ãã€ã«æ¥ç¶ã§ã®èªã¿èŸŒã¿ã¯ããã«é
ããªããããèªåèªèº«ãæ¢ããŸããã
æåã«æºåž¯é»è©±
ãã¢ãæžãããšããç§ã¯åœŒã«ã€ããŠåœŒã«Twitterã§æçš¿ãããšæããŸããã ã»ãšãã©ã®äººã¯æºåž¯é»è©±ããTwitterãèªãããããã¢ã¯äž»ã«æºåž¯é»è©±åãã«èšèšããå¿
èŠããããŸãã ããã«ããŒããããªãå ŽåããŸãã¯ã¿ããããµããŒãããªãå Žå-æžã蟌ã¿ã¯è¡ãããŸããã
çºè¡šã®æ°æ¥åŸãäžèšã®è«çãæ£åœåãããããšãèªèããããšãã§ããŸãã ãã¢ã®çºè¡šã䌎ããã€ãŒãã¯ãç§ã®ãã€ãã¿ãŒã®äžã§æã人æ°ã®ãããã€ãŒãã«ãªããŸããã
äž»ã«iPhoneããã³Androidãã©ãããã©ãŒã ã§ãã¢ããã¹ãããŸããã Androidã§ã®ãã¹ãã§ã¯ãæãå®ãé»è©±ãèŠã€ããŠäœ¿çšããŸããã ããã¯ãå°ããªç»é¢ã§ã®ããã©ãŒãã³ã¹ãšäœ¿ããããã®ãããã°ã«å€§ãã«åœ¹ç«ã¡ãŸããã
éåææ§
ãã¢ã§æãé
ãéšåã¯ããµã€ãã®æåã®èªã¿èŸŒã¿ã§ããã ã°ã©ããåæåããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸããã
for (let i = 0; i < points.length; i += 2) { let nodeId = Math.floor(i / 2); let x = points[i + 0]; let y = points[i + 1];
äžèŠ-äœãééã£ãŠããŸããã ãã ããããã匱ãããã»ããµãšå€§ããªã°ã©ãã§å®è¡ãããšãã¡ã€ã³ã¹ã¬ãããå埩åŠçãå®è¡ããŠããéã«ããŒãžãç¡å¹ã«ãªããŸãã
ãŠã§ã€ã¢ãŠãïŒ äžéšã®ãŠãŒã¶ãŒã¯Web Workersã䜿çšããŠããŸãã ãã¹ãŠããã«ãã³ã¢ã«ãªã£ãããšãèãããšãããã¯çŽ æŽããããœãªã¥ãŒã·ã§ã³ã§ãã ããããç§ã®å ŽåãWebã¯ãŒã«ãŒã䜿çšãããšããã¢ã®äœæã«ãããæéã倧å¹
ã«å»¶é·ãããŸãã ã¹ããªãŒã éã§ããŒã¿ã転éããæ¹æ³ãåæããæ¹æ³ãããããªãŒå¯¿åœãç¯çŽããæ¹æ³ãWebã¯ãŒã«ãŒãå©çšã§ããªãå Žåã®å¯ŸåŠæ¹æ³ãªã©ãèæ
®ããå¿
èŠããããŸãã
ãã£ãšæéããããããªãã£ãã®ã§ããã£ãšæ decisionãªæ±ºæãå¿
èŠã§ããã ã«ãŒããå£ãããšã«ããŸããã ãã°ããå®è¡ããŠãçµéããæéã確èªãã setTimeout()
ãåŒã³åºããŠãã€ãã³ãã«ãŒãã®æ¬¡ã®å埩ã§ç¶è¡ããŸãã ãããã¯ãã¹ãŠã raforã©ã€ãã©ãªã§è¡ãããŸãã
ãã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããšããã©ãŠã¶ã¯å
éšã§äœãèµ·ãã£ãŠããããåžžã«ãŠãŒã¶ãŒã«éç¥ããããšãã§ããŸãã

æç»
ã°ã©ããèªã¿èŸŒãŸããã®ã§ãç»é¢ã«è¡šç€ºããå¿
èŠããããŸãã ãã¡ãããSVGã䜿çšããŠ100äžåã®èŠçŽ ãã¬ã³ããªã³ã°ããã®ã¯ãããããŸãããæåã®1äžåãè¶
ãããšé床ãäœäžãå§ããŸãã ã°ã©ããã¿ã€ã«ã«åå²ãã ãªãŒãã¬ãããŸãã¯OpenSeadragonã䜿çšããŠå€§ããªçµµãæãããšãã§ããŸãã
ã³ãŒãããã詳现ã«å¶åŸ¡ãããïŒãããŠWebGLãåŠã¶ïŒããã«ãWebGLã¬ã³ãã©ãŒããŒãããäœæããŸããã ããã§ããã·ãŒã³ã°ã©ããã¢ãããŒãã䜿çšããŸãã ãã®ã¢ãããŒãã§ã¯ãæç»å¯èœãªèŠçŽ ã®éå±€ããã·ãŒã³ãæ§ç¯ããŸãã ãã¬ãŒã ã®ã¬ã³ããªã³ã°äžã«ãã°ã©ãã調ã¹ãŠãåããŒãã«å€æãèç©ããããç»é¢ã«è¡šç€ºãããããæ©äŒãäžããŸãã three.jsãŸãã¯éåžžã®DOMã«ç²ŸéããŠããå Žåããã®ã¢ãããŒãã¯æ°ãããã®ã§ã¯ãããŸããã
ã¬ã³ãã©ãŒã¯ããã§å
¥æã§ããŸãããç§ã¯æå³çã«ãããææžåããŸããã§ããã ããã¯ç§èªèº«ã®ãã¬ãŒãã³ã°ã®ããã®ãããžã§ã¯ãã§ããã䜿çšã§ãããšããå°è±¡ãäžããããããŸãã:)
ããããªãŒ

æåã¯ãåãã¬ãŒã ã§ã·ãŒã³ãåæç»ããŸããã ããã«ãããã«ããé»è©±ã倧å¹
ã«æãŸããããããªãŒãé©ãã¹ãé床ã§ãŒãã«ãªãããšãããããŸããã
ãããã®æ¡ä»¶äžã§ã³ãŒããæžãããšã¯ãåæ§ã«äžäŸ¿ã§ããã ãã®ãããžã§ã¯ãã«åãçµãããã«ãç§ã¯ãã€ã空ãæéã«ã³ãŒããŒã·ã§ããã«åº§ã£ãŠããŸããã ãããã£ãŠãç§ã¯ããéãèããããšãåŠã¶ããã©ããããããããã»ã©éãçéžãããªãæ¹æ³ãèŠã€ããªããã°ãªããŸããã§ããã
2çªç®ã®ãªãã·ã§ã³ãéžæãããããããéãèããæ¹æ³ããŸã èŠã€ããŠããŸããã ãœãªã¥ãŒã·ã§ã³ã¯åçŽãªãã®ã§ããããšã倿ããŸããã
ãã¹ãŠã®ãã¬ãŒã ã«ã·ãŒã³ãæç»ããªãã§ãã ããã å°ããããå ŽåããŸãã¯å€æŽãããããšãããã£ãŠããå Žåã«ã®ã¿æç»ããŸãã
ä»ã§ã¯ããŸãã«ãæçœã«èŠãããããããŸããããæåã¯ããã§ã¯ãããŸããã§ããã çµå±ã®ãšãããåºæ¬çã«WebGLã䜿çšãããã¹ãŠã®äŸã¯ãåçŽãªã«ãŒãã説æããŠããŸãã
function frame() { requestAnimationFrame(frame); // renderScene(); // . // , }
ãä¿å®çãªãã¢ãããŒãã§ã¯ã requestAnimationFrame()
frame()
颿°ããåãåºãå¿
èŠããããŸããã
let frameToken = 0; function renderFrame() { if (!frameToken) frameToken = requestAnimationFrame(frame); } function frame() { frameToken = 0; renderScene(); }
ãã®ã¢ãããŒãã«ããã誰ã§ã次ã®ãã¬ãŒã ã®æç»ãèŠæ±ã§ããŸãã ããšãã°ããŠãŒã¶ãŒããããããã©ãã°ããŠå€æãããªãã¯ã¹ã倿Žãããšã renderFrame()
ã
frameToken
倿°ã¯ããã¬ãŒã éã§requestAnimationFrame
å床åŒã³åºãããšãåé¿ããã®ã«åœ¹ç«ã¡ãŸãã
ã¯ããã³ãŒããæžãã®ãå°ãé£ãããªã£ãŠããŸãããããããªãŒå¯¿åœã¯ç§ã«ãšã£ãŠããéèŠã§ããã
ããã¹ããšè¡
WebGLã¯äžçã§æãç°¡åãªAPIã§ã¯ãããŸããã ããã¹ããšå€ªãç·ïŒå¹
ã1ãã¯ã»ã«ãã倧ããïŒãæ±ãã®ã¯ç¹ã«å°é£ã§ãã

ç§ã¯ãã®ããžãã¹ã«å®å
šã«æ
£ããŠããªãã®ã§ãããã¹ã/è¡ã®ãµããŒãã远å ãããšããªãæéããããããšã«ããã«æ°ä»ããŸããã
äžæ¹ãããã¹ãããã¯ãã©ãã«A
ãšB
ããã€ãæç»ããã ãã§æžã¿ãŸãA
B
ãããŠå€ªãç·ã®-2ã€ã®ããŒã¯ãæ¥ç¶ãããã¹ã®ã¿ã ãã®ã¿ã¹ã¯ã¯DOM'aã«ããªã察å¿ããŠããŸãã
ãåç¥ã®ãšãããã¬ã³ãã©ãŒã¯ã·ãŒã³ã°ã©ãã䜿çšããŸãã çŸåšã®å€æã... SVGèŠçŽ ã«é©çšããããšãã¿ã¹ã¯ã§ããã·ãŒã³ã«å¥ã®èŠçŽ ã远å ããŠã¿ãŸãããïŒ ãã®SVGèŠçŽ ãéæã«ããŠããã£ã³ãã¹ã®äžã«é
眮ããŸãããã ããŠã¹ãããã¹ãŠã®ã€ãã³ããåé€ããã«ã¯ã pointer-events: none;
èšå®ãpointer-events: none;
ã

ããã¯éåžžã«è¿
éãã€æã£ãŠå€æããŸãã ã
ãããå
ãç§»åãã
ããã²ãŒã·ã§ã³ãéåžžã®ãããã®åäœã®ããã«ãããã£ãïŒããšãã°ãGoogleãããã®ããã«ïŒã
SVGçšã«äœæãããããã²ãŒã·ã§ã³ã©ã€ãã©ãªanvaka / panzoomããã§ã«æã£ãŠããŸããã ã¿ãããšåçæžè¡°ããµããŒãããŸããïŒæ
£æ§ã«ããã«ãŒããåãç¶ããå ŽåïŒã WebGLããµããŒãããããã«ãã©ã€ãã©ãªãå°ã調æŽããå¿
èŠããããŸããã
panzoom
ã¯ãŠãŒã¶ãŒããã®ã€ãã³ãïŒ mousedown
ã touchstart
ãªã©ïŒãtouchstart
ãã倿ãããªãã¯ã¹ã«ã¹ã ãŒãºãªå€æãé©çšããSVGãçŽæ¥æäœãã代ããã«ããããªãã¯ã¹ããã³ã³ãããŒã©ãŒãã«æž¡ããŸãã ã³ã³ãããŒã©ãŒã®ã¿ã¹ã¯ã¯ã倿ãé©çšããããšã§ãã ã³ã³ãããŒã©ãŒã¯ãSVGãDOMããŸãã¯WebGLã·ãŒã³ã«å€æãé©çšããç¬èªã®ã³ã³ãããŒã©ãŒã§ããå ŽåããããŸãã
ã¯ãªãã¯ããããã®ãçè§£ããæ¹æ³ã¯ïŒ
ã°ã©ããããŒãããæ¹æ³ãã°ã©ããæç»ããæ¹æ³ãããã³ã°ã©ãå
ãç§»åããæ¹æ³ã«ã€ããŠèª¬æããŸããã ãããããŠãŒã¶ãŒãã°ã©ãã«è§Šãããšãã«æŒããããã®ãã©ã®ããã«çè§£ããã®ã§ããïŒ éãéãå Žæãšå Žæ
ãŠãŒã¶ãŒãããããã¯ãªãã¯ãããšãã°ã©ãå
ã®ãã¹ãŠã®ãã€ã³ããç°¡åã«åã£ãŠããã®äœçœ®ãèŠãŠãæãè¿ããã€ã³ããèŠã€ããããšãã§ããŸãã å®éãããã¯æ°åãã€ã³ãã«ãšã£ãŠçŽ æŽãããæ¹æ³ã§ãã ãã€ã³ãã®æ°ãæ°äž/æ°åäžãè¶
ããå Žåãçç£æ§ã¯èš±å®¹ã§ããŸããã
ã€ã³ããã¯ã¹ããªãŒã«ã¯ã¢ããããªãŒã䜿çšããŸããã ããªãŒãäœæãããåŸ-æè¿åã®æ€çŽ¢é床ã¯å¯Ÿæ°ã«ãªããŸãã
ãšããã§ããã¯ã¯ããããªãŒããšããçšèªãåšå§çã«èãããå Žåã¯ãåæºããªãã§ãã ããã å®éãååæšã¯éåžžã®äºåæšã«éåžžã«ãã䌌ãŠããŸãã ãããã¯åŠç¿ãããããå®è£
ãããããé©çšããããã§ãã
ç¹ã«ãèªåã®å®è£
ã§ããyaqt libraryã䜿çšããŸãããããã¯ãããŒã¿åœ¢åŒã®ããã«ã¡ã¢ãªå
ã§æ°åããªãããã§ãã é©åãªããã¥ã¡ã³ããšã³ãã¥ããã£ïŒ d3-quadtreeãªã© ïŒãåãããããè¯ãä»£æ¿ææ®µããããŸãã
æ¹æ³ãæ¢ããŠããŸã
ããã§ããã¹ãŠã®éšåãé
眮ãããŸããã ã°ã©ãããããã°ã©ãã®æç»æ¹æ³ãã¯ãªãã¯ããããã®ãããããŸãã æççµè·¯ãèŠã€ããããšã ããæ®ã£ãŠããŸãã
// pathfinder https://github.com/anvaka/ngraph.path let path = pathFinder.find(fromId, toId);
ããã§ãèŠã€ãã£ããã¹äžã«ããé ç¹ã®é
åãã§ããŸããã
ãããã«
ã°ã©ããšã·ã§ãŒãã«ããã®äžçãžã®ãã®çãæ
è¡ã楜ããã ããšãé¡ã£ãŠããŸãã ã©ã€ãã©ãªã圹ã«ç«ã€ãã©ããããŸãã¯ã©ã€ãã©ãªãæ¹åããããã®ãã³ããããã°æããŠãã ããã
ãããããé¡ãããŸãïŒ
ã¢ã³ãã¬ã€ã