SAT Problem



  • könntest du mir da mal beispiel machen, irgendwie verstehe ich das nichtg.

    ist die ebene dann die normale auf die die punkte des polyeders projiziert werden?


  • Mod

    ich leite dich gerne an, erster schritt, mach eine funktion die eine ebenengleichung zurueckgibt.



  • okay das mit der 3d Normale?
    OK ist gemacht
    danke



  • also du meinst das, oder?
    http://www.wynx.de/ButcherC/EuEHNF.htm

    Eine Viereckige Ebene, die Senkrecht zur eigentlichen fläche des Polyeders ist?



  • Hätte ich sie posten sollen?

    float ebenengleichung(Vector n,Vector q){
    	return n*q;
    }
    inline float operator * (const Vector &V)const	{return (x*V.x) + (y*V.y); }
    

  • Mod

    ich habe so meine zweifel dass das irgendwas mit ebenengleichung zu tun hat.

    versuch von einem dreieck, also aus 3 vertices im 3D raum (also x y und z) die ebene zu errechnen.



  • ich google jetzt schon seit einer ewigkeit.
    könntest du mir einen kleinen Tipp geben?



  • ich glaub ich habs fast,nur weiss ich nicht was hier s und t bedeuten.
    http://home.arcor.de/penneweb/Abi2004/Eb3Pkt.html



  • ich bin mir nicht sicher, aber meinst du das?:

    inline Vector operator - (const Vector &V)	const	{	return Vector(x-V.x, y-V.y); }
    inline Vector operator * (float  s)			const	{	return Vector(x*s, y*s); }
    
    Vector ebengleichung(float r, float s,Vector a,Vector b,Vector C){
    
    vector retval;
    retval=a+r*(b-a)+s*(c-a);
    
    }
    

    Tut mir leid, dass ich so langsam bin, ich könnte den Teil von mir, der früher in Geometrie gepennt hat, den Schädel einschlagen.


  • Mod

    alterbro schrieb:

    ich google jetzt schon seit einer ewigkeit.
    könntest du mir einen kleinen Tipp geben?

    z.b. bei google "plane equation triangle"


  • Mod

    alterbro schrieb:

    ich bin mir nicht sicher, aber meinst du das?

    ebenengleichung ohne z? eine ebene existiert doch erst in 3d 😉

    Tut mir leid, dass ich so langsam bin, ich könnte den Teil von mir, der früher in Geometrie gepennt hat, den Schädel einschlagen.

    statt euch zu kloppen, solltet ihr kolaborieren, wenn du es erstmal kannst, werden beide teile deines schaedels lachen wie einfach es doch ist 😉

    wenn ich es nur vorsagen wuerde, waere ich jedoch nur kumpel von der schlaefrigen seite 😉



  • inline Vector operator - (const Vector &V) const { return Vector(x-V.x, y-V.y,z-V.z); }
    inline Vector operator * (float s) const { return Vector(x*s, y*s,z*s); }

    Vector ebengleichung(float r, float s,Vector a,Vector b,Vector C){

    vector retval;
    retval=a+r*(b-a)+s*(c-a);

    }
    sorry, die Inlines waren aus versehen aus dem alten SAT2d Projekt,jetzt richtig?

    statt euch zu kloppen, solltet ihr kolaborieren, wenn du es erstmal kannst, werden beide teile deines schaedels lachen wie einfach es doch ist

    wollen wir das beste hoffen

    wenn ich es nur vorsagen wuerde, waere ich jedoch nur kumpel von der schlaefrigen seite

    Ohne Schleimen zu wollen...
    Es stimmt, ich hätts vermutlich nur gecopypastet, und mich dann darüber aufgeregt, weshalb es nicht funktioniert.
    Kann auch sein das ich das nie in der Schule gelernt hab.



  • ist es jetzt richtig?:

    inline Vector operator - (const Vector &V) const { return Vector(x-V.x, y-V.y,z-V.z); }
    inline Vector operator * (float s) const { return Vector(x*s, y*s,z*s); }
    
    Vector ebengleichung(float r, float s,Vector a,Vector b,Vector C){
    
    vector retval;
    retval=a+r*(b-a)+s*(c-a);
    
    }
    

  • Mod

    das kompiliert?

    naja, probiere es aus, alle 3 punkte die du angibst sollten einen abstand von 0 zur ebene haben (die funktion brauchst du auch fuer den 3d SAT test).



  • ok, ich habe keine Ahnung wie ich das rausfinden soll, oder wie ich rausfinden soll, wie ich das rausfinden soll.

    ABer ich google mal.



  • was setzt ich nun für s und r ein?


  • Mod

    so sieht die declaration aus

    Plane ebengleichung(Vector Vertex0,Vector Vertex1,Vector Vertex2);
    

    so sieht die test funktions declaration aus

    float DistanzToPlane(Plane Ebene,Vector Punkt);
    

    so testest du ob es stimmt

    Plane TrianglePlane((Vector Vertex0,Vector Vertex1,Vector Vertex2)
    {
      const Plane P = ebengleichung(Vertex0,Vertex1,Vertex2);
      assert(fabsf(DistanzToPlane(P,Vertex0))<FLT_EPSILON);
      assert(fabsf(DistanzToPlane(P,Vertex1))<FLT_EPSILON);
      assert(fabsf(DistanzToPlane(P,Vertex2))<FLT_EPSILON);
      return P;
    }
    

    den rest musst du wohl mit deiner schlaefrigen haelfte und google ausmachen 🙂

    uebrigens, nur keine angst den editier button zu klicken, dafuer ist er da 😉



  • ...



  • ich glaub jjetzt hab ichs:

    class ebenengleichung{
    
    		Vector3d first;
    		Vector3d second;
    		Vector3d third;
    
    		char *getasstring(){
    			char string[128];
    			sprintf_s(string,"x=(%f%f%f)+s(%f%f%f)+r(%f%f%f)",first.x,first.y,first.z,second.x,second.y,second.z,third.x,third.y,third.z);
    
    return string;
    }
    
    		ebenengleichung(Vector3d A,Vector3d B,Vector3d C){
    
    			this->first=A;
    			this->second=B-A;
    			this->third=C-A;
    		}
    };
    


  • Ich hab mich ein wenig schlau gemacht.

    Muss ich etwa immer zuerst mit den 3 Punkten eine Parametergleichung erstellen, aus direser dann eine Koordinatengleichung, und aus der Koordinatengleichung eine hessische Normalform?

    Ist das für den Computer nicht etwas aufwendig?


Anmelden zum Antworten