Schaal van grafiek bepalen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Ik heb een tool gemaakt die data opneemt van een installatie en in een grafiek uit kan zetten. Vervolgens kan ik inzoomen, met een cursor over de data lopen etc. Het werkt prima, maar ik zit alleen een beetje met het automatisch bepalen van een schaal voor de grafiek.

Ik heb mijn grafiek opgedeeld in 4 vlakken voor de y waarden. Discrete signalen vang ik af en plaats ik op de 25% en 75% lijnen. Dit met name om de analoge signalen niet te verstoren. Bij de analoge signalen moet de max ongeveer binnen de 75% en 100% lijn vallen en de min binnen de 0% en 25% lijn. Oftewel, ze moeten minimaal de helft van de grafiek beslaan.

Wat ik had bedacht is om een marge van 10% boven en onder de max en min aan te houden. Maar dan krijg je waarden die niet netjes afgerond zijn. Zeker niet als een signaal van 0..100%, werkelijke waarden van tussen de 5.2 en 96.2% heeft.

Aangezien ik 4 vakken heb denk ik dat ik moet afronden naar een getal dat deelbaar is door 4, maar ik kan hier nog geen methode voor bedenken. Soms ligt het signaal tussen de -0.1 en 0.5 en soms tussen de 25000 en 35000.

Kan iemand mij een zetje in de rug geven hoe ik dit aan zou moeten pakken?

You don't have to be crazy to do this job, but it helps ....

Beste antwoord (via Alain op 13-12-2021 19:55)


  • oohlaf
  • Registratie: Oktober 2012
  • Laatst online: 13:47
Zoiets wellicht om de dichtstbijzijnde veelvoud van 4 te vinden van de y-as?

https://www.geeksforgeeks.org/multiple-of-x-closest-to-n/

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • oohlaf
  • Registratie: Oktober 2012
  • Laatst online: 13:47
Zoiets wellicht om de dichtstbijzijnde veelvoud van 4 te vinden van de y-as?

https://www.geeksforgeeks.org/multiple-of-x-closest-to-n/

Acties:
  • 0 Henk 'm!

  • AlphaRomeo
  • Registratie: Maart 2007
  • Laatst online: 17:33

AlphaRomeo

FP PowerMod
Het dichtstbijzijnde getal deelbaar door vier zou iets zijn als Round(x/4)*4 toch? Als je het eerstvolgende deel wilt wordt het Ceiling(x/4)*4.

Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Ik heb naar aanleiding van jullie tips iets werkbaars gemaakt (bedankt hiervoor!). Het is alleen nog lang niet perfect. Ik reken nu mijn delta om naar een getal tussen de 75 en 100%, neem daar het gemiddelde van en zoek naar het dichtstbijzijnde veelvoud van 4. Daarna reken ik weer terug naar de originele delta. Met name voor een grote delta is dit niet ideaal.

Als iemand nog een algoritme weet voor deze casus houd ik me aanbevolen.

You don't have to be crazy to do this job, but it helps ....


Acties:
  • +1 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Ik heb inmiddels de oplossing weten te verbeteren. Allereerst heb ik losgelaten dat ik moet kijken naar de delta tussen max en min. Ik bereken nu de max en min onafhankelijk van elkaar. Vervolgens bepaal ik de multiple naar aanleiding van de grootte van de delta. Ik heb de functie ook aangepast zodat negatieve getallen goed werken en dat de functie altijd een hogere waarde oplevert ingeval van max en een lagere waarde in geval van min.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
private double bestMultiple(double n, double x, boolean isMin) {  
    double y = n;
    if (y >= 0) {
        y = y + x / 2;
        y = y - (y % x);
    } else {
        y = y - x / 2;
        y = y + (y % x);
    }
    if (!isMin && n > y) y += x;
    if (isMin && n < y) y -= x;
    return y;
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    max += margin;
    min -= margin;

    double multiple;
    if ((max - min) > 10000.0) {
        multiple = 2500.0;
    } else if ((max - min) > 1000.0) {
        multiple = 250.0;
    } else if ((max - min) > 100.0) {
        multiple = 25.0;
    } else if ((max - min) > 10.0) {
        multiple = 2.5;
    } else if ((max - min) > 1.0) {
        multiple = 0.25;
    } else if ((max - min) > 0.1) {
        multiple = 0.025;
    } else {
        multiple = 0.0025;
    }

    max = bestMultiple(max, multiple, false);
    min = bestMultiple(min, multiple, true);


Bedankt @oohlaf en @AlphaRomeo !

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

Je zou nog de log functie kunnen gebruiken om de orde grootte van het verschil tussen min en max te bepalen, en daarmee je multiple te berekenen. Dat scheelt dan weer die lijst van if-else statements.

Edit: In java is dat dan de Math.log10 method.

[ Voor 11% gewijzigd door WormLord op 14-12-2021 17:36 ]

Pagina: 1