Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przecięcie się dwóch elips

Ostatnio zmodyfikowano 2024-05-03 01:16
Autor Wiadomość
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.

C/C++
bool collisionTwoElipses( float x1, float y1, float rx1, float ry1, float x2, float y2, float rx2, float ry2 );
P-180995
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ę:

C/C++
#include <cmath>

bool collisionTwoElipses( float x1, float y1, float rx1, float ry1, float x2, float y2, float rx2, float ry2 ) {
   
// Obliczamy odległość między środkami elips
   
float dx = x2 - x1;
   
float dy = y2 - y1;
   
float d = sqrt( dx * dx + dy * dy );
   
   
// Sprawdzamy czy suma promieni jest większa niż odległość między środkami elips
   
if( d <= rx1 + rx2 && d <= ry1 + ry2 ) {
       
// Jeśli tak, to elipsy przecinają się
       
return true;
   
} else {
       
// W przeciwnym razie nie przecinają się
       
return false;
   
}
}
P-180996
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.
P-180998
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-03 01:16:54
Poprawny kod na przecięcie sie dwóch elips :-)

C/C++
# define M_PI 3.14159265358979323846

bool pointInEllipse( float px, float py, float cx, float cy, float rx, float ry ) {
   
// Sprawdza, czy punkt (px, py) znajduje się wewnątrz elipsy o środku (cx, cy) i półosiach rx, 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;
   
   
// Sprawdzenie punktów na pierwszej elipsie względem drugiej elipsy
   
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;
       
}
    }
   
   
// Sprawdzenie punktów na drugiej elipsie względem pierwszej elipsy
   
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;
       
}
    }
   
   
// Brak przecięcia
   
return false;
}
P-181000
« 1 »
  Strona 1 z 1