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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

19.09.2012, 08:14

Hier das Problem: Die Bogenlänge eines Kreisbogens ist, wie wir alle wissen, proportional zu seinem Radius. Wenn du 180 Grad pro Sekunde zurücklegen willst, musst du also je nach Radius unterschiedlich schnell unterwegs sein. Je Größer der Radius, desto schneller musst du dich bewegen, um die 180 Grad zu schaffen...

Was die Division durch Null betrifft: Stell einfach sicher, dass der Radius nie kleiner oder gleich Null wird...

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

12

19.09.2012, 10:40

Du kannst doch nicht einfach 1 hinzuaddieren, nur damit der Wert nicht null ist. Da bekommst du doch ein ganz anderes, falsches Ergebnis raus.

Aber ich muss mich entschuldigen. Meine Formel hat nicht gestimmt...

Wenn du willst, dass der Punkt 100 Pixel/s zurücklegen soll, musst du den Winkel berechnen, der Abhängig vom Radius zurückgelegt wird. Dann macht der Punkt bei einem sehr kleinen Kreis sehr viele Umdrehungen und bei einem sehr großen sehr wenig Umdrehungen.

vWinkel = vBahn/(radius*2*PI)*360

beispiel:
bei einem Radius von 200 Pixeln und einer Bahngeschwindigkeit von 100 Pixel/s:
100/(200*2*PI)*360 = 28,65°/s

bei einem Radius von 10 Pixeln und einer Bahngeschwindigkeit von 100 Pixel/s:
100/(10*2*PI)*360 = 573°/s

bei einem Radius von 200 Pixeln und einer Bahngeschwindigkeit von 10 Pixel/s:
10/(10*2*PI)*360 = 57,3°/s

Ich habe mal das Gradmaß verwendet, weil die meisten besser damit klar kommen. Hier nochmal mit dem Bogenmaß:

bei einem Radius von 200 Pixeln und einer Bahngeschwindigkeit von 100 Pixel/s:
100/(200*2*PI)*PI*2 = 0,5rad/s

bei einem Radius von 10 Pixeln und einer Bahngeschwindigkeit von 100 Pixel/s:
100/(10*2*PI)*PI*2 = 10rad/s

bei einem Radius von 200 Pixeln und einer Bahngeschwindigkeit von 10 Pixel/s:
10/(10*2*PI)*PI*2 = 1rad/s

Wenn du weitere Erläutungen brauchst kann dir dein Physiklehrer sicher weiter helfen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

19.09.2012, 11:08

Ich bin mir nicht sicher, ob Foaly wirklich weiß, was er eigentlich will. Erst will er konstante Bahngeschwindigkeit (also zurückgelegte Strecke pro Zeit) und dann wieder will er konstante Winkelgeschwindigkeit (absolvierte Runden pro Zeit). Das widerspricht sich natürlich, wie dot schon gesagt hat, sobald sich der Radius ändert.
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

14

19.09.2012, 12:13

Ich glaube er will zwar konstante Bahngeschwindigkeit haben, aber ist sich nicht sicher welche Geschwindigkeit er möchte. Ich verstehe es so, dass er möchte, dass die Geschwindigkeit so hoch ist, dass sie bei einem Beispiel Winkel eine halbe Drehung pro Sekunde schafft. Quasi einfach um die Geschwindigkeit festzulegen. Nun dafür wurde die Formel doch genannt. Damit kannst du dir die Geschwindigkeit doch ausrechnen. Dann setzt du alles in die andere Formel ein, welche von deinem Programm dann berechnet wird.
Für dein Problem mit der 0. 0° und 360° sind doch das selbe. Mit dem Wissen sollte es recht einfach zu schaffen sein das Problem zu lösen;)
„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.“

15

19.09.2012, 21:28

Naja die Sache ist tatsächlich so einfach wie sie sich anhört. Ich will das ein Punkt sich um einen anderen Punkt dreht. Dabei verändert sich der Radius gelegentlich. Der Punkt soll sich aber trotzdem mit einer konstanten Geschwindigkeit bewegen. Mich habe die Begriffe Winkelgeschwindigkeit und Bewegungsgeschwindigkeit ein bisschen verwirrt und deshalb ist es wahrscheinlich son bisschen komisch rübergekommen. Die Rotation berechne ich so das ich den Winkel pro Frame erhöhe. Aber das führt ja dazu das die Geschwindigkeit des Punktes erhöht, wenn sich der Radius verlängert.(was ich ja nicht will :D)
Muss ich nun um eine konstante Geswchindigkeit zu haben folgende Formel ausrechnen und zum Winkel hinzuaddieren?

C-/C++-Quelltext

1
vWinkel = vBahn/(radius*2*PI)*360

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

16

19.09.2012, 21:53

Genau ;)

Und vBahn kannst du frei wählen. Man kann so keine Aussage darüber machen, wie der Wert sein muss, um x Drehungen pro Sekunde bei einem Radius r zu bekommen, da nicht klar ist, wie du vWinkel weiterverwendest.

Generell ist es bei physikalischen Problemen immer ratsam, sich vor Augen zu führen, was man gegeben hat und was man berechnen möchte.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

19.09.2012, 22:22

Spannend ist, dass diese Formel noch immer nicht wirklich stimmt. Die Geschwindigkeit auf einer Bahn mit Radius r, die wird in der Tat nach der gegebenen Formel berechnet. Ändert man aber den Radius von z.B. r1=3 Einheiten auf r2=6 Einheiten, dann reicht es nicht, nur den Winkel nach der Geschwindigkeit für r1 oder r2 zu berechnen, denn der Weg von r1 nach r2 beträgt mindestens 3 Einheiten PLUS den eigentlichen Winkel. Bei einer Geschwindigkeit von z.B. v=2 wäre das ein Problem, denn der Weg wäre länger, als er sein dürfte. Solange die Radien im Vergleich zur Bahngeschwindigkeit nur langsam verändert werden, solange wird die Diskrepanz aber nicht auffallen.

Worum geht es denn eigentlich konkret? Welche Simulation soll hier durchgeführt werden? Eventuell braucht man ja auch einen komplett anderen Ansatz!
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]

18

19.09.2012, 22:32

Hahaha es hört sich vielleicht witzig an, aber es ist genau so billig wie es sich anhört. Hier mein Code:

C-/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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <SFML/Graphics.hpp>
#include <iostream>
#include <cmath>


int main()
{
    sf::RenderWindow window(sf::VideoMode(1024, 768), "Circle");

    window.setFramerateLimit(60);

    sf::RenderTexture m_RenderTexture;
    m_RenderTexture.create(window.getSize().x, window.getSize().y);
    sf::Sprite m_RenderSprite;
    sf::Vector2f HalfWindowSize(window.getSize() / 2u);


    float theta = 0.0;
    float radius = 1.0;
    sf::CircleShape circle;
    circle.setOutlineThickness(1);
    circle.setOutlineColor(sf::Color::Black);
    circle.setRadius(50);
    circle.setPosition(HalfWindowSize.x - circle.getRadius() / 2, HalfWindowSize.y - circle.getRadius() / 2);


    sf::Clock FrameClock;
    float fTime;
    sf::Vector2f point1(100, 100);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close Event
            if (event.type == sf::Event::Closed)
                window.close();

            // Escape key pressed
            if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
                window.close();

        }

        fTime = FrameClock.restart().asSeconds();
//        std::cout << "Framerate: " << 1 / fTime << std::endl;

        theta += 5 / (radius * 2 * M_PI) * 2 * M_PI;//+= 5 * fTime;
        std::cout << "Theta: " << theta << std::endl;

        radius += 10 * fTime;

        sf::Vector2f PointToRotate(HalfWindowSize.x - radius, HalfWindowSize.y - radius);

        circle.setPosition(cos(theta) * (PointToRotate.x - HalfWindowSize.x) - sin(theta) * (PointToRotate.y - HalfWindowSize.y) + HalfWindowSize.x, sin(theta) * (PointToRotate.x - HalfWindowSize.x) + cos(theta) * (PointToRotate.y - HalfWindowSize.y) + HalfWindowSize.y);

        m_RenderTexture.draw(circle);
        m_RenderTexture.display();

        window.clear();
        m_RenderSprite.setTexture(m_RenderTexture.getTexture());
        window.draw(m_RenderSprite);
        window.display();
    }

    return 0;
}

Allerdings funktioniert es immer noch nicht richtig. Statt mit zunehmendem Radius schneller zu werden wir der Punkt jetzt mit zunehmendem Radius langsamer.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

19

19.09.2012, 22:46

Allerdings funktioniert es immer noch nicht richtig. Statt mit zunehmendem Radius schneller zu werden wir der Punkt jetzt mit zunehmendem Radius langsamer.


Und wo ist das Problem? Das wolltest du doch. Du wolltest eine konstante Bahngeschwindigkeit. Die hast du jetzt, wodurch es dir so erscheint, als ob der Punkt langsamer werden würde.

20

19.09.2012, 22:57

Aaah ok! Ich verstehe. Dann reden wir immer noch an einander vorbei. Was ich versuche zu erreichen ist das der Punkt bei egal welchem Radius in z.b.: 2 Sekunden einen kompletten Kreis macht. Wie würde ich das realisieren?

Werbeanzeige