
рд╕реНрдерд╛рдирд┐рдХ рд╣реИрд╢рд┐рдВрдЧ рдПрдХ рд╕рд░рд▓ рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕, рднреМрддрд┐рдХ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХ рдЗрдВрдЬрди, рдХрдг рд╕рд┐рдореБрд▓реЗрд╢рди, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдЬрд╣рд╛рдВ рднреА рдЖрдкрдХреЛ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╡рд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рддреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрдирдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдлрд┐рд░, рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЬрд▓реНрджреА рд╕реЗ рд╣реИрд╢ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрддреЗ рд╣реИрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдирдХреЗ рдмреАрдЪ рдХреЛрдИ рдЯрдХреНрдХрд░ рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рд╕реЗ рдЕрдиреНрдп рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЖрд╡рд╢реНрдпрдХ рдЧрдгрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдмрдврд╝рддреА рд╣реИред рдпрджрд┐ рдПрдХ рджрд░реНрдЬрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реМ рдЬрд╛рдВрдЪреЗрдВ рдХрд░рдиреА рд╣реИрдВ, рддреЛ рд╕реМ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдЬрд╛рд░реЛрдВ рдЬрд╛рдВрдЪреЗрдВ рд╣реИрдВред рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдХреБрдЦреНрдпрд╛рдд рджреНрд╡рд┐рдШрд╛рдд рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЫрджреНрдо рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдВрджрд┐рдЧреНрдз рд░реВрдк рд╕реЗ C # рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рднреНрд░рдо рд╣реИред рдпрд╣ рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реИред
рдпрджрд┐ рдЖрдк рдЧреНрд░рд┐рдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рддреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреБрдЫ рдЧреНрд░рд┐рдб рд╕реЗрд▓ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдЧреА рдФрд░ рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЙрдирдХреА рдкреВрд░реНрдгрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯрдХрд░рд╛рдП рдирд╣реАрдВред

