Page 1 of 5 1 2 3 ... LastLast
Results 1 to 15 of 65

Thread: Hoe Locatie gebied met een bepaalde straal bepalen ?

  1. #1

    Hoe Locatie gebied met een bepaalde straal bepalen ?

    Ik loop met het idee om een locatie app te maken, waarbij ik afhankelijk van de locatie info op het scherm krijg.

    Stel dat ik in de buurt van Eindhoven ben (bijvoorbeeld: 51.438231,5.477976), en ik ben daar in een gebied van een straal van 20 Km, dat ik dan een tekst op het scherm kan laten verschijnen.

    De huidige locatie bepaal ik zo:

    Code:
    procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
      const OldLocation, NewLocation: TLocationCoord2D);
    begin
     FormatSettings.DecimalSeparator := '.';  
     Edit1.Text := Format('%2.7f', [NewLocation.Latitude]);
     Edit2.Text := Format('%2.7f', [NewLocation.Longitude]);
    end;
    Maar hoe kan ik bepalen of ik in het gebied met een straal van 20 Km zit ?

  2. #2
    Je zult de afstand moeten bepalen tussen je opgegeven en huidige locatie. Er zijn veel verschillende soorten berekeningen daarvoor (afhankelijk of je de curve van de aarde mee wilt rekenen).

    Bijvoorbeeld:
    https://rosettacode.org/wiki/Haversine_formula#Delphi

    Delphi Code:
    1. uses Math;
    2.  
    3. function HaversineDist(th1, ph1, th2, ph2: double): double;
    4. const
    5.   diameter = 2 * 6372.8;
    6. var
    7.   dx, dy, dz: double;
    8. begin
    9.   ph1 := DegToRad(ph1 - ph2);
    10.   th1 := DegToRad(th1);
    11.   th2 := DegToRad(th2);
    12.  
    13.   dz := Sin(th1) - Sin(th2);
    14.   dx := Cos(ph1) * Cos(th1) - Cos(th2);
    15.   dy := Sin(ph1) * Cos(th1);
    16.   result := arcsin(sqrt(sqr(dx) + sqr(dy) + sqr(dz)) / 2) * diameter;
    17. end;
    18.  
    19. procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
    20.   const OldLocation, NewLocation: TLocationCoord2D);
    21. var
    22.   Afstand: Double;
    23. begin
    24.   Afstand := HaversineDist(51.438231, 5.477976, NewLocation.Latitude, NewLocation.Longitude);
    25.   if Afstand < 20 then
    26.   begin
    27.     // do your thing...
    28.   end;
    29. end;

    (niet uitgetest dus geen idee of dit zo goed werkt )

    Overigens zul je in dit geval heel veel meldingen krijgen want bij elke wijziging binnen de 20km krijg je een melding. Je moet dus natuurlijk wel een soort boolean inbouwen die alleen een melding geeft als je er binnen komt en er weer buiten komt.

    Edit: Ok, dat zou je natuurlijk ook zo kunnen doen met Old en NewLocation:
    Delphi Code:
    1. procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
    2.   const OldLocation, NewLocation: TLocationCoord2D);
    3. var
    4.   Afstand1, Afstand2: Double;
    5. begin
    6.   Afstand1 := HaversineDist(51.438231, 5.477976, OldLocation.Latitude, OldLocation.Longitude);
    7.   Afstand2 := HaversineDist(51.438231, 5.477976, NewLocation.Latitude, NewLocation.Longitude);
    8.   if (Afstand2 > 20) and (Afstand1 <= 20) then
    9.   begin
    10.     // do your thing...
    11.   end;
    12. end;

  3. #3
    Bedankt.

    Ik heb een test Appje gemaakt, en ga het testen. Omdat ik dit niet thuis kan testen gaat dit even duren.

    Ik wil de basis postie's en de afstanden in een database opnemen en deze telkens laten doorlopen.

    Ik denk aan een DB met de volgende velden:
    Lat
    Long
    Radius (dus de afstand)
    Tekst. (de tekst die ik dan te zien krijg)

    Hoe zouden jullie dit aanpakken ?

  4. #4
    Quote Originally Posted by MMSoft View Post
    Ik denk aan een DB met de volgende velden:
    ...
    Hoe zouden jullie dit aanpakken ?
    Uit de losse vuist:
    Delphi Code:
    1. procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
    2.   const OldLocation, NewLocation: TLocationCoord2D);
    3. var
    4.   Afstand1, Afstand2: Double;
    5.   Lat, Long, Rad: Double;
    6.   Txt: String;
    7. begin
    8.   Query.Open;
    9.   while not Query.Eof do
    10.   begin
    11.     Lat := Query.FieldByName('Lat').asFloat;
    12.     Long := Query.FieldByName('Long').asFloat;
    13.     Rad := Query.FieldByName('Radius').asFloat;
    14.     Txt := Query.FieldByName('Tekst').asString;
    15.     Afstand1 := HaversineDist(Lat, Long, OldLocation.Latitude, OldLocation.Longitude);
    16.     Afstand2 := HaversineDist(Lat, Long, NewLocation.Latitude, NewLocation.Longitude);
    17.     if (Afstand2 > Rad) and (Afstand1 <= Rad) then
    18.     begin
    19.       Showmessage(Txt);
    20.     end;
    21.     Query.Next;
    22.   end;
    23.   Query.Close;
    24. end;

    De vraag is alleen of je in LocationSensor1LocationChanged() elke keer alle locaties uit de database wilt halen. Waarschijnlijk is het beter de database in een array of records in te lezen en dan de array te lopen i.p.v. de database. (ik kan me zo voorstellen dat LocationSensor1LocationChanged nogal wat keren aangeroepen wordt en dan wil je niet elke keer de database raadplegen)

  5. #5
    De vraag is alleen of je in LocationSensor1LocationChanged() elke keer alle locaties uit de database wilt halen.
    Nee dat lijkt mij inderdaad niet handig (en ook erg langzaam), dus eerst alle DB gegevens naar een array te kopiëren, en deze array telkens doorzoeken ?
    Een array met één veld heb ik al meermaals gebruikt, maar is het ook mogelijk om een array met meerdere velden te maken ?

  6. #6
    Quote Originally Posted by MMSoft View Post
    Nee dat lijkt mij inderdaad niet handig (en ook erg langzaam), dus eerst alle DB gegevens naar een array te kopiëren, en deze array telkens doorzoeken ?
    Een array met één veld heb ik al meermaals gebruikt, maar is het ook mogelijk om een array met meerdere velden te maken ?
    Dat doe je gewoon met een array of record_type.

    Ongeveer zo: (weer uit de losse vuist):

    Delphi Code:
    1. type
    2.   LocatieType = record
    3.     Lat, Long, Rad: Double;
    4.     Txt: String;
    5.   end;
    6.  
    7. type
    8.   TForm1 = class(TForm)
    9.     procedure FormCreate(Sender: TObject);
    10.     procedure LocationSensor1LocationChanged(Sender: TObject;
    11.        const OldLocation, NewLocation: TLocationCoord2D);
    12.   private
    13.     { Private declarations }
    14.   protected
    15.     { Protected declarations }
    16.   public
    17.     { Public declarations }
    18.     Locaties: array of LocatieType;
    19.   end;
    20.  
    21. implementation
    22.  
    23. uses Math;
    24.  
    25. {$R *.dfm}
    26.  
    27. // [url]https://rosettacode.org/wiki/Haversine_formula#Delphi[/url]
    28.  
    29. function HaversineDist(th1, ph1, th2, ph2: double): double;
    30. const
    31.   diameter = 2 * 6372.8;
    32. var
    33.   dx, dy, dz: double;
    34. begin
    35.   ph1 := DegToRad(ph1 - ph2);
    36.   th1 := DegToRad(th1);
    37.   th2 := DegToRad(th2);
    38.  
    39.   dz := Sin(th1) - Sin(th2);
    40.   dx := Cos(ph1) * Cos(th1) - Cos(th2);
    41.   dy := Sin(ph1) * Cos(th1);
    42.   result := arcsin(sqrt(sqr(dx) + sqr(dy) + sqr(dz)) / 2) * diameter;
    43. end;
    44.  
    45. procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
    46.   const OldLocation, NewLocation: TLocationCoord2D);
    47. var
    48.   Afstand1, Afstand2: Double;
    49.   Cnt: Integer;
    50. begin
    51.   Cnt := 0;
    52.   for Cnt := 0 to High(Locaties) do
    53.   begin
    54.     Afstand1 := HaversineDist(Locaties[Cnt].Lat, Locaties[Cnt].Long, OldLocation.Latitude, OldLocation.Longitude);
    55.     Afstand2 := HaversineDist(Locaties[Cnt].Lat, Locaties[Cnt].Long, NewLocation.Latitude, NewLocation.Longitude);
    56.     if (Afstand2 > Locaties[Cnt].Rad) and (Afstand1 <= Locaties[Cnt].Rad) then
    57.     begin
    58.       Showmessage(Locaties[Cnt].Txt);
    59.     end;
    60.   end;
    61. end;
    62.  
    63. procedure TForm1.FormCreate(Sender: TObject);
    64. var
    65.   Cnt: Integer;
    66. begin
    67.   // setup eerst the database connectie
    68.   // ....
    69.  
    70.   Query.Open;
    71.   SetLength(Locaties, Query.RecordCount - 1);
    72.   Cnt := 0;
    73.   while not Query.Eof do
    74.   begin
    75.     Locaties[Cnt].Lat := Query.FieldByName('Lat').asFloat;
    76.     Locaties[Cnt].Long := Query.FieldByName('Long').asFloat;
    77.     Locaties[Cnt].Rad := Query.FieldByName('Radius').asFloat;
    78.     Locaties[Cnt].Txt := Query.FieldByName('Tekst').asString;
    79.     Inc(Cnt);
    80.     Query.Next;
    81.   end;
    82.   Query.Close;
    83. end;

    Je ziet in de form-declaratie de Locaties: array of LocatieType;
    In FormCreate kunnen we deze dynamische array van records op een bepaalde grootte instellen met SetLength() (RecordCount - 1 omdat we vanaf 0 beginnen).
    Dan vullen we alle records in de array en kunnen deze gebruiken in een loop in LocationSensor1LocationChanged.

  7. #7
    Ik heb de code getest, en het ziet er veel belovend uit. Met onderstaande code kreeg ik juiste een melding als ik de cirkel verliet i.p.v. als ik de cirkel inkwam.

    Edit: Ok, dat zou je natuurlijk ook zo kunnen doen met Old en NewLocation:

    Code:
    procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
    const OldLocation, NewLocation: TLocationCoord2D);
    var
     Afstand1, Afstand2: Double;
    begin
      Afstand1 := HaversineDist(51.438231, 5.477976, OldLocation.Latitude, OldLocation.Longitude);
      Afstand2 := HaversineDist(51.438231, 5.477976, NewLocation.Latitude, NewLocation.Longitude);
      if (Afstand2 > 20) and (Afstand1 <= 20) then
       begin
        // do your thing...
      end;
    end;
    ]
    Ik heb dit gewijzigd, en ga dat zo spoedig mogelijk weer testen:
    Code:
     if (Afstand1 > 20) and (Afstand2 <= 20) then 
       begin
    Dan vullen we alle records in de array en kunnen deze gebruiken in een loop in LocationSensor1LocationChanged]
    Ik ga dit eens goed bekijken, op dit moment begrijp ik deze code nog niet.
    Last edited by MMSoft; 10-Sep-16 at 11:10.

  8. #8
    Quote Originally Posted by MMSoft View Post
    Ik heb de code getest, en het ziet er veel belovend uit. Met onderstaande code kreeg ik juiste een melding als ik de cirkel verliet i.p.v. als ik de cirkel inkwam.
    Ja, zoals al gezegd had ik dit even uit de losse vuist getikt.
    Afstand1 had inderdaad als eerste gemoeten.

    Misschien is het duidelijker als je Afstand1 hernoemd in OudeAfstand en Afstand2 in NieuweAfstand. Dan wordt het een stuk duidelijker:
    if (OudeAfstand > 20 {km}) and (NieuweAfstand <= 20 {km}) then

    De LocationSensor1LocationChanged wordt elke keer aangeroepen als de afstand gewijzigd is. Dus als de oude afstand > 20km is en de nieuwe <= 20km dan wil je dus de melding.

    Ik ga dit eens goed bekijken, op dit moment begrijp ik deze code nog niet.
    Je had het erover dat je wel wist hoe je met een array moest werken met één veld. Dus array[0..10] of string begrijp je dus.

    Ten eerste kun je een array dynamisch maken door geen [0..10] op te geven. Je krijg dan Arrayvar: array of string. Deze moet je echter wel een keer op lengte "zetten"/initialiseren en dat kan met SetLengt(Arrayvar, 10). Dit maakt Arrayvar dan hetzelfde als de array[0..10] of string.

    Ten tweede de "string"... Je kun in plaats van string ook een compleet record gebruiken. (net als in databases).
    Dus we definiëren eerst een record
    Delphi Code:
    1. type
    2.   LocatieType = record
    3.     Lat, Long, Rad: Double;
    4.     Txt: String;
    5.   end;
    en definieren dan Locaties: array of LocatieType;
    Ook hier kunnen moeten we weer de lengte van de array initialiseren met SetLength(Locaties, aantal_locaties).

    Daarna kunnen we dus gewoon Locaties[12].Lat aanspreken en ook Locaties[12].Long e.d..

  9. #9
    De database gegevens worden nu bij de opstart netjes gekopieerd naar de 'Arrayvar' (bedankt voor de duidelijke uitleg !).

    Wat gebeurd er als de routine 'LocationSensor1LocationChanged' alweer opgeroepen wordt als deze nog niet klaar is denken jullie ?
    Dat zou namelijk kunnen gebeuren als er veel data in de 'Arrayvar' staat. Gaat de App dan vast lopen denken jullie ?

    Ook ben ik nog aan het kijken hoe ik de eerste keer (als het programma net opgestart is) de data het beste kan vergelijken omdat ik mij dan mogelijk al een of meerdere cirkels bevindt en dan wil ik deze data ook te zien krijgen.
    Last edited by MMSoft; 12-Sep-16 at 18:38.

  10. #10
    Quote Originally Posted by MMSoft View Post
    Wat gebeurd er als de routine 'LocationSensor1LocationChanged' alweer opgeroepen wordt als deze nog niet klaar is denken jullie ? Dat zou namelijk kunnen gebeuren als er veel data in de 'Arrayvar' staat. Gaat de App dan vast lopen denken jullie ?
    Nee hoor. Het doorlopen van een array met veel data zal heel erg snel zijn. De vraag is echter hoe jij de melding geeft. Als je bijvoorbeeld een ShowMessage() geeft... ja, dan zou je een probleem kunnen krijgen omdat die de boel blokkeert. Maar als je een melding geeft en je keert gelijk terug dan denk ik dat dat geen probleem geeft. (Tevens denk ik dat er geen nieuwe LocationSensor1LocationChanged komt zolang de oude nog aan het lopen is maar dat weet ik niet zeker)

    Het kan natuurlijk wel zo zijn dat LocationSensor1LocationChanged erg veel aangeroepen wordt. Bijvoorbeeld een centimeter binnen de 20km en weer een centimeter erbuiten (binnen 1 seconden ofzo). In dat geval is het misschien wel handig om de meldingen niet direct weer te geven maar eerst even intern op te slaan en pas met een timer om de 15 seconden weer te geven.

    Het beste kun je dan in je Array, naast de Lat, Long en Txt een boolean opnemen Melding: Boolean. Die initialiseer je op false. En dan kun je in de LocationSensor1LocationChanged de boolean op true zetten als je binnen de straal komt. Dan hoef je in de timer alleen maar eenzelfde loop in te bouwen die bij true de melding geeft.

    Weer het losse vuistje (alleen de wijzigingen t.o.v. de vorige code)
    Delphi Code:
    1. type
    2.   LocatieType = record
    3.     Lat, Long, Rad: Double;
    4.     Txt: String;
    5.     Melding: Boolean;    // <---- deze toevoegen
    6.   end;
    7.  
    8. procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
    9.   const OldLocation, NewLocation: TLocationCoord2D);
    10. var
    11.   Afstand1, Afstand2: Double;
    12.   Cnt: Integer;
    13. begin
    14.   for Cnt := 0 to High(Locaties) do
    15.   begin
    16.     Afstand1 := HaversineDist(Locaties[Cnt].Lat, Locaties[Cnt].Long, OldLocation.Latitude, OldLocation.Longitude);
    17.     Afstand2 := HaversineDist(Locaties[Cnt].Lat, Locaties[Cnt].Long, NewLocation.Latitude, NewLocation.Longitude);
    18.  
    19.     // geen if meer maar direct de Melding boolean met true of false vullen
    20.     Locaties[Cnt].Melding := (Afstand1 > Locaties[Cnt].Rad) and (Afstand2 <= Locaties[Cnt].Rad);
    21.  
    22.   end;
    23. end;
    24.  
    25. procedure TForm1.Timer1Timer(Sender: TObject);
    26. var
    27.   Cnt: Integer;
    28. begin
    29.   // Timerloop die meldingen geeft indien Melding := true;
    30.   for Cnt := 0 to High(Locaties) do
    31.     if Locaties[Cnt].Melding then
    32.       ShowMessage(Locaties[Cnt].Txt);
    33. end;
    34.  
    35. procedure TForm1.FormCreate(Sender: TObject);
    36. var
    37.   Cnt: Integer;
    38. begin
    39.   // .... zelfde code als voorheen
    40.     Locaties[Cnt].Lat := Query.FieldByName('Lat').asFloat;
    41.     Locaties[Cnt].Long := Query.FieldByName('Long').asFloat;
    42.     Locaties[Cnt].Rad := Query.FieldByName('Radius').asFloat;
    43.     Locaties[Cnt].Txt := Query.FieldByName('Tekst').asString;
    44.     Locaties[Cnt].Melding := false;            // <---- deze toevoegen
    45.   // .... zelfde code als voorheen
    46. end;


    Edit:
    Ook ben ik nog aan het kijken hoe ik de eerste keer (als het programma net opgestart is) de data het beste kan vergelijken omdat ik mij dan mogelijk al een of meerdere cirkels bevindt en dan wil ik deze data ook te zien krijgen.
    Oja, als je dus bij het starten al de meldingen wilt hebben dan kun je je FormCreate aanpassen dat je .Melding niet op false zet maar al op true voor de locaties binnen de straal. Je Timer1Timer geeft daarna automatisch de meldingen voor de locaties binnen de straal zonder dat je LocationSensor1LocationChanged uitgevoerd hoeft te zijn.
    Delphi Code:
    1. procedure TForm1.FormCreate(Sender: TObject);
    2. var
    3.   Afstand1, Afstand2: Double;
    4.   Cnt: Integer;
    5. begin
    6.   // .... zelfde code als voorheen
    7.     Locaties[Cnt].Lat := Query.FieldByName('Lat').asFloat;
    8.     Locaties[Cnt].Long := Query.FieldByName('Long').asFloat;
    9.     Locaties[Cnt].Rad := Query.FieldByName('Radius').asFloat;
    10.     Locaties[Cnt].Txt := Query.FieldByName('Tekst').asString;
    11.  
    12.     // extra code om bij het opstarten al de locaties-meldingen te geven
    13.     Afstand1 := HaversineDist(Locaties[Cnt].Lat, Locaties[Cnt].Long, OldLocation.Latitude, OldLocation.Longitude);
    14.     Afstand2 := HaversineDist(Locaties[Cnt].Lat, Locaties[Cnt].Long, NewLocation.Latitude, NewLocation.Longitude);
    15.  
    16.     // geen if meer maar direct de Melding boolean met true of false vullen
    17.     Locaties[Cnt].Melding := (Afstand1 > Locaties[Cnt].Rad) and (Afstand2 <= Locaties[Cnt].Rad);
    18.  
    19.   // .... zelfde code als voorheen
    20. end;
    Last edited by rvk; 12-Sep-16 at 22:57.

  11. #11
    Ik was intussen ook al met een Timer in de weer gegaan, en heb het nu zo:

    Code:
    procedure TForm1.FormActivate(Sender: TObject);
    begin
     Timer1.Enabled := False; //
     Timer1.Interval := 1000; //
     ....
    
    
    procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
      const OldLocation, NewLocation: TLocationCoord2D);
    begin
     Timer1.Enabled := True;
    end;
    
    
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
     Doorzoek_Gegevens; //
     Timer1.Enabled := False; //Timer stoppen
    end;
    
    
    procedure TForm1.Doorzoek_Gegevens;
    begin
     Edit1.Text := Format('%2.7f', [LocationSensor1.Sensor.Latitude]);
     Edit2.Text := Format('%2.7f', [LocationSensor1.Sensor.Longitude]);
    
     Memo2.Lines.Clear; //
    
     for Cnt := 0 to High(Locaties) do
      begin
       Afstand := HaversineDist( Locaties[Cnt].Lat, Locaties[Cnt].Long, LocationSensor1.Sensor.Latitude, LocationSensor1.Sensor.Longitude); 
    
       if (Afstand <= Locaties[Cnt].Radius) then
       begin
        Memo2.Lines.Add( 'Afstand: ' + FormatFloat('0.0', Afstand ) + ' Km.' ) ;
        Memo2.Lines.Add( Locaties[Cnt].Tekst_1 + ', ' + Locaties[Cnt].Tekst_2 );
        Memo2.Lines.Add( '--------------------' );
       end;
     end;
    
     Memo1.Lines := Memo2.Lines; //De Vernieuwde gegevens tonen
    end;
    Ik gebruik 2 Memo velden, waarvan alleen Memo1 zichtbaar is.
    Op Memo1 toon ik de gegevens, en Memo 2 gebruik ik telkens als tijdelijke gegevens opslag

    Op deze manier heeft de routine 'Doorzoek_Gegevens' 1 Sec. de tijd om alles te doorzoeken,
    en als ik buiten een cirkel kom dan worden die gegevens ook niet meer getoond.
    Tevens heb ik met dit alles nu ook het probleem niet meer als ik in 1 of meerdere cirkels ben als ik het programma opstart, dat ik dan deze gegevens niet zie.
    Althans dat is de bedoeling, maar ik moet alles nog eens onderweg gaan testen....

    Vraag:
    Als ik de Timer stop, moet ik dat zijn teller waarde op 0 of 1000 zetten, voordat ik deze weer start ?
    Last edited by MMSoft; 12-Sep-16 at 23:15.

  12. #12
    Ja, zo kan het ook.
    Ik dacht alleen dat je echt een "melding" wilde geven wanneer je binnen een straal kwam. Met jouw methode geef je eigenlijk constant (bij locatie wijziging) ALLE locaties waarbinnen je valt. (en dus niet alleen een melding bij erbinnen komen)

    Maar dat is dus een kwestie van wat je precies wilt. Als je dus een "notification" wilt geven als je binnen een straal komt dan moet je mijn methode gebruiken maar als je een continue lijst van locaties waarbinnen je valt weergeven dan doe je het zoals je nu hebt gedaan.

    Quote Originally Posted by MMSoft View Post
    Als ik de Timer stop, moet ik dat zijn teller waarde op 0 of 1000 zetten, voordat ik deze weer start ?
    Nee. Na Enabled := false wordt de timer weer gereset. Als je daarna dus Enabled := true doet begint ie gewoon weer (automatisch) op 1000.

  13. #13
    Als dit alles goed werkt, dan heb ik het klaar, maar ik denk eraan om er toch nog 2 dingen bij weer te geven:

    -Is het eenvoudig mogelijk om de snelheid waarmee ik rijd weer te geven, dus is deze snelheid met code uit te lezen ?
    Ik heb wel eens gelezen dat een GPS sensor ook de snelheid weer kan geven, maar hoe lees ik die uit of is dat niet zo eenvoudig ?

    -Tevens zou het handig zijn als ik ook de richting weer kon geven doormiddel van een pijltje die in de richting van één GPS positie wijst, maar dat lijkt mij erg lastig of valt dat wel mee ?

  14. #14
    De snelheid staat gewoon in de TLocationSensor (speed):
    http://docwiki.embarcadero.com/Libra...sor_Properties

    Richting weet ik niet. Je zou de oude een nieuwe locatie op kunnen slaan en daarmee de richting weergeven (in graden vandaag noord ofzo). Of even in de unicode characterset kijken hoeveel verschillende pijltjes je hebt want alleen up, down, left en right lijkt mij wat onnauwkeurig.

    (Of je moet zelf pijltjes willen gaan tekenen maar dat kan niet in een TMemo)

  15. #15
    Duh... richting is natuurlijk MagneticHeading

    En https://en.wikipedia.org/wiki/Templa...e_chart_Arrows voor de pijlen als je TMemo wilt gebruiken.

Page 1 of 5 1 2 3 ... LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •