рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рдХрдгреЛрдВ рдХреА рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░рдирд╛

рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдЯрдХрд░рд╛рд╡ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ? рд╕рдВрднрд╡рдд: рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдЙрдкрд╛рдп рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рд░ рд╡рд╕реНрддреБ рдХреЛ рд╣рд░ рджреВрд╕рд░реА рд╡рд╕реНрддреБ рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рдПред рдФрд░ рдпрд╣ рд╕рд╣реА рдирд┐рд░реНрдгрдп рд╣реИ, рдФрд░ рдЬрдм рддрдХ рдмрд╣реБрдд рд╕рд╛рд░реА рд╡рд╕реНрддреБрдПрдВ рдирд╣реАрдВ рд╣реЛрдВрдЧреА рддрдм рддрдХ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣реЗрдЧрд╛ред рдЬреИрд╕реЗ рд╣реА рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рд╣рдЬрд╛рд░ рд╣реИрдВ, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдФрд░ рдпрджрд┐ рдХрдг рдХрдИ рджрд╕рд┐рдпреЛрдВ рд╣рдЬрд╛рд░реЛрдВ рдпрд╛ рд╕реИрдХрдбрд╝реЛрдВ рд╣реИрдВ? рддрдм рд╕рдм рдХреБрдЫ рдЬрдо рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЪрд╛рд▓ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░реЗрдВрдЧреЗред

рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо 2 рдбреА рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдХрдг рдЧреЛрд▓ рд╣реИрдВ, рдХрдгреЛрдВ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред

рд╕рд╛рдордЧреНрд░реА


1. рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрд╡рд▓реЛрдХрди
1.1ред рдкреВрд░реНрдг рдЦреЛрдЬ
1.2ред рд╕реНрд╡реАрдк рдФрд░ рдкреНрд░реВрди
1.3ред рдирд┐рдпрдорд┐рдд рдиреЗрдЯрд╡рд░реНрдХ
2. рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди
2.1ред рд╕реНрд╡реАрдк рдФрд░ рдкреНрд░реВрди
2.2ред рдирд┐рдпрдорд┐рдд рдиреЗрдЯрд╡рд░реНрдХ
3. рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛
4. рдЖрд╡реЗрджрди (рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб)
5. рдирд┐рд╖реНрдХрд░реНрд╖



1. рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрд╡рд▓реЛрдХрди


1.1ред рдкреВрд░реНрдг рдЦреЛрдЬ

рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рднреА рд╕рдВрднрд╡ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдзреАрдорд╛ рд╣реИред рдХрдгреЛрдВ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЬреЛрдбрд╝реЗ рдХреЗ рдмреАрдЪ рдПрдХ рдЬрд╛рдВрдЪ рд╣реИред

void Update() { for (int i = 0; i < NUM_P; ++i) { for (int j = i + 1; j < NUM_P; ++j) { Collision(&_particles[i], &_particles[j]); } } } 

рдХрдард┐рдирд╛рдИ: O (n ^ 2)

рдкреЗрд╢реЗрд╡рд░реЛрдВ:
* рд╕рдордЭрдиреЗ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди
* рд╡рд┐рднрд┐рдиреНрди рдХрдг рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдирд╣реАрдВ
рд╡рд┐рдкрдХреНрд╖:
* рд╕рдм рд╕реЗ рдордВрдж

1.2ред рд╕реНрд╡реАрдк рдФрд░ рдкреНрд░реВрди

рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╣рдо рдУрдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдмрд╛рдИрдВ рд╕реАрдорд╛ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдХрдгреЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХреЛ тАЛтАЛрдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдмрд╛рдИрдВ рд╕реАрдорд╛ рд╡рд░реНрддрдорд╛рди рдХрдг рдХреА рд╕рд╣реА рд╕реАрдорд╛ рд╕реЗ рдХрдо рд╣реИред

рдореИрдВ рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдгреЛрдВ рдХрд╛ рдЖрджреЗрд╢ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХрдг рдХреА рдмрд╛рдИрдВ рд╕реАрдорд╛ (X рд╕реНрдерд┐рддрд┐ рдХрдг рддреНрд░рд┐рдЬреНрдпрд╛ рдШрдЯрд╛рдХрд░) рдХреЛ рдЫрд╛рдБрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрди рдЪрд┐рддреНрд░ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЕрдм рдЖрдк рд╣рд▓рдЪрд▓ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХреЛ тАЛтАЛрдПрдХ рджреВрд╕рд░реЗ рдХрдг рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓реЗ рдХрдг рдХреА рд╕рд╣реА рд╕реАрдорд╛ рджреВрд╕рд░реЗ рдХрдг рдХреА рдмрд╛рдИрдВ рд╕реАрдорд╛ рд╕реЗ рдмрдбрд╝реА рд╣реЛред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
0 рдХрдг 1 рдФрд░ 2 рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛:

