Barycentric Coordinates



  • Hallo!

    Ich schreibe ein Paint Programm, dass mir ein Dreieck zeichnet. Dieses Dreieck soll nun gefüllt werden. Doch leider funktioniert das nicht so wie ich will.

    Ich habe einen Algorithmus zur Parametrisierung gegeben. Dieser Algorithmus enthält eine Funktion distance. Die muss ich noch selber schreiben. Allerdings weiß ich nicht wie ich den Rest berechnen soll.

    Also das ganze läuft in 2 For Schleifen. Der Algo bildet ein Rechteck über das Dreieck und färbt alle Punkte innerhalb des Rechtecks schwarz.

    Zur Berechnung ob ein Punkt gesetzt werden soll oder nicht wird alpha, beta und gamma berechnet. Beta und Gamma werden äquivalent zu alpha berechnet.

    alpha = 1.0 - distance((x,y), BC) / distance(A, BC);
    

    distance soll mir nun die Distanz berechnen.

    BC ist ein Vektor und den Berechne ich indem ich den Punkt B - Punkt C = BC rechne.
    Der Vektor n = (-BC.y, BC.x) //Vertauschung der Koordinaten von Vektor BC.

    Nun muss ich d die Distanz berechnen. d = (Vektor n* Vektor v)/Länge von Vektor n. Allerdings weiß ich nicht wie man den Vekor v berechnet.

    Kann mir jemand weiterhelfen?

    lg usr0009



  • Allerdings weiß ich nicht wie man den Vekor v berechnet

    "v" ist der Vektor vom Punkt (x,y) zu einem beliebigen Punkt auf der Kante (zb einer der beiden Eckpunkte) - siehe Point-Line Distance.



  • Also mein Code würde demnach dann so aussehen:

    float GLUTDrawWindow::distance(Point P, Point Q, Point R)
    {
    	Vector q = Q-R;
    	Vector n(((-1)*q.y),q.x,0);
    	Vector v = Q-P;
    	return((n.dot(v))/(n.length()));
    }
    

    Point P entspricht dem (x,y), also dort wo sich die Pixelabfrage gerade befindet.

    Point Q = ist gleich dem Punkt A
    Point R = ist gleich dem Punkt B

    Doch leider funktioniert es nicht. Was mache ich jetzt noch falsch?

    lg und Danke im Voraus für die Hilfe.



  • Ich habe jetzt fast alle Kombinationen ausprobiert und trotzdem wird mein Dreieck nicht so gefüllt wie ich das wünsche.

    Hier nun mein ganzer Code:

    for (int x=x_min; x < x_max; x++)
    		{
    			for (int  y = y_min; y < y_max; y++)
    			{
    				Point s(x,y,0);
    				float alpha = 1.0 + (distance(s, vertices[1],vertices[2]) / distance(vertices[0], vertices[1],vertices[2]));
    				float beta = 1.0 + (distance(s, vertices[0],vertices[2]) / distance(vertices[1], vertices[0],vertices[2]));
    				float gamma = 1.0 + (distance(s, vertices[0],vertices[1]) / distance(vertices[2], vertices[0],vertices[1]));
    				if ((alpha < 0.0) || (beta < 0.0) || (gamma < 0.0))
    				{
    					colours[selected] = alpha * colours[0] + beta * colours[1] + gamma * colours[2];
    					theImage.SetPixel(y,x,0,0,0);
    				}
    			}
    		}
    	} // DrawTriangle()
    
    float GLUTDrawWindow::distance(Point P, Point Q, Point R)
    {
    	Vector n(-Q.y,Q.x,0);
    	Vector r(Q.x-P.x,Q.y-P.y,0);
    	return((r.dot(n))/r.length());
    	//--------------------------
    	//Vector v((R.y-Q.y),-(R.x-Q.x),0);
    	//Vector r((Q.x-P.x),(Q.y-P.y),0);
    	//return((r.dot(v))/(r.length()));
    	//--------------------------
    	//Vector v = Q-R;
    	//Vector w(-v.y,v.x,0);
    	//Vector r((v.x-P.x),(v.y-P.y),0);
    	//return(r.dot(w)/r.length());
    	//---------------------------
    	//Vector v(R.y-Q.y,-(R.x-Q.x),0);
    	//Vector r(Q.x-P.x,Q.y-P.y,0);
    	//return((r.dot(v)/r.length()));
    	//---------------------------
    }
    

    Vielleicht kann mir jemand behilflich sein, um das Problem zu lösen. Thx



  • 1.0 + (distance(...
    

    Naja, wenn man + und - verwechselt...

    p.S.:

    if ((alpha < 0.0) || (beta < 0.0) || (gamma < 0.0))
    

    Ich würde mal behaupten dass hier 2x && statt || stehen sollte.



  • C/C++ Code:

    1.0 + (distance(...
    

    Naja, wenn man + und - verwechselt...

    Das kommt davon wenn man etwas ausprobiert und nicht alles wieder rückgängig macht.

    if ((alpha < 0.0) || (beta < 0.0) || (gamma < 0.0))
    

    Ich würde mal behaupten dass hier 2x && statt || stehen sollte.

    Funktioniert leider auch nicht. Jetzt hab ich dann eh schon bald alle Variationen durchprobiert und keine Funktioniert. 😞


Anmelden zum Antworten