Berechnung der Schnittpunkte Gerade Kreis (in C++!)



  • Hi,

    Aufgabe ist es die Schnittpunkte und die Schnittpunktanzahl zu berechnen.

    Vorgegeben ist vom Kreis der Mittelpunkt und der Radius. Von der Geraden bekommen wir den Start und die Richtung jeweils in Koordinaten.

    Ich benutzte die Anleitung unter Link 1.
    Dazu habe ich die Gerade von der Zweipunkteform in die Koordinatenform gebracht nach der Anleitung in Link 2.

    //Zweipunkteform in Korrdinatenform bringen
    	float a = pointLine[1] - lineDirection[1];
    	float b = lineDirection[0] - pointLine[0];
    	float c = lineDirection[0] * pointLine[1] - pointLine[0] * lineDirection[1];
    
    	// d = c-ax0 - by0
    	float d = c - a*m_centerCircle[0] - b*m_centerCircle[1];
    	float dsquare = d*d;
    	float innerterm = (a*a + b*b);
    	float leftterm = m_circleRadius * m_circleRadius * innerterm;
    
    	if (leftterm >= dsquare) { //2 Schnittpunkte
    		m_computedIntersectionPoints = 2;
    		float sqrtterm = sqrt(leftterm - dsquare);
    		float x1 = m_centerCircle[0] + ((a*d + (b * sqrtterm)) / innerterm);
    		float x2 = m_centerCircle[0] + ((a*d - (b * sqrtterm)) / innerterm);
    		float y1 = m_centerCircle[1] + ((b*d + (a * sqrtterm)) / innerterm);
    		float y2 = m_centerCircle[1] + ((b*d - (a * sqrtterm)) / innerterm);
    		m_intersectionPoints[0][0] = x1;
    		m_intersectionPoints[0][1] = y1;
    		m_intersectionPoints[1][0] = x2;
    		m_intersectionPoints[1][1] = y2;
    	}
    	else {
    		if (leftterm - dsquare < 0.001f) { // ein Schnittpunkt
    			m_computedIntersectionPoints = 1;
    			float sqrtterm = sqrt(leftterm - dsquare);
    			float x1 = m_centerCircle[0] + ((a*d + (b * sqrtterm)) / innerterm);
    			float y1 = m_centerCircle[1] + ((b*d + (a * sqrtterm)) / innerterm);
    			m_intersectionPoints[0][0] = x1;
    			m_intersectionPoints[0][1] = y1;
    		}
    		else { // kein Schnittpunkt
    			m_computedIntersectionPoints = 0;
    		}
    	}
    

    Ich habe ein Programm von meinem Professor, welches den Kreis und die Gerade im Programm anzeigt. Die Schnittpunkte die ich berechne werden auch angezeigt. Diese passen aber leider nicht.

    Was ist der Fehler im Programm?

    Danke - Enomine

    Link 1 = https://de.wikipedia.org/wiki/Schnittpunkt#Schnittpunkte_einer_Gerade_mit_einem_Kreis
    Link 2 = https://de.wikipedia.org/wiki/Koordinatenform#Aus_der_Zweipunkteform


  • Global Moderator

    Ohne dein Programm genauer angesehen zu haben: Dies ist die perfekte Gelegenheit, den Umgang mit einem Debugger an einem einfach nachvollziehbaren Beispiel zu üben.
    1. Mach die ganze Rechnung zu einem Beispiel auf Papier (so richtig mit konkreten Zahlenwerten). Sei sicher, dass du das richtige Ergebnis hast. Schreib dir alle Zwischenwerte auf.
    2. Nimm einen Debugger (wenn du eine IDE benutzt, bietet die gewiss einfachen, komfortablen Umgang damit an). Schmeiß die gleichen Anfangswerte in das Programm wie für deine Papierrechnung.
    3. Geh Schritt für Schritt durch und guck dir die Variablenwerte an. Such nach der Stelle, wo dein Programm von den Erwartungen abweicht.



  • Cool danke xD

    Danke - Enomine



  • Ähnliche Frage wurde kürzlich schon einmal gestellt: trimmen-Funktion -> Brechnen des/der Schnittpunkte von Gerade und Kreis