рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рдореЛрдЪреНрдЪ рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо

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

рдЫрд╡рд┐

рдкрд╣рд▓реЗ рдХреБрдЫ рдпрд╛рджреЗрдВ

рдпрд╣ рддрдм рдерд╛ рдЬрдм рдореИрдВ 90 рдХреЗ рджрд╢рдХ рдореЗрдВ рддрдХрдиреАрдХреА рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЫрд╛рддреНрд░ рдерд╛, рд╢рд╛рдпрдж рджреВрд╕рд░рд╛ рдкрд╛рдареНрдпрдХреНрд░рдоред рдореИрдВ рдПрдХ рдмрд╛рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдУрд▓рдВрдкрд┐рдпрд╛рдб рдХреЗ рдкрд╛рд╕ рдЧрдпрд╛ред рдФрд░ рдЗрд╕ рдУрд▓рдВрдкрд┐рдХ рдореЗрдВ, рдХрд╛рд░реНрдп рдерд╛: рддреНрд░рд┐рдХреЛрдг рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░рдирд╛, рд╡рд┐рдорд╛рди рдкрд░ рдкрд░реАрдХреНрд╖рдг рдмрд┐рдВрджреБ, рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд┐ рдпрд╣ рдмрд┐рдВрджреБ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ trifling рдХрд╛рд░реНрдп, рд▓реЗрдХрд┐рди рддрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ - рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдкрд░ - рд▓реИрдВрдбрдлрд┐рд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рддред рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ - 90 рдХреЗ рджрд╢рдХ рдХреЗ рдордзреНрдп рдерд╛, рдХреЛрдИ рдЗрдВрдЯрд░рдиреЗрдЯ рдирд╣реАрдВ рдерд╛, рдХрдВрдкреНрдпреВрдЯрд░ рдЬреНрдпрд╛рдорд┐рддрд┐ рдкрд░ рдХреЛрдИ рдХрд┐рддрд╛рдмреЗрдВ рдирд╣реАрдВ рдереАрдВ, рд▓реЗрдХрд┐рди рдЯреЙрд╡рд░ рдкрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рдФрд░ рдЯрд░реНрдмреЛ рдкрд╛рд╕реНрдХрд▓ рдХреЗ рд╕рд╛рде 286-x рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдереАред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рд┐рддрд╛рд░реЛрдВ рдиреЗ рд╕рдВрдпреЛрдЧ рдХрд┐рдпрд╛, рдХрд┐ рдЬрд┐рд╕ рд╕рдордп рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдЙрд╕ рдЯрд╛рд╡рд░ рдкрд░ рд╣рдо рдПрдХ рдЬрдЯрд┐рд▓ рдЪрд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдкрдврд╝ рд░рд╣реЗ рдереЗред рдФрд░ рдПрдХ рд╕реВрддреНрд░ (рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ) рдЙрдкрдЬрд╛рдК рдЬрдореАрди рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореЗрд░реЗ рдбреЗрдврд╝ рдЧрд┐рдЧ рдкреЗрдВрдЪ рдорд░ рдЧрдП рдФрд░ рдЗрд╕ рдХреЛрдб рдФрд░ рдЧреБрдордирд╛рдореА рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЕрдиреНрдп рдпреБрд╡рд╛ рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд▓рд┐рдпрд╛)ред рд╕реНрдирд╛рддрдХ рд╕реНрддрд░ рдХреА рдкрдврд╝рд╛рдИ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдПрдХ рд╢реЛрдз рд╕рдВрд╕реНрдерд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред рд╡рд╣рд╛рдВ рдореБрдЭреЗ рд╕рдВрд╕реНрдерд╛рди рдХреЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреАрдЖрдИрдПрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдерд╛, рдФрд░ рдореЗрд░реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо C ++ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХрд╛рдо рдореЗрдВ рдЦреБрдж рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп



рджрд┐рдП рдЧрдП:
рдЧреЗрдо - рдЗрд╕рдХреЗ рдХреЛрдиреЗ (xi, yi) рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдмрд┐рдВрджреБ (x0, y0) рдХреЗ рд╕рдордиреНрд╡рдп рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдорд╛рди рдкрд░ рдмрдВрдж рдкреЙрд▓реАрд▓рд╛рдЗрди (рдЗрд╕рдХреЗ рдмрд╛рдж рдмрд╣реБрднреБрдЬ)
рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ:
рдХреНрдпрд╛ рдмрд┐рдВрджреБ рдмрд╣реБрднреБрдЬ рджреНрд╡рд╛рд░рд╛ рдШрд┐рд░реЗ рдХреНрд╖реЗрддреНрд░ рдбреА рдХрд╛ рд╣реИред

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

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдХреЙрдЪреА рдЗрдВрдЯреАрдЧреНрд░рд▓ рдлреЙрд░реНрдореВрд▓рд╛


