Avatar billede rthuls Nybegynder
27. april 2004 - 14:00 Der er 12 kommentarer og
2 løsninger

hvor stor procentdel er masket

Jeg har følgende skrabespils funktion. Kan det lade sig gøre at checke, hvor stor en procentdel af billedet er syneligt/masket?

this.createEmptyMovieClip("square", 10);
var size = 25;
function drawSquare() {
    x = _root._xmouse;
    y = _root._ymouse;
    with (this.square) {
        moveTo(x-size, y-size);
        beginFill(0x000000);
        lineTo(x+size, y-size);
        lineTo(x+size, y+size);
        lineTo(x-size, y+size);
        endFill();
    }
}
image.setMask(_root.square);
this.onMouseMove = function() {
    drawSquare();
    updateAfterEvent();
};
Avatar billede barklund Nybegynder
27. april 2004 - 15:29 #1
Det ville godt nok være et helvede at skulle beregne. Men det skal da nok kunne lade sig gøre. Du kan jo ikke bare tælle "antallet" af tegnede firkanter, for de vil jo lappe over hinanden...
Avatar billede jakwag Nybegynder
27. april 2004 - 16:23 #2
jeg fik lige en ide, men som jeg godt var klar over er det noget tungt lort:

this.createEmptyMovieClip("square", 10);
var size = 25;
function drawSquare()
{
    x = _root._xmouse;
    y = _root._ymouse;
    with (this.square)
    {
        moveTo(x - size, y - size);
        beginFill(0x000000);
        lineTo(x + size, y - size);
        lineTo(x + size, y + size);
        lineTo(x - size, y + size);
        endFill();
    }
}
image.setMask(_root.square);
this.onMouseDown = function()
{
    this.onMouseMove = function()
    {
        drawSquare();
        updateAfterEvent();
    };
};
this.onMouseUp = function()
{
    checkProcent();
    delete this.onMouseMove;
};
//****************
function checkProcent()
{
    w = image._width;
    h = image._height;
    x = image._x;
    y = image._y;
    pixels = 0;
    hit = 0;
    for (var i = x; i <= x + w; i++)
    {
        for (var j = y; j <= y + h; j++)
        {
            pixels++;
            if (square.hitTest(i, j, false))
            {
                hit++;
            }
           
        }
    }
    p = hit/pixels*100;
    txtProcent.text = p;
}

Og så virker det ikke engang. Jeg kan åbenbart ikke finde ud af at bruge hitTest. Den rammer bounding boxen og ikke selve shapen selvom jeg har sat den til false. Kan det ikke lade sig gøre?? Det synes jeg at jeg har gjort før...

: ) Jakob
Avatar billede jakwag Nybegynder
27. april 2004 - 16:24 #3
hvis man vil have en lidt hurtigere estimated:

function checkProcent()
{
    w = image._width;
    h = image._height;
    x = image._x;
    y = image._y;
    pixels = 0;
    hit = 0;
    for (var i = x; i <= x + w; i+=10)
    {
        for (var j = y; j <= y + h; j+=10)
        {
            pixels++;
            if (square.hitTest(i, j))
            {
                hit++;
            }
           
        }
    }
    p = hit/pixels*100;
    txtProcent.text = p;
}
Avatar billede jakwag Nybegynder
27. april 2004 - 16:32 #4
tja, den havde jeg da fået helt omvendt opfattet.

Det burde jo være:
function checkProcent()
{
    w = image._width;
    h = image._height;
    x = image._x;
    y = image._y;
    pixels = 0;
    hit = 0;
    for (var i = x; i <= x + w; i++)
    {
        for (var j = y; j <= y + h; j++)
        {
            pixels++;
            if (square.hitTest(i, j, true))
            {
                hit++;
            }
           
        }
    }
    p = hit/pixels*100;
    txtProcent.text = p;
}

Men så virker det slet ikke, kan man ikke lave en hittest på noget som er tegnet dynamisk?
Avatar billede jakwag Nybegynder
27. april 2004 - 16:44 #5
hhmm... jo, det kan man godt. Det virker faktisk. men ikke hvis man sætter maske med et script: image.setMask(_root.square);

men hvis man laver et mc på timelinen som man kalder for "square" og laver det til en maske, så funger det.
Avatar billede rthuls Nybegynder
27. april 2004 - 18:41 #6
God ide jakwag!
Desværre er den så kompleks, at min maskine næsten ikke kan trække den :-(

Har i nogle alternative løsninger til hvordan man kan checke om brugeren har skrabet nok af pladen til at man kan gå videre?
Avatar billede barklund Nybegynder
27. april 2004 - 19:23 #7
Man kunne også have et 2D array, som havde lige så mange celler som pilledet have pixels og som var 0 fra starten. Når man så tegner en firkant, så sætter man de size*size felter i array til 1. Når man slipper den, så kan man tæller 1'er fremfor 0'er.

Men det vil blive et stort array  - 200*200 pixels giver et array med 40000 felter.

Måske man skulle have et felt for hver 5 eller 10 pixels. Samme optimering kunne man lave med jakobs ide.
Avatar billede jakwag Nybegynder
28. april 2004 - 08:52 #8
ja, hastigheden vil nok ikke blive stort bedre af at det er en array den skal loope igennem. Og ja, som jeg skrev tidligere kan man lave en estimeret ved at nøjes med hver 10.
Avatar billede barklund Nybegynder
28. april 2004 - 09:56 #9
Jeg tror nu at opslå på en fixed værdi i et array er hurtigere end at beregne en hittest. Det kan jeg laves som et faked 2d array i 1d - altså bare en lang liste, hvor man selv kender offset. Det gør meget hurtigere end et rigtigt 2d. Men ja, prøv :)
Avatar billede rthuls Nybegynder
28. april 2004 - 16:59 #10
Jeg prøver at lege videre med det.

Jakwag smider du ikke også et svar, så kan i dele.
Avatar billede jakwag Nybegynder
29. april 2004 - 10:18 #11
svar...
Avatar billede rthuls Nybegynder
29. april 2004 - 10:35 #12
Sådan der.

Tak for jeres input!
Avatar billede barklund Nybegynder
29. april 2004 - 12:03 #13
Tak for points
Avatar billede jakwag Nybegynder
29. april 2004 - 12:25 #14
thanks!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester