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

Kolizje dowolnego trójkąta z prostokątem (zaznaczanie trójkątów)

Ostatnio zmodyfikowano 2024-11-10 17:15
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-10 17:07:35
Ja napisałem coś takiego i byłem pewien, że to zadziała. Ale nie działa. Algorytm najpierw oblicza współczynniki dwóch równań y = ax + b. Następnie szuka punku wspólnego tych prostych. Na końcu sprawdzane jest czy punkt wspólny mieści się w zakresie (bounding box) tych dwóch odcinków. Gdzieś zrobiłem bląd logiczny. Pytanie do Was gdzie popełniam błąd ?

C/C++
bool intersectionTwoLines( sf::Vector2f p1, sf::Vector2f p2, sf::Vector2f q1, sf::Vector2f q2 ) {
   
   
// first line
   
if( p1.x > p2.x ) {
       
sf::Vector2f p = p1;
       
p1 = p2;
       
p2 = p;
   
}
   
   
// second line
   
if( q1.x > q2.x ) {
       
sf::Vector2f q = q1;
       
q1 = q2;
       
q2 = q;
   
}
   
   
// p1.y = a*p1.x + b;
    // p2.y = a*p2.x + b;
    // b = p1.y - a*p1.x;
    // p2.y = a*p2.x + p1.y - a*p1.x;
    // p2.y = a(p2.x - p1.x) + p1.y;
    // a(p2.x - p1.x)  = p2.y - p1.y;
    // a = (p2.y - p1.y)/(p2.x - p1.x);
    // b = p1.y - a * p1.x;
   
    // first function y = ax + b
   
float a1, b1;
   
a1 =( p2.y - p1.y ) /( p2.x - p1.x );
   
b1 = p1.y - a1 * p1.x;
   
   
if( p2.x - p1.x < 0 ) {
       
a1 *= - 1.0f;
       
b1 *= - 1.0f;
   
}
   
   
// second function y = ax + b
   
float a2, b2;
   
a2 =( q2.y - q1.y ) /( q2.x - q1.x );
   
b2 = q1.y - a2 * q1.x;
   
   
if( q2.x - q1.x < 0 ) {
       
a2 *= - 1.0f;
       
b2 *= - 1.0f;
   
}
   
   
if( a1 == a2 )
       
 return false;
   
   
// commont point
   
sf::Vector2f center;
   
center.x =( b2 - b1 ) /( a1 - a2 );
   
center.y = a1 * center.x + b1;
   
   
// intersections
   
float min_x_line1 = min( p1.x, p2.x );
   
float min_x_line2 = min( q1.x, q2.x );
   
float min_x = min( min_x_line1, min_x_line2 );
   
   
float min_y_line1 = min( p1.y, p2.y );
   
float min_y_line2 = min( q1.y, q2.y );
   
float min_y = min( min_y_line1, min_y_line2 );
   
   
float max_x_line1 = max( p1.x, p2.x );
   
float max_x_line2 = max( q1.x, q2.x );
   
float max_x = max( max_x_line1, max_x_line2 );
   
   
float max_y_line1 = max( p1.y, p2.y );
   
float max_y_line2 = max( q1.y, q2.y );
   
float max_y = max( max_y_line1, max_y_line2 );
   
   
if( center.x <= max_x && center.x >= min_x && center.y <= max_y && center.y >= min_y )
       
 return true;
   
   
return false;
}
P-181876
DejaVu
» 2024-11-10 17:10:17
 Pytanie do Was gdzie popełniam błąd ?

Popełniasz przede wszystkim błąd, że próbujesz sam 'zaimplementować' coś, co jest 'rozwiązane' w prostszy i bardziej efektywny sposób :) A jeżeli chodzi o kod... to musisz podłubać debuggerem, albo zapytać ChatGPT gdzie zrobiłeś błąd.
P-181877
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-10 17:15:14
Ok. No dobra, skorzystam z Twojego algorytmu. W każdym bądź razie dzięki. Będę mógł wreszcie napisać kolizje z mesh'ami obiektów :-)
P-181878
1 « 2 »
Poprzednia strona Strona 2 z 2