AgetoAge Genealogy

Hvordan skriver man en god prosedyre for å la en PC finne slektskap mellom personer?
Hittil har jeg gått skrittvis frem for å finne den nærmeste relasjonen mellom 2 personer og finner da kun èn relasjon hvis denne i det hele tatt eksisterer. Dette er forsåvidt greit men 2 personer kan ha flere relasjoner og jeg har tenkt litt på å finne en god metode for å finne alle relasjoner.
Jeg så for meg en metode som ville være rask og der computeren kunne på en måte bruke "øyne" til å "se" relasjonene med en gang.
Løsningen dukket opp som lyn fra klar himmel her en dag og jeg vil i korte trekk si litt om algoritmen her.
Løsningen er basert på en forhåndslaget tabell som oppdateres automatisk når man legger til, endrer rekkefølge på barn eller sletter personer. La oss kalle denne tabellen for Relationships og siden vi ikke har denne tabellen fra før av så må vi fylle den med data først men først litt om hvordan denne tabellen er laget. Tabellen er meget enkel og har kun 3 felter:
PID - AncestorID - Path
PID er person-id
AncesterID er ID til den ancestoren som er lengst tilbake.
Path er en "vei" som angir hvordan denne personen er relatert til sin eldste ancestor (AncestorID) og Path kan f.eks være slik "3.1.2.1.5.1.2.3.1" og denne personen er altså barn nummer 1 fra barn nummer 3 fra barn nummer 2 fra barn nummer 1....osv....
Siden vi ikke har denne tabellen fra før av og vi har en masse personer i databasen må vi fylle den med data og vi finner først alle personer som ikke har foreldre registert. Så går vi gjennom denne listen og lager en liste over alle descendanter til hver ancestor i listen. Vi legger så inn data fra disse listene i tabellen vår (Relationship tabellen).
Når vi så skal finne relasjoner mellom A og B vil dette kunne finnes ved en enkel SQL spørring der vi får Path til A og B hvor AncestorID er den samme.
I min database fant jeg ca 2400 personer uten foreldre registert og ved å finne alle descendanter til disse fikk jeg ca 156 000 rader i Relationship tabellen. Tabellen ble generert på ca 15 sekunder. For den som har lyst å prøve å lage denne tabellen kan man gå til Database/Database info og klikke "Update relation table" Klikk så Clear Table og så Button1.
01-10-2013 - Jeg har nå fått ferdig denne nye funksjonen som finner alle slektsforhold mellom to personer, jeg måtte legge til to nye felter i tabellen som viser foreldre til hver etterkommer, dette var nødvendig for å finne ut om A og B deler det samme ancestor par, hvis de ikke gjør det er det da en halv relasjon

Så har jeg oppdatert Group View eller Close relations slik at valgte Texturer blir lagret når man lukker vinduet.

03-10-2013 - Lastet opp ny versjon da jeg glemte å legge inn de 2 nye feltene RelationShiptabellen når man lager ny database. Dette skulle nå være i orden. Samtidig har jeg lagt inn to nye tabeller på skjemaet som viser sammenhengen (med ektefeller).

Dobbelklikk i den øverste tabellen for å laste inn de to tabellene under.

06-10-2013 - Lastet opp ny versjon der Chart funksjonen nå vil vise relaterte personer for den ancestoren som er valgt.
En liten gjennomgang hvordan man bruker denne nye slektskapfinneren:
 1 - Bruker man en tidligere laget database må man gå til Database/Database Info og klikke Upgrade RelationShips - dette vil lage tabellen og fylle den med data.
 2 - Gå så til personlisten og dobbelklikk en person, klikk Functions og RelationShip og der velger man File/Advansed Relationfinder.
 3 - Velg person B der og klikk GO da finnes alle felles ancestorer med Path til person A og B. Dobbelklikk så på enten A.Path eller B.Path for å vise personene som danner slektskapet. Man kan så klikke Chart om man ønsker for å vise personene i bokser med texture og linjer som viser sammenhengen.

Nå kan boksene i Relation Chart flyttes med å klikke og holde nede venstre musknapp mens man drar musa dit hvor man vil flytte boksene. Og nå kan man også sette ønsket høyde/bredde og x og y avstand mellom boksene. (Ikke lastet opp enda da jeg har mere oppdateringer som jeg ikke er ferdig med).

Så holder jeg også på med å lage en egen kontroll som vil kunne brukes overalt i programmet der man ønsker å velge et texture med mulighet for å velge WrapMode (hvordan texturet vil skjøtes sammen med seg selv for å fylle arealet som skal fylles. Og man kan også velge Opacity og bakgrunnsfarve som tilsammen gjør at man kan lage en egen farvetone.

Her er et lite eksempel på bruk av teksturer i Ancestor 3.1 ved hjelp av den nye texture velgeren som snart kan lanseres. Og man kan lage alle slags varianter av et eneste texture.

12-10-2013 - Da er den nye texture velgeren tilgjengelig i AgetoAgeSqlite (x86) i Ancestor 3.1 og Close relatives (GroupView). Klikk Options/Setup for å sette texturer og annet...
Her er et til eksempel...enkelt å velge texture nå ja og sette det til ønsket farvetone og lysstyrke. Men husk at et texture ikke trenger å være stort.. hvis man søker på nettet etter teksturer finner man ofte kjempestore teksturer på flere MB men det har lite for seg å bruke disse, jeg vil anbefale et teksture i området 10 - 300 kb. Det er omtrent som å legge parkett på et gulv....man bruker mange små biter og tilsammen blir det et stort gulv og denne jobben gjør AgetoAge lynraskt.

19-10-2013 - Lastet opp ny versjon av AgetoAgeSqlite (x86) der Setup for Ancestor 3.1 har blitt forbedret.

21-10-2013 - Lastet opp ny versjon der jeg har lagt inn de texturer som er vist på demoene her i selve programmet slik at man kan importere dem inn i Photo Manager for å ha lett og enkel tilgang til disse. Funksjonen finnes i Photo Manager menyen File/Add standard textures. Texturene vil bli lagt inn under kategorien "Textures". Noen korrigeringer/forbedringer er også utført.
23-10-2013 - Lastet opp ny versjon der noen standard texturer blir satt automatisk inn i Photo Manager når man lager en ny database. Så har jeg oppdatert Close relations (GroupView) slik at tekstene kan få marginer (left/top/bottom/right).
24-10-2013 - Lastet opp ny versjon der Close Relations har blitt oppdatert slik at brukeren kan gå til Setup og skrive inn hvilken tekst som skal vises for fødsel- og dødsdatoer. F.eks om man vil bruke " b." eller f.eks " født " foran fødselsdatoer, hvis det ikke er registert noen data for fødsel- eller dødsdatoer blir kun navnet vist. Det har forøvrig vært svært interresant å utvikle denne kontrollen som jeg har kalt "AncestorTreeLabel" som brukes til å vise ancestorene og denne kan gjenbrukes andre steder i programmet veldig enkelt med å velge den i "Verktøykassen" og dra den dit man vil ha den.
27-10-2013 - Lastet opp ny versjon der Close Relations har blitt oppdatert slik at brukeren kan velge selv hvilken metode for å vise fødsel/døds datoer. Standard visning er at disse datoene vises på nederste linje med et bindestrek mellom.
03-11-2013 - Lastet opp ny versjon der Photo Manager har blitt litt forbedret.
06-11-2013 - Lastet opp ny versjon der jeg har lagt inn valg for windows mode i Ancestor 3.1. Man kan nå velge Full Window som vil utnytte max areal av skjermen.

10-11-2013 - Lastet opp ny versjon der Relationship vinduet har blitt oppdatert slik at datoene også blir vist for personene.

 

Pics of the day
hands.bmp