2 рдФрд░ 3 рдХреЗ рд╕рд╛рде 1ред
2 рдХреЗрд╡рд▓ 3 рдХреЗ рд╕рд╛рдеред
3 4, 5 рдФрд░ 6 рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдд рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
 void Update() { qsort(_sap_particles, NUM_P, sizeof(Particle *), CompareParticles); for (int i = 0; i < NUM_P; ++i) { for (int j = i + 1; j < NUM_P && _sap_particles[i]->pos.x + RADIUS_P > _sap_particles[j]->pos.x - RADIUS_P; ++j) { Collision(_sap_particles[i], _sap_particles[j]); } } } 

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╣реИ рдЬрд╣рд╛рдВ рд╕рдордп рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрдг рдЖрдВрджреЛрд▓рди рдЫреЛрдЯрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЫрдВрдЯрд╛рдИ рдореБрдЦреНрдп рднрд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИ, рдФрд░ рдпрд╣ рддреЗрдЬ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдХрдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЫрдВрдЯреЗ рд╣реБрдП рд╣реИрдВред

рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреЛ рдЙрдирдХреЗ рдПрдПрдмреАрдмреА (рдПрдХреНрд╕рд┐рд╕-рдПрд▓рд╛рдЗрдирдб рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕, рдиреНрдпреВрдирддрдо рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрдард┐рдирд╛рдИ: рдУ (рдПрди ^ 2) - рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдУ (рдПрди * рд▓реЙрдЧ (рдПрди)) - рдФрд╕рдд рдорд╛рдорд▓реЗ рдореЗрдВ

рдкреЗрд╢реЗрд╡рд░реЛрдВ:
* рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ
* рд╡рд┐рднрд┐рдиреНрди рдХрдг рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдирд╣реАрдВ
* рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди
рд╡рд┐рдкрдХреНрд╖:
* рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ

1.3ред рдирд┐рдпрдорд┐рдд рдиреЗрдЯрд╡рд░реНрдХ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдирд╛рдо рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдкреВрд░реЗ рд╕реНрдерд╛рди рдХреЛ рдЫреЛрдЯреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдПрдХ рд╕рдорд╛рди рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ рдХрдг рдХреЗ рд╡реНрдпрд╛рд╕ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ (рд╕реЗрд▓) рдПрдХ рд╕рд░рдгреА рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
  const int _GRID_WIDTH = (int)(WIDTH / (RADIUS_P * 2.0f)); const int _GRID_HEIGHT = (int)(HEIGHT / (RADIUS_P * 2.0f)); std::vector<Particle *> _grid[_GRID_WIDTH][_GRID_HEIGHT]; 

рдореБрдЦреНрдп рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рднрд░ рдЬрд╛рддрд╛ рд╣реИред рднрд░рдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ: рдХрдг рд╕реЗрд▓ рд╕реВрдЪрдХрд╛рдВрдХ рдХрдг рд╡реНрдпрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рджреЛрдиреЛрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдФрд░ рдЖрдВрд╢рд┐рдХ рднрд╛рдЧ рдХреЛ рддреНрдпрд╛рдЧрдХрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
  int x = (int)(_particles[i].pos.x / (RADIUS_P * 2.0f)); int y = (int)(_particles[i].pos.y / (RADIUS_P * 2.0f)); 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХреЗ рд▓рд┐рдП, рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╕реЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдПрдХ рддрддреНрд╡ рдХреЛ рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ)ред
рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ 8 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рднреА рдХрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕рднреА рдХрдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЬрд╛рдВрдЪрдирд╛ рдирд╣реАрдВ рднреВрд▓рддреА рд╣реИред

рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  void Update() { for (int i = 0; i < _GRID_WIDTH; ++i) { for (int j = 0; j < _GRID_HEIGHT; ++j) { _grid[i][j].clear(); } } for (int i = 0; i < MAX_P; ++i) { int x = (int)(_particles[i].pos.x / (RADIUS_P * 2.0f)); int y = (int)(_particles[i].pos.y / (RADIUS_P * 2.0f)); _grid[x][y].push_back(&_particles[i]); } //        } 

рдХрдард┐рдирд╛рдИ: O (n)

рдкреЗрд╢реЗрд╡рд░реЛрдВ:
* рд╕рдм рд╕реЗ рддреЗрдЬ
* рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ
рд╡рд┐рдкрдХреНрд╖:
* рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛
* рд╡рд┐рднрд┐рдиреНрди рдХрдг рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓ (рд╕рдВрд╢реЛрдзрди рдЖрд╡рд╢реНрдпрдХ)

2. рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди


2.1ред рд╕реНрд╡реАрдк рдФрд░ рдкреНрд░реВрди

рдХрдгреЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдЕрдХреНрд╖ рдХреЛ рдЪреБрдирдХрд░ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╖реНрдЯрддрдо рдЕрдХреНрд╖ рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрдгреЛрдВ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╕реНрдерд┐рдд рд╣реИред
рдЗрд╖реНрдЯрддрдо рдУрдП рдЕрдХреНрд╖:

рдЗрд╖реНрдЯрддрдо OX рдЕрдХреНрд╖:



2.2ред рдирд┐рдпрдорд┐рдд рдиреЗрдЯрд╡рд░реНрдХ

рдЕрдиреБрдХреВрд▓рди рдирдВрдмрд░ 1:
рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
  const int _MAX_CELL_SIZE = 4; const int _GRID_WIDTH = (int)(WIDTH / (RADIUS_P * 2.0f)); const int _GRID_HEIGHT = (int)(HEIGHT / (RADIUS_P * 2.0f)); int _cell_size[_GRID_WIDTH * _GRID_HEIGHT]; Particle *_grid[_GRID_WIDTH * _GRID_HEIGHT * _MAX_CELL_SIZE]; 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдЖрдпрд╛рдореА рдЖрдпрд╛рдо рджреЛ рдЖрдпрд╛рдореА рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИ, рдФрд░ рдпрд╣ рднреА рдХрд┐ рд╕реНрдерд┐рд░ рд▓рдВрдмрд╛рдИ рдХреА рдПрдХ рд╕реНрдерд┐рд░ рдЧрддрд┐ рдПрдХ рдЧрддрд┐рд╢реАрд▓ std :: рд╡реЗрдХреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдордиреЗ рдпрд╣ рд╕рдм рд╕рдВрдпреБрдХреНрдд рдХрд┐рдпрд╛ рд╣реИред рдореБрдЭреЗ рдПрдХ рдФрд░ рд╕рд░рдгреА рднреА рд╢реБрд░реВ рдХрд░рдиреА рдереА, рдЬреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдмрд╛рдд рдХрд░реЗрдЧреА рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдореЗрдВ рдХрд┐рддрдиреЗ рдХрдг рд╣реИрдВред
рдФрд░ рд╣рд╛рдВ, рд╣рдордиреЗ рд╕реЗрд▓ рдореЗрдВ рдХрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдпрд╛, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдзрдордХреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдордЬрдмреВрдд рд╕рдВрдкреАрдбрд╝рди рдХреЗ рд╕рд╛рде, рдмрд╣реБрдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдгреЛрдВ рдХреЛ рд╕реЗрд▓ рдореЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдХреБрдЫ рдЯрдХрд░рд╛рд╡реЛрдВ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЯрдХрд░рд╛рд╡ рдХреЗ рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдиреБрдХреВрд▓рди тДЦ2
рдореБрдЦреНрдп рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдЧреНрд░рд┐рдб рд╕рд░рдгреА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдХреЗрд╡рд▓ рдЙрд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдШрдЯрд┐рдд рд╣реБрдП рд╣реИрдВред
рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд╕рднреА рдХрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рдирдП рдХрдг рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдХрдг рдХреЛ тАЛтАЛрд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдирдП рд╕реЗрд▓ рдореЗрдВ рдореБрдХреНрдд рд╕реНрдерд╛рди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд╛рд╕рди рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рджрд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдХреЛрд╢рд┐рдХрд╛ рд╕реЗ рдЕрдВрддрд┐рдо рдХрдг рд╣реЛрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
  for (int i = 0; i < _GRID_WIDTH * _GRID_HEIGHT; ++i) { for (int j = 0; j < _cell_size[i]; ++j) { int x = (int)(_grid[i * _MAX_CELL_SIZE + j]->pos.x / (RADIUS_P * 2.0)); int y = (int)(_grid[i * _MAX_CELL_SIZE + j]->pos.y / (RADIUS_P * 2.0)); if (x < 0) { x = 0; } if (y < 0) { y = 0; } if (x >= _GRID_WIDTH) { x = _GRID_WIDTH - 1; } if (y >= _GRID_HEIGHT) { y = _GRID_HEIGHT - 1; } //            if (x * _GRID_HEIGHT + y != i && _cell_size[x * _GRID_HEIGHT + y] < _MAX_CELL_SIZE) { _grid[(x * _GRID_HEIGHT + y) * _MAX_CELL_SIZE + _cell_size[x * _GRID_HEIGHT + y]++] = _grid[i * _MAX_CELL_SIZE + j]; //           _grid[i * _MAX_CELL_SIZE + j] = _grid[i * _MAX_CELL_SIZE + --_cell_size[i]]; } } } 

рдЕрдиреБрдХреВрд▓рди рд╕рдВрдЦреНрдпрд╛ 3
рд╣рдо рдкрдбрд╝реЛрд╕реА 8 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмреЗрдорд╛рдиреА рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ 4 рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

рд╢реЗрд╖ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдЪреЗрдХ рдпрд╛ рддреЛ рдкрд╣рд▓реЗ рдпрд╛ рдмрд╛рдж рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдЧрд╛:


рдЕрдиреБрдХреВрд▓рди тДЦ4
рдЖрдк рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рд╕реНрдерд╛рдиреАрдпрддрд╛ рдмрдврд╝рд╛рдХрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдереЛрдбрд╝рд╛ рдЧрддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдмрд╛рд░, рдФрд░ рд░реИрдо рддрдХ рдХрдо рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдРрд╕рд╛ рди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рднреА рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рд░ рджреЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╛рд░ рдПрдХ рд╕реЗрдХрдВрдб, рдпрд╛ рд╣рд░ рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдЧрд░ рджреГрд╢реНрдп рдереЛрдбрд╝рд╛ рдмрджрд▓рддрд╛ рд╣реИред
рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЦреНрдп рд╕рд░рдгреА рдореЗрдВ рдХрдгреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдХрд░ рд╕реНрдерд╛рдиреАрдпрддрд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╛рдиреА рдкрд╣рд▓реЗ 4 рдХрдг 0 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рд╣реЛрдВрдЧреЗ, рдЕрдЧрд▓реЗ 4 1 рд╕реЗ рдФрд░ рдЗрддрдиреЗ рдкрд░ред

3. рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛


рдХрдг рд╕рдВрдЦреНрдпрд╛рдмреНрд░реВрдЯрдлреЛрд░реНрд╕ (рдПрдордПрд╕)рд╕реНрд╡реАрдк рдФрд░ рдкреНрд░реНрдпреВрди (рдПрдордПрд╕)рдирд┐рдпрдорд┐рдд рдиреЗрдЯрд╡рд░реНрдХ (рдПрдордПрд╕)
1000411
20001411
50008942
10000355104
200001438287
3000032005511
1000001273714023

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд░рдирд┐рдВрдЧ рд╕рдордп рдЙрдирдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдирд┐рдпрдорд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рд▓рдЧрднрдЧ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИ :)ред

4. рдЖрд╡реЗрджрди (рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб)


http://rghost.ru/35826275

рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХреЛрдбрдмреНрд▓реЙрдХ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рд╕рд╛рде рд╣реА рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдПрдХ рдЦрд┐рдбрд╝рдХреА рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреНрд▓реИрдирд▓рд┐рдм рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдлрд┐рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкреНрд░рдмрдВрдзрди:
рдирдВрдмрд░ 1 - рдмреНрд░реВрдЯрдлреЛрд░реНрд╕
рдирдВрдмрд░ 2 - рд╕реНрд╡реАрдк рдФрд░ рдкреНрд░реВрди
рдирдВрдмрд░ 3 - рд╡рд┐рдирд┐рдпрд╛рдордХ рдиреЗрдЯрд╡рд░реНрдХ
рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдмрдЯрди - рдЪрд▓рддреА "рдзрдХреНрдХрд╛"ред

5. рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣ рд▓реЗрдЦ рдЯрдХрд░рд╛рд╡ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреБрдЫ рднреА рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЬреЛ рд╡реЗ рд╕реНрд╡рдпрдВ рд▓реЗрддреЗ рд╣реИрдВ, рд╡рд╣ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╕реНрддреБрддрд┐ рд╣реИ, рддрд╛рдХрд┐ рд╡реЗ рдЙрди рдЬреЛрдбрд╝рд┐рдпреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд╕рдХреЗрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИрдВред

Source: https://habr.com/ru/post/In135948/


All Articles