Nicht lineare "progressbar" % berechnen

Hier wäre noch eine elegante Möglichkeit, wie ich finde:

Javascript:
class PG {
  constructor(milestones) {
    this.milestones = milestones;
    this.sum = 0;
    this.milestones2 = [];
    this.milestones.forEach(m => {
      this.sum += m;
      this.milestones2.push(this.sum);
    });
    this.milestones3 = [];
    this.milestones4 = [];
    for (let i = 0; i < this.milestones.length; i++) {
      this.milestones3[i] = this.milestones[i] / this.sum * 100.0;
      this.milestones4[i] = this.milestones2[i] / this.sum * 100.0;
    }
    console.log(this.sum, this.milestones, this.milestones2, this.milestones3, this.milestones4);
  }
  fromValueToPercent(val) {
    return val / this.sum * 100.0;
  }
  fromPercentToValue(per) {
    return per / 100.0 * this.sum;
  }
}

let progressbar = new PG([5, 1, 15, 3]);
console.log(progressbar.fromValueToPercent(23), progressbar.fromPercentToValue(62.5));

https://jsfiddle.net/z6b8xysg/

milestones4 beinhaltet dabei die Stellen, an denen eine Markierung in der Progressbar sein soll.

Es gibt auch Getter in JS/TS, aber ich wollte das jetzt nicht so aufblähen...

Schönen Abend
 
Alleine wenn ich die Namensgebung anschaue "milestones", "milestones2", "milestones3", "milestones4", dann widerstrebt es mir da eine Eleganz wahrzunehmen.

Und ich verstehe bei der Klasse in keiner Weise, was die Meilensteine überhaupt bewirken sollen. Nach wie vor ist es von Anfang bis Ende mit gleicher Steigung linear.

Ich habe es optimiert, finde ich etwas eleganter:
Code:
class PG {
  constructor(milestones) {
    this.sum = 0;
    this.milestones.forEach(m => {
      this.sum += m;
    });
  }
  fromValueToPercent(val) {
    return val / this.sum * 100.0;
  }
  fromPercentToValue(per) {
    return per / 100.0 * this.sum;
  }
}

let progressbar = new PG([5, 1, 15, 3]);
console.log(progressbar.fromValueToPercent(23), progressbar.fromPercentToValue(62.5));

Wo hier ein Zusammenhang mit Meilensteinen sein soll, v.a. unterschiedlich gewichtet in ihrem Fortschritt, kann ich mir bei bestem Willen nicht erklären. Aber darum geht es gar nicht mehr, oder?
Worum geht es dann? Code ohne Zweck schreiben?
 
Naja, das ursprüngliche Problem, das angeblich nicht-linear gewesen sein soll, ist eben doch linear.

Aber da es keine Rückmeldung mehr gab, sehe ich das als erledigt an.
 
  • Gefällt mir
Reaktionen: Murray B.
CyborgBeta schrieb:
Naja, das ursprüngliche Problem, das angeblich nicht-linear gewesen sein soll, ist eben doch linear.
Also die Gerade, die du durch die vom TE genannten Werte ziehen willst, die möchte ich sehen.

Also ich formuliere sie für dich in ein Koordinaten-System (kartesisch) um, also mit x-Ordinate und y-Ordinate, also mit 2 Dimensionen.

xy
2017
5050
10083

Wenn du das schaffst ist, ist dir der Mathematik-Nobelpreis so gut wie sicher.

Edit: Und bei allem Respekt: Dass du deine "Lösungen" (Anführungszeichen da im nicht-eigentlichen Wortsinn verwendet) hier postest ist ja das eine, aber dass die Aussagen über über das "ursprüngliche Problem" geht auf keine Kuhhaut.
 
Zuletzt bearbeitet:
tollertyp schrieb:
Das ist linear:

(x/120)*100=y

Für x=Punkte=50 müssten es allerdings 41,7% sein. Ich denke, dass sich der TE hier schlicht vertan hat.

Ansonsten zeichnet man halt eine Gerade von (0,0) nach (20,17), von (20,17) nach (50,50), von (50,50) nach (100,83) und schließlich von (100,83) nach (120,100).

Keine Raketenwissenschaft. 🤷‍♂️ Alles schön linear.
 
  • Gefällt mir
Reaktionen: Murray B.
CyborgBeta schrieb:
Für x=Punkte=50 müssten es allerdings 41,7% sein. Ich denke, dass sich der TE hier schlicht vertan hat.
Also du ziehst bei drei Punkten einfach eine Gerade, indem du eine Gerade durch zwei Punkte ziehst und dann den dritten Punkt verschiebst. Den Nobelpreis hast du sicher.

also bei
Code:
f(x) = 120 * x / 100
habe ich
xf(x) = yy soll
1720,420
506050
8399,6100

Glückwunsch, deine Formel hat nicht einen Punkt getroffen. Ich bin raus, weil ich den Unsinn, den du schreibst, ehrlich gesagt nicht mehr ertragen kann.
 
  • Gefällt mir
Reaktionen: maloz, Nilson, Murray B. und eine weitere Person
KISS Prinzip.
Wurde bereits auf Seite 2 erwähnt. Keep it simple. Du hast nur wenige "Milestones", und wenn absehbar ist dass keine weiteren hinzukommen, dann ist eine simple Lösung mit If Else Abfragen völlig akzeptabel.
 
  • Gefällt mir
Reaktionen: Gelöscht 875920
tollertyp schrieb:
Glückwunsch, deine Formel hat nicht einen Punkt getroffen. Ich bin raus, weil ich den Unsinn, den du schreibst, ehrlich gesagt nicht mehr ertragen kann.
Kein Grund, mich zu beleidigen, wenn du es nicht verstehst.

Bye
 
Dazu fällt mir nur ein: Ein Geisterfahrer? Nein hundert...
Mehr lese ich von dir definitiv nicht hier.
 
CyborgBeta schrieb:
Ansonsten zeichnet man halt eine Gerade von (0,0) nach (20,17), von (20,17) nach (50,50), von (50,50) nach (100,83) und schließlich von (100,83) nach (120,100).
Das ist genau das, was @tollertyp schon vor einigen Seiten vorgeschlagen hat. Ansonsten verstehe ich deinen Ansatz auch nicht.
 
  • Gefällt mir
Reaktionen: KitKat::new() und tollertyp
Ich lese hier bisher nur interessiert mit, aber hat der TE nicht schon längst die Lösungen ausprobiert und sich zuletzt für den Ansatz von @tollertyp entschieden? Dann muss der Thread auch nicht künstlich am Leben erhalten werden, wenn es eher in Anfeindungen ausartet.

Sofern @machhommy also zufrieden ist, sollte sich jede weitere Diskussion erübrigen, wenn sie nicht aus mathematischem Interesse und vor allem gesittet und ohne Auseinandersetzung fortgeführt wird.
 
  • Gefällt mir
Reaktionen: CyborgBeta und Murray B.
Dampfbox schrieb:
der ist vor allem gebannt :daumen:
... dann kann das alles ja kein ernsthaftes Anliegen gewesen sein. ;)
Ergänzung ()

Und irgendwie hab ich die Vermutung, die beiden könnten dieselbe Person sein. Ist aber nur eine Vermutung.
 
Zurück
Oben