Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

lightpower

Frischling

  • »lightpower« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Ludwigsburg

Beruf: Schüler

  • Private Nachricht senden

1

06.08.2016, 21:57

[gelöst] math: zahlen automatisch hoch(-runter)zählen, a -> b in ms

hallo forum,

bin gaanz neu hier und tüfftele grade ganz neu mit programmieren. in java versuche ich ein paar dinge und wollte hier ne frage loswerden.

wie schaffe ich es zb in 2000ms einen wert a=100 auf a=200 hochzuzählen (bzw.runter). rein rechnerisch ist das klar, doch wenn zb die werte dynamisch sind.
ich habe halt mehrere werte (50) in einem array momentWert[] und möchte dann neue werte reinhauen die dann in zb 2000ms erreicht werden sollen.

ich hab keene ahnung ob ich des richtig erklären kann

[0] 100 -> 2000ms -> 155
[1] 44 -> 2000ms -> 102
[2] 3 -> 2000ms -> 200
[3] 178 -> 2000ms -> 44
...
[49]200 -> 2000ms -> 3

hoffe bin hier richtig, vielleicht kann eine/r mir auf die sprünge helfen, bitte.

dange

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »lightpower« (11.08.2016, 10:35)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

07.08.2016, 08:39

Startzeit T0 messen. Aktuelle Zeit T1 messen. Differenz bilden. Durch gewünschte Intervallänge teilen. Damit ergibt sich ein Prozentwert für die bereits verstrichene Zeit. Der Rest ist simple Prozentrechnung, um von Wert A nach Wert B zu kommen. Das ist Mathematik der 9ten Klasse.

bidde
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

lightpower

Frischling

  • »lightpower« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Ludwigsburg

Beruf: Schüler

  • Private Nachricht senden

3

07.08.2016, 22:15

okay, da brauch ich noch bis ich in der 9.klasse bin, aber danke.
im prinzip ist mir des klar, naja, vielleicht doch nicht. das liegt einfach am proggen. versuche schrittweise mit kleinen projekten klar zu kommen.

ich habe 6x49 zahlen in arrays diese übergebe ich mit dem aufruf wertFade(a) an die funktion

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Fade ===
void wertFade(int a) {  
  float wertFadeInTime = wertZeit[a]*1000*wertFadeIn[a]/100; // wertFadeIn[a] in Prozent 0-100%
  float wertFadeOutTime = wertZeit[a]*1000-wertFadeOut[a]/100; // wertFadeOut[a] in Prozent 0-100%
  float wertDuringTime = millis()-wertMillis[a];
  
  if (wertDuringTime < wertFadeInTime) {
    for (int k = 0; k < 49; k++) {
      wertSpeicher[a][k] = floor( wertSpeicherToFade [a][k] * wertDuringTime / wertFadeInTime );    
    }     
  } else {
    for (int k = 0; k < 49; k++) {
      wertSpeicher[a][k] = wertSpeicherToFade [a][k];  // damit am schluss die echten schlusswerte stimmen ?!? - scheisse muss ich noch anderst mache
    }   
  }
}


aber ich denke ich habe so gebastelt, dass nichts stimmt. funktionieren tut es, aber iwie nicht von zb. 120 -> 44 , abwährts halt
aber ich werde es iwie schaffen, sind ja ferien :D

danke nochmals

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

4

08.08.2016, 00:16

im prinzip ist mir des klar, naja, vielleicht doch nicht. das liegt einfach am proggen.
Wenn man ein solches (einfaches mathematisches) Problem hat, liegt es eigentlich nicht daran, dass man das nicht programmieren kann - eher, dass die Theorie noch nicht klar ist. Das ist zumindest meine eigene Erfahrung, die aber viele andere hier bestimmt bestätigen können.

Aber ich bin mir sicher, dass sich dir helfen lässt! :) Ich beginne gleich mal, indem ich BlueCobolds knappe Antwort ein bisschen erkläre. Wenn du irgendwo rausfliegst, weil dus nicht verstehst, dann schreib, bei welchem Buchstaben.

A) Im Prinzip ist es völlig egal, wo deine Zählung beginnt oder endet - es geht nur um die Differenz und die Zeitspanne, in der dieser Unterschied zurückgelegt werden soll.

