é«ééå¹³æ¹æ ¹(Fast Inverse Square Root)ã¯、Quake IIIã§æåã«ãªã£ããããã¬ãã«ã®è¿äŒŒæ³ã§ã。0x5f3759dfãšããããžãã¯ãã³ããŒã§åæå€ãäœã、ãã¥ãŒãã³æ³1åã§è¯å¥œãªç²ŸåºŠãåŸãŸã。æ¬çš¿ã§ã¯ãã®ä»çµã¿ãš、çŸä»£CPUã®rsqrtåœä»€ãšã®äœ¿ãåããç°¡æœã«æŽçããŸã。
ãã®ã¢ã«ãŽãªãºã ã¯、ããšããšQuake III Arenaã®ãœãŒã¹ã³ãŒãã§ç¥ãããããã«ãªããŸãã。ãã®æ¹æ³ã¯æµ®åå°æ°ç¹æ°ã®ããã衚çŸãå©çšããŠãã、ãã®éã«äœ¿çšããã「ããžãã¯ãã³ããŒ」㯠0x5f3759df ã§ã。
以äžããã®å žåçãªå®è£ äŸã§ã(Cèšèªé¢šã®æ¬äŒŒã³ãŒã):
float Q_rsqrt(float number) {
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = *(long*)&y; // æµ®åå°æ°ç¹æ°ãæŽæ°ãšããŠè§£é
i = 0x5f3759df - (i >> 1); // ããžãã¯ãã³ããŒã䜿çš
y = *(float*)&i; // æŽæ°ãæµ®åå°æ°ç¹æ°ã«æ»ã
y = y * (threehalfs - (x2 * y * y)); // ãã¥ãŒãã³æ³ã®1åç®ã®å埩
return y;}
ãã®ã¢ã«ãŽãªãºã ã¯、ãã¥ãŒãã³æ³ãå©çšããå埩åŠçã«ãã£ãŠéå¹³æ¹æ ¹ãéåžžã«é«éã«è¿äŒŒããããšãã§ããŸã。 0x5f3759df ã¯ç¹å®ã®ããŒããŠã§ã¢ã¢ãŒããã¯ãã£ã«æé©åãããŠãããã、æ±çšçãªçšéã§ã¯ä»ã®ææ³ãã©ã€ãã©ãªã䜿çšããæ¹ãè¯ãããšããããŸãã、ãã®æ¹æ³ã¯æŽå²çã«éåžžã«æåã§ã。
æ°çã¢ãã«ãã¢ã«ãŽãªãºã ã«ãããŠã、ããŸããŸãª「ããžãã¯ãã³ããŒ」ã䜿ãããŠãã、ç¹å®ã®ç®çã«æé©åãããã、å¹çåãå®çŸããããã«æŽ»çšãããŠããŸã。以äžã«、ããã€ãã®ä»£è¡šçãªäŸãæããŸã。
Bresenhamã®ã¢ã«ãŽãªãºã
ã°ã©ãã£ãã¯ã¹ã«ãããçŽç·ãæç»ããéã«äœ¿ãããBresenhamã®ã¢ã«ãŽãªãºã ã§ã¯、æŽæ°ã®é€ç®ãé¿ããããã«「ããžãã¯ãã³ããŒ」ã䜿ãããããšããããŸã。ããšãã°、ããç¹å®ã®ãªãã»ãããåæå€ãçµæãæé©åããããã«æåã§èª¿æŽãããå ŽåããããŸã。
ããã·ã¥é¢æ°ã®ããžãã¯ãã³ããŒ
ããã·ã¥é¢æ°ããã§ãã¯ãµã ã¢ã«ãŽãªãºã (CRCãªã©)ã«ãããžãã¯ãã³ããŒãç»å ŽããŸã。ããšãã°、MurmurHashãFNV-1aãªã©ã§ã¯ç¹å®ã®「ããžãã¯ãã©ã€ã 」ã䜿çšãããŠãã、ããã«ããè¡çªçãäœæžã、çµæã®åæ£æ§ãåäžããŸã。代衚çãªãã®ãšããŠä»¥äžããããŸã:
MurmurHash3: 0x5bd1e995 ãšãã宿°ã䜿ããã。
FNV-1a ããã·ã¥: FNV-1a ã§ã¯ 0x811C9DC5 ããªãã»ããããŒã¹、0x01000193 ããã©ã€ã æ°ãšããŠäœ¿ãããŠããŸã。
Perlinãã€ãº
ãã€ãºçæã®ã¢ã«ãŽãªãºã ã§ããPerlinãã€ãºã§ã、è£éãã°ã©ããŒã·ã§ã³èšç®ã§äœ¿çšããã5次ã®è£é颿°(6t^5 - 15t^4 + 10t^3)ã¯、ç¹å®ã®è£éå質ãä¿ã€ããã«ããžãã¯ãã³ããŒçã«æ§æãããŠããŸã。ãã®åœ¢ã®è£é颿°ã¯、æ»ãããªãã€ãºçæã«é©ããŠãããšãããŠããŸã。
Zigguratã¢ã«ãŽãªãºã
ä¹±æ°çæã¢ã«ãŽãªãºã ã§ããZigguratã¢ã«ãŽãªãºã ã§ã¯、ææ°é¢æ°ãæ£èŠååžããã®ä¹±æ°ãå¹ççã«çæããããã«、ç¹å®ã®éŸå€ã宿°(ããžãã¯ãã³ããŒ)ã䜿çšãããŸã。ããšãã°、ããŒãã«ãäºåèšç®ããéã®å€ã、ç¹å®ã®「è·³ãè¿ã」ç¯å²ãããžãã¯ãã³ããŒã®åœ¢ã§äºåã«æ±ºå®ãããŠããŸã。
Sin/Cosã®é«éè¿äŒŒ
äžè§é¢æ°ã®é«éè¿äŒŒã«ãããžãã¯ãã³ããŒã䜿ãããããšããããŸã。ç¹ã«å€ãã²ãŒã ããã°ã©ãã³ã°ã§ã¯、ããŒãã«ã«ãã¯ã¢ãããç¹å®ã®åŒã䜿ã£ãŠsinãcosãè¿äŒŒããéã«、ç¹å®ã®å®æ°ã䜿ãããŸã。
äŸãã°、x * (Ï - x) / 2 ãªã©ã®åŒãäžè§é¢æ°ã®è¿äŒŒã«äœ¿ãããããšããã、ãããããæå³ã§ããžãã¯ãã³ããŒã掻çšããŠããŸã。
ã¡ã«ã»ã³ã・ãã€ã¹ã¿
ä¹±æ°çæã¢ã«ãŽãªãºã ã®ä»£è¡šäŸã§ããã¡ã«ã»ã³ã・ãã€ã¹ã¿ã§ã¯、ç¹å®ã®ãã©ã¡ãŒã¿ã§ãã19937ãšããæ°ãåšæé·(2^19937−1)ãæ±ºå®ããéèŠãªå®æ°ãšããŠäœ¿çšãããŠããŸã。ãŸã、åæåãã¯ãã«ãä¿æ°ã«ãããžãã¯ãã³ããŒçãªå®æ°ãå«ãŸããŠããŸã。
Quakeã®æŽæ°å¹³æ¹æ ¹
å ã»ã©ã®é«ééå¹³æ¹æ ¹ãšåãã、æŽæ°ã®å¹³æ¹æ ¹ãå¹ççã«æ±ããããã®ã¢ã«ãŽãªãºã ã§ã¯、ç¹å®ã®ãããã·ããããªãã»ãããããžãã¯ãã³ããŒã®åœ¢ã§äœ¿ãããããšããããŸã。ããšãã°、2鲿³ã§ã®æé©åã®ããã®ããããã¹ã¯ãã·ããéãå žåçã§ã。
ãããã®ããžãã¯ãã³ããŒã¯、éåžž、å®éšãçè«çãªåæã«ãã£ãŠç¹å®ã®åé¡ã«å¯ŸããŠæé©åããããã®ã§ã。ãã®ãã、ããæå³「è¬ãããŠãã」ãã®ãå€ã、å¹ççãªã¢ã«ãŽãªãºã ãèšç®ã«ãããŠéåžžã«éèŠãªåœ¹å²ãæãããŠããŸã。