ãã£ãŒãã®å€ãã®èå³æ·±ãå¿çšãšãããã«é¢ããããã€ãã®èå³æ·±ãäºå®ãèæ ®ãããŸãã é¢çœãã§ãããïŒ
èšäºã®æŠèŠïŒ
- å¿ èŠãªæŠå¿µãšå®çŸ©
- æ§ç¯ã¢ã«ãŽãªãºã
- ã¢ããªã±ãŒã·ã§ã³
- èå³æ·±ãäºå®
- åç §
ãã®èšäºã§ã¯ãå¹³é¢äžã«ãããã€å³ãæ§ç¯ããããã®ã¢ã«ãŽãªãºã ã®ã¿ãèæ ®ãããããšã«æ³šæããŠãã ããã éäžã§ããã€ã¢ã°ã©ã ã®äœæã«å¿ èŠãªä»ã®ã¢ã«ãŽãªãºã ãæ€èšããŸãã2ã€ã®ã»ã°ã¡ã³ãã®äº€ç¹ã決å®ããã¢ã«ãŽãªãºã ã2ã€ã®åžå€è§åœ¢ã亀差ãããO'Rourkeã¢ã«ãŽãªãºã ãããã³ã海岞ç·ããäœæããã¢ã«ãŽãªãºã ã§ãã
å¿ èŠãªæŠå¿µãšå®çŸ©
次ã«èµ·ããããšã¯ãã¹ãŠ é£è¡æ©äžã«ãããšããã«èšããªããã°ãªããŸããã
ããŠããããäœã§ããããç解ããåã«-ãããã€å³ãç§ãã¡ãå¿ èŠãšãã幟äœåŠãªããžã§ã¯ãã®ããã€ãã®æŠå¿µãæãåºãããŸãïŒãã ããç¹ãç·ãå ç·ãç·åãå€è§åœ¢ãé ç¹ãå€è§åœ¢ã®ãšããžã®å®çŸ©ã«æ¢ã«ç²ŸéããŠãããšä»®å®ããŸããå¹³é¢ãåå²ãããã¯ãã«ããã³çŽæçãªæŠå¿µïŒïŒ
åçŽãªããªãŽã³ãšã¯ãèªå·±äº€å·®ã®ãªãããªãŽã³ã§ãã åçŽãªããªãŽã³ã®ã¿ãæ€èšããŸãã
éåžå€è§åœ¢ãšã¯ã2ã€ã®é ç¹ãååšããå€è§åœ¢ã®ããšã§ããããã®é ç¹ãçµã¶ãšããžãé€ããæå®ãããå€è§åœ¢ãšäº€å·®ããç·ãæãããŸãïŒå³ãåç §ïŒã
åžå€è§åœ¢ãšã¯ã蟺ã®å»¶é·ç·ãä»ã®èŸºãšäº€å·®ããªãå€è§åœ¢ã§ãïŒå³ãåç §ïŒã ä»ã®å®çŸ©ã¯ãŠã£ãããã£ã¢ã§å©çšå¯èœã§ãã
ãã€ã¢ã°ã©ã ãæ§æããã®ã¯åžå€è§åœ¢ã§ãã ãªãåžããæ£ç¢ºã«ïŒ ãããã¯åžé¢å³åœ¢ã§ããåå¹³é¢ã®äº€ç¹ïŒåŸã§èŠãïŒã«ãããªããããåžé¢å³åœ¢ã®äº€ç¹ãåžé¢å³åœ¢ã§ããçç±ã¯ããã«ããã®ã§ãèªåã§ç¢ºãããããšããå§ãããŸãïŒèšŒæ ã¯ãããšãã°æ¬[2]ã«ãããŸã ïŒã
åå¹³é¢ã«ã€ããŠè©±ãå§ããã®ã§ããã€ã¢ã°ã©ã èªäœïŒããããè»è·¡ãããªãïŒã«ã¹ã ãŒãºã«ç§»åã§ããŸãããã®é åã§ã¯ãä»ã®ãã¹ãŠã®ãã€ã³ããããç¹å®ã®ãã€ã³ãã«è¿ããã€ã³ãããã¹ãŠãããŸãã ãããã€å³ã§ã¯ãè»è·¡ã¯åžå€è§åœ¢ã§ãã
è»è·¡ãäœæããæ¹æ³ã¯ïŒ å®çŸ©ã«ããã次ã®ããã«æ§ç¯ãããŸããnåã®ãã€ã³ãã®ã»ãããäžããŠããã€ã¢ã°ã©ã ãæ§ç¯ããŸãã è»è·¡ãæ§æããç¹å®ã®ãã€ã³ãpãš ãäžããããã»ããã®å¥ã®ãã€ã³ã-q ïŒ pãšçãããªãïŒãåããŸãã ãããã®2ã€ã®ãã€ã³ããçµã¶ç·ãæç»ãããã®ã»ã°ã¡ã³ãã®äžå€®ã®åç·ãšãªãç·ãæç»ããŸãã ãã®ç·ã¯å¹³é¢ã2ã€ã®åå¹³é¢ã«åå²ããŸãã1ã€ã¯ç¹pã§ããã1ã€ã¯ç¹qã§ãã ãã®å Žåããããã®2ç¹ã®è»è·¡ã¯ãçµæã®åå¹³é¢ã§ãã ã€ãŸããç¹pã®è»è·¡ãæ§ç¯ããã«ã¯ããã®ãããªãã¹ãŠã®åå¹³é¢ã®äº€ç¹ãååŸããå¿ èŠããããŸãïŒã€ãŸãã qãé€ãç¹å®ã®ã»ããã®ãã¹ãŠã®ç¹ãqã®ä»£ããã«ãªããŸãïŒã
è»è·¡ãæ§ç¯ããããã€ã³ãã¯ã ãµã€ããšåŒã°ããŸã ã 次ã®å³ã§ã¯ãè»è·¡ã¯ç°ãªãè²ã§ããŒã¯ãããŠããŸãã
ãã€ã¢ã°ã©ã ãæ§ç¯ããããã®ã¢ã«ãŽãªãºã ã¯ãç¹å®ã®ã»ããã®ãã¹ãŠã®ãã€ã³ãã«å¯ŸããŠãããã®åãè»è·¡ãæ§ç¯ããããã®ã¢ã«ãŽãªãºã ã«ä»ãªããŸããã ãã®åé¡ã®è»è·¡ã¯ã ãããã€ããªãŽã³ãŸãã¯ãããã€ã»ã«ãšãåŒã°ããŸã ã
æåŸã«ãå¹³é¢äžã®nç¹ã®ãããã€å³ã®å®çŸ©ãå®åŒåããŸãïŒnã¯æ£ã®æŽæ°ïŒ-ããã¯ã nè»è·¡ ïŒè»è·¡ããšã®åç¹ïŒã§æ§æãããå¹³é¢ã®ããŒãã£ã·ã§ã³ã§ã ã ç¹°ãè¿ãã«ãªããŸãããå¥ã®å®çŸ©ã¯Wikipediaã«ãããŸãã
ã¡ãªã¿ã«ãããã¯ãããã€å³ã®ã€ã³ã¿ã©ã¯ãã£ããªã«ã©ãŒããžã¥ã¢ã©ã€ã¶ãŒãåãããµã€ãã§ãã
ãã€ã¢ã°ã©ã ãã©ã®ããã«è¡šç€ºããããªããããã€ãšããååãä»ããããŠããã®ãã«èå³ãããå Žåã¯ã以äžã®ãã¿ãã¬ãã芧ãã ããã
æŽå²çäºå®
ïŒ ãã®ãµã€ãããåãããè³æïŒ
äžè¬ã«ããã®å³ã®æåã®äœ¿çšæ³ã¯ãRene DescartesïŒ1596-1650ïŒãThe Beginning of PhilosophyïŒ1644ïŒã®äœåã«ãããŸãã ãã«ã«ãã¯ãå®å®ãæã®éåã®åœ±é¿ã®ãŸãŒã³ã«åå²ããããšãææ¡ããŸããã
ããã2äžçŽåŸãæåãªãã€ãã®æ°åŠè ãšãã³ããŒã¿ãŒã°ã¹ã¿ãã¬ãžã¥ãŒããã£ãªã¯ã¬ïŒ1805幎-1859幎ïŒã2次å ããã³3次å ã®å Žåã®å³ãå°å ¥ããŸããã ãããã£ãŠããããã¯ãã£ãªã¯ã¬å³ãšåŒã°ããããšããããŸãã
ãŸãããã§ã«1908幎ã«ããã·ã¢ã®æ°åŠè Georgy Feodosievich VoronoiïŒ1868幎4æ16æ¥ïŒ28ïŒã1868幎-1908幎11æ7æ¥ïŒ20ïŒã1908幎ïŒã¯ããã®å³ããã倧ããªæ¬¡å ã®ç©ºéã«ã€ããŠèª¬æããŸããã ãã¡ãã圌ã®çãäŒèšã§ãïŒ ãŠã£ãããã£ã¢ããåŒçšïŒïŒ
ã²ãªã«ã®ãŒã»ãã§ãªãã·ãšãããã»ãããã€ã¯ããã«ã¿ãå·ã®ãºã©ãŽã«æïŒçŸåšã®ãã§ã«ããŒããŠå°åïŒã§çãŸããŸããã 1889幎以æ¥ã圌ã¯ãµã³ã¯ãããã«ãã«ã¯å€§åŠã§ã¢ã³ãã¬ã€ã»ãã«ã³ããšåŠã³ãŸããã 1894幎ã圌ã¯ä¿®å£«è«æã3次æ¹çšåŒã®æ ¹ã«äŸåããæŽæ°ã«ã€ããŠããæè·ããã å幎ã圌ã¯ã¯ã«ã·ã£ã¯å€§åŠã®ææã«éžåºãããããã§éã®åæ°ãç 究ããŸããã ãããã€ã¯ã ãŽã¡ãŒãã©ãã»ã·ã§ã«ãã³ã¹ããŒã«ãã£ãŠèšç·ŽãããŸããã 1897幎ããããã€ã¯ãç¶ç¶åæ°ã®ã¢ã«ãŽãªãºã ã®äžè¬åã«ã€ããŠãå士è«æãæè·ããããã£ã³ãã¹ããŒè³ãåè³ããŸããã
ã¡ãã£ãšããæŽå²
ïŒ ãã®ãµã€ãããåãããè³æïŒ
äžè¬ã«ããã®å³ã®æåã®äœ¿çšæ³ã¯ãRene DescartesïŒ1596-1650ïŒãThe Beginning of PhilosophyïŒ1644ïŒã®äœåã«ãããŸãã ãã«ã«ãã¯ãå®å®ãæã®éåã®åœ±é¿ã®ãŸãŒã³ã«åå²ããããšãææ¡ããŸããã
ããã2äžçŽåŸãæåãªãã€ãã®æ°åŠè ãšãã³ããŒã¿ãŒã°ã¹ã¿ãã¬ãžã¥ãŒããã£ãªã¯ã¬ïŒ1805幎-1859幎ïŒã2次å ããã³3次å ã®å Žåã®å³ãå°å ¥ããŸããã ãããã£ãŠããããã¯ãã£ãªã¯ã¬å³ãšåŒã°ããããšããããŸãã
ãŸãããã§ã«1908幎ã«ããã·ã¢ã®æ°åŠè Georgy Feodosievich VoronoiïŒ1868幎4æ16æ¥ïŒ28ïŒã1868幎-1908幎11æ7æ¥ïŒ20ïŒã1908幎ïŒã¯ããã®å³ããã倧ããªæ¬¡å ã®ç©ºéã«ã€ããŠèª¬æããŸããã ãã¡ãã圌ã®çãäŒèšã§ãïŒ ãŠã£ãããã£ã¢ããåŒçšïŒïŒ
ã²ãªã«ã®ãŒã»ãã§ãªãã·ãšãããã»ãããã€ã¯ããã«ã¿ãå·ã®ãºã©ãŽã«æïŒçŸåšã®ãã§ã«ããŒããŠå°åïŒã§çãŸããŸããã 1889幎以æ¥ã圌ã¯ãµã³ã¯ãããã«ãã«ã¯å€§åŠã§ã¢ã³ãã¬ã€ã»ãã«ã³ããšåŠã³ãŸããã 1894幎ã圌ã¯ä¿®å£«è«æã3次æ¹çšåŒã®æ ¹ã«äŸåããæŽæ°ã«ã€ããŠããæè·ããã å幎ã圌ã¯ã¯ã«ã·ã£ã¯å€§åŠã®ææã«éžåºãããããã§éã®åæ°ãç 究ããŸããã ãããã€ã¯ã ãŽã¡ãŒãã©ãã»ã·ã§ã«ãã³ã¹ããŒã«ãã£ãŠèšç·ŽãããŸããã 1897幎ããããã€ã¯ãç¶ç¶åæ°ã®ã¢ã«ãŽãªãºã ã®äžè¬åã«ã€ããŠãå士è«æãæè·ããããã£ã³ãã¹ããŒè³ãåè³ããŸããã
æ§ç¯ã¢ã«ãŽãªãºã
ãããã€å³ã®äœææ¹æ³ãåŠã³ãŸãã 4ã€ã®ã¢ã«ãŽãªãºã ãæ€èšããŸãããã®ãã¡2ã€ã¯è©³çŽ°ã§ãïŒ1ã€ã¯å®è£ ãããå¥ã®èšäºã§ã¯Fortuneã®ã¢ã«ãŽãªãºã ã®å®å šãªå®è£ ã«å°å¿µããŸãïŒã
- ãé¡ã«ããããã€å³ãããããããããã®ã¢ã«ãŽãªãºã ã é£æåºŠïŒ ;
- åå¹³é¢ã亀差ãããŠãããã€å³ãäœæããã¢ã«ãŽãªãºã ã é£æåºŠïŒ ;
- å¹³é¢äžã«ãããã€å³ãäœæããããã®ãã©ãŒãã¥ã³ã®ã¢ã«ãŽãªãºã ã é£æåºŠïŒ ;
- ååž°çãããã€ç·å³ããããã¢ã«ãŽãªãºã ã é£æåºŠïŒ ã
ããã€ãã®ã¢ã«ãŽãªãºã ã®èª¬æã®åŸãC ++ã§ã®å®è£ ãæäŸãããŸãã å®è£ ã«ã¯ãç§ãã¡ãäœæããã©ã€ãã©ãªSplashGeom©-github ãžã®ãªã³ã¯ã䜿çšããŸãããããã«ã¯ãå¹³é¢äžããã³ç©ºéå ã®ããã€ãã®èšç®ãžãªã¡ããªã®ã¢ã«ãŽãªãºã ãå®è£ ããããã«å¿ èŠãªãã¹ãŠãå«ãŸããŠããŸãã ãã®ã©ã€ãã©ãªãå³å¯ã«å€æããªããããé¡ãããŸãããŸã 掻çºãªéçºãšæ¹åã®æ®µéã«ãããŸããããã¹ãŠã®ã³ã¡ã³ããèãããŸãã
ä»ã®å®è£ ã«èå³ãããå Žåã¯ã次ã®ãšããã§ãã
- boost.polygon
- Steve Fortuneã®Webãµã€ã
- ãªãŒãªã³/ãªãŒãã³ãããã€
- Javaå®è£
- JavaScriptã§ã®å®è£ ïŒããžã¥ã¢ã©ã€ã¶ãŒããããŸãïŒ
ããã§ã¯ãã¢ã«ãŽãªãºã ã®çŽæ¥èª¿æ»ã«ç§»ããŸãããã
ãé¡ã«ããããã€å³ãæ§ç¯ããããã®ã¢ã«ãŽãªãºã
ããã§ã®ã¢ã€ãã¢ã¯ãåå¹³é¢ã暪åãã®ã§ã¯ãªããã»ã°ã¡ã³ãã®äžå€®ã®åç·ãïŒããã¯ç°¡åã§ãåæããããïŒäº€å·®ããããã®ç¹ãä»ã®ãã¹ãŠã®ç¹ãšæ¥ç¶ããããšã§ãã ã€ãŸãããããã€ã»ã«ã®å®çŸ©ã«åŸã£ãŠã次ã®ããã«ç¹pã®è»è·¡ãäœæããŸãã
- ãã®ãã€ã³ãpãä»ã®ã»ã°ã¡ã³ããšæ¥ç¶ãããã¹ãŠã®ã»ã°ã¡ã³ãã®äžå€®ã®åç·ãæããã®ã§ãn-1ã®çŽç·ïŒäžå€®ã®åç·ïŒãååŸããŸãã
- ãã¹ãŠã®ç·ããã¢ã§äº€å·®ãããŠã 亀差ç¹ïŒãææªã®å Žåãã§ã¯ãåçŽç·ãä»ã®ãã¹ãŠã®çŽç·ãšäº€å·®ã§ããããïŒ;
- ããããã¹ãŠã確èªããŠãã ãã n-1åã®åå¹³é¢ã®ããããã®ã¡ã³ããŒã·ããäžã®ãã€ã³ããã€ãŸãã挞è¿ç·ããã§ã«ååŸããŠãã ã ãããã£ãŠããã¹ãŠã®åå¹³é¢ã«å±ãããã€ã³ãã¯ããã€ã³ãpã®ãããã€ã»ã«ã®é ç¹ã«ãªããŸãã
- ãã¹ãŠã®nãã€ã³ãã«å¯ŸããŠæåã®3ã€ã®ã¹ããããå®è¡ããçµæã®æŒžè¿ãååŸããŸã ã
ã¢ã«ãŽãªãºã ã¯e-maxx.ruã«ããããŸãã
å¿ èŠã«å¿ããŠãSplashGeom©ã䜿çšããŠãã®ã¢ã«ãŽãªãºã ãåå¥ã«å®è£ ã§ããŸãã ãã®èšäºã§ã¯ããã®ã¢ã«ãŽãªãºã ã¯å®éã«ã¯å°ãªããšã以äžã®ãã®ããã¯ããã«å£ãããããã®å®è£ ã¯ç€ºãããŠããŸãã...
åå¹³é¢ãè¶ ããŠäº€å·®ããããšã«ãããããã€å³ãæ§ç¯ããããã®ã¢ã«ãŽãªãºã
ãã®ã¢ã«ãŽãªãºã ã¯ãããã»ã©è€éãªèšç®ãå¿ èŠãšããªãããããã§ã«å®éã«äœ¿çšã§ããŸãã ãã®ããã«ã¯ãã»ã°ã¡ã³ããšã©ã€ã³ã亀差ãããåžå€è§åœ¢ã亀差ãããåå¹³é¢ã亀差ãããåŸãããè»è·¡ããã€ã¢ã°ã©ã ã«çµåã§ããå¿ èŠããããŸãã
ã¢ã«ãŽãªãºã
- çŸåšã®ãµã€ãã®n-1çŽç·ãååŸããŸãïŒåã®ã¢ã«ãŽãªãºã ã®ããã«-äžå€®ã®åç·ïŒã ãããã¯ãåå¹³é¢ã®ããžã§ãã¬ãŒã¿ãã«ãªããŸãã
- ããã§ãn-1åå¹³é¢ãã§ããŸããã ãããã®ååå¹³é¢ã¯ãåããã®çŽç·ã§äžããããŸãã ãã€ã³ããšæ¹åãã€ãŸããç·ã®ã©ã¡ãåŽã«ãããã æ¹åã¯ãè»è·¡ãæ§ç¯ããçŸåšã®ãµã€ãã«ãã£ãŠæ±ºå®ãããŸããããã¯ãç®çã®åå¹³é¢ã«ãããããè»è·¡ã¯ãã®äžã«ãªããã°ãªããŸããã
- ç§ãã¡ã¯ãã¹ãŠã®åå¹³é¢ã暪æããŸã-ç§ãã¡ã¯ãããããããšãã§ããŸã -çŸåšã®ãµã€ãã®è»è·¡ãååŸããŸãã
- ãã¹ãŠã®nãã€ã³ãã«å¯ŸããŠæåã®3ã€ã®ã¹ããããå®è¡ããçµæã®æŒžè¿ãååŸããŸã * = ã
å®è£
ããã§ã®äž»ãªãã£ããã¯ãåžå€è§åœ¢ã®éåžžã®äº€å·®ãå®è£ ããããšã§ãããªããªããäžå¿«ãªçž®éã±ãŒã¹ãããããã§ãïŒå€è§åœ¢ã®é ç¹ããã³/ãŸãã¯åŽé¢ãäžèŽããŸããå€è§åœ¢ãããèªäœãšäº€å·®ããå Žåããã®å ŽåïŒã
ã¢ã¯ã·ã§ã³ã®ç¯å²å šäœãå€æ¥ããé·æ¹åœ¢ã«å¶éããŠããããšãããã«èšããªããã°ãªããŸãã-ããŒããã¬ãŒã³ã¯äºãã«äº€å·®ããéšåãåãåããŸãã ããã«ããããã€ã¢ã°ã©ã å ã®ç¡éã»ã«ã®åé¡ã解決ãããŸãã
ç·ãšç·åã®äº€ç¹
ãããŠããã®ååšã®å€æã ãã§ãªããæ£ç¢ºã«äº€ç¹ãå¿ èŠã§ãã SplashGeom©ã§ã¯ãããã¯-ããšãã°ãã©ã€ã³ãšã»ã°ã¡ã³ãã®äº€å·®ã®å®è£ ã§ãã
ã³ãŒãã衚瀺
// // kInfPoint - , kNegInfPoint - Point2D Line2D::GetIntersection(const Line2D& second_line) const { double cross_prod_norms = Vector2D(this->A, this->B).OrientedCCW(Vector2D(second_line.A, second_line.B)); Point2D intersect_point; if (fabs(cross_prod_norms) <= EPS) /* A1 / A2 == B1 / B2 */ { if (fabs(this->B * second_line.C - second_line.B * this->C) <= EPS) /* .. == C1 / C2 */ { intersect_point = kNegInfPoint2D; } else { intersect_point = kInfPoint2D; } } else { double res_x = (second_line.C * this->B - this->C * second_line.B) / cross_prod_norms; double res_y = (second_line.A * this->C - this->A * second_line.C) / cross_prod_norms; intersect_point = Point2D(res_x, res_y); } return intersect_point; } // Point2D Segment2D::GetIntersection(const Segment2D& second_seg) const { Line2D first_line(*this); Line2D second_line(second_seg); Point2D intersect_point = first_line.GetIntersection(second_line); if (intersect_point == kNegInfPoint2D) { if (this->Contains(second_seg.b)) { intersect_point = second_seg.b; } else if (this->Contains(second_seg.a)) { intersect_point = second_seg.a; } else if (second_seg.Contains(this->b)) { intersect_point = this->b; } else if (second_seg.Contains(this->a)) { intersect_point = this->a; } else { intersect_point = kInfPoint2D; } } else if (!(this->Contains(intersect_point) && second_seg.Contains(intersect_point))) { intersect_point = kInfPoint2D; } return intersect_point; }
åžå€è§åœ¢ã®äº€å·®
ããã§ãããªãŽã³ã®äº€å·®ãå®çŸããŸããã ãã¡ãããããªãã¯ãããããããšãã§ããŸã ããã§ãnãšmã¯ãããã1çªç®ãš2çªç®ã®å€è§åœ¢ã®é ç¹ã®æ°ã§ã-æåã®å€è§åœ¢ã®å蟺ãš2çªç®ã®å€è§åœ¢ã®å蟺ã亀差ããã亀差ç¹ãæžã蟌ã¿ãããã«å¥ã®å€è§åœ¢ã«å±ããç¹ã確èªããŸãããããè¯ãé床ãéæããããã«ãã¢ã«ãŽãªãºã ã«åŸã£ãŠäº€å·®ããŸãO`RourkeïŒã¢ã«ãŽãªãºã ã®å ã®èª¬æ- [3] ïŒã
ãŸãããã®èª¬æã®ãªãã·ã§ã³ã®1ã€ã¯algolist.ruã«ãããŸãã ç§ãã¡ã®å Žåãå®è£ ã¯ãããã€ãã®è£è¶³çãªã¢ã€ãã¢ãšãšãã«ãæ¬[1] ïŒpã334ïŒã®ã¢ã«ãŽãªãºã ã®èª¬æã«åºã¥ããŠããŸãã ãã®å®è£ ã§ã¯ ãããªãŽã³ã«å ±éã®èŸºã ããå ŽåïŒæ¬[1]ã«èšèŒãããŠããããã«ããã®å Žåã¯å¥éèæ ®ããå¿ èŠããããŸãïŒãèæ ®ããŠããŸããã ãå ±éã®é ç¹ãæã€å Žåã¯æ£ããæ©èœããŸãã
以äžã®ãã¿ãã¬ã®äžã«ãã¢ã«ãŽãªãºã ã®äžè¬çãªèª¬æããããŸãã
O'Rourkeã¢ã«ãŽãªãºã ãç¥ãããïŒ
ã¢ã«ãŽãªãºã ïŒè¿œå ã®èª¬æã«ã€ããŠã¯ãäžèšã®ãœãŒã¹ãåç
§ããŠãã ããïŒïŒ
ã¢ãŒã·ã§ã³é¢æ°ã¯ããŸããŸãªæ¹æ³ã§å®è£ ã§ãããšããžã移åããŠããããªãŽã³ã®çªå·ïŒã©ãã«ïŒãè¿ããŸãã æŠå¿µçã«ã圌女ã¯èªåã®äžã§3ã€ã®ããšãè¡ããŸãã
- ã±ãŒã¹çªå·ã決å®ããŸã -æåã®ããªãŽã³ã®ãšããžãš2çªç®ã®ããªãŽã³ã®ãšããžã®çŸåšã®çžå¯Ÿäœçœ®ã ãããã¢ã«ãŽãªãºã ã®äž»èŠãªã¢ã€ãã¢ã§ã -äºãã«å¯Ÿãããšããžã®äœçœ®ã®ã±ãŒã¹ã衚瀺ããŸãã ãããã®4ã€ã®äœçœ®ã¯ãã¹ãŠ[1]ã§è©³ãã説æãããŠããŸãããå®è£ ã§ã¯ãå¹³é¢äžã®ãã¯ãã«ã®ã¹ãã¥ãŒç©ã䜿çšããŠäœçœ®ã決å®ãããŸãã
-çŸåšã©ã®ããªãŽã³ã®ã©ã®ãšããžããå åŽãã«ããããã€ãŸããä»ã®ãšããžã®ãå·ŠåŽãã«ãããã決å®ããŸããããã¯æãã®è£œåã§ããã§ãã¯ãããŸãïŒçµç¹ããå·ŠåŽãã«ããå Žåã¯ãå·ŠåŽãã«ãããŸãïŒã
-ãšããžã®1ã€ã®çŸåšã®ç«¯ã亀差ããªãŽã³ã«æžã蟌ããã©ããã決å®ããŸãã ãããç®çã®ã±ãŒã¹ãšå åŽã®ãªãã«å¯Ÿå¿ããå Žåãè¿œå ããå¿ èŠããããŸãã
- æ倧å埩åæ°ãçµéãããŸã§ïŒ2 *ïŒn + mïŒä»¥äžã§ããããšã蚌æãããŸãïŒã次ã®æé ãå®è¡ããŸãã
aïŒã 1çªç®ãš2çªç®ã®ããªãŽã³ã®çŸåšã®ãšããžãååŸããŸãã
bïŒ ãããã亀差ããå Žå-亀差ç¹ããã®ç¹ãèæ ®ããŸãïŒäº€å·®ç¹ããªãŽã³ã«è¿œå ããã ãã§ãè¿œå ãç¡èŠããå ŽåããããŸããããã§ãªãå Žå-æåã®äº€å·®ç¹ã§ãªãå ŽåïŒã€ãŸãããã§ã«åãäœã£ãŠããïŒã亀差ç¹ããã以å€ã®å Žåã¯ã¢ã«ãŽãªãºã ãçµäºããŸã-亀差ç¹ã«å°éããŸããã
cïŒã 次ã«ïŒçŸåšã®ãšããžã亀差ãããã©ããã«é¢ä¿ãªãïŒã ã¢ãŒã·ã§ã³é¢æ°ãåŒã³åºããŸãããã®é¢æ°ã¯ãæåã®ïŒãŸãã¯2çªç®ã®ïŒããªãŽã³ã®ãŠã£ã³ããŠã1ãšããžåæ¹ã«ç§»åãã亀差ããªãŽã³ã«é ç¹ãè¿œå ã§ããããã«ããŸãã äž»ãªè¡åã¯ã éåã§æ£ç¢ºã«è¡ãããŸãã - 亀差ç¹ããªãã£ãå ŽåãããããªãŽã³ãå¥ã®ããªãŽã³ã®å åŽã«ãããã©ãããå€æããŸãïŒãã€ã³ããOã®åŸãã®åžããªãŽã³ã«å±ããŠãããã©ããã確èªããŸãïŒlogïŒããªãŽã³ã®é ç¹ã®æ°ïŒïŒ- [1] ã59-60ããŒãžïŒã ããã§ããã°ããããè¿ããããã§ãªããã°ç©ºã®äº€å·®ç¹ãè¿ããŸãã
ã¢ãŒã·ã§ã³é¢æ°ã¯ããŸããŸãªæ¹æ³ã§å®è£ ã§ãããšããžã移åããŠããããªãŽã³ã®çªå·ïŒã©ãã«ïŒãè¿ããŸãã æŠå¿µçã«ã圌女ã¯èªåã®äžã§3ã€ã®ããšãè¡ããŸãã
- ã±ãŒã¹çªå·ã決å®ããŸã -æåã®ããªãŽã³ã®ãšããžãš2çªç®ã®ããªãŽã³ã®ãšããžã®çŸåšã®çžå¯Ÿäœçœ®ã ãããã¢ã«ãŽãªãºã ã®äž»èŠãªã¢ã€ãã¢ã§ã -äºãã«å¯Ÿãããšããžã®äœçœ®ã®ã±ãŒã¹ã衚瀺ããŸãã ãããã®4ã€ã®äœçœ®ã¯ãã¹ãŠ[1]ã§è©³ãã説æãããŠããŸãããå®è£ ã§ã¯ãå¹³é¢äžã®ãã¯ãã«ã®ã¹ãã¥ãŒç©ã䜿çšããŠäœçœ®ã決å®ãããŸãã
-çŸåšã©ã®ããªãŽã³ã®ã©ã®ãšããžããå åŽãã«ããããã€ãŸããä»ã®ãšããžã®ãå·ŠåŽãã«ãããã決å®ããŸããããã¯æãã®è£œåã§ããã§ãã¯ãããŸãïŒçµç¹ããå·ŠåŽãã«ããå Žåã¯ãå·ŠåŽãã«ãããŸãïŒã
-ãšããžã®1ã€ã®çŸåšã®ç«¯ã亀差ããªãŽã³ã«æžã蟌ããã©ããã決å®ããŸãã ãããç®çã®ã±ãŒã¹ãšå åŽã®ãªãã«å¯Ÿå¿ããå Žåãè¿œå ããå¿ èŠããããŸãã
ããŠãSplashGeom©ã§ã¯æ¬¡ã®ããã«ãªããŸãã
ããªãŽã³äº€å·®ã³ãŒã
// , Convex2D Rectangle::GetIntersectionalConvex2D(const Point2D& cur_point, const Line2D& halfplane) const { vector<Point2D> convex_points; Segment2D cur_side; Point2D intersection_point; for (int i = 0, sz = vertices_.size(); i < sz; ++i) { int j = (i + 1) % sz; cur_side = Segment2D(vertices_[i], vertices_[j]); intersection_point = halfplane.GetIntersection(cur_side); if (intersection_point != kInfPoint2D) convex_points.push_back(intersection_point); if (halfplane.Sign(cur_point) == halfplane.Sign(vertices_[i])) convex_points.push_back(vertices_[i]); } Convex2D result_polygon(MakeConvexHullJarvis(convex_points)); return result_polygon; } // NumOfCase EdgesCaseNum(const Segment2D& first_edge, const Segment2D& second_edge) { bool first_looks_at_second = first_edge.LooksAt(second_edge); bool second_looks_at_first = second_edge.LooksAt(first_edge); if (first_looks_at_second && second_looks_at_first) { return NumOfCase::kBothLooks; } else if (first_looks_at_second) { return NumOfCase::kFirstLooksAtSecond; } else if (second_looks_at_first) { return NumOfCase::kSecondLooksAtFirst; } else { return NumOfCase::kBothNotLooks; } } // , "" WhichEdge WhichEdgeIsInside(const Segment2D& first_edge, const Segment2D& second_edge) { double first_second_side = Vector2D(second_edge).OrientedCCW(Vector2D(second_edge.a, first_edge.b)); double second_first_side = Vector2D(first_edge).OrientedCCW(Vector2D(first_edge.a, second_edge.b)); if (first_second_side < 0) { return WhichEdge::kSecondEdge; } else if (second_first_side < 0) { return WhichEdge::kFirstEdge; } else { return WhichEdge::Unknown; } } // WhichEdge MoveOneOfEdges(const Segment2D& first_edge, const Segment2D& second_edge, Convex2D& result_polygon) { WhichEdge now_inside = WhichEdgeIsInside(first_edge, second_edge); NumOfCase case_num = EdgesCaseNum(first_edge, second_edge); WhichEdge which_edge_is_moving; switch (case_num) { case NumOfCase::kBothLooks: { if (now_inside == WhichEdge::kFirstEdge) { which_edge_is_moving = WhichEdge::kSecondEdge; } else { which_edge_is_moving = WhichEdge::kFirstEdge; } break; } case NumOfCase::kFirstLooksAtSecond: { which_edge_is_moving = WhichEdge::kFirstEdge; break; } case NumOfCase::kSecondLooksAtFirst: { which_edge_is_moving = WhichEdge::kSecondEdge; break; } case NumOfCase::kBothNotLooks: { if (now_inside == WhichEdge::kFirstEdge) { which_edge_is_moving = WhichEdge::kSecondEdge; } else { which_edge_is_moving = WhichEdge::kFirstEdge; } break; } } if (result_polygon.Size() != 0 && (case_num == NumOfCase::kFirstLooksAtSecond || case_num == NumOfCase::kSecondLooksAtFirst)) { Point2D vertex_to_add; if (now_inside == WhichEdge::kFirstEdge) { vertex_to_add = first_edge.b; } else if (now_inside == WhichEdge::kSecondEdge) { vertex_to_add = second_edge.b; } else { if (case_num == NumOfCase::kFirstLooksAtSecond) vertex_to_add = first_edge.b; // ?! else vertex_to_add = second_edge.b; } if (vertex_to_add != result_polygon.GetCurVertex()) result_polygon.AddVertex(vertex_to_add); } return which_edge_is_moving; } // ( , ) Convex2D Convex2D::GetIntersectionalConvex(Convex2D& second_polygon) { Convex2D result_polygon; size_t max_iter = 2 * (this->Size() + second_polygon.Size()); Segment2D cur_fp_edge; // current first polygon edge Segment2D cur_sp_edge; // current second polygon edge Point2D intersection_point; bool no_intersection = true; WhichEdge moving_edge = WhichEdge::Unknown; for (size_t i = 0; i < max_iter; ++i) { cur_fp_edge = this->GetCurEdge(); cur_sp_edge = second_polygon.GetCurEdge(); intersection_point = cur_fp_edge.GetIntersection(cur_sp_edge); if (intersection_point != kInfPoint2D) { if (result_polygon.Size() == 0) { no_intersection = false; result_polygon.AddVertex(intersection_point); } else if (intersection_point != result_polygon.GetCurVertex()) { if (intersection_point == result_polygon.vertices_[0]) { break; // we already found the intersection polygon } else { result_polygon.AddVertex(intersection_point); } } } moving_edge = MoveOneOfEdges(cur_fp_edge, cur_sp_edge, result_polygon); if (moving_edge == WhichEdge::kFirstEdge) { this->MoveCurVertex(); } else { second_polygon.MoveCurVertex(); } } if (no_intersection == true) { if (second_polygon.Contains(this->GetCurVertex())) { result_polygon = *this; } else if (this->Contains(second_polygon.GetCurVertex())) { result_polygon = second_polygon; } } return result_polygon; }
ãã®èª¬æãšã³ãŒãã圹ã«ç«ã€ããšãé¡ã£ãŠããŸãã
åå¹³é¢ã®äº€å·®ç¹
ãããã£ãŠãåå¹³é¢ã®äº€å·®ç¹ãæ§ç¯ããããã«å¿ èŠãªãã®ã¯ãã¹ãŠæã£ãŠããŸãã ããŠãããããã£ãŠã¿ãŸãããããããŠããã ãã§ãªããè³¢ãæ¹æ³ã§-亀差ããåå¹³é¢ã®æäœã®çµåæ§ã®ããã«ãä»»æã®é åºã§ãããã亀差ãããããšãã§ããŸããã€ãŸãã2ã€ã®å¹³é¢ã亀差ãããããã«2ã€ã®å¹³é¢ã亀差ããã次ã«äº€å·®ç¹ã亀差ãããŸããããã¯ãã¹ãŠãåå¥ã«æšªæãããããæ©ããªã£ãŠããŸãã
ãã®ããã ååž°ã䜿çšããããšããå§ãããŸã
ã³ãŒãã衚瀺
Convex2D GetHalfPlanesIntersection(const Point2D& cur_point, const vector<Line2D>& halfplanes, const Rectangle& border_box) { if (halfplanes.size() == 1) { Convex2D cur_convex(border_box.GetIntersectionalConvex2D(cur_point, halfplanes[0])); return cur_convex; } else { int middle = halfplanes.size() >> 1; vector<Line2D> first_half(halfplanes.begin(), halfplanes.begin() + middle); vector<Line2D> second_half(halfplanes.begin() + middle, halfplanes.end()); Convex2D first_convex(GetHalfPlanesIntersection(cur_point, first_half, border_box)); Convex2D second_convex(GetHalfPlanesIntersection(cur_point, second_half, border_box)); return first_convex.GetIntersectionalConvex(second_convex); } }
è»è·¡ããã£ãŒãã«è¿œå ãã
ããã§ãæå®ãããã€ã³ãã®ãããã€ããªãŽã³ãã§ããŸãããããããã€ã¢ã°ã©ã ã«è¿œå ããŸãã é åãä»»æã®é åºã§ååŸãããããã¯äºãã«é¢é£ããŠããªããããããã«ã¯ç¹ã«åé¡ã¯ãããŸããïŒFortuneã¢ã«ãŽãªãºã ã®å®è£ ãšã¯ç°ãªãããšããžãžã®ãã€ã³ã¿ãŒã§é£æ¥ããè»è·¡ã«ç§»åã§ããŸãïŒã
ã³ãŒãã衚瀺
// Voronoi2DLocus VoronoiDiagram2D::MakeVoronoi2DLocus(const Point2D& site, const vector<Point2D>& points, const Rectangle& border_box) { Voronoi2DLocus cur_locus; vector<Line2D> halfplanes; for (auto cur_point : points) { if (cur_point != site) { Segment2D cur_seg(site, cur_point); Line2D cur_halfplane(cur_seg.GetCenter(), cur_seg.NormalVec()); halfplanes.push_back(cur_halfplane); } } *cur_locus.region_ = GetHalfPlanesIntersection(site, halfplanes, border_box); cur_locus.site_ = site; return cur_locus; } // VoronoiDiagram2D VoronoiDiagram2D::MakeVoronoiDiagram2DHalfPlanes(const vector<Point2D>& points, const Rectangle& border_box) { Voronoi2DLocus cur_locus; for (auto cur_point : points) { cur_locus = MakeVoronoi2DLocus(cur_point, points, border_box); this->diagram_.push_back(cur_locus); } return *this; }
ããã§ããããã€å³ãäœæããæ¹æ³ãåŠã³ãŸãã ãããã¯è»è·¡ã®ãã¯ãã«ïŒãªã¹ãïŒã®åœ¢ãããŠããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã®æ¬ ç¹ã¯ãé£äººã«é¢ããæ å ±ãååŸã§ããªãããšã§ãïŒããããããã®æ¬ ç¹ã¯å®è£ ãæ¹åããããšã§è§£æ¶ã§ããŸãïŒã
ããã«å€ãã®æ å ±ãRSEL ïŒ DCEL ïŒããååŸã§ããŸãã ãã®æ§é ã¯ãFortuneã®ã¢ã«ãŽãªãºã ã§äœ¿çšãããŸãã
次ã«ãFortuneã®ã¢ã«ãŽãªãºã ããçŽç·ãšã海岞ç·ãã䜿çšããŠèª¬æããŸã
ã®ãããã€å³ãæ§ç¯ããããã®ãã©ãŒãã¥ã³ã®ã¢ã«ãŽãªãºã
1987幎ãã¹ãã£ãŒããã©ãŒãã¥ã³ã¯ã ã ãã¡ãããããã¯ãã®ãããªæŒžè¿ç·ãæã€å¯äžã®æ§ç¯ã¢ã«ãŽãªãºã ã§ã¯ãããŸããããéåžžã«ç解å¯èœã§ãããå®è£ ããã®ã¯ããã»ã©é£ãããããŸããïŒããã«ãéåžžã«çŸãã
ãã©ãŒãã¥ã³ã¢ã«ãŽãªãºã ã®è³æã¯ã ãã¡ã ã ãã¡ã ã ãã¡ã ã ãã¡ãã§ã芧ããã ããŸã ã
ãšããã§ã Habrahabrã®èšäºã¯ãã§ã«ãã®ã¢ã«ãŽãªãºã ã®æ€èšã«å°å¿µããŠããŸãã
ãããã£ãŠãã¢ã«ãŽãªãºã ã®äž»ãªã¢ã€ãã¢ã¯ãããããã¹ã€ãŒãã©ã€ã³ã§ãã ç¹å®ã®ãªããžã§ã¯ãã»ããã«æ²¿ã£ãçŽç·ã®åããç°¡åã«ã·ãã¥ã¬ãŒãã§ãããããèšç®ãžãªã¡ããªã®å€ãã®ã¢ã«ãŽãªãºã ã§äœ¿çšãããŸãïŒããšãã°ãnåã®ã»ã°ã¡ã³ãã亀差ãããã¢ã«ãŽãªãºã ã§ãã¹ã€ãŒãã©ã€ã³ã䜿çšãããŸãïŒã
ã©ã®ããã«ãäœãããã®ãã«ã€ããŠè©±ãå§ããåã«ãã¹ã€ãŒãã©ã€ã³ãã©ã®ããã«åãããèŠãŠã¿ãŸãããïŒ ãããã ïŒ
ããã§ããã å®è£ ã§ã¯ããã¹ãŠãã»ãŒåãã§ãRFPã®ã¿ãéåžžãå·Šããå³ã§ã¯ãªãäžããäžã«ç§»åããŸããå®éããã¹ãŠã¯ããã»ã©æ»ããã§ã¯ãªããã€ãã³ãããšã«çºçããŸãïŒä»¥äžãåç §ïŒã
ã¢ã«ãŽãªãºã ã®æ¬è³ª
nåã®ãµã€ãïŒå¹³é¢äžã®ãã€ã³ãïŒããããŸãã ãäžããäžãžããã€ãŸãæ倧ã®çžŠåº§æšãæã€ãµã€ãããå°ãã座æšãæã€ãµã€ããžïŒæ£ç¢ºã«ã¯ã€ãã³ãããã€ãã³ããžïŒã«ç§»åããã¹ã€ãŒãã©ã€ã³ããããŸãã ããã«æ³šæããå¿ èŠãããã®ã¯ãå³ã®æ§ç¯ã«åœ±é¿ãäžããã®ã¯ã ããé«ããµã€ããŸãã¯ææ¬çãªã©ã€ã³äžã«ãããµã€ãã®ã¿ ã§ã ã
ZPã次ã®ãµã€ãïŒ ãã€ã³ãã€ãã³ãïŒã«å°éãããšãæ°ããæŸç©ç·ïŒã¢ãŒãïŒãäœæãããŸãããã®ãµã€ãã®çŠç¹ã¯ ã ãã£ã¬ã¯ã¿ãŒã§ãïŒ ãŠã£ãããã£ã¢ã®æŸç©ç·ã«ã€ã㊠ïŒã ãã®æŸç©ç·ã¯å¹³é¢ã2ã€ã®éšåã«åå²ããŸããæŸç©ç·ã®ãå åŽãé åã¯ãµã€ãã«è¿ããã€ã³ãã«å¯Ÿå¿ãããå€åŽãé åã¯æåŒç·ã«è¿ããã€ã³ãã«å¯Ÿå¿ããæŸç©ç·äžã«ãããã€ã³ãã¯ãµã€ãããã³GPããçè·é¢ã«ãããŸãã æŸç©ç·ã¯ããµã€ããžã®RFPã®äœçœ®ã«å¿ããŠå€åããŸããRFPããµã€ãããããã«äžããã°äžããã»ã©ãæŸç©ç·ã¯æ¡å€§ããŸãããæåã¯äžè¬ã«ã»ã°ã¡ã³ãã§ãïŒãäžåããïŒã
æŸç©ç·ãæ¡å€§ãããšã2ã€ã®ãã¬ãŒã¯ãã€ã³ãããããŸããä»ã®æŸç©ç·ãšã®äº€ç¹ïŒã海岞ç·ãïŒã§ãã ã海岞ç·ãã«ã¯ã亀差ç¹ã®1ã€ã®ãã€ã³ãããä»ã®ãã€ã³ããŸã§ã®æŸç©ç·ç¶ã®å匧ãæ ŒçŽãããŠãããããããŒãã©ã€ã³ãå€æããŸãã å®éããã®ã¢ã«ãŽãªãºã ã§ã¯ããã®ã海岞ç·ãã®åããã·ãã¥ã¬ãŒãããŸãã ãããã®åããã¬ãŒã¯ãã€ã³ãã¯ãããã€ã»ã«ã®ãšããžã«æ²¿ã£ãŠæ£ç¢ºã«ç§»åããããã§ãïŒçµå±ãã³ã³ãããŒã«ãã€ã³ãã¯ãããã®æŸç©ç·ã察å¿ããäž¡æ¹ã®ãµã€ããããããã«ã¯RFPãããçè·é¢ã§ããããšãããããŸãïŒã
ãããŠã¡ããã©ãã®ç¬éãç°ãªãæŸç©ç·ã®1ã€ã«ãã2ã€ã®å¶åŸ¡ç¹ããäŒãããšããã€ãŸã1ã€ã«å€ãããã®ããã«ããã®ç¹ããããã€ã»ã«ã®é ç¹ã«ãªããŸãïŒåã€ãã³ããçºçããŸãïŒããã®æç¹ã§ããããã®2ã€ã®ãã€ã³ãã®éã«ãã£ãå匧-ã厩å£ãããã海岞ç·ãããåé€ãããŸãã 次ã«ããã®ãã€ã³ããåã®å¯Ÿå¿ãããã€ã³ãã«æ¥ç¶ãããããã€ã»ã«ã®ãšããžãååŸããŸãã
ã¢ã«ãŽãªãºã
ãã®ãããã¹ã€ãŒãã©ã€ã³ãäžã«ç§»åãããšã2 çš®é¡ã®ã€ãã³ããçºçããŸã ã
ãã€ã³ãã€ãã³ã
ãã€ã³ãã®ã€ãã³ãã¯ããµã€ãã®1ã€ã§ã®POã®ãããã§ãããã®ããããã®ãµã€ãã«å¯Ÿå¿ããæ°ããæŸç©ç·ãäœæãã2ã€ã®ãã¬ãŒã¯ãã€ã³ããè¿œå ããŸãïŒå®éãæåã¯1ã€ã§ãããã¢ãŒããæ¡åŒµãããšããã§ã«2ã€ãããŸãïŒ-ãã®äº€å·®ç¹æµ·å²žç·ã®ããæŸç©ç·ïŒã€ãŸããæ¢åã®æŸç©ç·ã®åé¢ïŒã ãã®ã¢ã«ãŽãªãºã ã§ã¯ãæŸç©ç·ïŒãŸãã¯ãããã海岞ç·ãã«å±ããéšå- ã¢ãŒã ïŒã¯ããã€ã³ãã€ãã³ãã®å Žåã«ã®ã¿ ã海岞ç·ã«æ¿å ¥ããããŸããã€ãŸããæ°ããã¢ãŒãã¯ãã€ã³ãã€ãã³ãã®åŠçæã«ã®ã¿è¡šç€ºãããŸãã
ãšããã§ã次ã®åçã¯ããªããã®ãããªãæŸç©ç·ã®ããããã®é¢é£ãã海岞ç·ããšåŒã°ããã®ãã瀺ããŠããŸãã
ãµãŒã¯ã«ã€ãã³ã
ãµãŒã¯ã«ã€ãã³ãã¯ã1ã€ã®ã¢ãŒãã®åé€ã«äŒŽããããã€ã»ã«ã®æ°ããé ç¹ã®åºçŸã§ããããã§ã®ãã€ã¢ã°ã©ã ã®æ°ããé ç¹ã®åºçŸã¯ãã¢ãŒãã®å·Šå³ã®ç¹ãšæ°ããé ç¹ã®ã¢ãããŒãã«ãããå·Šãäžå€®ãå³ãäžå€®ã®ã厩å£ãã®3ã€ã®ã¢ãŒãããã£ãããšãæå³ããããã§ããããã€å³ã ãã®ã¢ã«ãŽãªãºã ã§ã¯ãåã€ãã³ããçºçããå Žåã«ã®ã¿æŸç©ç·ïŒã¢ãŒãïŒãã海岞ç·ãããåé€ãããŸããã€ãŸããã¢ãŒãã¯åã€ãã³ããåŠçãããšãã«ã®ã¿åé€ã§ããŸãã
ãããã€å³ã®é ç¹ã¯åžžã«å³ã®æ£ç¢ºã«3ã€ã®ãšããžã®äº€ç¹ã«ãããšããå®çããããå³ã®é ç¹ã¯3ã€ã®ãµã€ããéãåã®äžå¿ã§ããããã®ç¹ããã¹ã€ãŒãç·ãŸã§ã®è·é¢ãåãã§ãããšè¿°ã¹ãŠããŸããã®åã®ååŸã«çããïŒããã¯ã海岞ç·ãäžã«ãããã€ã³ãã®ããããã£ã§ãïŒã ããã¯ã3ã€ã®ãµã€ããééããåã®æäžç¹ãã¹ã€ãŒãã©ã€ã³ã®äžãŸãã¯ã¹ã€ãŒãã©ã€ã³äžã«ãããšãã«ããã®æäžç¹ã®åã€ãã³ããã€ãã³ããã¥ãŒã«ããã·ã¥ããããã§ãããããã€å³ã
ã€ãã³ãïŒãã€ã³ããŸãã¯ãµãŒã¯ã«ïŒã§ã¯ã1ã€ã®ç¹å®ã®ã¢ãŒããæ¥ç¶ãããŠããããšãéèŠã§ãã ããã¯ãã€ãã³ããåŠçãããšãã«åœ¹ç«ã¡ãŸãã ãŸããæéå ã«RSDS ïŒ DCEL ïŒã«ãšããžãè¿œå ããå¿ èŠãããããšãå¿ããŠã¯ãªããŸããïŒæ§é å ã®ãã€ã³ã1ã以äžãåç §ïŒããããã£ãŠãã¢ãŒããšãšããžã®é¢ä¿ãç解ããå¿ èŠããããŸãã
ãããã£ãŠãç·ã®åãã¯é¢æ£çã§ãã ãµã€ãäžã®ä»»æã®ç¬éã ãŸã㯠3ã€ã®ãµã€ããéãåã®äžéšã®ç·ã§ ããã®äžå¿ã¯ãããã€å³ã®æ°ããé ç¹ã§ãã çŽ æŽãããã
äžè¬çãªã¢ã«ãŽãªãºã ïŒ
- æåã«ãã€ã³ãã€ãã³ãã§åæåããã€ãã³ãã®ãã¥ãŒïŒåªå
é äœä»ãïŒãäœæããŸã-ãã®ãµã€ãã®ã»ããïŒçµå±ããã€ã³ãã€ãã³ãã¯åãµã€ãã«å¯Ÿå¿ããŸãïŒ;
- ãã¥ãŒã空ã§ã¯ãªãéïŒ
aïŒã ããããã€ãã³ããåããŸãã
bïŒ ããããã€ã³ãã€ãã³ãã®å Žåããã€ã³ãã€ãã³ããåŠçããŸãã
cïŒã ããããµãŒã¯ã«ã€ãã³ãã®å ŽåããµãŒã¯ã«ã€ãã³ããåŠçããŸãã
- æ®ãã®ãã¹ãŠã®ãšããžãä»äžããŸãïŒborder_boxã䜿çšïŒã
å®è£
Fortuneã¢ã«ãŽãªãºã ã®å®è£ ã«ã€ããŠã¯ãå¥ã®èšäºã§è©³çŽ°ã«æ€èšããŸãããããã§ã¯ããã®ç解ã«åœ¹ç«ã€å¯èœæ§ã®ããããã€ãã®éçºã«ã€ããŠèª¬æããŸãã
å¿ èŠãªæ§é
ãã®ã¢ã«ãŽãªãºã ãå®è£ ããã«ã¯ãããã€ãã®æ§é ïŒã¯ã©ã¹ïŒãå¿ èŠã§ãã
- RSDS ïŒ DCEL ïŒ-ãã§ã«èŠã€ãã£ããããã€å³ã®ãšããžãä¿åããããã®ãªã¹ãã
- ã€ãã³ãã®ããåªå ãã¥ãŒã
- ãã€ããªããªãŒïŒBeachSearchTreeããããŸãïŒ-ã海岞ç·ããä¿åãããã-æŸç©ç·ãšãã€ã³ãã®çŸåšã®äœçœ®ã ãã®ããªãŒã¯ãã©ã³ã¹ãåããŠããããšã«æ³šæããŠãã ãããããŒãã«ã¯æ£ç¢ºã«2人ã®æ¯åããŸãã¯ãŒãïŒèïŒããããŸãã ãã®æ§é ã®è©³çŽ°ã«ã€ããŠã¯ãããšãã°ã Habréã®ãã®èšäºãåç §ããŠãã ãã ïŒ ãã®åœã§ã¯å°ãç°ãªã£ãŠè¡šç€ºãããŸãïŒã
ãã®ãããªããŒã¿æ§é ã䜿çšããŠãäžè¬çãªã¢ã«ãŽãªãºã ã®å®è£ ãäœæã§ããŸãã
ã³ãŒãã衚瀺
VoronoiDiagram2D VoronoiDiagram2D::MakeVoronoiDiagram2DFortune(const vector<Point2D>& points, const Rectangle& border_box) { priority_queue<Event> events_queue(points.begin(), points.end()); shared_ptr<Event> cur_event; BeachSearchTree beach_line; DCEL edges; while (!events_queue.empty()) { cur_event = make_shared<Event>(events_queue.top()); shared_ptr<const PointEvent> is_point_event(dynamic_cast<const PointEvent *>(cur_event.get())); if (is_point_event) { events_queue.pop(); beach_line.HandlePointEvent(*is_point_event, border_box, events_queue, edges); } else { shared_ptr<const CircleEvent> is_circle_event(dynamic_cast<const CircleEvent *>(cur_event.get())); events_queue.pop(); beach_line.HandleCircleEvent(*is_circle_event, border_box, events_queue, edges); } } edges.Finish(border_box); this->dcel_ = edges; return *this; }
HandlePointEventïŒïŒãšHandleCircleEventïŒïŒã®ãã¹ãŠã®ããžãã¯ãšè€éãã¯ãå¥ã®èšäºã®äž»é¡ã«ãªããŸãã以éãå®è£ ã«åœ¹ç«ã€ããã€ãã®è£å©é¢æ°ã瀺ããŸãã
ãã«ããŒé¢æ°
æŸç©ç·ã®äº€å·®ç¹ïŒã¢ãŒãïŒ
RFPã®äœçœ®ã«å¿ããŠã2ã€ã®æŸç©ç·ïŒã¢ãŒãïŒã®äº€å·®ç¹ãååŸã§ããå¿ èŠããããŸãã ç¹x 'ããã³y'ã«çŠç¹ãåœãŠãæŸç©ç·ã®æ¹çšåŒãšãy軞ã«æ²¿ã£ãäœçœ®ãlã§ããçŽæ¥è¡åã¯ã次ã®æ¹çšåŒã§äžããããŸãïŒå°åºå¯èœïŒã
ãšããã§ããã©ã±ããã®åã®éšåã¯ãã®æŸç©ç·ã®çŠç¹ãã©ã¡ãŒã¿ã§ã ã ãããããæŸç©ç·æ¹çšåŒã®å¯Ÿå¿ããä¿æ°ããåŒãåºãããç°¡åãªæ¹æ³ã§2ã€ã®éç·åœ¢æ¹çšåŒã解ãããšãã§ããŸããäžæ¹ããä»æ¹ãæžç®ããæåã«èŠã€ãã£ãæ ¹ãä»£å ¥ããŠã2ã€ã®ãã€ã³ããååŸããŸãã æãé«ããã€ã³ãã¯ã海岞ç·ãã®èåŸã«ãããããäœããã€ã³ãïŒã€ãŸãã瞊座æšãå°ãããã€ã³ãïŒã«èå³ããããŸãã 説æãããã¢ã¯ã·ã§ã³ã¯ã次ã®ã³ãŒãã«åæ ãããŸãã
ãã©ããŒã«äº€å·®ç¹ã³ãŒã
pair<Point2D, Point2D> Arch::GetIntersection(const Arch& second_arch, double line_pos) const { pair<Point2D, Point2D> intersect_points; double p1 = 2 * (line_pos - this->focus_->y); double p2 = 2 * (line_pos - second_arch.focus_->y); // is not 0.0, because line moved down if (fabs(p1) <= EPS) { intersect_points.first = this->GetIntersection(Ray2D(*this->focus_, Point2D(this->focus_->x, this->focus_->y + 1))); intersect_points.second = intersect_points.first; } else { // solving the equation double a1 = 1 / p1; double a2 = 1 / p2; double a = a2 - a1; double b1 = -this->focus_->x / p1; double b2 = -second_arch.focus_->x / p2; double b = b2 - b1; double c1 = pow(this->focus_->x, 2) + pow(this->focus_->y, 2) - pow(line_pos, 2) / p1; double c2 = pow(second_arch.focus_->x, 2) + pow(second_arch.focus_->y, 2) - pow(line_pos, 2) / p1; double c = c2 - c1; double D = pow(b, 2) - 4 * a * c; if (D < 0) { intersect_points = make_pair(kInfPoint2D, kInfPoint2D); } else if (fabs(D) <= EPS) { double x = -b / (2 * a); double y = a1 * pow(x, 2) + b1 * x + c1; intersect_points = make_pair(Point2D(x, y), Point2D(x, y)); } else { double x1 = (-b - sqrt(D)) / (2 * a); double x2 = (-b + sqrt(D)) / (2 * a); double y1 = a1 * pow(x1, 2) + b1 * x1 + c1; double y2 = a1 * pow(x2, 2) + b1 * x2 + c1; intersect_points = make_pair(Point2D(x1, y1), Point2D(x2, y2)); } } return intersect_points; }
3ç¹ã§åãæã
åã€ãã³ããåŠçãããšãã3ã€ã®ã¢ãŒãïŒãµã€ãïŒã®çŠç¹ããæ§æãããåã®äžå¿ãšæäžç¹ã決å®ããå¿ èŠããããŸãã3ç¹ã䜿çšããŠåãæ§ç¯ããããã®ããã€ãã®åæã¢ã«ãŽãªãºã ããããŸãïŒæ§ç¯ã«ããããã®äžå¿ãšååŸãååŸããããšãæå³ããŸãïŒãç§ãã¡ã®ããã°ã©ã ã§ã¯ãããè¡ãããŸãïŒã¢ã«ãŽãªãºã ã®ãããã§ïŒ-æåã®2ç¹ãš2çªç®ã®2ç¹ãã»ã°ã¡ã³ãã§æ¥ç¶ããŸããäžå¿ã¯äžå€®ã®åç·ã®äº€ç¹ã«ãããååŸã¯äžå¿ãã3ç¹ã®ãããããŸã§ã®è·é¢ã§ããéããŠçŸããïŒ
3ã€ã®ãã€ã³ãã§å建èšã³ãŒãã衚瀺ãã
Circle::Circle(const Point2D& p1, const Point2D& p2, const Point2D& p3) { Segment2D first_segment(p1, p2); Segment2D second_segment(p2, p3); Line2D first_perpendicular(first_segment.GetCenter(), first_segment.NormalVec()); Line2D second_perpendicular(second_segment.GetCenter(), second_segment.NormalVec()); center_ = first_perpendicular.GetIntersection(second_perpendicular); little_haxis_ = big_haxis_ = center_.l2_distance(p1); }
ãã€ã³ãã€ãã³ãåŠç
ãã€ã³ãã€ãã³ãã¯ãPointEventããã¥ãŒããåãåºãããšãã§ããäœãå ¥ã£ãŠããã®ïŒãã®ã€ãã³ããé¢é£ä»ããããŠãããµã€ãã®ã¿ããããŸãã
ãããåŠçãããšãã«äœãããŸããïŒ ã海岞ç·ãã«æ°ããã¢ãŒããè¿œå ããããªãŒã®ãå¿ èŠã«å¿ããŠããã¹ãŠã®æ¥ç¶ãèšå®ãã3ã€ã®å¯èœãªã±ãŒã¹ã®ããããã§ãµãŒã¯ã«ã€ãã³ããçºçãããã©ããã確èªããŸããæ°ãããµã€ããåå ã§ãããã¹ãŠã®ã±ãŒã¹ã確èªããå¿ èŠããããŸãã
ã¢ãŒããè¿œå ãããšãã¯ã©ãããŸããïŒãã€ããªã®ã海岞ç·ãããªãŒïŒx座æšïŒã§ãã®å Žæãæ¢ãããããæ¿å ¥ããŸãã
貌ãä»ãããäœãããŸããïŒæ°ããã¢ãŒãã2ã€ã®ãã€ã³ãã§äº€å·®ããã¢ãŒããžã®ãã€ã³ã¿ãŒãèŠã€ããŸããïŒäº€å·®ãã€ã³ããã³ã³ãããŒã«ãã€ã³ãã®1ã€ã«æ£ç¢ºã«åœããå Žåã¯åå¥ã«èæ ®ãããŸã-亀差ã¯2ã€ã®æŸç©ç·-å·Šå³ã«ãããŸãïŒã
ã€ãŸãããå£ããããã®ã¢ãŒããåãã代ããã«5ã€ã®ããŒãïŒ1ã5ãã¯ãïŒãæ¿å ¥ããŸã-arch1ãbp1ãarch2ãbp2ãarch3ã Arch1ã¯ãæ°ããã¢ãŒãã亀差ããã¢ãŒãã®å·ŠåŽéšåã§ããã€ãŸããå·Šã®ãã¬ãŒã¯ãã€ã³ãã®å·Šã«ããããŒã¹ãbp1ã¯å·Šã®ãã¬ãŒã¯ãã€ã³ãïŒæ°ããã¢ãŒãã®å·Šã®äº€å·®ïŒãarch2ã¯æ°ããã¢ãŒããbp2ã¯å³ã®ãã¬ãŒã¯ãã€ã³ãã§ãïŒå³æ°ããã¢ãŒãã®äº€å·®ç¹ïŒãarch3ã¯ãæ°ããã¢ãŒãã亀差ããã¢ãŒãã®æ£ããéšåã§ãã
ãã€ã³ãã€ãã³ãããããã€å³ã®æ°ãããšããžïŒãŸãã¯ããšããžãããå ŽåããããŸãïŒãçæããããšã¯æ³šç®ã«å€ããŸãã
æ°ãã海岞ç·ãã海岞ç·ãã«è¿œå ããããã®å¯èœãªãªãã·ã§ã³ã®1ã€ã¯ãHabréã®ãã®èšäºã§èª¬æãããŠããŸãã
ãµãŒã¯ã«ã€ãã³ããã³ããªã³ã°
ãµãŒã¯ã«ã€ãã³ãã¯ããã¥ãŒããCircleEventãåŒãåºãããšãã§ãã
äœãå ¥ã£ãŠããã®ïŒãã®äžã«ãã€ã³ãããããŸã-ããã¯ã3ã€ã®ãµã€ããééããç¹å®ã®åã®æäœãã€ã³ãã§ãããåé€ãã¹ãã¢ãŒãã§ããããªãŒã«ã¯2ã€ã®ã³ã³ãããŒã«ãã€ã³ããããã圌女èªèº«ãã³ã³ãããŒã«ãã€ã³ãã¯æçµçã«1ã€ã«ãªããŸãããããŠãã¢ãŒããããªãŒããæ éã«åé€ãããã¹ãŠã®ã芪åé¢ä¿ããåæ§ç¯ããå¿ èŠããããŸããå®éããã®ã€ãã³ããåŠçãããšãããªãŒå ã®3ã€ã®ããŒãã1ã€ã«çœ®ãæããããŸãïŒ2ã€ã®ãã¬ãŒã¯ãã€ã³ããš1ã€ã®ãã¬ãŒã¯ãã€ã³ããæã€ã¢ãŒãïŒã
ãµãŒã¯ã«ã€ãã³ãããããã€å³ã®2ã€ã®ãšããžãå®äºããããšãã€ãŸãããã®ã€ãã³ããåŠçããããšãšããžãçµäºããããšã«æ³šæããŠãã ããã
ãŸããã€ãã³ãåŠçã®éèŠãªéšåã¯ããšããžã®æé·ãç£èŠãããããããªã¹ãã«è¿œå ããŠãšããžãå®æãããæ¹æ³ã§ããã€ãŸããæçµçã«ã¯ãã¹ãŠãçµäºãããæéã§ããããå¢çã«çœ®ãããŸãé·æ¹åœ¢ã
çµæã®å°ããªåæ
åºåã§ãã§ã«RSDSïŒDCELïŒãåãåãã®ã§ãååãªæ å ±ãååŸã§ããŸã-察å¿ãããµã€ããç¥ã£ãŠããåãšããžã«ã€ããŠããã®ãšããžã®ããã€ã³ããååŸãããã®ãµã€ããèŠã€ããŠãåºæ¥äžãã-é£äººãèªèããŸãããªã¹ãã«ããã¹ãŠã®ãµã€ãã®é£äººã®ãªã¹ããäœæã§ããŸããããã¯ãã§ã«éæãããŠããŸãã + = ïŒ
ããã«ããšããžã«ããŒãããµã€ããããå Žåããå¢çãµã€ãããã€ãŸããç¡éãã®è»è·¡ãæã€ãµã€ãã«ããŸããããŒãããããããã«ããããã€ã³ãã®åæã»ããã®åžå ãæ§ç¯ããããšãã§ããŸã; æåŸã«ãçŽ æŽãããã
ãŸããäžè¬ã«ãRSDSã¯æ¬è³ªçã«ã°ã©ããªã®ã§ãå€ãã®ã°ã©ãã¢ã«ãŽãªãºã ã§ãã®ãªã¹ããåŒãç¶ã䜿çšã§ããŸãã
ã®ãããã€å³ãäœæããããã®ååž°ã¢ã«ãŽãªãºã
ãã®ã¢ã«ãŽãªãºã ã¯æ¬[1]ïŒpã260ïŒã§æäŸãããŠããŸããããã§ã¯ãFortuneã¢ã«ãŽãªãºã ãšãã䌌ãŠããŸããããã®ãªãã·ã§ã³ãå®è£ ããªãã£ããããæ§ç¯ã¢ã«ãŽãªãºã ã®ã¿ãæäŸããŸãã
ã¢ã«ãŽãªãºã
- Sãµã€ãã®ã»ããå šäœã2ã€ã®ã»ãŒçããéšåïŒå¥æ°åã®ãã€ã³ããããå ŽåããããŸãïŒS 1ãšS 2ã«åå²ããŸãã
- S 1ããã³S 2ã®ãããã€å³ãååž°çã«äœæããŸãã
- çµæã®å³ãçµã¿åãããŠãSã®å³ãååŸããŸãã
ã¢ã«ãŽãªãºã ã®äžè¬çãªèª¬æã¯è€éã§ã¯ãããŸããããã¢ã«ãŽãªãºã ã«ã¯ç¬èªã®åŸ®åŠãªç¹ããããŸãã詳现ã«ã€ããŠã¯ãæå®ãããæ¬ãåç §ããŠãã ããã
çšé
ãããã€å³ã®ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã®å®å šãªãªã¹ãã¯ããã«ãããŸããç§ã«ãšã£ãŠæãèå³æ·±ããšæããããã®ãããã€ã玹ä»ããŸãïŒå€ãã®æ å ±ã¯[1]ããååŸããŸããïŒã
ããã°ã©ãã³ã°ãã²ãŒã éçºãå°å³äœæ
èšç®å¹ŸäœåŠãããã€å³ã§ã®åé¡è§£æ±ºããã¹ãŠã®å¿ èŠãªæåã®ããè¿æ¥ãã€ã³ãããããããããã¯ã®ã¿ã¹ã¯ã§ç¹å¥è³ãã£ãŒãäžãããã¹ãŠã®æè¿å
ãããã€å³ãšããããŒäžè§åœ¢åå²ã®éã«ãéèŠãªé¢ä¿ãããã次ã ã«æ§ç¯ããããšãã§ããŸã圌ãã¯ãäºãã«ãã¥ã¢ã«ãªã®ã§ïŒ -ãšããžãé£æ¥ãµã€ãã¯ãæçµçã«ããããŒäžè§åœ¢åå²ååŸæ¥ç¶vikikonspektyãïŒãã²ãŒã éçºã§
ãããã€å³ã䜿çšããäŸã¯ãããšãã°ãã®èšäºã«ãããŸããããã§ã¯ãã²ãŒã ãšã³ãžã³ã®ããã²ãŒã·ã§ã³ã·ã¹ãã ã¯å³ã«åºã¥ããŠããŸãã
ããŸããŸãªãžãªãã±ãŒã·ã§ã³ãœãããŠã§ã¢ããããã€å³ã䜿çšããå¯èœæ§ããããŸããäœçœ®æ å ±åç §ã·ã¹ãã ã¯ãVoronoiãã€ã¢ã°ã©ã ã䜿çšããŠãããšãã°ãå Žæã®ããŸããŸãªæ€çŽ¢ãšåæã®ããã«ãæå¯ãã®é£æååºã決å®ã§ããŸãã
ããã§ã¯ãå°å³äœæã§ã®ãã£ãŒãã®äœ¿çšã«èšåããããšãã§ããŸã-å°åã®å¢çã®æŠèŠãšããããã«åºã¥ãããããªãåæããšã«ãããè²ä»ãã®ãããã€å³ã®å©ããåããŠãäœãã®ååžã瀺ãå°çå³ãæ確ã«ç€ºãããšãã§ããŸããããã«ã¯ãå¿ èŠãªã€ã³ãžã±ãŒã¿ãŒïŒæž©åºŠãªã©ïŒã®æšç§»ã衚瀺ãããŸãã
ãã¡ãããVoronoiãã€ã¢ã°ã©ã ã䜿çšããŠããŸããŸãªãã£ã«ã¿ãŒåçãã³ãã©ãŒãäœæããããçš®ã®ãã¢ã¶ã€ã¯ããäœæã§ããŸãã
ããããããã¯ã¢ããªã±ãŒã·ã§ã³ã®å§ãŸãã«ãããŸããã
建ç¯ãšèšèšã«ãããŠ
ãããã€å³ã¯çŸããå³åœ¢ã§ãããäžçš®ã®ã幟äœåŠçãªãŠã§ããã§ããããã人ã ã建ç¯ãšãã¶ã€ã³ã§ãããã€å³ã䜿çšãããšããã¢ã€ãã¢ãæãã€ããã®ã¯éåžžã«è«ççã§ãããã¹ãŠã®äœæã äŸïŒ
èå€åŠã§
[1]ããïŒ
èå€åŠã§ã¯ããããã€ããªãŽã³ã䜿çšããŠãå€ä»£æåã®ããŒã«ã®äœ¿çšç¯å²ããããã³ã°ãã競åãã貿æã®äžå¿ã®åœ±é¿ãç 究ããŠããŸãã-ããã¯éåžžã«è«ççã§ãããªããªããéåžžãè¿é£ã®å°åã¯ãçåãã®ããã«æŠãããã§ãã
çæ åŠã§ã¯ãäœãçãæ®ãèœåã¯ãé£ç©ãšå ã®ããã«æŠããªããã°ãªããªãé£äººã®æ°ã«äŸåããŸãã
ã¢ããªã³ã°ãšèªèã«ãããŠ
ãã®èšäºã§ã¯ãVoronoiã®3Dãã€ã¢ã°ã©ã ã«ã€ããŠã¯èª¬æããŸããããç©çåŠããã³ãªããžã§ã¯ãã®3Dã¢ããªã³ã°ã«å€ãã®çšéããããŸãã空éå ã®ãªããžã§ã¯ãã®ããŸããŸãªçš®é¡ã®ã°ãªããïŒããã³ã¹ã±ã«ãã³ïŒã¯ããããã€å³ã䜿çšããŠæ§ç¯ã§ããŸãïŒãã ããããå€ãã®å ŽåãããããŒäžè§åœ¢åå²ã䜿çšããŸãïŒãããŸããŸãªãªããžã§ã¯ãã®
3Dã¹ãã£ã³ïŒããã³ã³ã³ãã¥ãŒã¿ãŒããžã§ã³ïŒã§ã¯ããããã€å³ãšããããŒäžè§åœ¢åå²ã䜿çšã§ããŸãããŸããããããå·¥åŠïŒé害ç©ãèæ ®ããããããã®åãïŒãšå¯æ¥ã«é¢é£ããŠããŸãã
çç©åŠãšååŠ
[1]ããïŒ
è€éãªãããã€å³ãæ§ç¯ãããç 究ã®ããã«ãé»æ°åãšçè·é¢åãçµã¿åããã圱é¿ã¯ãååã®æ§é ã決å®ããã®ã«åœ¹ç«ã¡ãŸãã
ãããã€å³ã®äœ¿çšã«é¢ããå¥ã®èå³æ·±ãèšäºããããŸãã
èå³æ·±ãäºå®
èªç¶ã¯é©ãã¹ããã®ã§ããããªã³ã®è²ãå®éã«ãããã€å³ã®ããã«èŠããããšãããã£ãããã§ããããã¯èçŒã§èŠãããšãã§ããŸãïŒ
次ã®èŠ³å¯ã泚ç®ã«å€ããŸããããã¯ãæš¹æšã®èã®äžã§ãå³ãèŠãããšãã§ããããšã瀺ããŠããŸãã
ã¡ãªã¿ã«ã1幎ã»ã©åã«ã1ã€ã®äºä»¶ããããã€å³ã«ãé¢é£ä»ããããŸãããããã§ã¯ãæ°ããã¢ã¹ã¯ã¯ãããžã§ã¯ãã®ããŽã«äœ¿çšãããŸããã
ãããŠ-æåŸã«-ãµã€ãå ã«äžå¿ãæã€åã®æé·ãšãšãã«å³ãã©ã®ããã«è¡šç€ºãããããèŠãããšãã§ãããããªïŒ
ããã§ã¯ãããã€ãã®ç«æºãæã€ç«ã®åºãããšã®é¡äŒŒæ§ãæãããšãã§ããŸãã
ããŠã誰ãèªåã«æãè¿ãããç¥ã£ãŠããäžçãžã®ç§ãã¡ã®å°ããªæ è¡ã¯çµãããŸããããã®èšäºã楜ããã§ãæ°ããã䟿å©ã§é¢çœãäœããæ¬åœã«åŠãã ããšãé¡ã£ãŠããŸãã
ãæž èŽããããšãããããŸããïŒ
åç §è³æ
[1]æºåF.ãShaymos M.èšç®å¹ŸäœåŠãã¯ããã«ïŒ1989ïŒ
[2] Alexandrov A. D.ãWerner A. L.ãRyzhik V. I. Stereometryã空éã®å¹ŸäœåŠ
[3]ãžã§ã»ãã»ãªã«ãŒã¯ãCã®èšç®å¹ŸäœåŠ
ããã®èšäºã¯ãInstitute of Physics and Technologyã®1幎çã§ããIlya Zakharkinã«ãã£ãŠäœæãããŸããã
»FIVT MIPT Kirilenko ElenaãšKasimova Nadezhdaã®1幎çãå³æžé€šã®å·çãæäŒããŸããã
»ã©ã€ãã©ãªããã¹ãããããšã§ãã€ãã¹ã©ãã»ã¹ããªã³ãå©ããŸããã
»æå°è ã®Gadelshin IlnurãšGafarov Rustamã«ç¹ã«æè¬ããŸãã