Ik heb een driehoekig isometrisch raster, zoals deze:

In mijn code, worden driehoeken gegroepeerd op kolommen.
Terwijl ik met de muis, wil ik berekenen wat driehoek de muis coördinaten in. Is er een eenvoudig algoritme om dat te doen?
Ik heb een driehoekig isometrisch raster, zoals deze:

In mijn code, worden driehoeken gegroepeerd op kolommen.
Terwijl ik met de muis, wil ik berekenen wat driehoek de muis coördinaten in. Is er een eenvoudig algoritme om dat te doen?
Wat u wilt doen is het maken van deze in een raster zoveel mogelijk omdat grids zijn veel gemakkelijker om mee te werken.
Het eerste wat je doet is werken wat kolom het op. Je zegt dat je op te slaan dat zo moet het makkelijker door het doen van een eenvoudige integer deling op zijn de x-coördinaat door de kolombreedte gecompenseerd door de box start. Gemakkelijk.
Na dat u wilt werken wat driehoek het is in (uiteraard). Hoe u dit gedeeltelijk om te zetten in een raster is je doet alsof dat u een stapel rechte hoek driehoeken in plaats van een stapel isometrische driehoeken.
De driehoeken hebben een lengte langs de y-as (de zijkant van de kolom). Dat getal in twee en uit te werken hoeveel stappen naar beneden je bent. Op basis van het aantal stappen naar beneden en als de kolom is even of oneven zal u vertellen als u op zoek bent naar:
+--------+
|-_ |
| -_ |
| -_ |
| -_|
+--------+
of omgekeerd. Op dit moment hoeft u alleen maar om te bepalen welke kant van de lijn is het op om te bepalen welke rechthoekige driehoek is het in, die ook vertelt welke isometrische driehoek is het in.
Je hebt een paar opties voor dit.
Je zou zelfs kunnen gebruik maken van (1) tot (2) te genereren als een snelle lookup.
Het enige ander ding om te overwegen is wat er gebeurt als de muis cursor zich op een rand?
Dit is vergelijkbaar met wat Cletus gezegd, maar op een andere manier om ernaar te kijken denk ik.
Ik ga ervan uit de driehoek kant: 1.
Stel, je hebt het net zoals hieronder:
y'
/
/__/__/__/__/__/__/
/__/__/__/__/__/__/
/__/__/__/__/__/__/____ x'
(0,0)
Als u het raster in een coördinatensysteem waarin de x- en y-assen onder een hoek van 60 graden, een punt waarvan de coördinaten in de gehoekte systeem (x 'y') beschouwen zal overeenkomen met de coördinaten van de orthogonaal assenstelsel (met dezelfde oorsprong een algemene richting van de assen) tot (x, y).
In uw probleem, krijgt u (x, y), moeten we (x 'y') te vinden en dan uitzoeken van de driehoek.
Als i de eenheidsvector langs x en j de orthogonale aan y, dan hebben we
x'* i + y'( i/2 + sqrt(3) * j /2) = xi + yj.
(In principe de eenheidsvector langs de 'hoek' y-as i / 2 + sqrt (3) / 2 * j. De eenheidsvector langs de x-as is gelijk aan de normale x-as, dat wil zeggen i).
Dus
x' + y'/2 = x
y' * sqrt(3)/2 = y
Oplossen geeft:
y' = 2*y/sqrt(3)
x' = x - y/sqrt(3)
Veronderstel nu dat x 'en y' positief.
Nu als c = [x '], het gehele deel van x'
en r = [y '], het gehele deel van y'
dan in de (hoek) rooster, de punt ligt in de CTH kolom en de r-de rij. (Het tellen van rechts en van boven en beginnen te tellen bij 0).
Zo hebben we verengd je wijzen op een parallellogram
____
/\ * /
/___\/
(c,r)
Nu in om erachter te komen welke driehoek is het in de fractionele delen van x 'en y' kunnen beschouwen.
{x} = x' - [x'] = x' - c.
{y} = y' - [y'] = y' - r.
Nu,
Als {x} + {y} > 1vervolgens de punt ligt in de driehoek gemarkeerd met *. als {x} + {y} < 1, dan is het punt ligt in de andere driehoek. Als {x} + {y} = 1dan het punt ligt op de lijn betreft beide driehoeken.
Hoop dat het helpt ook.