Kartesische in Kugelkoordinaten



  • Hi,
    für mein aktuelles Spieleprojekt habe ich zwei Klassen:
    Polar3D für Kugelkoordinaten und
    Vector3D für Kartesische koordinaten.

    Die Kugelkoordinaten brauche ich z.B. für die Kamerarotation, Sonnenbewegung etc.

    Um alles korrekt anzeigen zu können, muss ich die Kugelkoordinaten in Kartesische Koordinaten umrechnen, dafür habe ich bereits einen algorythmus:

    Vector3D Polar3D::toCartesian()
    {
    	double x	= (cos(cV * 2 * PI / 360) * sin(cH * 2 * PI / 360))  * cL;
    	double y	= sin(cV * 2 * PI / 360) * cL;
    	double z	= (cos(cV * 2 * PI / 360) * cos(cH * 2 * PI / 360))  * cL;
    
    	if (cH == 90.0f)
    	{
    		x	= 0.0f;
    		z	= 0.0f;
    	}
    
    	return Vector3D(x, y, z);
    }
    

    cH ist dabei der Horizontalwinkel, cV der Vertikalwinkel und cL der Betrag.

    Jetzt ist meine Frage, wie man Kartesische Koordinaten in Kugelkoordinaten umrechnen kann.
    Kann mir da jemand helfen?
    Es ist nich unbedingt notwendig das zu tun, aber es wäre schön wenn es möglich wäre.

    mfg
    Matogel



  • matogel schrieb:

    Jetzt ist meine Frage, wie man Kartesische Koordinaten in Kugelkoordinaten umrechnen kann.

    Du kannst das mit einer Transformation umrechnen. Du findest die Transformationsgleichungen hier unter "Uebliche Konventionen": http://de.wikipedia.org/wiki/Kugelkoordinaten



  • Vielen Dank, auch für die schnelle Antwort.
    Sprich

    Polar3D Vector3D::toPolar()
    {
    	double len		= magnitude();
    	double v		= atan2(y(), x()) * 180 / Polar3D::PI;
    	double h		= acos(z() / len) * 180 / Polar3D::PI;
    	return Polar3D(h, v, len);
    }
    

    tut es schon?
    Berücksichtigt atan2 die ganzen Sonderfälle?

    EDIT: oh, ich sehe gerade, dass die auf Wikipedia die Z und Y koordinate vertauscht haben. sprich ich muss den Algorythmus so abändern:

    Polar3D Vector3D::toPolar()
    {
    	double len		= magnitude();
    	double h		= atan2(z(), x()) * 180 / Polar3D::PI;
    	double v		= acos(y() / len) * 180 / Polar3D::PI;
    	return Polar3D(h, v, len);
    }
    

    richtig?


Anmelden zum Antworten