Ik ben momenteel bezig met HTML5 canvas en hierin teken ik in in de meest basale vorm vakjes (rectangles) die interactief zijn (mouseovers + clickable). Aangezien het niet echt over canvas specifieke dingen gaat (da's immers alleen maar een manier om het te renderen), leek het me wijsheid om het hier te plaatsen.
Aangezien de vakjes gedraaid kunnen zijn, heb ik niet voldoende aan een simpele bounding box check, dus ben ik op onderzoek uitgegaan naar hoe je vast kunt stellen of een punt in een willekeurige polygoon voor kan komen. Ik kwam er al snel op uit dat de meest efficiente manier is om te werken met een Barycentric coordinatenstelsel nadat je je polygoon in driehoeken hebt verdeeld. Ik snap de wiskunde erachter nog niet helemaal, maar dat gaat vast nog wel komen... Wie weet door enige uitleg hier
Ik heb in principe wel een werkend beginnetje kunnen maken, en bij wijze van proof of concept wil ik kunnen detecteren of de mouseover een vierkantje oplicht. Een vierkant (of rechthoek) ABCD bestaat immers uit twee driehoeken, ABD en BCD, dus als ik weet of een punt in 1 van die driehoeken zit, dan zit het punt ook in de rechthoek.
Het geval wil echter dat op de diagonaal (BD) een afrondingsfout o.i.d. lijkt op te treden. Ik had gehoopt er op deze manier mee weg te komen en op een later tijdstip nog eens uit te zoeken hoe het precies werkt, maar die vlieger gaat dus niet helemaal op: om het op te lossen moet ik nu wel echt begrijpen hoe het in elkaar steekt
Ik heb een fiddle gemaakt waar ik alle cruft (zoals optimalisaties) weggelaten heb en met vanilla JS het probleem geschetst wordt. Je ziet dat het algoritme (Triangle.contains) in principe redelijk goed werkt, maar bij het vierkant in het midden wordt het probleem duidelijk. Omdat de driehoeken niet overlappen, maar alleen maar aangrenzen, vallen er punten die het lijnstuk BD vormen (van linksonder naar rechtsboven) volgens deze methode in geen van de twee driehoeken. Het effect is dat als je muis op de diagonaal komt, het als een "mouseout" wordt gezien. Of dat alle punten van de diagonaal zijn heb ik nog niet uitgezocht, ook niet of daar een patroon in is te ontdekken, maar wellicht dat iemand met wat meer kennis van zaken daar sowieso al een verklaring voor kan geven...
http://jsfiddle.net/t5Nsb/2/
Ik vraag me af hoe ik er achter kan komen hoe dit is op te lossen, of dat ik misschien wel een hele andere richting op moet. Ik ben benieuwd of iemand hier mee kan helpen
PS: Een reeds bedachte oplossing om met een tweede canvas te werken en van dat canvas de kleuren uit te lezen van de muispositie en elk object aan een middels een unieke kleur te koppelen, maar helaas ondersteunt excanvas, de fallback voor IE <= 9, dat niet
Je krijgt daar overigens ook weer een ander probleem bij, namelijk antialiasing
De twee belangrijkste links die ik ernaast gehouden heb zijn:
http://blogs.msdn.com/b/r...nt-in-triangle-tests.aspx
http://www.blackpawn.com/texts/pointinpoly/
Aangezien de vakjes gedraaid kunnen zijn, heb ik niet voldoende aan een simpele bounding box check, dus ben ik op onderzoek uitgegaan naar hoe je vast kunt stellen of een punt in een willekeurige polygoon voor kan komen. Ik kwam er al snel op uit dat de meest efficiente manier is om te werken met een Barycentric coordinatenstelsel nadat je je polygoon in driehoeken hebt verdeeld. Ik snap de wiskunde erachter nog niet helemaal, maar dat gaat vast nog wel komen... Wie weet door enige uitleg hier
Ik heb in principe wel een werkend beginnetje kunnen maken, en bij wijze van proof of concept wil ik kunnen detecteren of de mouseover een vierkantje oplicht. Een vierkant (of rechthoek) ABCD bestaat immers uit twee driehoeken, ABD en BCD, dus als ik weet of een punt in 1 van die driehoeken zit, dan zit het punt ook in de rechthoek.
Het geval wil echter dat op de diagonaal (BD) een afrondingsfout o.i.d. lijkt op te treden. Ik had gehoopt er op deze manier mee weg te komen en op een later tijdstip nog eens uit te zoeken hoe het precies werkt, maar die vlieger gaat dus niet helemaal op: om het op te lossen moet ik nu wel echt begrijpen hoe het in elkaar steekt
Ik heb een fiddle gemaakt waar ik alle cruft (zoals optimalisaties) weggelaten heb en met vanilla JS het probleem geschetst wordt. Je ziet dat het algoritme (Triangle.contains) in principe redelijk goed werkt, maar bij het vierkant in het midden wordt het probleem duidelijk. Omdat de driehoeken niet overlappen, maar alleen maar aangrenzen, vallen er punten die het lijnstuk BD vormen (van linksonder naar rechtsboven) volgens deze methode in geen van de twee driehoeken. Het effect is dat als je muis op de diagonaal komt, het als een "mouseout" wordt gezien. Of dat alle punten van de diagonaal zijn heb ik nog niet uitgezocht, ook niet of daar een patroon in is te ontdekken, maar wellicht dat iemand met wat meer kennis van zaken daar sowieso al een verklaring voor kan geven...
http://jsfiddle.net/t5Nsb/2/
Ik vraag me af hoe ik er achter kan komen hoe dit is op te lossen, of dat ik misschien wel een hele andere richting op moet. Ik ben benieuwd of iemand hier mee kan helpen
PS: Een reeds bedachte oplossing om met een tweede canvas te werken en van dat canvas de kleuren uit te lezen van de muispositie en elk object aan een middels een unieke kleur te koppelen, maar helaas ondersteunt excanvas, de fallback voor IE <= 9, dat niet
De twee belangrijkste links die ik ernaast gehouden heb zijn:
http://blogs.msdn.com/b/r...nt-in-triangle-tests.aspx
http://www.blackpawn.com/texts/pointinpoly/
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz