|
|
\require{AMSmath}
Punt berekenen na een bepaalde afstand op een lijn
Ik heb een lijn AB, met bijvoorbeeld de coordinaten: A = (2, 2) en B = (10, 10). Nu wil ik die lijn eigenlijk aan beide kanten 'inkorten' met een waarde x (bijvoorbeeld 1.414). Nu zou in dit voorbeeld de nieuwe lijn lopen van (3,3) naar (9,9), maar hoe bereken je dat?
Bij voorkeur zo min mogelijk, of liever geen gebruik van sin, cos, tan , worteltrekken, machten etc omdat dit onderdeel is van een pathfinding systeem en deze berekening moet honderden keren per frame kunnen worden uitgevoerd.
Dennis
Student hbo - woensdag 17 juni 2009
Antwoord
Helemaal zonder worteltrekken zal het niet gaan. Maar als de lijn dezelfde richting houdt in opeenvolgende frames hoef je dat worteltrekken maar één keer te doen: Noem A(a1,a2) en B(b1,b2) Bereken nu de richtingsvector (rv1,rv2)=(b1-a1,b2-a2) Bereken de lengte len van de richtingsvector: len=Ö(rv1·rv1+rv2·rv2) Bereken ook delta=x/len.
Als je nu aan beide zijden een stukje ter lengte x wilt aftrekken dan geldt:
a1nieuw=a1oud+delta·rv1 a2nieuw=a2oud+delta·rv2
b1nieuw=b1oud-delta·rv1 b2nieuw=b2oud-delta·rv2
Als nu in een volgend frame dezefde punten weer een stukje moeten worden veranderd hoef je alleen de berekening delta=x/len opnieuw uit te voeren en de nieuwe (a1,a2) en (b1,b2) uit te rekenen. Dus moet je dan per puntenpaar wel ruimte reseveren voor rv1, rv2 en len.
Op zich kan dat weer een probleem geven voor wat betreft geheugenruimte. Je kunt dan de volgende strategie volgen: Bereken het midden (m1,m2) van AB: m1=(a1+b1)/2 en m2=(a2+b2)/2. rv1 en rv2 zijn weer (b1-a1) resp (b2-a2). dan a1=m1-t·rv1 a2=m2-t·rv2 b1=m1+t·rv1 b2=m2+t·rv2 In de startsituatie geldt dan t=0.5 Met len=Ö(rv1·rv1+rv2·rv2) geldt dan tnieuw=toud-x/len. Per lijnstukje levert dat dus op dat je moet opslaan: m1,m2,rv1,rv2, t en len. Je kunt dan de nieuwe t berekenen en (a1,a2) en (b1,b2) herberekenen.
|
Vragen naar aanleiding van dit antwoord? Klik rechts..!
woensdag 17 juni 2009
|
|
home |
vandaag |
bijzonder |
gastenboek |
statistieken |
wie is wie? |
verhalen |
colofon
©2001-2024 WisFaq - versie 3
|