Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²/Π—Π°Π΄Π°Ρ‡Π° ΠΎ принадлСТности Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ

Π’ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ извСстна Π·Π°Π΄Π°Ρ‡Π° ΠΎΠ± ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ принадлСТности Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ. На плоскости Π΄Π°Π½Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°. ВрСбуСтся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ вопрос ΠΎ принадлСТности Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ.

ΠœΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΡƒΠΊΠ»Ρ‹ΠΌ, Ρ‚Π°ΠΊ ΠΈ Π½Π΅Π²Ρ‹ΠΏΡƒΠΊΠ»Ρ‹ΠΌ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ прСдполагаСтся, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ простой, Ρ‚.Π΅. Π±Π΅Π· самопСрСсСчСний, Π½ΠΎ Π·Π°Π΄Π°Ρ‡Ρƒ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΈ для Π½Π΅-простых ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ². Π’ послСднСм случаС Ρ€Π°Π·Π½Ρ‹Π΅ способы опрСдСлСния принадлСТности Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ. Π Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π±Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ, Π² Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π² дальнСйшСм быстрСС ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° мноТСство запросов ΠΎ принадлСТности Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ.

Алгоритм опрСдСляСт Ρ‚ΠΎΡ‡ΠΊΠΈ Π³Ρ€Π°Π½ΠΈΡ† ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ОписаниС [ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ]

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ вычислСний Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ прСдставлСны цСлочислСнными ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ (ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ быстродСйствиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ являСтся СстСствСнным для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ), вычислСния ΠΈ сравнСния ΠΏΠ»ΠΎΡ‰Π°Π΄Π΅ΠΉ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ вычислСниями ΠΈ сравнСниями ΠΈΡ… ΡƒΠ΄Π²ΠΎΠ΅Π½Π½Ρ‹Ρ… ΠΏΠ»ΠΎΡ‰Π°Π΄Π΅ΠΉ. Π’Π΅ΠΌ самым ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡŒ округлСния ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всСго Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, Π² Ρ†Π΅Π»ΠΎΠΌ.

АргумСнтами Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ принадлСТности Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, ΡΠ²Π»ΡΡŽΡ‚ΡΡ

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1, Ссли Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ, ΠΈΠ½Π°Ρ‡Π΅ β€” 0.

Ѐункция ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄.

ΠžΡ‡Π΅Π½ΡŒ быстрый Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ [ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ]

Π’ основС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π»Π΅ΠΆΠΈΡ‚ идСя подсчёта количСства пСрСсСчСний Π»ΡƒΡ‡Π°, исходящСго ΠΈΠ· Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ оси, со сторонами ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Если ΠΎΠ½ΠΎ Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅, Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ. Π’ Π΄Π°Π½Π½ΠΎΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ Π»ΡƒΡ‡ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π²Π»Π΅Π²ΠΎ.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ быстрСС дСлСния, условиС ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Однако, стоит Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π½Π΅ эквивалСнтСн ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ, поэтому Π΅Π³ΠΎ использованиС ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ.

Perl [ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ]

Delphi (Object Pascal) [ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ]

JavaScript [ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ]

Python 3 [ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ]

На Python ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° нСсколько отличаСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков Π² сторону компактности ΠΈΠ·-Π·Π° особСнностСй адрСсации элСмСнтов массива. НС Π½ΡƒΠΆΠ½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. НС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°ΠΌΠΈ Π²ΠΎΠ³Π½ΡƒΡ‚ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Быстрый Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ для случая, ΠΊΠΎΠ³Π΄Π° Π»ΡƒΡ‡ пСрСсСкаСт ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько Π²Π΅Ρ€ΡˆΠΈΠ½ [ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ]

Ѐункция Cross опрСдСляСт, пСрСсСкаСт Π»ΠΈ Π»ΡƒΡ‡ j-ΠΎΠ΅ Ρ€Π΅Π±Ρ€ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°:

Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

Если пСрСмСнная count ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π»Π΅ΠΆΠΈΡ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаСт Ρ‚ΠΎΡ‡ΠΊΠ° Π»Π΅ΠΆΠΈΡ‚ Π²Π½Π΅ Π·Π°Π΄Π°Π½ΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π»ΡƒΡ‡ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π²Π½ΠΈΠ·.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ опрСдСлСния принадлСТности Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ

НСдавно Π½Π° Ρ…Π°Π±Ρ€Π΅ Π±Ρ‹Π»Π° ΡΡ‚Π°Ρ‚ΡŒΡ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠΈΡΡ‹Π²Π°Π»ΠΎΡΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π³Π΄Π΅ находится Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ: Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ»ΠΈ снаруТи. Подобная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° встрСчаСтся Π² гСомСтричСском ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ достаточно часто. А Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄, описанный Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, Π±Ρ‹Π» нСсколько Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π΅Π½, Π° Π² коммСнтариях Π±Ρ‹Π» нСбольшой хаос, Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΌΡ‹ΡΠ»ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ. Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π² соврСмСнной ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ заданная Ρ‚ΠΎΡ‡ΠΊΠ° ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

ΠŸΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ…ΠΎΡ‡Ρƒ сразу ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π₯отя сама ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° проста: Ρƒ нас Π·Π°Π΄Π°Π½ Π½Π°Π±ΠΎΡ€ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ Π·Π°Π΄Π°Π½ порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ эти Ρ‚ΠΎΡ‡ΠΊΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ. И Π·Π°Π΄Π°Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ тСстируСм Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ. ΠŸΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹ΠΉ, ΠΈ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Ρ€Π΅Π±Ρ€Π° ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ ΠΈΠ·Π±Π°Π²Π»Π΅Π½ ΠΎΡ‚ самопСрСсСчСний. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° количСство Π²Π΅Ρ€ΡˆΠΈΠ½ Π½Π΅Ρ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠΌ Π²Π΅Ρ€ΡˆΠΈΠ½. ΠœΡ‹ надССмся, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ задаст Π½Π°ΠΌ нСпонятно Ρ‡Ρ‚ΠΎ, Π½ΠΎ ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ. И Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ нюанс: Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΡƒ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, которая хотя ΠΈ позволяСт ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с числами достаточно Ρ‚ΠΎΡ‡Π½ΠΎ, всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ ΠΈΠ·Π±Π°Π²Π»Π΅Π½Π° ΠΎΡ‚ ошибок.

Ну Π²Ρ€ΠΎΠ΄Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈΡΡŒ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚.

ΠœΠ΅Ρ‚ΠΎΠ΄ 1. Врассировка Π»ΡƒΡ‡Π΅ΠΉ

Начну я с Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ считаСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярным Π² ΠΌΠΈΡ€Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ ΠΈΠ³Ρ€: трассировка Π»ΡƒΡ‡Π΅ΠΉ. Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠœΠ΅Ρ‚ΠΎΠ΄ простой, Π½ΠΎ, ΠΊ соТалСнию, Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π΅Π³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ. ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ этого являСтся случай, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ пСрСсСкаСм Π»ΡƒΡ‡ΠΎΠΌ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈΠ»ΠΈ Ρ€Π΅Π±Ρ€ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ частично совпадаСт с Π»ΡƒΡ‡ΠΎΠΌ. Π˜Π»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ это Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠ°. Π’ самом Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ вдоль оси Ρ…. ВыпускаСм ΠΈΠ· Ρ‚ΠΎΡ‡ΠΊΠΈ Π»ΡƒΡ‡ Π² ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ оси x ΠΈ Π»ΡƒΡ‡ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½ΠΎ пСрСсСк ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅. Π’ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΡ‹ провСряСм Ρ‚Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ? НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с числами с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, ΠΈ нСбольшиС ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π² ΠΌΠΈΡ€ аналитичСской Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ просто гСомСтричСскими понятиями, Π° числами.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ Π»ΡƒΡ‡ Π² ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. Π’Π°ΠΌ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ – Π»ΡƒΡ‡ пСрСсСкаСт Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π’ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. ВмСсто Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ направлСния Π²Π·ΡΡ‚ΡŒ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅? Никто Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΎΠΏΡΡ‚ΡŒ Π½Π΅ пСрСсСчСтС Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ. Π’ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ ΠΌΠ½ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π°Π²Π΅Ρ€Ρ…Ρƒ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Π½Π° Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ пСрСсСчСниС Π΅Π΅ с Π»ΡƒΡ‡ΠΎΠΌ, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌ оси y ΠΈ ΠΈΠ΄ΡƒΡ‰ΠΈΠΉ свСрху Π²Π½ΠΈΠ· Ρ‚ΠΎΠΆΠ΅ пСрСсСкаСт ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅.

ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Ссли Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ пСрСсСчСниС с Π²Π΅Ρ€ΡˆΠΈΠ½ΠΎΠΉ – это ΠΏΠ»ΠΎΡ…ΠΎ, смотритС Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ:

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ пСрСсСкаСм Π»ΡƒΡ‡ с ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ с этим Π»ΡƒΡ‡ΠΎΠΌ совпадаСт. Как Π±Ρ‹Ρ‚ΡŒ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС? А Ссли Π½Π΅ совпадаСт, Π° ΠΏΠΎΡ‡Ρ‚ΠΈ совпадаСт? А ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, Ρ‡Ρ‚ΠΎ Π² ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ΅ мноТСство ΠΏΠΎΡ‡Ρ‚ΠΈ Π²Ρ‹Ρ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… Ρ€Π΅Π±Π΅Ρ€, ΠΊΠ°ΠΊ с Ρ‚Π°ΠΊΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒ?

Π‘Π°ΠΌΠΎΠ΅ ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π²ΠΎ всСй этой ситуации Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π²ΠΎΡ‚ каТСтся: Β«ΠΌΠ½Π΅ Π½Π°Π΄ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ простоС для ΠΌΠΎΠΈΡ… простых Ρ†Π΅Π»Π΅ΠΉ, мСня такая ситуация Π½Π΅ коснСтся». По Π·Π°ΠΊΠΎΠ½Ρƒ ΠœΠ΅Ρ€Ρ„ΠΈ, ΠΊ соТалСнию, ΠΈΠΌΠ΅Π½Π½ΠΎ такая ситуация Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ всякий Ρ€Π°Π· ΠΊΠΎΠ³Π΄Π° Π΅Π΅ совсСм Π½Π΅ ТдСшь. И поэтому я ΠΏΠ»Π°Π²Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠΆΡƒ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ.