рдЫрд╡рд┐
рдХрд╛рд░реНрдпрдХрд░реНрддрд╛-рдХрд┐рд╕рд╛рди рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдмрд┐рдВрджреБ рд╕реЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
- рд╕реАрдорд╛ рдЬреА рд╣рдорд╛рд░реЗ рджрд┐рдП рдЧрдП рд╕рдореЛрдЪреНрдЪ рд╣реИрдВ,
- z0 -рддрдо рдмрд┐рдВрджреБ
- f (z) - рдПрдХ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдХрд╛ рдПрдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдп рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рдХрд╣реАрдВ рднреА рдЕрдирдВрдд рддрдХ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред

рд╡реЗ рд╣реИрдВ, рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдмрд┐рдВрджреБ рд╕рдореЛрдЪреНрдЪ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд╣рдореЗрдВ рдЕрднрд┐рдиреНрди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдмрд┐рдВрджреБ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рд╡реЗ рд╕рдВрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рдВрджреБ рд╕рдореЛрдЪреНрдЪ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдиреЛрдЯ: рдХреЙрдЪреА рдХреЗ рдЕрднрд┐рдиреНрди рдкреНрд░рдореЗрдп рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдмрд┐рдВрджреБ рд╕рдореЛрдЪреНрдЪ рдореЗрдВ рдЭреВрда рдирд╣реАрдВ рдмреЛрд▓рддрд╛ рд╣реИ, рддреЛ рдЗрдВрдЯреАрдЧреНрд░реИрдВрдб рдХрд╣реАрдВ рднреА рдЕрдирдВрдд рддрдХ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрднрд┐рдиреНрди рд╢реВрдиреНрдп рд╣реИред рдпрд╣ рдорд╛рдорд▓реЗ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ - рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЕрднрд┐рдиреНрди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ: рдЧреИрд░-рд╕рдореЛрдЪреНрдЪ рдХрд╛ рдмрд┐рдВрджреБ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдпрд╣ рдЕрд▓рдЧ рд╣реИ - рдпрд╣ рд╕рдореЛрдЪреНрдЪ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред
рдЖрдЗрдП рд╣рдо рдЕрднрд┐рдиреНрди рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред F (z) рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред 1. рдмрд┐рдирд╛ рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ, рд╣рдо z0 рдХреЗ рд▓рд┐рдП рдмрд┐рдВрджреБ 0 рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдк рд╣рдореЗрд╢рд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдЫрд╡рд┐

рд╣рдо рдЕрднрд┐рдиреНрди рдХреЗ рд╣рд░ рдореЗрдВ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЗрдХрд╛рдИ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрднрд┐рдиреНрди рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рдХрд╛рд▓реНрдкрдирд┐рдХ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдпрд╣ рджреВрд╕рд░реА рддрд░рд╣ рдХреЗ рджреЛ рдШреБрдВрдШрд░рд╛рд▓реЗ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рдирд┐рдХрд▓рд╛ред
рд╣рдо рдкрд╣рд▓реЗ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ
рдЫрд╡рд┐

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

рдХрд╛рд▓реНрдкрдирд┐рдХ рднрд╛рдЧ рдХреЗ рд╕рд╛рде, рдРрд╕реА рдЪрд╛рд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд╕реАрдорд╛ рдореЗрдВ рд▓рд╛рдЗрди рд╕реЗрдЧрдореЗрдВрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ:
рдЫрд╡рд┐
рдЬрд╣рд╛рдБ Gi- рдЦрдВрдб (xi, yi) рд╣реИ - (xi + 1, y i + 1)
рд╣рдо ith рдЕрднрд┐рдиреНрди рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ith рдЦрдВрдб рдХреЗ рд╕рдореАрдХрд░рдг рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
рдЫрд╡рд┐

рдЕрднрд┐рдиреНрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдкрдиреНрди
рдЫрд╡рд┐

рдФрд░ рдмреЛрдЭрд┐рд▓ рдФрд░ рдердХрд╛рдК рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдХрд░реНрд╖рдХ рд╕реВрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
рдЫрд╡рд┐

рд╣рдо рдЕрдВрддрддрдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ
рдЫрд╡рд┐

C ++ рдПрд▓реНрдЧреЛрд░рд┐рдердо:



template < class T>
bool pt_in_polygon( const T &test,const std::vector &polygon)
{
if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();

T last_pt=polygon.back();

last_pt.x-=test.x;
last_pt.y-=test.y;

double sum=0.0;

for (
std::vector::const_iterator iter=polygon.begin();
iter!=end;
++iter
)
{
T cur_pt=*iter;
cur_pt.x-=test.x;
cur_pt.y-=test.y;

double del= last_pt.x*cur_pt.y-cur_pt.x*last_pt.y;
double xy= cur_pt.x*last_pt.x+cur_pt.y*last_pt.y;

sum+=
(
atan((last_pt.x*last_pt.x+last_pt.y*last_pt.y - xy)/del)+
atan((cur_pt.x*cur_pt.x+cur_pt.y*cur_pt.y- xy )/del)
);

last_pt=cur_pt;

}

return fabs(sum)>eps;

}



T тАУ , :
struct PointD
{
double x,y;
};



2D : Anti-Grain Geometry (AGG) .

:
тАУ
-
Shift- тАУ

PS

, , . .
forgotten .
template bool pt_in_polygon2(const T &test,const std::vector &polygon)
{

static const int q_patt[2][2]= { {0,1}, {3,2} };

if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();
T pred_pt=polygon.back();
pred_pt.x-=test.x;
pred_pt.y-=test.y;

int pred_q=q_patt[pred_pt.y<0][pred_pt.x<0];

int w=0;

for(std::vector::const_iterator iter=polygon.begin();iter!=end;++iter)
{
T cur_pt = *iter;

cur_pt.x-=test.x;
cur_pt.y-=test.y;

int q=q_patt[cur_pt.y<0][cur_pt.x<0];

switch (q-pred_q)
{
case -3:++w;break;
case 3:--w;break;
case -2:if(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x) ++w;break;
case 2:if(!(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x)) --w;break;
}

pred_pt = cur_pt;
pred_q = q;

}

return w!=0;

}

template < class T>
bool pt_in_polygon( const T &test,const std::vector &polygon)
{
if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();

T last_pt=polygon.back();

last_pt.x-=test.x;
last_pt.y-=test.y;

double sum=0.0;

for (
std::vector::const_iterator iter=polygon.begin();
iter!=end;
++iter
)
{
T cur_pt=*iter;
cur_pt.x-=test.x;
cur_pt.y-=test.y;

double del= last_pt.x*cur_pt.y-cur_pt.x*last_pt.y;
double xy= cur_pt.x*last_pt.x+cur_pt.y*last_pt.y;

sum+=
(
atan((last_pt.x*last_pt.x+last_pt.y*last_pt.y - xy)/del)+
atan((cur_pt.x*cur_pt.x+cur_pt.y*cur_pt.y- xy )/del)
);

last_pt=cur_pt;

}

return fabs(sum)>eps;

}



T тАУ , :
struct PointD
{
double x,y;
};



2D : Anti-Grain Geometry (AGG) .

:
тАУ
-
Shift- тАУ

PS

, , . .
forgotten .
template bool pt_in_polygon2(const T &test,const std::vector &polygon)
{

static const int q_patt[2][2]= { {0,1}, {3,2} };

if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();
T pred_pt=polygon.back();
pred_pt.x-=test.x;
pred_pt.y-=test.y;

int pred_q=q_patt[pred_pt.y<0][pred_pt.x<0];

int w=0;

for(std::vector::const_iterator iter=polygon.begin();iter!=end;++iter)
{
T cur_pt = *iter;

cur_pt.x-=test.x;
cur_pt.y-=test.y;

int q=q_patt[cur_pt.y<0][cur_pt.x<0];

switch (q-pred_q)
{
case -3:++w;break;
case 3:--w;break;
case -2:if(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x) ++w;break;
case 2:if(!(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x)) --w;break;
}

pred_pt = cur_pt;
pred_q = q;

}

return w!=0;

}

template < class T>
bool pt_in_polygon( const T &test,const std::vector &polygon)
{
if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();

T last_pt=polygon.back();

last_pt.x-=test.x;
last_pt.y-=test.y;

double sum=0.0;

for (
std::vector::const_iterator iter=polygon.begin();
iter!=end;
++iter
)
{
T cur_pt=*iter;
cur_pt.x-=test.x;
cur_pt.y-=test.y;

double del= last_pt.x*cur_pt.y-cur_pt.x*last_pt.y;
double xy= cur_pt.x*last_pt.x+cur_pt.y*last_pt.y;

sum+=
(
atan((last_pt.x*last_pt.x+last_pt.y*last_pt.y - xy)/del)+
atan((cur_pt.x*cur_pt.x+cur_pt.y*cur_pt.y- xy )/del)
);

last_pt=cur_pt;

}

return fabs(sum)>eps;

}



T тАУ , :
struct PointD
{
double x,y;
};



2D : Anti-Grain Geometry (AGG) .

:
тАУ
-
Shift- тАУ

PS

, , . .
forgotten .
template bool pt_in_polygon2(const T &test,const std::vector &polygon)
{

static const int q_patt[2][2]= { {0,1}, {3,2} };

if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();
T pred_pt=polygon.back();
pred_pt.x-=test.x;
pred_pt.y-=test.y;

int pred_q=q_patt[pred_pt.y<0][pred_pt.x<0];

int w=0;

for(std::vector::const_iterator iter=polygon.begin();iter!=end;++iter)
{
T cur_pt = *iter;

cur_pt.x-=test.x;
cur_pt.y-=test.y;

int q=q_patt[cur_pt.y<0][cur_pt.x<0];

switch (q-pred_q)
{
case -3:++w;break;
case 3:--w;break;
case -2:if(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x) ++w;break;
case 2:if(!(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x)) --w;break;
}

pred_pt = cur_pt;
pred_q = q;

}

return w!=0;

}

template < class T>
bool pt_in_polygon( const T &test,const std::vector &polygon)
{
if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();

T last_pt=polygon.back();

last_pt.x-=test.x;
last_pt.y-=test.y;

double sum=0.0;

for (
std::vector::const_iterator iter=polygon.begin();
iter!=end;
++iter
)
{
T cur_pt=*iter;
cur_pt.x-=test.x;
cur_pt.y-=test.y;

double del= last_pt.x*cur_pt.y-cur_pt.x*last_pt.y;
double xy= cur_pt.x*last_pt.x+cur_pt.y*last_pt.y;

sum+=
(
atan((last_pt.x*last_pt.x+last_pt.y*last_pt.y - xy)/del)+
atan((cur_pt.x*cur_pt.x+cur_pt.y*cur_pt.y- xy )/del)
);

last_pt=cur_pt;

}

return fabs(sum)>eps;

}



T тАУ , :
struct PointD
{
double x,y;
};



2D : Anti-Grain Geometry (AGG) .

:
тАУ
-
Shift- тАУ

PS

, , . .
forgotten .
template bool pt_in_polygon2(const T &test,const std::vector &polygon)
{

static const int q_patt[2][2]= { {0,1}, {3,2} };

if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();
T pred_pt=polygon.back();
pred_pt.x-=test.x;
pred_pt.y-=test.y;

int pred_q=q_patt[pred_pt.y<0][pred_pt.x<0];

int w=0;

for(std::vector::const_iterator iter=polygon.begin();iter!=end;++iter)
{
T cur_pt = *iter;

cur_pt.x-=test.x;
cur_pt.y-=test.y;

int q=q_patt[cur_pt.y<0][cur_pt.x<0];

switch (q-pred_q)
{
case -3:++w;break;
case 3:--w;break;
case -2:if(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x) ++w;break;
case 2:if(!(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x)) --w;break;
}

pred_pt = cur_pt;
pred_q = q;

}

return w!=0;

}

template < class T>
bool pt_in_polygon( const T &test,const std::vector &polygon)
{
if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();

T last_pt=polygon.back();

last_pt.x-=test.x;
last_pt.y-=test.y;

double sum=0.0;

for (
std::vector::const_iterator iter=polygon.begin();
iter!=end;
++iter
)
{
T cur_pt=*iter;
cur_pt.x-=test.x;
cur_pt.y-=test.y;

double del= last_pt.x*cur_pt.y-cur_pt.x*last_pt.y;
double xy= cur_pt.x*last_pt.x+cur_pt.y*last_pt.y;

sum+=
(
atan((last_pt.x*last_pt.x+last_pt.y*last_pt.y - xy)/del)+
atan((cur_pt.x*cur_pt.x+cur_pt.y*cur_pt.y- xy )/del)
);

last_pt=cur_pt;

}

return fabs(sum)>eps;

}



T тАУ , :
struct PointD
{
double x,y;
};



2D : Anti-Grain Geometry (AGG) .

:
тАУ
-
Shift- тАУ

PS

, , . .
forgotten .
template bool pt_in_polygon2(const T &test,const std::vector &polygon)
{

static const int q_patt[2][2]= { {0,1}, {3,2} };

if (polygon.size()<3) return false;

std::vector::const_iterator end=polygon.end();
T pred_pt=polygon.back();
pred_pt.x-=test.x;
pred_pt.y-=test.y;

int pred_q=q_patt[pred_pt.y<0][pred_pt.x<0];

int w=0;

for(std::vector::const_iterator iter=polygon.begin();iter!=end;++iter)
{
T cur_pt = *iter;

cur_pt.x-=test.x;
cur_pt.y-=test.y;

int q=q_patt[cur_pt.y<0][cur_pt.x<0];

switch (q-pred_q)
{
case -3:++w;break;
case 3:--w;break;
case -2:if(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x) ++w;break;
case 2:if(!(pred_pt.x*cur_pt.y>=pred_pt.y*cur_pt.x)) --w;break;
}

pred_pt = cur_pt;
pred_q = q;

}

return w!=0;

}

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


All Articles