рдЧреНрд░рд┐рдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреНрд░рд┐рдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджреЛ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреАрди рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдзреАрдорд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рд╣рдо рд╣реИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБрдЖрдпрд╛рдореА рдЦреЛрдЬ рд╕реНрдерд╛рди рдХреЛ рдПрдХ-рдЖрдпрд╛рдореА рдореЗрдВ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд╢рд┐рдВрдЧ рд╣рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рднрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рд╣рд╛рд╢рд┐рдВрдЧ рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдореЗрдВ рдорд╛рдореВрд▓реА рдЕрдВрддрд░ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдПрдХ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣рд╛рдирд┐рдкреВрд░реНрдг рд╕рдВрдкреАрдбрд╝рди рд╣реИред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдЖрд░реЗрдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрд▓ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рднрд░рдирд╛, рд╣рдо рддрдм рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рд╕рд┐рд░реНрдл рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕реЗрд▓ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рджреЛ рдЖрдпрд╛рдореА рдЧреНрд░рд┐рдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
hashId = (Math.Floor(position.x / ellSize)) + (Math.Floor(position.y / ellSize)) * width;
рд╣рдо рдПрдХреНрд╕-рд╕рдордиреНрд╡рдп рдХреЛ рд╕реЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдВрд╢рд┐рдХ рднрд╛рдЧ рдХреЛ рдХрд╛рдЯрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╡рд╛рдИ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧреНрд░рд┐рдб рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдХреА рддрд░рд╣ рдПрдХ рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдЧреНрд░рд┐рдб рд╣реИ, рд▓реЗрдХрд┐рди рдЧрдгрдирд╛ рдХреЗ рд╕рд░рд▓реАрдХрд░рдг рдХреЗ рдХрд╛рд░рдг рдЦреЛрдЬ рддреЗрдЬ рд╣реИред рд╕рдЪ рд╣реИ, рдЯрдХрд░рд╛рд╡ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдЙрдирдХрд╛ рд╕рд░рд▓реАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдПрдХ рдмрд╣реБрдд рджреВрд░ рдХреА рд╡рд╕реНрддреБ рдХрд╛ рд╕рдордиреНрд╡рдп рд╣реИрд╢ рдПрдХ рдХрд░реАрдмреА рдХреЗ рд╕рдордиреНрд╡рдп рд╡рд╛рд▓реЗ рд╣реИрд╢ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рддрд░рдг рдФрд░ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЯрдХреНрдХрд░ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдЪреБрдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╕реНрдерд╛рдирд┐рдХ рд╣реИрд╢ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╣реИрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЬреЛрдбрд╝реЗрдВ2 * 3.14 рдпрд╛ 2 * 3.1415926535897932384626433832795028841971 рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рддреЗрдЬ рд╣реИ ...? рдмреЗрд╢рдХ, рдкрд╣рд▓рд╛ред рд╣рдореЗрдВ рдПрдХ рдХрдо рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ? рдЗрд╕реА рддрд░рд╣, рд╣реИрд╢ рдХреЗ рд╕рд╛рдеред рд╣рдо рдЧрдгрдирд╛рдУрдВ рдХреЛ рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдЯреАрдХрддрд╛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣реИрд╢ рдЪрд┐рдк рдФрд░ рдЙрдирдХреА рддрд╛рдХрдд рдХрд╛ рд╕реНрд░реЛрдд рд╣реИредрдЖрдЗрдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ - рд╣реИрд╢ рддреАрди-рдЖрдпрд╛рдореА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдПрдирд╡реАрдбрд┐рдпрд╛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА
рд▓реЗрдЦ рдореЗрдВ рд╡реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди
рдХрд░рддреЗ рд╣реИрдВ:
GLuint hash = ((GLuint)(pos.x / CELLSIZE) << XSHIFT) | ((GLuint)(pos.y / CELLSIZE) << YSHIFT) | ((GLuint)(pos.z / CELLSIZE) << ZSHIFT);
рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖ рдкрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд▓реЗрддреЗ рд╣реИрдВ, рд╕реЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рдЖрдХрд╛рд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд┐рдЯ рдЧрдгрд┐рдд рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдХреЗ рд▓рд┐рдП" рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдорд┐рд▓рддрд╛ рд╣реИ:
hash = (Floor(pos.x / cellSize) * 73856093) ^ (Floor(pos.y / cellSize) * 19349663) ^ (Floor(pos.z / cellSize) * 83492791);
рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖ рдкрд░ рд╕реЗрд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдвреВрдВрдвреЗрдВ, рдПрдХ рдмрдбрд╝реА рдЕрднрд╛рдЬреНрдп рд╕рдВрдЦреНрдпрд╛ рдФрд░ XOR рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░реЗрдВред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдмрд╣реБрдд рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЕрдЬреНрдЮрд╛рдд рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд┐рдирд╛ред
рдПрдХ рд╕реНрдерд╛рдирд┐рдХ рд╣реИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ: рдПрдХ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реЗрд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣реИрд╢рдЯреЗрдмрд▓реНрд╕ рд╕рдмрд╕реЗ рдЬрд▓реНрджреА рдореБрдЦреНрдп рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рд╣реИрдВ, рд╡реЗ рд╣реИрд╢рдореИрдк рднреА рд╣реИрдВ рдпрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ, рд╣рдо рд╣реИрд╢ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реЗрд▓ рдирдВрдмрд░ред рд╕рд╛рде рдореЗрдВ, рдпреЗ рджреЛ рдХрдВрдЯреЗрдирд░ рдЖрдкрдХреЛ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЦреЛрдЬрдиреЗ рдФрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдкреВрд░реНрдгрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
private Dictionary<int, List<T>> dict; private Dictionary<T, int> objects;
рдЗрди рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ? рд╣рдо рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рд╕реНрд╡рдпрдВ рд╡рд╕реНрддреБред
public void Insert(Vector3 vector, T obj) { var key = Key(vector); if (dict.ContainsKey(key)) { dict[key].Add(obj); } else { dict[key] = new List<T> { obj }; } objects[obj] = key; }
рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╣реИрд╢ рдХрд░реЗрдВ, рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдХреБрдВрдЬреА рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ рдФрд░ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ рдХреЛ рд░рдЯрдирд╛ред рдЬрдм рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрд░рд╛рдиреЗ рд╕реЗрд▓ рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдирдП рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред
public void UpdatePosition(Vector3 vector, T obj) { if (objects.ContainsKey(obj)) { dict[objects[obj]].Remove(obj); } Insert(vector, obj); }
рдпрджрд┐ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рднрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред
public void Clear() { var keys = dict.Keys.ToArray(); for (var i = 0; i < keys.Length; i++) dict[keys[i]].Clear(); objects.Clear(); }
рдпрд╣реА рд╣реИ, рдиреАрдЪреЗ рдкреВрд░реНрдг рд╡рд░реНрдЧ рдХреЛрдб рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдпреВрдирд┐рдЯреА рдЗрдВрдЬрди рд╕реЗ
рд╡реЗрдХреНрдЯрд░ 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХреНрд╕рдПрдирдП рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣реИрд╢ рдХрд╛ рдХрд╛рд░реНрдп рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд "рдХреНрд╡рд┐рдХ рд░рд╛рдЙрдВрдбрд┐рдВрдЧ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдЬреНрдЮрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
SpatialHash.cs using System.Linq; using UnityEngine; using System.Collections.Generic; public class SpatialHash<T> { private Dictionary<int, List<T>> dict; private Dictionary<T, int> objects; private int cellSize; public SpatialHash(int cellSize) { this.cellSize = cellSize; dict = new Dictionary<int, List<T>>(); objects = new Dictionary<T, int>(); } public void Insert(Vector3 vector, T obj) { var key = Key(vector); if (dict.ContainsKey(key)) { dict[key].Add(obj); } else { dict[key] = new List<T> { obj }; } objects[obj] = key; } public void UpdatePosition(Vector3 vector, T obj) { if (objects.ContainsKey(obj)) { dict[objects[obj]].Remove(obj); } Insert(vector, obj); } public List<T> QueryPosition(Vector3 vector) { var key = Key(vector); return dict.ContainsKey(key) ? dict[key] : new List<T>(); } public bool ContainsKey(Vector3 vector) { return dict.ContainsKey(Key(vector)); } public void Clear() { var keys = dict.Keys.ToArray(); for (var i = 0; i < keys.Length; i++) dict[keys[i]].Clear(); objects.Clear(); } public void Reset() { dict.Clear(); objects.Clear(); } private const int BIG_ENOUGH_INT = 16 * 1024; private const double BIG_ENOUGH_FLOOR = BIG_ENOUGH_INT + 0.0000; private static int FastFloor(float f) { return (int)(f + BIG_ENOUGH_FLOOR) - BIG_ENOUGH_INT; } private int Key(Vector3 v) { return ((FastFloor(vx / cellSize) * 73856093) ^ (FastFloor(vy / cellSize) * 19349663) ^ (FastFloor(vz / cellSize) * 83492791)); } }
рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдбреЗрдореЛ рдореЗрдВ,
рдЗрд╕ рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рджреЗрдЦреЗрдВ рдХрд┐ рд╣реИрд╢ рд╕реНрдкреЗрд╕ рдХреИрд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреАрд▓реА рдЧреЗрдВрдж рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдПрдХ рдЯрд╛рдЗрдорд░ рджреНрд╡рд╛рд░рд╛ рд╣реИрд╢реЗрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЧреЛрд▓реЗ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд┐рдВрджреБ рдкрд░ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреАрд▓реЗ рдХреНрдпреВрдмреНрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рд╕реЗрд▓ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдиреАрд▓реА рдХреБрдВрдЬрд┐рдпрд╛рдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдИ рдЧрдИ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рдореЗрдореЛрд░реА рднрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦ рд╕рдХреЗрдВред рдорд╛рдЙрд╕ рдХреЛ рдШреБрдорд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЧрд┐рдЯрд╣рдм рдкрд░ рд╕реВрддреНрд░ |
рдПрдХрддрд╛ рд╡реЗрдм рдкреНрд▓реЗрдпрд░ рдХреЗ рдорд╛рд▓рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдирд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдгрджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ
http://www.cs.ucf.edu/~jmesit/publications/scsc%202005.pdfhttp://www.beosil.com/download/CollisionDetectionHashing_VMV03.pdfhttp://http.developer.nvidia.com/GPUGems3/gpugems3_ch32.html