ΠœΠ΅Ρ‚ΠΎΠ΄ 2. БлиТняя Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ Π΅Π΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ

Π’ΠΎΠΎΠ±Ρ‰Π΅ Ρƒ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ angle weighted pseudo normals ΠΈ связан ΠΎΠ½ Π² понятиСм Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ расстояний со Π·Π½Π°ΠΊΠΎΠΌ (signed distance fields). Но ΠΏΡƒΠ³Π°Ρ‚ΡŒ лишний Ρ€Π°Π· я Π½ΠΈΠΊΠΎΠ³ΠΎ Π½Π΅ Ρ…ΠΎΡ‡Ρƒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡƒΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ просто блиТняя Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ Π΅Π΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ пСрпСндикулярный Π²Π΅ΠΊΡ‚ΠΎΡ€).

Алгоритм Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ‚Π°ΠΊΠΎΠΉ:

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π’ΠΎΡ‡ΠΊΠ° A1, блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° для Π½Π΅Π΅ находится Π½Π° Ρ€Π΅Π±Ρ€Π΅. Если всС Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ ΠΊ Ρ€Π΅Π±Ρ€Ρƒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ ΠΎΡ‚ тСстируСмой Ρ‚ΠΎΡ‡ΠΊΠΈ Π΄ΠΎ блиТайшСй. Π’ случаС Ρ‚ΠΎΡ‡ΠΊΠΈ A1, ΡƒΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ = 0. Или ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΡƒΠ»ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ·-Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. МСньшС 90 градусов, тСстируСмая Ρ‚ΠΎΡ‡ΠΊΠ° A1 – Π²Π½ΡƒΡ‚Ρ€ΠΈ. ΠŸΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚ΠΎΡ‡ΠΊΡƒ A2. Π£ Π½Π΅Π΅ блиТайшая Ρ‚ΠΎΡ‡ΠΊΠ° – Π²Π΅Ρ€ΡˆΠΈΠ½Π°, Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ – усрСднСнная Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ Ρ€Π΅Π±Π΅Ρ€ ΠΏΡ€ΠΈΠ»Π΅Π³Π°ΡŽΡ‰ΠΈΡ… ΠΊ этой Π²Π΅Ρ€ΡˆΠΈΠ½Π΅. Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ скалярноС ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. ΠœΡ‹ – снаруТи.

Π’Π°ΠΊ, Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ с ΡΡƒΡ‚ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ. Π§Ρ‚ΠΎ Ρ‚Π°ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ, связанной с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ?

Как ΠΈ Π² случаС трассировки Ρ‚ΠΎΡ‡Π΅ΠΊ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ – O(log n), Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΡŒΡ для хранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ€Π΅Π±Ρ€Π°Ρ…. Π‘ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΌΠ΅Ρ‚ΠΎΠ΄, хотя ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Π±ΡƒΠ΄Π΅Ρ‚ нСсколько ΠΏΠΎΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ трассировка. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго ΠΎΡ‚Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΈ Ρ€Π΅Π±Ρ€ΠΎΠΌ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ дорогостоящая опСрация, Ρ‡Π΅ΠΌ пСрСсСчСниС Π΄Π²ΡƒΡ… Π»ΠΈΠ½ΠΈΠΉ. НСприятности, связанныС с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π² этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π΅Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ‚ Ρ€Π΅Π±Π΅Ρ€ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Ρ‡Π΅ΠΌ ΠΌΡ‹ Π±Π»ΠΈΠΆΠ΅ ΠΊ Ρ€Π΅Π±Ρ€Ρƒ, Ρ‚Π΅ΠΌ большС Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ опрСдСлСния Π·Π½Π°ΠΊΠ°. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρ‡Π΅ΠΌ ΠΌΡ‹ Π±Π»ΠΈΠΆΠ΅ ΠΊ Ρ€Π΅Π±Ρ€Ρƒ, Ρ‚Π΅ΠΌ мСньшС расстояниС. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ссли ΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ссли ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ расстояниС мСньшС Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ минимального (это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константа Π²Ρ€ΠΎΠ΄Π΅ DBL_EPSILON ΠΈΠ»ΠΈ FLT_EPSILON), Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ€Π΅Π±Ρ€Ρƒ. А Ссли ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ€Π΅Π±Ρ€Ρƒ, Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ сами Ρ€Π΅ΡˆΠ°Π΅ΠΌ, Ρ‡Π°ΡΡ‚ΡŒ Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π΅Π³ΠΎ Ρ€Π΅Π±Ρ€ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ – Ρ‡Π°ΡΡ‚ΡŒ).

