Кіріспе
Бір нүктенің копланарлы көпбұрышқа қатысты орналасуын анықтау. Есептеу геометриясында көпбұрыш ішіндегі нүкте (PIP) мәселесі жазықтықтағы берілген нүктенің көпбұрыштың ішінде, сыртында немесе шекарасында жатыр ма деген сұраққа жауап береді. Бұл нүкте орналасу мәселелерінің ерекше жағдайы және геометриялық деректерді өңдеумен айналысатын салаларда, мысалы компьютерлік графика, компьютерлік көру, географиялық ақпараттық жүйелер (ГИС), қозғалыс жоспарлау және компьютерлік көмекпен жобалау (CAD) сияқты қолданыстарға ие. Компьютерлік графикадағы мәселенің алғашқы сипаттамасы 1974 жылға дейін қолданылған екі кең таралған тәсілді (сәуле тарату және бұрыштарды қосу) көрсетеді. Компьютерлік графика саласының тәжірибелі мамандарының мәселенің тарихын және оны шешудің кейбір хитролықтарын Ray Tracing News журналының бір санында табуға болады.
In computational geometry, the point in polygon (PIP) problem asks whether a given point in the plane lies inside, outside, or on the boundary of a polygon. It is a special case of point location problems and finds applications in areas that deal with processing geometrical data, such as computer graphics, computer vision, geographic information systems (GIS), motion planning, and computer aided design (CAD). An early description of the problem in computer graphics shows two common approaches (ray casting and angle summation) in use as early as 1974. An attempt of computer graphics veterans to trace the history of the problem and some tricks for its solution can be found in an issue of the Ray Tracing News.
Жарықпен құю алгоритмі
Нүкте қарапайым көпбұрыштың ішінде немесе сыртында екенін анықтаудың бір қарапайым жолы – нүктеден басталып, кез келген белгіленген бағытта жүретін сәуле көпбұрыштың қабырғаларын қанша рет кесіп өтетінін тексеру. Егер нүкте көпбұрыштың сыртында болса, сәуле оның қабырғаларын жұп сан рет кесіп өтеді. Егер нүкте көпбұрыштың ішінде болса, онда ол қабырғаларын тақ сан рет кесіп өтеді. Көпбұрыш қабырғасындағы нүктенің жағдайы сәуле кесісу алгоритмінің егжей-тегжейіне байланысты. Бұл алгоритм кейде кесісу саны алгоритмі немесе жұп-тақ ереже алгоритмі деп те аталады және ол 1962 жылдан бері белгілі. Алгоритм қарапайым байқауға негізделген: егер нүкте шексізден сынама нүктесіне дейін сәуле бойымен қозғалса және ол көпбұрыш шекарасын бірнеше рет кесіп өтетін болса, онда ол сырттан ішке, содан кейін іштен сыртқа және т.б. өтеді. Нәтижесінде, әрбір екі "шекарадан өтуден" кейін қозғалатын нүкте сыртқа шығады. Бұл байқау математикалық тұрғыдан Джордан қисық теоремасымен дәлелденуі мүмкін.
Шекті дәлдік
Егер шекті дәлдігі бар компьютерде іске асырылса, егер нүкте осы шекараға өте жақын болса, дөңгелектеу қателіктерінің салдарынан нәтижелер дұрыс болмауы мүмкін. Кейбір қолданбалар үшін, мысалы, бейнеойындар немесе басқа ойын-сауық өнімдері үшін бұл үлкен мәселе емес, өйткені олар көбінесе жылдамдыққа дәлдікке қарағанда басымдық береді. Дегенмен, формальды түрде дұрыс компьютерлік бағдарлама үшін сандық толеранттылық ε енгізіп, P (нүкте) L (сызықтан) ε қашықтықта жатыр ма, жоқ па, соны тексеру қажет. Бұл жағдайда алгоритм тоқтатылып, "P шекараға өте жақын" деп хабарлама беруі керек. Сәуле құю алгоритмінің көптеген іске асырылымдары сәуленің көпбұрыштың барлық қабырғаларымен қиылысуын бірінен соң бірі тексереді. Осы жағдайда келесі мәселені шешу қажет. Егер сәуле көпбұрыштың төбесі арқылы дәл өтіп кетсе, онда ол екі кесіндіні олардың соңғы нүктелерінде қиып өтеді. Бұл мысалдағы жоғарғы төбе немесе 4 және 5 қиылысы арасындағы төбе үшін қалыпты болса да, оң жақ төбе (мысалда) алгоритмнің дұрыс жұмыс істеуі үшін бір қиылысуды санауды талап етеді. Сәулеге түсетін көлденең кесінділерде де ұқсас мәселе туындайды. Мәселе мынадай жолмен шешіледі: Егер қиылысу нүктесі тексеріліп жатқан көпбұрыштың қабырғасының төбесі болса, онда қиылысу тек қана қабырғаның екінші төбесі сәуледен төмен жатса ғана есептеледі. Бұл, әсерлі түрде, сәуледегі төбелер сәуледен сәл жоғары орналасқан деп қарастырумен тең. Тағы да, сәуле төбе арқылы өтіп кетуі шекті дәлдіктегі арифметикада сандық проблемаларды тудыруы мүмкін: бір төбеге іргелес екі қабырға үшін сәулемен қиылысуды тікелей есептеу екі жағдайда да төбенің координаталарын бермеуі мүмкін. Егер көпбұрыш оның төбелері арқылы анықталса, бұл мәселе қиылысуды нақты есептеуден бұрын сәуленің және тексеріліп жатқан көпбұрыштың қабырғасының ұштарының y координаталарын тексеру арқылы жойылады. Басқа жағдайларда, көпбұрыштың қабырғалары басқа деректер түрлерінен есептелгенде, алгоритмнің сандық тұрақтылығын қамтамасыз ету үшін басқа тәсілдер қолданылуы керек.
Бұрау саны алгоритмі
Бір нүкте көпбұрыш ішінде орналасқан-орналаспағанын тексеру үшін қолданылатын тағы бір әдіс – берілген нүктенің көпбұрышқа қатысты бұрылу санын есептеу. Егер бұрылу саны нөлден өзгеше болса, онда нүкте көпбұрыш ішінде жатыр. Бұл алгоритм кейде нөлдік емес ереже алгоритмі деп те аталады. Бұрылу санын есептеудің бір жолы – көпбұрыштың әр қабырғасынан туындайтын бұрыштардың қосындысын табу. Дегенмен, бұл қымбат кері тригонометриялық функцияларды қолдануды қамтиды, бұл әдетте бұл алгоритмді сәуле тарату алгоритмімен салыстырғанда тиімсіз (баяу) етеді. Ақырсоңында, бұл кері тригонометриялық функцияларды есептеудің қажеті жоқ. Нәтижесінде, барлық бұрыштардың қосындысы тек 0-ге немесе (немесе оның еселіктеріне) ғана тең болуы мүмкін болғандықтан, сынақ нүктесін айналып өтетін кезде көпбұрыш қандай квадранттар арқылы өтетінін қадағалау жеткілікті. Бұл бұрылу саны алгоритмін шекарадан өтулерді санау жылдамдығымен салыстыруға мүмкіндік береді. 2001 жылы Дэн Сандей бұрылу санын есептеудің жақсартылған алгоритмін жасады. Ол есептеулерде бұрыштарды немесе тригонометрияны қолданбайды және жоғарыда сипатталған сәуле тарату алгоритмімен толықтай сәйкес жұмыс істейді. Сандей алгоритмі тексеріліп жатқан нүктеден шексіз көлденең сәулені тарату арқылы жұмыс істейді. Сәуле көпбұрыштың қабырғасын кесіп өткен сайын Хуан Пинеданың қабырға кесіп өту алгоритмі (1988) қолданылады, ол бұл кесіп өтудің бұрылу санына қалай әсер ететінін анықтайды. Сандей сияқты, егер қабырға сәулені "жоғары" бағытта кесіп өтсе, бұрылу саны артады; егер ол "төмен" бағытта кесіп өтсе, сан кемиді. Сандей алгоритмі қарапайым емес көпбұрыштар үшін дұрыс жауап береді, ал шекарадан өту алгоритмі мұндай жағдайда қателікке ұшырайды. Толтыру алгоритміне 'толтыру ережесі' атрибуты әсер етеді. Бұл мән бір немесе екі болуы мүмкін. Мысалы, пентаграммада атрибуты жоқ орталық "бос кеңістік" (көрінетін фон) бар, ал атрибуты бар болса, ондай кеңістік жоқ. Қарапайым көпбұрыштар үшін алгоритмдер бірдей нәтиже береді. Алайда, күрделі көпбұрыштар үшін алгоритмдер көпбұрыш өзімен-өзі қиылысатын аймақтардағы нүктелер үшін әртүрлі нәтижелерді көрсетуі мүмкін, онда көпбұрыштың ішкі және сыртқы жағы анықталмайды. Тіпті-тақ ережені қолданудың бір шешімі – қиылысуды тексеруден бұрын күрделі көпбұрыштарды тіпті-тақ эквивалентті қарапайым көпбұрыштарға түрлендіру. Дегенмен, бұл есептеулерді күрделендіреді. Көпбұрыш өзімен-өзі жапсысса да дұрыс нәтиже беретін жылдам нөлдік емес бұрылу саны алгоритмін пайдалану тиімдірек.
Көпбұрышты сұраныстардағы нүкте
Көпбұрыш ішіндегі нүкте мәселесін жалпы геометриялық қайталамалы сұраныс жағдайында қарастыруға болады: берілген бір көпбұрыш пен сұраныс нүктелерінің тізбегі үшін, әр сұраныс нүктесіне жауапты жылдам табу қажет. Бұл жағдайда, жазықтықтағы нүктені табудың кез келген жалпы тәсілін қолдануға болады. Кейбір арнайы көпбұрыштар үшін оңайырақ шешімдер бар.
Ерекше жағдайлар
Монотонды көпбұрыштар, жұлдыз тәрізді көпбұрыштар, дөңгелек көпбұрыштар және үшбұрыштар үшін қарапайым алгоритмдер қолданылуы мүмкін. Үшбұрыш жағдайын барицентрлік координаттар жүйесін, параметрлік теңдеуді немесе скалярлық көбейтіндіні пайдалану арқылы оңай шешуге болады. Скалярлық көбейтінді әдісі кез келген дөңгелек көпбұрышқа табиғи түрде қолданылады.