12. august 2002 - 09:57Der er
6 kommentarer og 1 løsning
y-akse i graf
Hej
Jeg er ved at lave en normalt søjle diagram. Jeg har dog nogle udfordring med at beregne y-aksens maksimum og minimum.
Hvis det skulle være helt rigtigt skal den runde op til det nærmeste tal - dvs. at hvis mine y-værdier er 1, 2, 5, 8 - skulle y-aksen være inddelt med 0, 5, 10.
Det samme hvis y-værdierne er 10, 20, 30 - så skal grafen indeles som 0, 25, 50.
Du må forklare lidt... Hvad skal maksimum være? Nærmeste 10 over højeste tal? Eller er det afhængigt at størrelses-ordnen på højeste tal? Hvorfor skal listen [10,20,30] have "50" som maksimum og ikke bare "30"?
Er det noget med, at have et array af muligst maksima (hedder det det?):
maxs = [5,10,50,100,500,1000,5000,10000];
Så findes det mindste tal i array'et, som det højeste tal er større end og aksens maksimum er da index+1... øh, altså:
var i, max_num = numbers[0]; for (i = 1; i < numbers.length; i++) max_num = Math.max(max_num,numbers[i]); for (y_max = 0; maxs[y_max] < my_max; y_max++);
Så vil du til sidst have en "y_max", der er det mindste tal i maxs-arrayet større end det højeste tal i numbers-arrayet... kan det bruges?
Jeg tror at barklund har fat i det rigtige, men kan det ikke lade sig gøre uden at have en array med 'maksima'? Dvs. at beregne det næste 'runde' tal...
Tjo... Hvis næste "runde" tal er som jeg har skrevet, så har jeg lige digtet:
Math.nextRound = function(num) { var f = 5*Math.ceil(num/(5*Math.pow(10,num.toString().length-1))); var z = Math.pow(10,num.toString().length); return int (String(f)+String(z).substr(2)); } trace(Math.nextRound(29)); trace(Math.nextRound(499)); trace(Math.nextRound(501));
var numToString = num.toString(); // streng af tallet
var powerToNumLength = Math.pow(10,numToString.length-1); // Et 1-tal efterfulgt af et nul færre, end num har cifre
var numAsDecimal = num/powerToNumLength; // vil indeholde num hvor "," står lige efter det første ciffer: // 45638 => 4,5638 // 875 => 8,75
var factor = 5; // faktor til at fortælle hvilke indeks mellem 1 og 10 der er interessante // her er det "5" og "10" der bliver udvalgt.
var maxIndex = factor*Math.ceil(numAsDecimal/factor); // Finder det indeks mellem 1 og 10 som er større end numAsDecimal // og som factor går op i. Vil her give "5" eller "10"
var zeroes = powerToNumLength.toString().substr(1); // en streng af nuller, med et nul færre end cifre i num
var maxAsString = maxIndex.toString()+zeroes; // streng med funden maximum ("5" eller "10") // efterfulgt af alle nullerne
return int(maxAsString); // returneres som int }
/Barklund
Synes godt om
Ny brugerNybegynder
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.