tBane Temat założony przez niniejszego użytkownika |
Przecięcie się dwóch elips » 2024-05-01 20:18:53 Witam. Potrzebuje instrukcji warunkowej dla przecięcia się dwóch elips opisanych przez ich punkty środkowe oraz promienie. bool collisionTwoElipses( float x1, float y1, float rx1, float ry1, float x2, float y2, float rx2, float ry2 );
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-01 20:37:34 nie wiem czy to poprawne ale Chat GPT zasugerował taką funkcję: #include <cmath>
bool collisionTwoElipses( float x1, float y1, float rx1, float ry1, float x2, float y2, float rx2, float ry2 ) { float dx = x2 - x1; float dy = y2 - y1; float d = sqrt( dx * dx + dy * dy ); if( d <= rx1 + rx2 && d <= ry1 + ry2 ) { return true; } else { return false; } }
|
|
DejaVu |
» 2024-05-02 16:40:42 ChatGPT 4: Kod, który podałeś, nie jest poprawny do wykrywania przecięć między dwoma elipsami. Próbujesz oceniać przecięcie dwóch elips na podstawie odległości między ich środkami i sumy ich "promieni" wzdłuż osi x i y, co jest podejściem stosowanym raczej dla okręgów, a nie elips. Elipsy są bardziej skomplikowane w analizie ze względu na ich geometryczne właściwości i różne kształty w zależności od orientacji.
Wykrywanie przecięcia dwóch elips jest znacznie trudniejsze, niż to sugeruje ten fragment kodu. Zamiast porównywać odległości i "promienie" można podejść do problemu na kilka bardziej zaawansowanych sposobów:
1. **Geometria analityczna**: Można zapisać równania obu elips w układzie współrzędnych, a następnie rozwiązać system równań w celu znalezienia punktów przecięcia. Jeśli system nie ma rozwiązania, elipsy się nie przecinają.
2. **Aproksymacja numeryczna**: Użyć metod numerycznych do znalezienia punktów przecięcia równań elips.
3. **Biblioteki graficzne lub matematyczne**: Wykorzystać gotowe funkcje z bibliotek, które obsługują operacje na elipsach, takie jak biblioteki graficzne (na przykład w językach programowania jak Python z biblioteką `matplotlib` lub `shapely`).
Przykładowe równanie elipsy w układzie współrzędnych to: [ \frac{(x - h)^2}{a^2} + \frac{(y - k)^2}{b^2} = 1 \] gdzie \((h, k)\) to współrzędne środka elipsy, \(a\) to połowa szerokości (promień wzdłuż osi x), a \(b\) to połowa wysokości (promień wzdłuż osi y).
Aby dokładnie zbadać przecięcie dwóch elips, można by spróbować rozwiązać dwa powyższe równania względem siebie. W przypadku, gdy nie jesteś pewien, jak to zaimplementować, mogę pomóc w stworzeniu takiego rozwiązania w innym języku programowania, który lepiej nadaje się do obliczeń numerycznych, na przykład Python.
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-03 01:16:54 Poprawny kod na przecięcie sie dwóch elips :-) # define M_PI 3.14159265358979323846
bool pointInEllipse( float px, float py, float cx, float cy, float rx, float ry ) { return( std::pow( px - cx, 2 ) / std::pow( rx, 2 ) ) +( std::pow( py - cy, 2 ) / std::pow( ry, 2 ) ) <= 1; }
bool intersectionsTwoEllipses( float x1, float y1, float rx1, float ry1, float x2, float y2, float rx2, float ry2 ) { const int numPoints = 100; for( int i = 0; i < numPoints; ++i ) { float angle = 2 * M_PI * i / numPoints; float px = x1 + rx1 * std::cos( angle ); float py = y1 + ry1 * std::sin( angle ); if( pointInEllipse( px, py, x2, y2, rx2, ry2 ) ) { return true; } } for( int i = 0; i < numPoints; ++i ) { float angle = 2 * M_PI * i / numPoints; float px = x2 + rx2 * std::cos( angle ); float py = y2 + ry2 * std::sin( angle ); if( pointInEllipse( px, py, x1, y1, rx1, ry1 ) ) { return true; } } return false; }
|
|
« 1 » |