Page 1 of 3 1 2 3 LastLast
Results 1 to 15 of 31

Thread: recursieve functie : Pixels tellen

  1. #1

    recursieve functie : Pixels tellen

    Hello mensen,

    Ik heb even jullie 'wiskundig' inzicht nodig.
    Volgens mij moet een een recursieve functie gebruiken.

    Ik probeer er achter te komen uit hoeveel zwarte pixels een 'groep' bestaat als je er vanaf gaat dat de achtergrond wit is.

    Ik wil in totaal het AANTAL 'groepen' zwarte pixels tellen en hoeveel pixels deze groep heeft.

    de regels zijn: links,rechts,boven,beneden, en alle schuine opties. 8 combi dus.
    Ik kan het wel vanuit 1 pixel oplossen met hoeveel andere pixels die is verbonden dmv een loop, alleen het nadeel is dat bij het vinden van een verbonden zwarte pixel dat hij vanuit daar ook weer 8 nieuwe combinaties heeft waar die weer doorheen moet loopen. Dit moet dan wel opgelost met een recursieve functie omdat je wel 20 'layers/pixels' diep kunt gaan.


    Klein voorbeeldje:

    ik heb een groep met 5 zwarte pixels
    ik heb een groep met 4 zwarte pixels
    ik heb een groep met 9 zwarte pixels

    aantal groepen gevonden: 3

    groep1: 5
    groep2: 4
    groep3: 9

    Als iemand er over na kan/wil denken, ik hoor je antwoord graag. thanks

  2. #2
    Interessant onderwerp !
    Ik ben een programma ervoor aan het maken en het is bijna af, maar ik krijg nu AV's die met m'n dynamische arrays te maken hebben...

    Ik krijg geen AV, maar het Delphi CPU scherm waar hij een regeltje highlight met assembly code.

    Dit zou toch in principe moeten kunnen ??
    Code:
      SetLength(AlreadyChecked, Length(AlreadyChecked)+1);
      AlreadyChecked[Length(AlreadyChecked)].X := Huidig.X;
      AlreadyChecked[Length(AlreadyChecked)].Y := Huidig.Y;
    Met als Variabele:
    AlreadyChecked: Array of TPoint;

  3. #3
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Heeft een array niet een 0-based index?? Misschien even proberen met de -1...
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  4. #4
    Een Index wel ja, maar een Length niet.
    Ik heb even de foutmelding bijgevoegd hieronder.
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	error.jpg 
Views:	340 
Size:	44.8 KB 
ID:	2137  

  5. #5
    Length is 1 hoger dan de hoogste index. Gebruik dus Length()-1 of High().
    1+1=b

  6. #6
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Sorry, maar ik bedoel dus
    Code:
    AlreadyChecked[Length(AlreadyChecked) - 1].X := Huidig.X;
    Albert.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  7. #7
    Dit is trouwens wel traag. Je moet dus voor elke pixel die je wilt controleren de hele lijst gaan doorlopen. Bovendien ga je voor elke pixel die array reallocaten.

    Je kunt dan beter een tweedimensionale array van Booleans declareren en voor elke pixel die je controleert de overeenkomstige boolean op True zetten.
    Code:
    ifnot AlreadyChecked[x, y] then
    begin
      VerwerkPixel(x, y);
      AlreadyChecked[x, y] := True;
    end;
    1+1=b

  8. #8
    Haha krijg nu een Stack OverFlow...

  9. #9
    Bedankt voor het mee helpen uitzoeken!
    Het programma zal toch wat trager worden omdat er een lijst van coords per groep bijgehouden moet worden. Als er bv 5 groepen gevonden zijn dan moeten de 2 laatste verwijderd om uiteindelijk op de 3 hoogste groepen uit te komen. Dus die overige groepen moeten toch pixel voor pixel verwijderd worden aan de hand van die coords.

  10. #10
    Dat zit er al in
    Maar ik weet nu waarom ik een Stack Overflow krijg... de buren bereken ik zo:
    Code:
      Buren[1] := Point(Huidig.X-1,Huidig.Y-1);
      Buren[2] := Point(Huidig.X,Huidig.Y-1);
      Buren[3] := Point(Huidig.X+1,Huidig.Y-1);
      Buren[4] := Point(Huidig.X+1,Huidig.Y);
      Buren[5] := Point(Huidig.X+1,Huidig.Y+1);
      Buren[6] := Point(Huidig.X,Huidig.Y+1);
      Buren[7] := Point(Huidig.X-1,Huidig.Y+1);
      Buren[8] := Point(Huidig.X-1,Huidig.Y);
    Pixel = X:

    1 2 3
    8 X 4
    7 6 5

    Dan kijktie per buur of die pixel zwart is enz, en dan maakt hij nieuwe buren. Maar als er geen zwarte pixels meer zijn keert hij terug naar de oorspronkelijke loop met de 'eerste' zwarte pixel... maar de waarden van de Buren zijn dan natuurlijk al verandert. zodoende krijg ik een heen en weer geloop tussen 2 buren... Hoe los je dit op, weer een dynamische array erin gooien ? (Zodat je je oorspronkelijke buren, subburen, subsubburen enz. weer opslaat en daar weer naar kan terugspringen).
    Last edited by Dees; 13-Nov-04 at 15:12.

  11. #11
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Gebruik backtracking. Voorzie zelf een stack i.p.v. recursief te werken.
    Je kan het controleren van de buren trouwens ook in een loopje stoppen.
    All methodologies are based on fear. -- Kent Beck.

  12. #12
    BackTracking... wat is dat (of hoe werkt dat).
    De buren controleer ik sowieso via een loopje al .

  13. #13
    Yep daar kwam ik dus ook tegen aan. Ik kan steeds 8 mogelijkheden maar per pixel. alleen de volgende pixel heeft er ook weer 8 (eigelijk 7) maar je snapt het precies!

    Hiervoor komt een recursive functie kijken. Heb het zelf in php ooit eens gebruikt om onbeperkte sub-sub etc- navigatie te maken. Komt eigelijk op zelfde neer alleen weet niet precies hoe je dit in delphi kan verwezelijken.

    Zoiets lijkt me dus:
    http://delphi.about.com/library/weekly/aa120799a.htm


    sorry Dirk Andries je post te laat gelezen
    Backtracking ken ik overigens niet.

  14. #14
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  15. #15
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    1) De recursie is niet nodig, je kan die vervangen door een loop als je zelf een stack voorziet.
    2) Backtracking Delphi
    All methodologies are based on fear. -- Kent Beck.

Page 1 of 3 1 2 3 LastLast

Thread Information

Users Browsing this Thread

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

Similar Threads

  1. Callback functie in thread (TimeSetEvent)
    By marz in forum Algemeen
    Replies: 8
    Last Post: 26-Jul-04, 16:36
  2. Replies: 2
    Last Post: 09-Oct-03, 11:03
  3. Replies: 2
    Last Post: 20-Sep-03, 00:42
  4. objecten aanspreken in een functie
    By aEr_aEr in forum Algemeen
    Replies: 2
    Last Post: 21-Jan-03, 13:31

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
  •