December 15, 2001
For those not familiar with the plane equation, The values A, B, and C are the coordinate values of the normal vector. D can be calculated by substituting a point known to be on the plane for x, y, and z.
Vilket borde innebära att normalen = (A, B, C) och att D är en vektor som ligger på planet, vilket borde innebära att D = (0, 0, 0)...Eftersom A i en pylogon alltid är (0,0,0)..En polygon som har hörnen A, B, C dvs...
Men om det nu vore så, hur skulle då Ax + By + Cz + D = 0???
Ax + By + Cz = 0 skulle kunna gå, men D är ju en vektor! Linjärt tal(Ax + By + Cz) + vektor(D) går inte!
December 15, 2001
Mera undercover work:
In the plane equation (Ax + By + Cz - D = 0), D specifies the distance between the plane and the origin.
...D måste väl gå att beräkna på ngt bra sätt...Ska D vara så litet som möjligt, lr kan D vara hur stort/litet som helst???
BTW, så vill jag veta allt detta för att få en formel som tar reda på om och vart en linje skär ett plan...Jag är lite ringrostig på planekvationen...
April 5, 2001
öhh vill ni veta hur man beräknar kortaste avståndet till origo till planet?
sätt f=x^2 + y^2 +z^2 och försök sedan minimera f=d^2
sätt g=planet och definiera en funktion h så att:
h = f + C*g
Räkna ut ekvations systemet
h'x = 0
h'y = 0
h'z = 0
h'C = 0
När ni löst ut x,y och z, släng in dom i f och lös ut d.
December 15, 2001
Ööö...
Vi kallar (x,y,z) för P
d = |P|
f = x^2 + y^2 +z^2 = P . P
g = normalen till planet...hoppas jag
men detta går inte riktigt ihop:
h = f + C*g
eftersom
h'x = 0
h'y = 0
h'z = 0
h'C = 0
så
h = (0,0,0,0)
för det ger
(0,0,0,0) = P . P + C * g
då h är en 4d vektor(så långt jag fattar), f o C linjära och C och g är inte ens definerat, så fattar jag inte vart du vill komma...h'C är definerat, men inte C
Då kan vi sammanfatta:
(0,0,0,0) = P . P
Vilket INTE stämmer...
Utveckla...
June 18, 2001
Jag förstår ärligt talat inte vad du pratar om och jag har aldrig sett någon svara sig själv fler gånger.
Dock! Är D = 0 ligger planet i origo.
Denna formel beskriver förresten ett oändligt plan vilket tydligen inte är vad du söker.
För att räkna ut vilken punkt ett plan skär en linje kan du sätta upp någon av linjen eller planet i parameterform och sedan ersätta variablerna i den andra figuren med just dessa parametervärden.
Ex:
Linje/plan1: 6X - 3Y + 3 = 0
LInje/plan2: X + 2Y + 1 = 0
Vi gör om ekvation 1 till parameterform:
X = t
Y = 2t + 1
t + 2(2t + 1) + 1 = 0
t = -(3/5)
De skär varandra i punkten (-(3/5), -(1/5))
December 15, 2001
Här kommer iaf min icke fungerande kod:
VECTOR LineIntersectPlane( VECTOR a, VECTOR b, VECTOR p1, VECTOR p2 )
{
//a and b are two vectors that form a plane. p1 and p2 are vectors defining
//the end points of the line that we want to check. If that line doesn´t intersect
//the plane, or if an error uccured, this function returns Vector( 0, 0, 0 ).
//Otherwise it returns the intersection point.
VECTOR n = Normal( a, b ); //we geta the normal of the plane
float d = - DotProduct( n, p1 ), //mumbo jumbo which i don´t yet really understand
s1 = DotProduct( n, p1 ) + d,
s2 = DotProduct( n, p2 ) + d;
if( s1 * s2 >= 0 ) //the line does not cross plane
return Vector( 0, 0, 0 );
VECTOR q = ( p2 - p1 ).Normalize(); //get the direction of the line
float Num = - ( DotProduct( n, p1 ) + d ), //mumbo
Denom = DotProduct( n, q );
if( Denom = 0 )
return Vector( 0, 0, 0 ); //to prevent devide by 0
float s = Num / Denom;
VECTOR i = p1 + q * s; //appearently this is the interssection point
float r = 0;
r = VectorAngle( Vector( 0, 0, 0 ) - i, a - i ) + //now find out if it is valid
VectorAngle( a - i, b - i ) + //by calculation the 3 angles between
VectorAngle( b - i, Vector( 0, 0, 0 ) - i ); //the point and each conrner of the poly
if( r > 2 * PI * MATH_FAULT ) //MATH_FAULT = 0.95
return i; //return the intersection point
return Vector( 0, 0, 0 ); //since we have a small error marginal to count with..
}
Det kufiska är det att
LineIntersectPlane(Vector((rand()%1000)/100,(rand()%1000)/100,(rand()%1000)/100),Vector((rand()%1000)/100,(rand()%1000)/100,(rand()%1000)/100),Vector((rand()%1000)/100,(rand()%1000)/100,(rand()%1000)/100),Vector((rand()%1000)/100,(rand()%1000)/100,(rand()%1000)/100))
Alltid returnerar (0,0,0) dvs false...
LineIntersectPlane(Vector(1,0,0),Vector(0,1,0),Vector(.25,.25,-1),Vector(.25,.25,1))
returnerar också (0,0,0)...
Om man ritar upp detta på et papper, så SER man att det SKA returnera (.25,.25,0)...
April 5, 2001
h'x är alltså h deriverat med hänsyn på x.
Efter att du räknat ut h'y h'z h'c. Sätter du alla dess derivator lika med noll.
Detta ger ingen nollvektor, utan ett ekvationssystem med i detta fall fyra obekanta och fyra ekvationer. Efter att du löst ut x y z ur ekvationssystemet kastar du in dom i f, och räknar ut d. Kom ihåg att ekvationssystemet kan ge flera lösningar. Då får du kontrollera vilket som ger kortaste avståndet genom att testa alla punkter var för sig.
Hängde du med?
1 Guest(s)