B) Wenn du in 20 Sekunden von 60 auf 100 zählen willst, musst du in 20 Sekunden 40 (100 - 60) Schritte machen.

C) Die Geschwindigkeit ist also 2 Schritte pro Sekunde bzw. 0,002 (2 / 1000) Schritte pro Millisekunde. Diese Geschwindigkeit bekommst du heraus, indem du Distanz und Zeit durcheinander teilst - genau wie in der Physik.

D) Mithilfe dieser Geschwindigkeit kannst du für jeden Zeitpunkt in deinem Fade ausrechnen, welche Distanz schon zurückgelegt wurde. Dazu nimmst du die Geschwindigkeit mit der Zeit mal.

E) Das obige Beispiel hat nach 700ms also 1,4 (700 * 0,002) Schritte "zurückgelegt". Nach 15200ms schon 30,4 (15200 * 0,002) Schritte.

F) Wenn du nicht die Distanz, sondern den absoluten (wirklichen) Wert haben möchtest, dann rechnest du den Startwert dazu: Nach 700ms ist der Fade bei 61,4 (60 + 1,4) und bei 15,2s ist der Fade bei 90,4 (60 + 30,4) Schritten angelangt.

G) Der Trick ist, dass es bei dieser Methode völlig egal ist, in welche Richtung gefadet wird. Wenn du von 150 auf 70 in 2s faden willst, dann musst du -80 (70 - 150) Schritte in 2s machen.

H) Das macht eine Geschwindigkeit von -40 Schritten pro Sekunde oder -0,04 pro Millisekunde.

I) Nach 800ms hast du dann -32 (800 * -0,04) Schritte zurückgelegt. Der absolute Wert ist dann 118 Schritte (150 + -32).

Das war auch schon die ganze Mathematik dahinter!

Deinen Programmcode verstehe ich nicht so ganz. Das liegt aber daran, dass ich nicht genau weiß, was du in welchem Array speicherst bzw. was du am Ende herausbekommen möchtest. Mein Vorschlag wäre eine Methode mit folgender Signatur:

C#-Quelltext

1
2
3
4
5
double FadeBetween(double start, double end, double fadeTime, double actualTime)
{
    // Mein Vorschlag oben Programmiert
    return absoluteFadeValue;
}
Die wendest du dann in jedem deiner Zeitschritte auf das Array an.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CeDoMain« (08.08.2016, 00:30)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

08.08.2016, 07:24

funktionieren tut es, aber iwie nicht von zb. 120 -> 44 , abwährts halt
Is klar. Du hast da in Zeile 7 ja auch eine Bedingung stehen, die das verhindert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

08.08.2016, 09:06

BlueCobold hat den Grund schon geschrieben. Du bist ja recht noch, deshalb noch ein kleiner Hinweis. Du kannst es dir erst mal einfach machen, deinen Code so behalten und machst dann eine zweite Version der Funktion um Werte zu verkleinern.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

lightpower

Frischling

  • »lightpower« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Ludwigsburg

Beruf: Schüler

  • Private Nachricht senden

7

08.08.2016, 19:57

supi danke CeDoMain und alle anderen, freu, mit deiner ausführlichen hilfe hat es geklappt.

das mit der schon vergangenen zeit war meine grube. das mein programm natürlich nicht schafft jede ms den wert zu addieren, daran hätt ich denken sollen. :huh:

kann man das sauberer machen als das:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Vars
float momentWert;

float zeit = 2000; // Zeit des Fades
float momentZeit;
float schrittZeit;

float anfangsWert = 11;
float endWert = 222;

boolean fadeAktiv = false; 

//....

// fade
void fade () {
      
  if (!fadeAktiv) {
    momentWert = anfangsWert;
    float diffWert = endWert - anfangsWert; 
    schrittZeit = diffWert / zeit;
    momentZeit = millis();
    println (momentZeit);
    fadeAktiv = true;
  } else {
    if ((millis()) < momentZeit + zeit) {
      momentWert = floor (anfangsWert + ((millis() - momentZeit) * schrittZeit)); // runden statt schneiden
    }    
  }
}