ΠžΠΏΠΈΡΡ‹Π²Π°Ρ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, достаточно ΠΌΠ½ΠΎΠ³ΠΎ Π±Ρ‹Π»ΠΎ сказано ΠΎ нСдостатках. ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя Π½Π°Π·Π²Π°Ρ‚ΡŒ нСсколько нСдостатков ΠΈ этого способа. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ ΠΊ Ρ€Π΅Π±Ρ€Π°ΠΌ Π±Ρ‹Π»ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ сторону. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, снаруТи ΠΌΡ‹ ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ, Π½Π°Π΄ΠΎ провСсти Π½Π΅ΠΊΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ этих Π½ΠΎΡ€ΠΌΠ°Π»Π΅ΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΈΡ… ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠžΡ‡Π΅Π½ΡŒ часто, особСнно ΠΊΠΎΠ³Π΄Π° Π½Π° Π²Ρ…ΠΎΠ΄Π΅ большая свалка ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ Ρ€Π΅Π±Π΅Ρ€, этот процСсс Π½Π΅ всСгда прост. Если Π½Π°Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ, процСсс ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½ΠΎΡ€ΠΌΠ°Π»Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅. Π’Π°ΠΊΠΆΠ΅, этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ Π»ΡŽΠ±ΠΈΡ‚, ΠΊΠΎΠ³Π΄Π° Π½Π° Π²Ρ…ΠΎΠ΄ подаСтся ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с самопСрСсСчСниями. Π’ Π½Π°Ρ‡Π°Π»Π΅ я сказал, Ρ‡Ρ‚ΠΎ Π² нашСй Π·Π°Π΄Π°Ρ‡Π΅ Ρ‚Π°ΠΊΠΎΠΉ случай Π½Π΅ рассматриваСтся, Π½ΠΎ Ссли Π±Ρ‹ ΠΎΠ½ рассматривался, Ρ‚ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠ³ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Но Π² Ρ†Π΅Π»ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ΠΏΠ»ΠΎΡ…, особСнно Ссли Ρƒ нас Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ с большим количСством Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ Ρ€Π΅Π±Π΅Ρ€, Π° Ρ‚ΠΎΡ‡Π΅ΠΊ Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ. Если ΠΆΠ΅ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΌΠ°Π»ΠΎ, трассировка Π»ΡƒΡ‡Π΅ΠΉ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°, Π° хочСтся Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ способ.

ΠœΠ΅Ρ‚ΠΎΠ΄ 3. ИндСкс Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ извСстСн довольно Π΄Π°Π²Π½ΠΎ, Π½ΠΎ Π² основном остаСтся тСорСтичСским, ΠΏΠΎ большСй части ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ Ρ‚Π°ΠΊ эффСктивСн, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ Π΄Π²Π°. Π’ΠΎΡ‚ Π΅Π³ΠΎ ΡΡƒΡ‚ΡŒ Β«Π½Π° ΠΏΠ°Π»ΡŒΡ†Π°Ρ…Β». Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΡƒΡŽ ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ с Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠΌ Π² тСстируСмой Ρ‚ΠΎΡ‡ΠΊΠ΅. ΠŸΠΎΡ‚ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° спроСцируСм Π½Π° эту ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ Π»ΡƒΡ‡Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ проходят Ρ‡Π΅Ρ€Π΅Π· Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ. Как-Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

На рисункС Ρ‚ΠΎΡ‡ΠΊΠΈ P1, P2 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ – Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Π° Ρ‚ΠΎΡ‡ΠΊΠΈ P1’, P2’ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ – ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Π½Π° ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассматриваСм Ρ€Π΅Π±Ρ€ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, ΠΏΠΎ проСкциям ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, происходит Π»ΠΈ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки ΠΈΠ»ΠΈ ΠΏΠΎ часовой стрСлкС ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π’Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠΌ, Π° Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ часовой стрСлкС – ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Π£Π³ΠΎΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствуСт ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π΅Π±Ρ€Ρƒ – это ΡƒΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ сСгмСнтами окруТности Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½ этого Ρ€Π΅Π±Ρ€Π°. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ Ρƒ нас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ»ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Ρ‚ΠΎ ΠΈ ΡƒΠ³ΠΎΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ»ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ.

Алгоритм Π² этом случаС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, порядок ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ установлСн ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки. Π•ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠ° А, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ тСстируСм. Для тСстирования сначала вычисляСм ΡƒΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ AP1 ΠΈ AP2. Π’Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ этих ΠΆΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² смотрит Π½Π° нас, Π·Π½Π°Ρ‡ΠΈΡ‚ прибавляСм ΠΊ суммС. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ дальшС ΠΈ считаСм ΡƒΠ³ΠΎΠ» ΠΌΠ΅ΠΆΠ΄Ρƒ AP2 ΠΈ AP3. Π’Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ смотрит Π½Π° нас, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ. И Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ этого рисунка я всС посчитал ΠΈ Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

(AP1, AP2)=74.13, (AP2, AP3)=51.58, (AP3, AP4)=89.99, (AP4, AP5)=126.47, (AP5, AP1)=120.99.
sum=74.13-51.58+89.99+126.47+120.99=360. 360/360=1 Π’ΠΎΡ‡ΠΊΠ° – Π²Π½ΡƒΡ‚Ρ€ΠΈ.

