[C#] closePoint / farPoint

Pagina: 1
Acties:

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 14:14
Ik ben in c# bezig gegaan om een simple AI movement system te maken. Van alle objecten in de zo genaamde wereld heb ik all coördinaten (x,y,z). Voor de interactie van de objecten met elkaar dienen ze naar elkaar toe te bewegen. De bedoeling is dat ze een punt selecteren dat valk bij het andere object ligt. De manier die ik nu gebuik is het selecteren van het punt waar object A staat en dan 1 van de x aftrekken van die positie.

Deze methode is natuurlijk heel erg onnauwkeurig en heeft als gevolg dat de object soms door elkaar heen lopen. Om dit op te lossen heb ik wat op wikipedia gezocht omtrent geometrische wiskunde. Ik kwam uit op de functies van Sinus (sin) en Cosinus (cos).

Als oplossing kreeg ik deze code, alleen werkt hij nog steeds niet erg perfect in alle situaties (x,y en z zijn class variabele in de point class).

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public float getAngle(Point a)
        {
            float dx = a.x - x;
            float dy = a.y - y;

            float ang = (float)Math.Atan2(dy, dx);
            ang = (float)((ang >= 0) ? ang : 2 * Math.PI + ang);
            return ang;
        }

        public Point getClosePoint( Point a )
        {
            double angle = (double)getAngle(a);
            return new Point(a.x + Math.Cos(angle), a.y + Math.Sin(angle), a.z);
        }


Ook komt het soms voor dat object van elkaar vandaan moeten bewegen. Hier voor heb ik nog geen goede oplossing gevonden. Ter illustratie heb ik maar even een plaatje gemaakt in photoshop. De groene punten zijn de punten die de methods getClosePoint en getFarPoint moeten uitrekenen.

Afbeeldingslocatie: http://img254.imageshack.us/img254/906/examplecopypd4.th.gif

Afbeeldingslocatie: http://img254.imageshack.us/img254/906/examplecopypd4.th.gif

http://www.tweakers.net/gallery/119170/sys


  • Down
  • Registratie: Februari 2005
  • Laatst online: 29-11 22:34
Volgens mij gebruiken math functies in c++ radians ipv degrees, ik weet niet of dit in c# ook zo is, misschien gaat dat fout.

Ik vind het plaatje trouwens niet geheel duidelijk :)

Mother north, how can they sleep while their beds are burning?


Verwijderd

Imodium schreef op dinsdag 30 januari 2007 @ 19:09:
Volgens mij gebruiken math functies in c++ radians ipv degrees, ik weet niet of dit in c# ook zo is, misschien gaat dat fout.

Ik vind het plaatje trouwens niet geheel duidelijk :)
Ik kan me herinneren dat dit bij C# ook het geval is inderdaad. Alweer een hele tijd geleden dat ik ermee gewerkt heb.

  • codeneos
  • Registratie: Augustus 2004
  • Laatst online: 14:14
Het plaatje is een snelle schets van hoe het zou moeten in photoshop. Als object a naar object b toe will dan moet het dus naar het groene punt bewegen dat dicht bij object b ligt. Dit punt zou je moeten kunnen uitrekenen met de getClosePoint method (de x en y cord). Idem voor het andere groene punt.

Is er dan wellicht iets fout aan mijn getAgle methode? Ik ben niet zeker van de laatste if regel waar PI*2 gaat omdat cos en sin methods zijn die zich herhalen zou ik ook gewoon een negatief getal kunnen gebruiken (kreeg de tip van een vriend dat ik dat toe moest voegen, zijn redering kon ik nouwlijks volgen maar ja ik ben ook niet zo goed in deze berekening).

Ik ben nu deze code aan het proberen voor getFarPoint.

C#:
1
2
3
4
5
        public Point getFarPoint(Point a)
        {
            double angle = (double)getAngle(a);
            return new Point(x + ((float)Math.Cos(angle) * 10), y + ((float)Math.Sin(angle) * 10), z);
        }

[ Voor 31% gewijzigd door codeneos op 30-01-2007 20:26 ]

http://www.tweakers.net/gallery/119170/sys