Reflektion an einem Dreieck und bei einem Kreis???



  • Hallo
    mein Problem ist folgendermassen,
    Ich arbeite mit dem Borland, wo ich mit einem Image so eine art Pong ausprogrammieren möchte.

    Der Ball soll an einem Körper reflektieren bei einem Rechteck ist des ja einfach,
    doch wie Prüfe ein Dreieck ( Dreieck mit LineTo und MoveTo gezeichnet), des problem ist ja ich kann ja nicht if(ball_x1==x2) machen wegen der schräge vom Dreieck.

    Genau so möchte ich gerne mit einem Kreis (Ellpise) eine Reflektion prüfen.

    Hat da einer von euch eine Idee wie ich das mit dem Dreieck und mit dem Kreis hin bekomme ?



  • Um die Kollision mit einer Geraden x\vec{x} zu prüfen, stellst Du diese in der Hesseschen Normalform dar; also
    nx=d\vec{n}\vec{x}=d
    mit
    n=1\vert \vec{n} \vert =1
    Ist p\vec{p} die Ball-Position und RR sein Radius, so ist die Kollision aufgetreten, wenn
    npd+R\vec{n}\vec{p} \leq d+R

    Bei der Ellipse wird es etwas schwieriger. Seien a\vec{a} und b\vec{b} die beiden Brennpunkte der Ellipse, so liegt ein Punkt innerhalb, wenn die Summe der beiden Abstände des Punktes zu den Brennpunkten kleiner als die große Halbachse hh der Ellipse ist.
    ap+bph\vert \vec{a}-\vec{p} \vert + \vert \vec{b} - \vec{p} \vert \leq h
    Wie man den Ball-Radius berücksichtigt, fällt mir jetzt gerade nicht ein.

    Gruß
    Werner

    PS.: die Ausrichtung der Latex-png's innerhalb einer Zeile passt nicht. Sollte mittig sein, nicht bündig an der Oberkante 😞



  • Vielen dank schon mal für deine Hilfe

    nur das problem ist ich bin nur nicht mit der höheren mathematik vertraut ^^

    aber ich versteht schon mal die Hesseschen Normalform etwas, nur noch eine frage weisste wie man diese Formel mit den Brennwert nennt damit ich in google oder wiki des mir anschaun kann.

    Aber danke nochmal für deine Hilfe 🙂



  • ER4SER schrieb:

    .. ich bin nur nicht mit der höheren mathematik vertraut

    'Hessesche Normalform' und Ellipse (Kegelschnitte) ist Oberstufe Gymnasium 😉

    ER4SER schrieb:

    .. nur noch eine frage weisste wie man diese Formel mit den Brennwert nennt damit

    Habe ich Brennwert geschrieben? Das sind die Brennpunkte. Ist doch bei Wiki alles schön erklärt. Kapitel "Ellipse als Punktmenge" erster Satz; Definition der Ellipse.

    Gruß
    Werner



  • Könnest du mir des auch evtl als Quelltext schreiben, weil ich komme einfach nicht mehr weiter so,das ist mein Dreieck.

    Image1->Canvas->Brush->Color= RGB(0,255,0);
      Image1->Canvas->Pen->Color=RGB (0,255,0);
    
      Image1->Canvas->MoveTo(0,425);
      Image1->Canvas->LineTo(100,525);
      Image1->Canvas->LineTo(0,525);
      Image1->Canvas->LineTo(0,425);
      Image1->Canvas->FloodFill(10,475, RGB (0,255,0), fsBorder);
    

    und der Ball hat die werte x1,y1,x2,y2.
    Schau dir des mal an, es ist nur eine Schräge des wäre mir schon viel wert wenn des als if-Anweisung klappen würde, einfach wenn der Ball an die Schräge ankommt.

    Danke nochmal

    Gruß Timo

    PS: ist nur Scheisse das ich nur Realschulabschluss hab 😃



  • Hallo Timo,

    Um das alles zu handeln würde ich Dir mindestens empfehlen eine Klasse für einen mathematischen Vektor zu nutzen. Du findest so was zum Beispiel in einem alten Beitrag von mir. Dort heißt er 'basic_vector<>' bzw. einfach 'Vector' für double's.

    Die Schräge geht von (0,425) nach (100,525); also steht ein Vektor (1,-1) darauf senkrecht. In Code:

    Vector n( 1, -1 ); // steht senkrecht auf der Schräge; zeigt nach außen
    n /= abs( n ); // teile durch seinen Betrag, dann ist 'n' ein Einheitsvektor
    double d = n * Vector( 0, 425 ); // (0, 425) ist ein Punkt der Schräge
    // mit 'n' und 'd' ist die Schräge jetzt festgelegt
    
    // -- Kollisions-Prüfung
    Vector posBall( x1, y1 ); // aktuelle Ball-Position
    double R = ...; // Ballradius (darf auch 0 sein)
    if( n * posBall <= d + R ) {
        // Ball hat die Schräge berührt oder ist bereits dahinter
    

    Du siehst, dass die Verwendung von so einer Vector-Klasse den großen Vorteil hat, dass man die Formeln in Code fast direkt hinschreiben kann.

    Jetzt bleibt noch, die neue reflektierte Bewegungsrichtung des Balls zu bestimmen. Weißt Du wie das geht?

    ER4SER schrieb:

    ist nur Scheisse das ich nur Realschulabschluss hab 😃

    Immerhin hast Du den; sei stolz drauf 😉

    Gruß
    Werner



  • Hallo Werner
    Sorry aber ich habe schon das Problem gelöst,
    und zwar mit der einfachen, berühmten Formel 😃 y=mx+b
    und so sieht des aus

    //schräge
      z1=1*x1+400; //x1,y1,x2,y2 ist der ball
      z2=1*x2+400; //z1 und z2 sind meine maxima grenzen
    
      if ( ( y2 >= z1 ) && ( x1 >=0 ) && ( y2 >= z2 ) )
      {
        schritt_unten=-10;
        punkte+=100;
      }
    

    und des läuft wunderbar so, aber der Programmier stil von dir ist auch mal sehr interessant.
    Diese Aufgabe was ich machen muss it ein Schulprojekt ^^, da wir C++ als Unterrichtsfach haben und des hab ich nun seid 1,5 Jahre und wir sind gerade erst mal bei Vererbung xD und so bisschen Anwendungsumgebung, da wir einen Lehrer haben der nicht von seinem Fach versteht z.b. die Methode OnKeyPress ^^

    Stolz über mein Realabschluss bin ich, wenn man davon absieht das ich mal Hauptschüler war ^^

    Wenn das nun noch mit dem Kreis reflektiert dann hab ich meine 1 Sicher ^^

    Aber danke nochmals für deine Bemühungen 😉

    Gruß Timo


Anmelden zum Antworten