(BP1, BP2)=44.78, (BP2, BP3)=89.11, (BP3, BP4)=130.93, (BP4, BP5)=52.97, (BP5, BP1)=33.63.
sum=-44.78+89.11-130.93+52.97+33.63=0. Π’ΠΎΡ‡ΠΊΠ° – снаруТи.

И Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ опишСм ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. НачнСм с минусов. ΠœΠ΅Ρ‚ΠΎΠ΄ прост матСматичСски, Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ-Ρ‚ΠΎ эффСктивСн с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΅Π³ΠΎ алгоритмичСская ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(n) ΠΈ, ΠΊΠ°ΠΊ Π½ΠΈ ΠΊΡ€ΡƒΡ‚ΠΈ, Π° всС Ρ€Π΅Π±Ρ€Π° ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° придСтся ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, для вычислСния ΡƒΠ³Π»Π° придётся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ арккосинуса ΠΈ двумя опСрациями взятия корня (Ρ„ΠΎΡ€ΠΌΡƒΠ»Π° скалярного произвСдСния ΠΈ связь Π΅Π³ΠΎ с ΡƒΠ³Π»ΠΎΠΌ Ρ‚Π΅ΠΌ Π² ΠΏΠΎΠΌΠΎΡ‰ΡŒ, ΠΊΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ). Π­Ρ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅Π΄Π΅ΡˆΠ΅Π²Ρ‹ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния скорости, ΠΈ, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΠΈ связанныС с Π½ΠΈΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сущСствСнны. И Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π΅ опрСдСляСт Ρ‚ΠΎΡ‡ΠΊΡƒ, Π»Π΅ΠΆΠ°Ρ‰ΡƒΡŽ Π½Π° Ρ€Π΅Π±Ρ€Π΅. Π›ΠΈΠ±ΠΎ – снаруТи, Π»ΠΈΠ±ΠΎ – Π²Π½ΡƒΡ‚Ρ€ΠΈ. Π’Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π½Π΅ Π΄Π°Π½ΠΎ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, послСдний нСдостаток Π»Π΅Π³ΠΊΠΎ опрСдСляСтся: Ссли хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡƒΠ³Π»ΠΎΠ² Ρ€Π°Π²Π΅Π½ (ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ€Π°Π²Π΅Π½) 180 градусам, это автоматичСски ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ€Π΅Π±Ρ€ΠΎ.

НСдостатки ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Ρ‡Π΅ΠΌ-Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΅Π³ΠΎ достоинствами. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это самый ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. Если ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΠΎΠ΄Π°Π½ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получаСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ для всСх Ρ‚ΠΎΡ‡Π΅ΠΊ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π΅ΠΊ Π½Π° Ρ€Π΅Π±Ρ€Π°Ρ…, Π½ΠΎ ΠΎ Π½ΠΈΡ… смотри Π²Ρ‹ΡˆΠ΅. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄ позволяСт частично Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠœΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ самопСрСсСкаСтся? НС Π±Π΅Π΄Π°, ΠΌΠ΅Ρ‚ΠΎΠ΄ скорСС всСго ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. ΠœΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π½Π΅ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π° малоосмыслСнный Π½Π°Π±ΠΎΡ€ сСгмСнтов? ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Π΅Ρ€Π½ΠΎ Π² большом количСствС случаСв. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, всСм ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ…ΠΎΡ€ΠΎΡˆ, Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ вычислСний арккосинусов.

Π§Π΅ΠΌ Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ этот ΠΎΠ±Π·ΠΎΡ€? А Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ опрСдСлСния принадлСТности Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ сущСствуСт Π½Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ Π΄Π²Π°. Они слуТат для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΎΠ»Π΅Π΅ подходят Π² случаях, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ – ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ½ΠΎ качСство. Ну ΠΈ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас нСпрСдсказуСмыС Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ° с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π° ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡΠΌ. Если Π½ΡƒΠΆΠ½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ качСство ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅Π²Π°ΠΆΠ½ΠΎ – трассировка Π»ΡƒΡ‡Π΅ΠΉ Π² ΠΏΠΎΠΌΠΎΡ‰ΡŒ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ скорСС всСго ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Π»ΠΈΠΆΠ½Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ. Если ΠΆΠ΅ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ мСстС – Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ опрСдСлСния ΠΏΡ€ΠΈ нСпонятных Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΠ΅Ρ‚ΠΎΠ΄ индСкса Ρ‚ΠΎΡ‡ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΌΠΎΡ‡ΡŒ.

Если Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ вопросы, Π·Π°Π΄Π°Π²Π°ΠΉΡ‚Π΅. Как Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉΡΡ Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠ΅ΠΉ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ связанными с Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ, Π±ΡƒΠ΄Ρƒ Ρ€Π°Π΄ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ‡Π΅ΠΌ смогу.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΈΠ»ΠΈ Π½Π΅Ρ‚?

Π”ΠΎΠ±Ρ€Ρ‹ΠΉ дСнь, ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ этой Ρ„ΠΈΠ³ΡƒΡ€Ρ‹?

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Π’ΠΎΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°, ΠΊΠΎΠ΄.

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Rsa97, это сработаСт для любого ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° Π²Ρ‹ΠΏΡƒΠΊΠ»ΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (ΠΊΠ°ΠΊ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅).
Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ всС Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° находятся Π²Ρ‹ΡˆΠ΅, Π½ΠΈΠΆΠ΅, ΠΏΡ€Π°Π²Π΅Π΅ ΠΈΠ»ΠΈ Π»Π΅Π²Π΅Π΅ искомой Ρ‚ΠΎΡ‡ΠΊΠΈ. Π—Π½Π°Ρ‡ΠΈΡ‚ искомая Ρ‚ΠΎΡ‡ΠΊΠ° находится Π²Π½Π΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅ это справСдливо Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²Ρ‹ΠΏΡƒΠΊΠ»Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ².

Если ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π½Π΅ Π²Ρ‹ΠΏΡƒΠΊΠ»Ρ‹ΠΉ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΡƒΠΊΠ»Ρ‹ΠΌ (Π½Π΅ помню ΠΊΠ°ΠΊ) Π²Ρ‹Π΄Π΅Π»ΠΈΠ² ΠΎΠ΄ΠΈΠ½ большой ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΈ нСсколько ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Ρ…. Π’ΠΎΠ³Π΄Π° Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π² Π΄Π²Π° этапа: 1. опрСдСляСм Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ большого ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Если Π΄Π° Ρ‚ΠΎ 2. опрСдСляСм Π»ΠΈΠΆΠΈΡ‚ Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ².

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, упираСмся Π² Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ вычислСний. Если ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ 359.9999991231 градус, Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚?

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Π•Ρ‰Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Π» ΠΏΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρƒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π½ΠΎ Ρ‚Π°ΠΌ слоТно Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ ΠΊΡ€Π°Π΅Π²Ρ‹Π΅ случаи ΠΈΠ·-Π·Π° ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΠΈ вычислСний.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, находится Π»ΠΈ данная Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ»ΠΈ снаруТи ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°?

По Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ΅ ‘p’ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅, находится Π»ΠΈ ‘p’ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π’ΠΎΡ‡ΠΊΠΈ, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅, Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ.

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

ΠœΡ‹ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ сначала ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ пост.
Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ Π»ΠΈ Π΄Π²Π° Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°?

НиТС приводится простая идСя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, находится Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ»ΠΈ снаруТи.

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π€ΠΎΡ‚ΠΎ Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Как ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ Β«gΒ» Π½Π° рисункС Π²Ρ‹ΡˆΠ΅?
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ true, Ссли Ρ‚ΠΎΡ‡ΠΊΠ° Π»Π΅ΠΆΠΈΡ‚ Π½Π° прямой ΠΈΠ»ΠΈ совпадаСт с ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с этим, послС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, пСрСсСкаСтся Π»ΠΈ линия ΠΎΡ‚ ‘p’ Π΄ΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅Π³ΠΎ, ΠΌΡ‹ провСряСм, являСтся Π»ΠΈ ‘p’ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹ΠΌ с Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π»ΠΈΠ½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Если это coliear, Ρ‚ΠΎ ΠΌΡ‹ провСряСм, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° ‘p’ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ сторонС ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Ссли ΠΎΠ½Π° Π»Π΅ΠΆΠΈΡ‚, ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true, ΠΈΠ½Π°Ρ‡Π΅ false.

НиТС приводится рСализация Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΈΠ΄Π΅ΠΈ.

// ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° C ++ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, находится Π»ΠΈ заданная Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°
// Π‘ΠΌ. Https://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/amp/
// для объяснСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ onSegment (), direction () ΠΈ doIntersect ()
#include

using namespace std;

// ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ (использованиС INT_MAX Π²Ρ‹Π·Π²Π°Π»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ пСрСполнСния)
#define INF 10000

// Учитывая Ρ‚Ρ€ΠΈ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠΈ p, q, r, функция провСряСт,
// Ρ‚ΠΎΡ‡ΠΊΠ° q Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ прямой ‘pr’

bool onSegment(Point p, Point q, Point r)

int orientation(Point p, Point q, Point r)

if (val == 0) return 0; // ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€

return (val > 0)? 1: 2; // часы ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки

// Ѐункция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ Π»ΠΈΠ½ΠΈΠΈ ‘p1q1’
// ΠΈ ‘p2q2’ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ.

bool doIntersect(Point p1, Point q1, Point p2, Point q2)

// Находим Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΈ

int o1 = orientation(p1, q1, p2);

int o2 = orientation(p1, q1, q2);

int o3 = orientation(p2, q2, p1);

int o4 = orientation(p2, q2, q1);

// p1, q1 ΠΈ p2 ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹, Π° p2 Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ p1q1

// p1, q1 ΠΈ p2 ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹, Π° q2 Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ p1q1

// p2, q2 ΠΈ p1 ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹, Π° p1 Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ p2q2

// p2, q2 ΠΈ q1 ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹, Π° q1 Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ p2q2

return false ; // НС ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½ΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… случаСв

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли Ρ‚ΠΎΡ‡ΠΊΠ° p Π»Π΅ΠΆΠΈΡ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° [] с n Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ

