Prosta sprawa? zsynchronizowany ruch po okręgu

Prosta sprawa? zsynchronizowany ruch po okręgu
JK
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:19
0

Witam. Kula niebieska rusza się po okręgu, tak jak przedstawiłem to na obrazku (sam rysowałem :P). Mój problem polega na tym, żeby czerwona kula poruszała się bezpośrednio obok niebieskiej kuli, ale w nieco oddalonej odległości. Inaczej mówiąc, gdy kula niebieska dotrze do dolnej krawędzi okręgu po którym się porusza, czerwona też powinna się w tym samym momencie znaleźć na dolnej krawędzi swojego okręgu.

user image

Niebieska kula się porusza ładnie tym kodem:

Kopiuj
kat += (Math.PI / 124) * 2;
x += Math.cos(kat) * speed;
y += Math.sin(kat) * speed;

gdzie kąt jak sama nazwa mówi to kąt
x to położenie x kuli
y to położenie y kuli
speed to ewentualne przyspieszenie

kombinuje od 2 dni, żeby ta przeklęta czerwona kula przylegała do niebieskiej, i nie mogę wykombinować jak to zrobić, żeby była do niej przyłączona :c

Rozwiązaniem tego problemu prawie na bank będą tylko 2 linijki...

Kopiuj
x2 = ?
y2 = ?

gdzie x2 to położenie x czerwonej kuli a y2 to położenie y czerwonej kuli, eh :P

Ma ktoś pomysł jak rozwiązać tę zagadkę?

edytowany 2x, ostatnio: Jade koniem
xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
1

Ruch po okręgu.

Generalnie chcesz, żeby prędkość kątowa obu kul pozostawała taka sama. Innymi słowy pierwsza kula pokonuje drogę 2PIr1 w czasie t, a druga pokonuje 2PIr2 też w czasie t.

Czyli (po przekształceniu wzorów na prędkość): speed1 = r1*speed2/r2 :P

EDIT: tak speed1 to prędkość pierwszej kulki, a r1 to promień okręgu po którym się porusza.

edytowany 1x, ostatnio: xfin
0

https://pl.wikipedia.org/wiki/Pr%C4%99dko%C5%9B%C4%87_k%C4%85towa

Twoje kule poruszaja sie z jednakowa predkoscia liniowa wiec nie poruszaja sie synchronicznie. Musisz powiazac predkosc liniowa z odlegloscia od srodka

bogdans
Po co komu prędkość liniowa? Kule poruszają się z jednakową prędkością kątową.
JK
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:19
0
Biały Szczur napisał(a):

Musisz powiazac predkosc liniowa z odlegloscia od srodka

Problem w tym, że środek jest nieznaną wartością, której jeśli nie trzeba, to wolałbym nie szukać bo zmienia się ona z każdą zmianą kierunku kuli.
Znam współrzędne kuli niebieskiej, a co więcej, ona porusza się eliptycznie w różnych kierunkach, a czerwona powinna lecieć w tym samym kierunku w którym obecnie leci niebieska

user image

xfin napisał(a):

Czyli (po przekształceniu wzorów na prędkość): speed1 = r1*speed2/r2 :P
Eh, brzmi mądrze, ale da się to jakoś przełożyć do praktycznego zastosowania? czym są podane przez Ciebie wartości? speed1 to prędkość kuli niebieskiej? r1 to promień? :c

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

W pierwszym poście opisałeś zupełnie inny (dużo prostszy) problem:

Kula niebieska rusza się po okręgu
. Odpowiedź, którą dał @xfin dotyczy tego prostego problemu.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
0

Odnośnie drugiego obrazka to w każdym jednym momencie wyznaczałbym kierunek prostopadły do funkcji po której poruszają się kulki (prostopadły do stycznej), i odsuwał jedną kulkę na jedną stronę, a drugą na drugą.

JK
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:19
0

Serio, nie da się tej czerwonej kuli sztywno przylepić do niebieskiej bez takiego kombinowania? Czerwona kula powinna być sztywno przylepiona do niebieskiej, po jej lewej stronie, oddalona od niej aby o kawałek.
Na bank możliwe jest napisanie tego w 2 linijkach, w końcu znany jest i kierunek kuli i jej położenie... trzeba tylko przylepić do niej drugą kule, eh :P Może wcześniej nie wyjaśniłem tego wystarczająco precyzyjnie, może teraz macie jakiś pomysł? :c

Kopiuj
x2 = ?
y2 = ?
edytowany 1x, ostatnio: Jade koniem
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 16 godzin
  • Postów:3563
0

Dlaczego nie podejdziesz do tego domenowo? Tworzysz kulki, i potem dodajesz metody, dzięki którym obracasz ją wokół wspólnych punktów.

Na początek powtórka z matmy:
Ze wzorów:
x = r * sin(alfa);
y = r * cos(alfa);

gdzie:
x,y - współrzędne w kartezjańskich
r - promień okręgu
alfa - kąt

czyli:
x1 = r1 * sin(alfa);
y1 = r1 * cos(alfa);

x2 = r2 * sin(alfa);
y2 = r2 * cos(alfa);

przechodząc na przyrosty
dx1 = r1 * d(sin(d(alfa)));
dy1 = r1 * d(cos(d(alfa)));
...

gdzie:
d(sin) - zmiana sinus
d(alfa) - zmiana kąta alfa

dodatkowo trzeba uwzględnić translację
dx1 + v = r1 * d(sin(d(alfa))) + v;
dy1 + v = r1 * d(cos(d(alfa))) + v;
v - wektor przesunięcia środka

przechodząc na przyrosty wektora
dx1 + dvx = r1 * d(sin(d(alfa))) + dvx
analogicznie dla dy1

Teraz przechodzimy na Javę:

Kopiuj
public class CirclingSphere {
    private double currentX;
    private double currentY;
    private int currentDegreeNumber;
    private double radius;

    public CirclingSphere(double radius){
        this.radius = radius;
        this.currentX = 0;
        this.currentY = radius;
        this.currentDegreeNumber = 0;
    }

    public void rotate(int angleInDegrees){
        double newRadians = toRadian(currentDegreeNumber + angleInDegrees);
        double currentRadians = toRadian(currentDegreeNumber);

        this.currentX = this.currentX + (radius * getSinusDifference(currentRadians, newRadians));
        this.currentY = this.currentY + (radius * getCosinusDifferential(currentRadians, newRadians));

        this.currentDegreeNumber = this.currentDegreeNumber + angleInDegrees;
    }

    public void translate(double x, double y){
        this.currentX = this.currentX + x;
        this.currentY = this.currentY + y;
    }

    public double getX(){
        return this.currentX;
    }

    public double getY(){
        return this.currentY;
    }

    private double getSinusDifference(double currentRadians, double newRadians){
        return Math.sin(newRadians) - Math.sin(currentRadians);
    }

    private double getCosinusDifferential(double currentRadians, double newRadians){
        return Math.cos(newRadians) - Math.cos(currentRadians);
    }

    private double toRadian(int numberOfDegrees){
        return (Math.PI * numberOfDegrees)/180.0;
    }
}

Czas na testy:

Kopiuj
public class Main {
    public static void main(String[] args){
        CirclingSphere first = new CirclingSphere(1);
        CirclingSphere second = new CirclingSphere(1.25);

        Consumer<Consumer<CirclingSphere>> bothConsumer = circlingSphereConsumer -> {
            circlingSphereConsumer.accept(first);
            circlingSphereConsumer.accept(second);

            System.out.println("First:" + asString(first));
            System.out.println("Second:" + asString(second));
        };

        bothConsumer.accept((cs -> cs.translate(0.1, -0.2))); // przesuwamy do punktu 0.1;-0.2
        for(int i=0; i<12; i++){
            bothConsumer.accept(cs -> cs.rotate(30)); // obracamy o 30 stopni w kazdym kroku
        }
    }

    private static String asString(CirclingSphere circlingSphere){
        return rounded(circlingSphere.getX())+ ";" + rounded(circlingSphere.getY());
    }

    private static double rounded(double d){
        return Math.round(d * 100)/100.0;
    }
}
edytowany 1x, ostatnio: wartek01
JK
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:19
0

Poprosić człowieka, żeby drzwi otworzył, to ten ci całe wrota buduje xD Obawiam się, że nie przeczytałeś ostatniego mojego posta zanim wysłałeś swojego i niestety chyba nie do końca mnie zrozumiałeś... Także wciąż proszę o pomoc :c

W0
Jakie wrota? Przecież to jest raptem cała jedna klasa z czterema metodami publicznymi, w tym dwa z tego to gettery. To co piszesz rzeczywiście jest proste, ale w współrzędnych sferycznych (dwa promienie przy tym samym kącie). Tak się jednak składa, że potrzebujesz jednak współrzędnych kartezjańskich, więc musisz skorzystać z transformaty. Dlatego "przyklejenie" będzie problemem, bo jeśli będziesz się tylko odwoływał do wartości (x,y) to nie uzyskasz tego efektu, o jaki Ci chodzi (przy obrocie wokół punktu tory kulek są różne).
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Nie da się na sztywno przylepić czerwonej kulki do niebieskiej, bo one się poruszają z różnymi prędkościami. Jeżeli niebieska (jak sugeruje rysunek) porusza się po łukach okręgów, to musisz znać położenie środków tych okręgów.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
JK
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:19
0
bogdans napisał(a):

Nie da się na sztywno przylepić czerwonej kulki do niebieskiej, bo one się poruszają z różnymi prędkościami. Jeżeli niebieska (jak sugeruje rysunek) porusza się po łukach okręgów, to musisz znać położenie środków tych okręgów.

Eh, jesteś pewien? Jeśli tak to już chyba nic nie wykombinuje :c

A gdyby niebieska kulka się nie poruszała, tylko stała w miejscu ale obrócona w jakimś kierunku, na przykład w lewo, albo poruszała się po prostej?
user image

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Jak po prostej, to nie ma problemu:

Kopiuj
x2 = x + pewnaStała;
y2 = y + innaStała;

A zdania

A gdyby niebieska kulka się nie poruszała, tylko stała w miejscu ale obrócona w jakimś kierunku, na przykład w lewo
nie rozumiem. Kulka obrócona niczym się nie różni od kulki nieobróconej.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
JK
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:19
0
bogdans napisał(a):

Jak po prostej, to nie ma problemu:

Kopiuj
x2 = x + pewnaStała;
y2 = y + innaStała;

no tak, tylko, że ona nie zawsze rusza się tylko po prostej, i gdy tylko zmieni kierunek, ten kod już się nie przyda :c

A zdania

A gdyby niebieska kulka się nie poruszała, tylko stała w miejscu ale obrócona w jakimś kierunku, na przykład w lewo
nie rozumiem. Kulka obrócona niczym się nie różni od kulki nieobróconej.

oj, kulka czy samochód... komputer tego nie rozróżni :D i tak samo jak samochód jest zawsze w którąś stronę zwrócony, tak samo i moja kulka jest w którąś stronę zwrócona :P

JK
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:19
0

user image
taka analogia:
wiesz w którym miejscu stoi bohater, i wiesz w którą stronę jest obrócony i potrzebujesz zespawnować dla niego broń, po jego prawej stronie.
nie możesz zrobić tego w ten sposób:

Kopiuj
przedmiot.x = bohater.x -3;
przedmiot.y = bohater.y -3;

bo jak on się odwróci to wtedy te współrzędne nie będą już po jego prawej stronie. A więc pytanie, jaki będzie kod, żeby przedmiot zawsze spawnował się po jego prawej stronie?

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Jeżeli fi jest kątem o jaki obrócił się bohater, to

Kopiuj
przedmiot.x = bohater.x - 3*Math.cos(fi);
przedmiot.y = bohater.y - 3*Math.sin(fi);

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
0
bogdans napisał(a):

Nie da się na sztywno przylepić czerwonej kulki do niebieskiej, bo one się poruszają z różnymi prędkościami. Jeżeli niebieska (jak sugeruje rysunek) porusza się po łukach okręgów, to musisz znać położenie środków tych okręgów.

Po co komu prędkość liniowa? Kule poruszają się z jednakową prędkością kątową

JK
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:19
0
bogdans napisał(a):

Jeżeli fi jest kątem o jaki obrócił się bohater, to

Kopiuj
przedmiot.x = bohater.x - 3*Math.cos(fi);
przedmiot.y = bohater.y - 3*Math.sin(fi);

Wprawdzie nie to nie jest rozwiązanie, ale to dzięki temu kodowi wreszcie mi się udało to rozwiązać :D dlatego wielkie dzięki :P
A poprawnym rozwiązaniem jest:

Kopiuj
kulaCzerwona.x = kulaNiebieska.x+(odlegloscMiedzyKulami *Math.cos(kat+1.570796));
kulaCzerwona.y = kulaNiebieska.y+(odlegloscMiedzyKulami *Math.sin(kat+1.570796));

1.570796 bo tyle wynosi 90 stopni w radianach;

bogdans napisał(a):

Nie da się na sztywno przylepić czerwonej kulki do niebieskiej, bo one się poruszają z różnymi prędkościami. Jeżeli niebieska (jak sugeruje rysunek) porusza się po łukach okręgów, to musisz znać położenie środków tych okręgów.

i co, nie da się? :D

edytowany 2x, ostatnio: Jade koniem
xfin
Ale @bogdans miał wtedy rację - z informacjami, które dostarczyłeś jasno Ci to powiedział. Wg pierwszego postu chciałeś orientować kulki wg środków okręgów, a nie względem siebie.
JK
W pierwszym poście napisałem, że czerwona kulka ma się poruszać obok niebieskiej. Faktycznie mogłem precyzyjniej to określić, ale informacje, że chciałem żeby się orientowały według środków okręgu to chyba z palca wyssałeś xfin xD
xfin
@Jade koniem rysunek, który zamieściłeś w celach poglądowych właśnie to pokazywał. Dwa okręgi o wspólnym środku, brak informacji o "zwrocie" którejkolwiek kulki ;) Informacja "poruszać się obok siebie po okręgach" z tamtym rysunkiem znaczy tyle co "mieć tę samą prędkość kątową".
JK
nie tłumacz się :D
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)