(relativ) einfache frage, kreis- und geradengleichungen
-
Hallo,
Ich versuche gerade mit c++ einen kleinen "raytrayer" im zweidimensionalen Raum zu schreiben.
void RaySchiessen( float SchnittWinkel ) { // DEBUG -> float KreisMittelPunktX = 400.f; float KreisMittelPunktY = 400.f; float KreisRadius = 200.f; // <- DEBUG float PunktX = 1.f; float PunktY = 1.f / tan(SchnittWinkel); float GeradenSteigung = PunktY / PunktX; // walk along ray for( float i = 0; i <= WindowSizeX; i += 1.f ) { float GeradePunktX = i; float GeradePunktY = GeradenSteigung * GeradePunktX; if( GeradePunktY >= WindowSizeY ) break; App.Draw( sf::Shape::Rectangle( GeradePunktX, GeradePunktY, GeradePunktX + 1, GeradePunktY + 1, sf::Color( 255, 0, 0, 255 )) ); if( std::sqrt( std::pow( GeradePunktY - KreisMittelPunktY, 2 ) + pow( GeradePunktX - KreisMittelPunktX, 2 ) ) <= KreisRadius ) { App.Draw( sf::Shape::Rectangle( GeradePunktX - 2, GeradePunktY - 2, GeradePunktX + 2, GeradePunktY + 2, sf::Color( 255, 255, 255, 255 )) ); break; } } }
Das ist meine Funktion, mit der ich die Rays schiesse. ( Als Parameter hat sie den Schnittwinkel zur y-achse ).
Nun wollte ich aber nicht jeden Punkt auf der Geraden entlang"laufen" sondern das ein bisschen besser lösen.. mit den Geraden- und Kreisgleichungen.
Mit meinem Test hats schon relativ gut geklappt:
Gerade: y=-0,5x + 2 Kreis: (x-4)² + (y-1)² = 25 ( x - 4 )² + ( 2 - 0,5x -1)² = 25 ( x - 4 )² + ( 1 - 0,5x )² = 25 x² - 8x + 17 - x + 0,25x² = 25 1,25x² - 9x + 17 = 25 1,25x² - 9x = 8 1,25( x² - 7,2x ) = 8 x² - 7,2x = 6,4 x² - 7,2x - 6,4 = 0
und dann eben mit pq-formel ergebniss gekriegt, hat gepasst.
Nun muss ich aber wohl oder übel das gleiche mit variablen machen.
Gerade: y=m*x + t Kreis: (x-a)² + (y-b)² = c ( x - a )² + ( ( m * x + t ) - b )² = c
und jetzt muss ich DAS irgendwie auf die Form einer quadratischen Gleichung bringen..
Leider weiß ich garnicht wie ich das anstellen soll, villeicht kann mir ja hier jemand helfen? (:
-
Ganz einfach genauso mit den Variablen rechnen, wie mit den Zahlen. Wie in der Schule:
( x - a )² + ( ( m * x + t ) - b )² = c x² -2ax + a² + (mx + (t-b))² = c x² -2ax + a² + m²x² + 2 (t-b) m x + (t-b)² = c (1+m²)x² + (2 m (t-b) - 2a)x + (a² + (t-b)²) = c x² + ((2m(t-b))/(1+m²)) x + (a² + (t-b)²)/(1+m²) = c/(1+m²) x² + ((2m(t-b))/(1+m²)) x + ((a² + (t-b)² - c)/(1+m²)) = 0
-
Ich würde Vektoren zur Berechnung verwenden.
In deinem Programm kannst du keine "senkrechten" Geraden
behandeln.