statt floor muss ich noch aufrunden, bei dem wert 222 kommt am schluss 221 raus, das bekommt ich hin.
jetzt pack ich des noch inner schleif eund dann muss des mit meinem array genauso gehn :rolleyes: :)

ich hoff ich darf hier im forum ab und an ein paar (dummi) fragen loswerden, ich möchte halt lernen und binno am anfang. 8|

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

08.08.2016, 22:51

ich hoff ich darf hier im forum ab und an ein paar (dummi) fragen loswerden, ich möchte halt lernen und binno am anfang. 8|

Fragen ist meist kein Problem, wenn die SuFu keine ordentlichen Ergebnisse bringt und man möglichst viele Infos (Was möchte ich erreichen? Was habe ich versucht?) bereitstellt.
Grundsätzlich empfehle ich Neulingen bei Problemen mit existierendem Code, der nicht wie gewünscht funktioniert, immer Rubber Duck Debugging und wenn das nicht hilft (Passiert eher selten) eine Frage mit einem SSCCE zu posten.
Wenn noch kein Code besteht hilft es auch, den Code als halben Pseudocode (Sprich nur die Function-Calls, aber noch nicht deren Implementierungen) zu schreiben. Beispielsweise:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
List<Foo> collectDataFromAgent(final URL agentURL) {
    final List<Bar> rawAgentData = getRawDataFromAgent(agentURL);
    final List<Bar> relevantData = extractRelevantData(rawAgentData);
    final List<Bar> newestData = getNewestData(relevantData, 50);
    final List<Foo> requiredData = extractRequiredValues(newestData);
    LOG.info("Collected {} data samples", requiredData.size());
    return requiredData;
}


Mit sowas verhinderst du auch direkt Premature-Optimization, weil du auf einer recht abstrakten Ebene arbeitest. Optimieren kann man dann noch hinterher, falls es nötig wird.

@David Wieso gibt es keine Java-Codetags?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

9

09.08.2016, 20:02

@Nimelrian: Bist du dir sicher, dass dein Post (inkl. Links, Code und Fachbegriffe) dem Leistungsstand des TE angemessen sind? :D Die C#-Tags funktionieren recht gut für Java.

@lightpower: Das Programm schaut gut aus. Ein paar Anmerkungen: Benenn doch die Variable momentZeit in startZeit um, denn sonst denkt man, sie würde genauso wie momentWert bei jedem Durchlauf aktualisiert. Auch der Name von schrittzeit ist missverständlich - da denke ich an eine Zeit und nicht an die Geschwindigkeit. Und dieses if-else-Konstrukt ist zwar ganz nett, doch unübersichtlich. Es sieht für mich aus, als versuchst du dafür zu sorgen, dass der if-Teil nur beim Start aufgerufen wird. Pack den doch in eine eigene Methode und den else-Teil in eine andere Methode und dann machst du eine Schleife um die 2te Methode. Und wenn du das solange laufen lässt bis die momentZeit der endZeit entspricht, dann brauchst du nicht runden. ;) Schau dir mal das hier an:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Vars
float momentWert;

float zeit = 2000; // Zeit des Fades
float startZeit;
float schritteProZeit;

float startWert = 11;
float endWert = 222;

boolean fadeAktiv = false; 

//....

// initialisiert fade
void fadeInit()
{
    momentWert = anfangsWert;
    float diffWert = endWert - anfangsWert; 
    schritteProZeit = diffWert / zeit;
    startZeit = millis();
    println (momentZeit);
    fadeAktiv = true;
}
// fade ausführen
void fade()
{
    fadeInit();
    while(millis() <= startZeit + zeit)
    {
        momentWert = floor (anfangsWert + ((millis() - momentZeit) * schrittZeit)); // runden statt schneiden
    }    
}
}
Kannst du ein bisschen mehr auf deine Ausdrucksweise achten? Das lässt sich dann leichter lesen. ;)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

10

09.08.2016, 22:05

@Nimelrian: Bist du dir sicher, dass dein Post (inkl. Links, Code und Fachbegriffe) dem Leistungsstand des TE angemessen sind?

Ja.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige