[VB / Grafiek] Formule voor zoeken mooi getal

Pagina: 1
Acties:

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 21-05 21:05

WhiteDog

met zwarte hond

Topicstarter
Dit is nogal moeilijk uit te leggen maar ik zal mijn best doen :)

Ik ben bezig met het maken van een engine om grafiekjes te tekenen. Voorbeeldje:
Afbeeldingslocatie: http://www.ispmonitor.be/files/graph.png

Zoals je ziet zijn er ook 5 lijntjes. Nu zou ik graag voor elk lijntje een duidelijke waarde plaatsen. Omdat de data elke keer anders is zou ik dus op een of andere manier een mooi getal moeten kunnen berekenen.

Even enkele voorbeeldjes:

Maximum getal op de grafiek: 3300

Dit geeft dan:
Lijn 1: 4000 - Lijn 2: 3000 - Lijn 3: 2000 - Lijn 4: 1000 - Lijn 5: 0

Maximum getal op de grafiek: 330

Dit geeft dan:
Lijn 1: 400 - Lijn 2: 300 - Lijn 3: 200 - Lijn 4: 100 - Lijn 5: 0

Maximum getal op de grafiek: 700

Dit geeft dan:
Lijn 1: 1000 - Lijn 2: 750 - Lijn 3: 500 - Lijn 4: 250 - Lijn 5: 0

Ik zoek dus een formule die aan de hand van een maximum getal een veelvoud van 100 of 50 berekent. Hierbij liefst ook een manier die rekening houd met het aantal lijnen zodat alles variabel is. bv. met 4 lijnen ipv 5:

Maximum getal op de grafiek: 700

Dit geeft dan:
Lijn 1: 750 - Lijn 2: 500 - Lijn 3: 250 - Lijn 4: 0

Iemand goed in wiskunde? Heb al vanalles zitten proberen in notepad maar het is nooit echt 100% correct...

Verwijderd

de 'mod' functie is het antwoord. ik geloof dat hij in basic 'mod' heet als ik het me goed herinner. wat hij doet is de rest van een hele deling geven. voorbeeld: (% = modulo)

10 % 3 is = 1 (want 3*3=9 en 10-9 = 1)

12 % 2 = 0

5 mod 3 = 2

etc. als jij 123 naar boven wilt afronden op 50 doe je dit:

123 mod 50 = 23
50-23 = 27
123 + 27 = 150

oftewel afgerond = n + (a - (n % 50))

waarbij n een willekeurige waarde is en a je afrond waarde. dus 50 in dit geval.

snappie? denk- en rekenfouten voorbehouden...

Verwijderd

Hoe je het net in VB moet doen kan ik je niet zeggen maar zo zou ik het aanpakken.

1. Bepaal de grootste waarde uit de grafiek
2. Verhoog de waarde tot je aan bv. een veelvoud van 250 komt
3. Je kent nu je bovenwaarde voor je lijnen, sinds dat dat getal zeker een veelvoud is van 250 is het ook makkelijk deelbaar door 5 en bekom je mooie getallen. Je hebt dan wel 6 lijnen ipv 5.

Ik denk dat je dan ook wel een getal kunt vinden zoals 250, maar dat ipv een veelvoud van 5 een veelvoud van 4 is. Als je zo een getal uitkiest dan heb je meteen 5 lijnen zoals je wilt met "mooie" getallen (veelvouden van je gekozen getal)

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 12:55

RayNbow

Kirika <3

code:
1
2
3
4
5
6
7
8
9
'Pseudo Code
MaxWaarde = 700
LijnAantal = 5

'Onafgerond waarde per lijn
WaardePerLijn = MaxWaarde / (LijnAantal - 1)

'Dit afronden naar boven (veelvoud van 50)
WaardePerLijn = Int( (WaardePerLijn / 50) + 0.5 ) * 50


EDIT: aaaargh, foutje met afronden naar boven... oude post rondde juist af naar dichtsbijzijnde... bah :P

Hierbij een verbeterde versie...

code:
1
2
3
4
5
6
7
8
MaxWaarde = 700
LijnAantal = 5

'Onafgerond waarde per lijn
WaardePerLijn = MaxWaarde / (LijnAantal - 1)

'Dit afronden naar boven (veelvoud van 50)
WaardePerLijn = RondAf(WaardePerLijn / 50) * 50


waarbij RondAf:

code:
1
2
3
Function RondAf(getal As Double) As Integer
    RondAf = IIf(Int(getal) = getal, getal, Int(getal) + 1)
End Function

[ Voor 54% gewijzigd door RayNbow op 04-04-2004 20:31 ]

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

@RayNbow: Mwah, dat lijkt me niet echt de oplossing. Zo kan je ook als waarde 4350 krijgen, wat ik geen mooi rond getal vind. Je afrondwaarde moet een veelvoud zijn van de (halve) ordegrootte van het getal *). Dat kan je zo doen:
1) bepaal de ordegrootte:
code:
1
Ordegrootte=log(MaxMaarde)/log(10)

2) rond dit getal naar boven af:
code:
1
Ordegrootte=Int( Ordegrootte + 0.5 )

3) Controleer of je maximum getal groter is dan de helft van de gevonden ordegrootte. Als dat het geval is, dan is je maximum lijn je ordegrootte, anders de helft daarvan:
code:
1
2
3
4
5
MaxLijnWaarde = 10^Ordegrootte
if MaxWaarde > ( MaxLijnWaarde / 2 )
  MaxLijnWaarde=MaxLijnWaarde/2
end if
WaardePerLijn=MaxLijnWaarde/5

Alle code is natuurlijk pseudo code ;)

*) De ordegrootte van een getal gebruik ik hier als het 10-tal waar hij bij hoort: De ordegrootte van 7 is 1, van 45 is 10, van 781 100, etc. Je kan deze ordegrootte ook uitdrukken in de getallen 1, 2, 3, ..., waarbij die kleine getallen de waarde zijn van n in 10^n. Omdat je hier het getal nodig hebt dat boven de maximum waarde ligt, rond je de ordegrootte naar boven af: 3.23 wordt dan 4 (10^4=10000) bijvoorbeeld.

[ Voor 23% gewijzigd door ATS op 04-04-2004 20:10 ]

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 21-05 21:05

WhiteDog

met zwarte hond

Topicstarter
Alvast bedankt voor de snelle reacties :)

ATS zijn methode komt het dichts in de buurt maar geeft soms wat overbodige resultaten. Bij bv. 4350 krijg je als maximum lijnwaaarde 8000. En hoewel er geen beter getal is krijg je dan wel een grafiek waarbij de helft leeg is. Ga dus even kijken of ik dit kan op lossen door boven de bovenste lijn wat plaats open te laten zodat er nog een stukje kan boven getekend worden :)
Pagina: 1