Toon posts:

[euler/matrices]herschalen

Pagina: 1
Acties:

Verwijderd

Topicstarter
We zijn voor het school een soort van fractaal generator aan het maken op basis van ee startmatrix. Dit werkt nu perfect (aan de hand van diamond square algoritme). Het enigste "probleem" is dat de matrix van het formaat 2^i +1 moet zijn (3x3 of 5x5).
Nu wil ik dit vermijden (gebruikersgemak + foto moet ook als start matrix kunnen dienen).
Wat ik dus moet doen is de huidige breedte en groote scalen naar het juiste formaat! Dit is echt niet zo simpel als ik dacht.

Laten we het probleem versimpelen en starten met een vector om die te vergroten:
1 , 2 , 3 is start vector. Resultaat moet een vector zijn met lengte 4.
Dus: 1 ,1.75 , 2,25 , 3. Dit heb ik met de hand uitgerekend.

Nu kan hieruit al afleiden: de begin en eindwaarde mogen worden overgenomen.
Maar verder kan ik er moeilijk logica inzien.

Het expanderen naar een matrix kan niet zo moeilijk zijn.

OF moet ik het anders aanpakken en mijn diamond square algoritme zo aanpassen dat het met alles werkt? maar dat was nu net de vereiste: begin matrix moet juist forfmaat zijn

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Wat je moet doen is interpolatie. Voor elk punt [x] in je output moet je een input punt [x*M/N] vinden. Voor x=0 en X=N had je al ontdekt dat dat simpel is, dat zijn de eindpunten. In het midden is x*M/N een breuk, en geen valide index. De simpele interpolatie is dan bepalen welke index er kleiner is, welk groter, en die punten dan gewogen middelen. In jouw geval heb je dus output punt1, wat teruggrekend input punt 0,75 zou zijn. Daarbij hoort dus 0,25 * input punt 0 + 0,75 * input punt 1. Dat is dus 0,25+1,50=1,75

Iha heb je een breuk A+B/C, waarvoor je dus de waarde [A] *(C-B)/C + [A+1]*B/C hoort.

Voor een matrix doe je dit idd simpelweg eerst per rij en daarna per kolom.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:26

Janoz

Moderator Devschuur®

!litemod

Ten eerste is je berekening waarschijnlijk fout. tussen 1 en 1.75 zit .75 en tussen 1.75 en 2.25 zit .5 ;)

Ik heb zelf al eens een schalings algoritme in elkaar geflanst. Het idee hiervan was dat ik een raster van de gewenste afmeting over het plaatje heenlegde. Hierbij is het belangrijk om niet naar de gridposities te kijken, maar naar de hokjes.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
MSalters schreef op 27 november 2003 @ 13:30:
Wat je moet doen is interpolatie. Voor elk punt [x] in je output moet je een input punt [x*M/N] vinden. Voor x=0 en X=N had je al ontdekt dat dat simpel is, dat zijn de eindpunten. In het midden is x*M/N een breuk, en geen valide index. De simpele interpolatie is dan bepalen welke index er kleiner is, welk groter, en die punten dan gewogen middelen. In jouw geval heb je dus output punt1, wat teruggrekend input punt 0,75 zou zijn. Daarbij hoort dus 0,25 * input punt 0 + 0,75 * input punt 1. Dat is dus 0,25+1,50=1,75

Iha heb je een breuk A+B/C, waarvoor je dus de waarde [A] *(C-B)/C + [A+1]*B/C hoort.

Voor een matrix doe je dit idd simpelweg eerst per rij en daarna per kolom.
ok, ik snap hoe je aan output punt 2 komt, maar hoe aan drie?
en van je formule zelf snap ik ni veel van :D

de vraag is eigenlijk: output punt x = combinatie van factor input Y + factor input Y2 waarbij Y2 het volgende element van de input vector is volgend op Y1

maar wat is die factor? steeds aantalelementenOude/aantalelementenNieuwe?
en wat is je startY waar je die factor moet op toepassen

Verwijderd

Topicstarter
voor de geintresseerden
khebbet zelf dan maar geprogrammeer.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function hInterpolatie(A,naar)
    ##interpoleert matrix A in horizontaal richtig toch "naar" pixels
    ## @param   naar    moet worden geschaald naar "zoveel" pixels
    win = cols(A);wout = naar;
    H = zeros(rows(A),wout);
    for i = 1 to rows(H);
        H(i,1) = A(i,1);
        H(i,cols(H)) = A(i,cols(A));
        for j = 2 to cols(H)-1;
            ci = (j-1) * (win/wout);


            H(i,j) = A(i,1+E(ci)) + (F(ci)*(A(i,E(ci)+2)-A(i,1+E(ci))));
        end;
    end;
    return H
endfunction

function vInterpolatie(A,naar)
    ##hetzelfde maar nu verticaal

    win = rows(A);
    wout = naar;
    V = zeros(wout,cols(A));
    for i = 1 to cols(V);

        V(1,i ) = A(1,i);
        V(rows(V),i)= A(rows(A),i);

        for j = 2 to rows(V)-1;
            ci = (j-1) * (win/wout);
            V(j,i) = A(1+E(ci),i) + (F(ci)*(A(E(ci)+2,i)-A(1+E(ci),i)));    
        end;
    end;
    return V;
endfunction
function interpoleer(M)
    ## algemene interpoleer functie
    ## @param   m   matrix die gaat worden geinterpoleerd
    if cols(M)>rows(M);
        H = hInterpolatie(M,berekenBreedte(M));
        V = vInterpolatie(H,cols(H));
        return V;
    else
        V = vInterpolatie(M,berekenLengte(M));

        H = hInterpolatie(V,rows(V));
        return H;
    endif;  
    ##return hInterpolatie(M,3);
endfunction

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Verwijderd schreef op 27 november 2003 @ 14:58:
[...]
ok, ik snap hoe je aan output punt 2 komt, maar hoe aan drie?
en van je formule zelf snap ik ni veel van :D

de vraag is eigenlijk: output punt x = combinatie van factor input Y + factor input Y2 waarbij Y2 het volgende element van de input vector is volgend op Y1

maar wat is die factor? steeds aantalelementenOude/aantalelementenNieuwe?
en wat is je startY waar je die factor moet op toepassen
Wat ik doe is eerst punten x1 en x2 van de input vinden waar m'n input vandaan moet komen. Dat is simpel te doen door de output index te vermenigvuldigen met de verhoduing van lengtes. Vervolgens haal ik de waardes y1 en y2 op die bij x1 n x2 horen, en trek ik een lijn door (x1,y1) en (x2,y2). Op dat lijnstuk ligt dus het punt (xi,yi) wat ik wil weten. Doe het maar op papier, zet langs de x as zowel de indices van de input en de output, teken de input waardes als grafiek van lijnstukken en lees de y waardes af voor de nieuwe x-coordinaten.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1