Моята ситуация:
Работя върху рамка HTML5/Canvas/JavaScript за мащабиране на потребителски интерфейс, която след това използвам за проект за уеб приложение за визуализация на данни. Една от функциите, които ми трябват за моята рамка, е да мога да открия дали мишката на потребителя е върху изобразена форма. За по-сложни форми като многоъгълници и форми с криви на Безие това се превръща в предизвикателство.
Намерих два начина за решаване на този проблем:
(1) Един от начините е да нарисувате всичко върху платното два пъти. Първият път всяка форма се запълва с уникален цвят от хеш таблица. Вторият път формите получават своите реални цветове и маски върху първия слой. За да открия сблъсък във формата на мишката, ще трябва да взема цвета на пиксела под мишката от първия слой и да картографирам цвета, който получавам, към съответната форма в хеш-таблицата.
(2) Или мога да използвам алгоритъма за излъчване на лъчи (http://en.wikipedia.org/wiki/Point_in_polygon#Ray_casting_algorithm). Всъщност внедрих този алгоритъм с код, който открива сблъсъци на лъчева линия и сблъсъци на лъч-Безие.
Истинският въпрос:
Не харесвам първия подход, защото всичко трябва да бъде начертано два пъти, което не е евтино от изчислителна гледна точка. Но вторият подход не гарантира точност, поради грешки в закръглянията от изчисленията.
В идеалния случай бих искал да подобря точността на втория подход до почти съвършенство.
Моят опит да подобря точността е да хвърля 4 лъча в различни посоки: отгоре, отляво, отдолу и отдясно. Ако поне един хоризонтален и един вертикален лъч предполагат, че мишката е вътре във формата, тогава заключавам, че точката е вътре във формата. Въпреки че това елиминира повечето грешки, грешки (без задействане) все още възникват, когато мишката е вътре във формата.
Би било страхотно, ако някой може да предложи поправка на алгоритъма за хвърляне на лъчи или може би дори трета опция!
Благодаря предварително.