bool isInside(Point polygon[], int n, Point p)

// Π’ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 3 Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ []

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ для ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° ΠΎΡ‚ p Π΄ΠΎ бСсконСчности

// ΠŸΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ пСрСсСчСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ со сторонами ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, пСрСсСкаСтся Π»ΠΈ ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ ΠΎΡ‚ ‘p’ Π΄ΠΎ ‘extreme’

// с ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠΌ ΠΎΡ‚ ‘polygon [i]’ Π΄ΠΎ ‘polygon [next]’

if (doIntersect(polygon[i], polygon[next], p, extreme))

// Если Ρ‚ΠΎΡ‡ΠΊΠ° ‘p’ являСтся ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½ΠΎΠΉ с ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠΌ Π»ΠΈΠ½ΠΈΠΈ ‘i-next’,

// Π·Π°Ρ‚Π΅ΠΌ провСряСм, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ ΠΎΠ½ Π½Π° сСгмСнтС. Если это лоТь, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ истину,

if (orientation(polygon[i], p, polygon[next]) == 0)

return onSegment(polygon[i], p, polygon[next]);

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true, Ссли count Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎ, ΠΈΠ½Π°Ρ‡Π΅ false

return count&1; // Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ (count% 2 == 1)

// ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

int n = sizeof (polygon1)/ sizeof (polygon1[0]);

isInside(polygon1, n, p)? cout «Yes \n» : cout «No \n» ;

isInside(polygon1, n, p)? cout «Yes \n» : cout «No \n» ;

n = sizeof (polygon2)/ sizeof (polygon2[0]);

isInside(polygon2, n, p)? cout «Yes \n» : cout «No \n» ;

isInside(polygon2, n, p)? cout «Yes \n» : cout «No \n» ;

isInside(polygon2, n, p)? cout «Yes \n» : cout «No \n» ;

n = sizeof (polygon3)/ sizeof (polygon3[0]);

isInside(polygon3, n, p)? cout «Yes \n» : cout «No \n» ;

// Java-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, являСтся Π»ΠΈ данная Ρ‚ΠΎΡ‡ΠΊΠ°
// Π»Π΅ΠΆΠΈΡ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°
// Π‘ΠΌ. Https://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/amp/
// для объяснСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ onSegment (),
// ΠžΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ () ΠΈ doIntersect ()

// ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ INT_MAX

// Π²Ρ‹Π·Π²Π°Π» ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ пСрСполнСния)

static int INF = 10000 ;

static class Point

public Point( int x, int y)

// Π”Π°Π½Ρ‹ Ρ‚Ρ€ΠΈ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠΈ p, q, r,

// функция провСряСт, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° q

// Π² Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌ сСгмСнтС ‘pr’

static boolean onSegment(Point p, Point q, Point r)

// Найти ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ упорядочСнного Ρ‚Ρ€ΠΈΠΏΠ»Π΅Ρ‚Π° (p, q, r).

// Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния

static int orientation(Point p, Point q, Point r)

return 0 ; // ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€

// Ѐункция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли

// ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ Β«p1q1Β» ΠΈ Β«p2q2Β» ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ.

static boolean doIntersect(Point p1, Point q1,

// Находим Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для

// ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΈ частныС случаи

int o1 = orientation(p1, q1, p2);

int o2 = orientation(p1, q1, q2);

int o3 = orientation(p2, q2, p1);

int o4 = orientation(p2, q2, q1);

// p1, q1 ΠΈ p2 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ

// p2 Π»Π΅ΠΆΠΈΡ‚ Π½Π° сСгмСнтС p1q1

if (o1 == 0 && onSegment(p1, p2, q1))

// p1, q1 ΠΈ p2 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ

// q2 Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ p1q1

if (o2 == 0 && onSegment(p1, q2, q1))

// p2, q2 ΠΈ p1 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ

// p1 Π»Π΅ΠΆΠΈΡ‚ Π½Π° сСгмСнтС p2q2

if (o3 == 0 && onSegment(p2, p1, q2))

// p2, q2 ΠΈ q1 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ

// q1 Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ p2q2

if (o4 == 0 && onSegment(p2, q1, q2))

// НС ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½ΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… случаСв

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли Ρ‚ΠΎΡ‡ΠΊΠ° p Π»Π΅ΠΆΠΈΡ‚

// Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° [] с n Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ

static boolean isInside(Point polygon[], int n, Point p)

// Π’ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 3 Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ []

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ для ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° ΠΎΡ‚ p Π΄ΠΎ бСсконСчности

Point extreme = new Point(INF, p.y);

// Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ пСрСсСчСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ

// со сторонами ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

int next = (i + 1 ) % n;

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, являСтся Π»ΠΈ ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ ΠΎΡ‚ ‘p’ Π΄ΠΎ

// Β«ΠΊΡ€Π°ΠΉΠ½ΠΈΠΉΒ» пСрСсСкаСтся с Π»ΠΈΠ½ΠΈΠ΅ΠΉ

// сСгмСнтируСм ΠΎΡ‚ ‘polygon [i]’ Π΄ΠΎ ‘polygon [next]’

if (doIntersect(polygon[i], polygon[next], p, extreme))

// Если Ρ‚ΠΎΡ‡ΠΊΠ° ‘p’ являСтся ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½ΠΎΠΉ с Π»ΠΈΠ½ΠΈΠ΅ΠΉ

// сСгмСнтируСм Β«i-nextΒ», Π·Π°Ρ‚Π΅ΠΌ провСряСм, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ ΠΎΠ½

// Π½Π° сСгмСнтС. Если это лоТь, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ true, ΠΈΠ½Π°Ρ‡Π΅ false

if (orientation(polygon[i], p, polygon[next]) == 0 )

return onSegment(polygon[i], p,

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true, Ссли count Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎ, ΠΈΠ½Π°Ρ‡Π΅ false

return (count % 2 == 1 ); // Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ (count% 2 == 1)

public static void main(String[] args)

int n = polygon1.length;

if (isInside(polygon1, n, p))

if (isInside(polygon1, n, p))

if (isInside(polygon2, n, p))

if (isInside(polygon2, n, p))

if (isInside(polygon2, n, p))

if (isInside(polygon3, n, p))

// Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ прСдоставлСн 29AjayKumar

// AC # ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ
// Π»Π΅ΠΆΠΈΡ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°
// Π‘ΠΌ. Https://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/amp/
// для объяснСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ onSegment (),
// ΠžΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ () ΠΈ doIntersect ()

// ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ INT_MAX

// Π²Ρ‹Π·Π²Π°Π» ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ пСрСполнСния)

static int INF = 10000;

public Point( int x, int y)

// Π”Π°Π½Ρ‹ Ρ‚Ρ€ΠΈ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠΈ p, q, r,

// функция провСряСт, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° q

// Π² Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΌ сСгмСнтС ‘pr’

static bool onSegment(Point p, Point q, Point r)

// Найти ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ упорядочСнного Ρ‚Ρ€ΠΈΠΏΠ»Π΅Ρ‚Π° (p, q, r).

// Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния

static int orientation(Point p, Point q, Point r)

return 0; // ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€

// Ѐункция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли

// ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ Β«p1q1Β» ΠΈ Β«p2q2Β» ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ.

static bool doIntersect(Point p1, Point q1,

// Находим Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для

// ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΈ частныС случаи

int o1 = orientation(p1, q1, p2);

int o2 = orientation(p1, q1, q2);

int o3 = orientation(p2, q2, p1);

int o4 = orientation(p2, q2, q1);

// p1, q1 ΠΈ p2 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ

// p2 Π»Π΅ΠΆΠΈΡ‚ Π½Π° сСгмСнтС p1q1

if (o1 == 0 && onSegment(p1, p2, q1))

// p1, q1 ΠΈ p2 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ

// q2 Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ p1q1

if (o2 == 0 && onSegment(p1, q2, q1))

// p2, q2 ΠΈ p1 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ

// p1 Π»Π΅ΠΆΠΈΡ‚ Π½Π° сСгмСнтС p2q2

if (o3 == 0 && onSegment(p2, p1, q2))

// p2, q2 ΠΈ q1 ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ

// q1 Π»Π΅ΠΆΠΈΡ‚ Π½Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ΅ p2q2

if (o4 == 0 && onSegment(p2, q1, q2))

// НС ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½ΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… случаСв

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли Ρ‚ΠΎΡ‡ΠΊΠ° p Π»Π΅ΠΆΠΈΡ‚

// Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° [] с n Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ

static bool isInside(Point []polygon, int n, Point p)

// Π’ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 3 Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ []

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ для ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° ΠΎΡ‚ p Π΄ΠΎ бСсконСчности

Point extreme = new Point(INF, p.y);

// Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ пСрСсСчСния Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ

// со сторонами ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, являСтся Π»ΠΈ ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ ΠΎΡ‚ ‘p’ Π΄ΠΎ

// Β«ΠΊΡ€Π°ΠΉΠ½ΠΈΠΉΒ» пСрСсСкаСтся с Π»ΠΈΠ½ΠΈΠ΅ΠΉ

// сСгмСнтируСм ΠΎΡ‚ ‘polygon [i]’ Π΄ΠΎ ‘polygon [next]’

polygon[next], p, extreme))

// Если Ρ‚ΠΎΡ‡ΠΊΠ° ‘p’ являСтся ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½ΠΎΠΉ с Π»ΠΈΠ½ΠΈΠ΅ΠΉ

// сСгмСнтируСм Β«i-nextΒ», Π·Π°Ρ‚Π΅ΠΌ провСряСм, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ ΠΎΠ½

// Π½Π° сСгмСнтС. Если это лоТь, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ true, ΠΈΠ½Π°Ρ‡Π΅ false

if (orientation(polygon[i], p, polygon[next]) == 0)

return onSegment(polygon[i], p,

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true, Ссли count Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎ, ΠΈΠ½Π°Ρ‡Π΅ false

return (count % 2 == 1); // Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ (count% 2 == 1)

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *