Hej, För det första har du tre olika fall; Trodde först att det handlade om flygolyckor... bara lite kuriosa.............. Jag saknar lite uppgifter för att kunna förstå funktionen CreatePlane. <b>Motsvarande gäller även om man transponerar ned allt en dimension</b> Jag repesenterar det med A,B,C,D där A,B,C är normalen för planen och D är avståndet ifrån origin. Niklas ditt svar gjorde mig inte mycket klokare, Det är rätt självklart att man ska hitta positioner ifrån båda planen där de är lika, frågan är hur man gör det. Ja, det var ju det jag förklarade... Antag att de två planen ges av ekvationerna Ok, så för att skapa en rät linje av det hela använder jag helt enkelt bara två olika värden på t? (två punkter krävs för att skapa en rät linje, right?). När formlen inte fungerar är alternativ "1" då när de inte kolliderar alls och alternativ "2" är när de ligger ovanpå varandra?. <b>Ok, så för att skapa en rät linje av det hela använder jag helt enkelt bara två olika värden på t? (två punkter krävs för att skapa en rät linje, right?).</b> <b>Specialfall 1</b> <b>Specialfall 2</b> Man tackar så mycket för din tid och hjälp :). En grej jag inte riktigt kopplar dock, Hur kan jag använda "parametriseringen" för att få ut den räta linjen utan att använda två olika t värden?. Jag måste ju ha två vektorer för att bilda en rät linje, startpunkt och riktning?. Jag har bara läst upp till MaC så jag har aldrig någonsin hört om parametrisering. En linje består av ett oändligt antal punkter. Du får fram olika punkter genom att ge t olika värden i parametriseringen och samtliga punkter i linjen kan nås på detta sätt. Okej I get it. I andan av att ha snygg kod är det väl bäst att bara ha den icke-deriverade funktionen (även om att köra en icke-deriverad sen derivad är snabbare). Ska försöka implementera detta till kod om jag får några problem återkommer jag :-). Tack för hjälpen! De kolliderar i en linje, men eftersom linjen är lodrät blir dess projektion ned på xy-planet bara en punkt. Okej!. Förstog dig nog lite fel, så fort jag såg ordet "punkt" blev jag lite spektisk. <b> "spektisk" :-D Får man vara skeptisk till den stavningen? </b> Får inte riktigt rätt på det nu, låt säga jag har följande plan: Det var nog ingen bra parametrisering jag hade hittat för specialfall 2. Jag behöver som sagt detta för ett program då det är viktigt att den kan räkna ut alla eventuella kombinationer. Du har ingen aning om en 100% fungerande metod? Det är väl bara att göra samma härledning fast bryta ut x eller y istället. Det måste väl ändå täcka alla specialfall? Typ en cyklisk permutation av (x, y, z)? Jo, jag har varit inne på det, men minns inte varför jag glömde bort det... Jepp, exakt vad jag menade. Rimligtvis täcker väl det in alla specialfall? <b>Alternativ parametrisering</b> Testat din parametrisering ett tag nu och den fungerar perfekt :). Tack för hjälpen!.Plan emot plan kollision
Låt oss säga att vi har två plan (oändligt långa ytor i 3D rymd), jag vill kontrollera om de kolliderar och om de gör det vill jag få ut den "räta linjen" som bildas där planen kolliderar (planen är oändligt långa och bredda, så antingen har de oändligt många kolliderings punkter eller ingen).
Jag har tänkt att man kan dela upp de båda planen i två räta linjer var, te.x. den första så skapar man en rät linje av planets x,y värden och ignorerar z, och den andra räta linjen skapar man av z och y (se kod nedan) , kolliderar någon av dessa två räta linjer med det andra planets räta linjer är det en kollision. Allt jag behöver för att få ut den räta linjen är bara då två olika kollisions punkter vilket inte ska vara så svårt om denna metod fungerar
private void CreatePlane(Vector3 p1, Vector3 p2, Vector3 p3)
{
// Ignore the Z depth on the first one
Vector2 l1;
Vector2 l1c;
l1.X = p1.X - p3.X;
l1.Y = p1.Y - p3.Y;
l1c = l1;
l1c.Normalize(); // Om x är 5 och y är 10 blir det istället x = 0,33 y = 0,66 osv.
}
Jag undrar nu om denna metod verkligen fungerar?, och om det finns någon snabbare? (helst i C#).
Eftersom jag inte är så jätte bra på matte precis skulle jag uppskatta om ni inte postar länkar där te.x. Stephen Hawking har kommit på hur man snabbast fixar det med hjälp av rysk nobelpristagar matematik :).
Sv: Plan emot plan kollision
1. Planen har samma vinklar men ligger ifrån varandra - inga lösningar.
2. Planen har samma vinklar och ligger på varandra - alla punkter på planen är lösningar.
3. De har olika vinklar - en linje är lösningarna.
Jag förstår mig inte riktigt på den metoden som du föreslår, i princip är det väldigt lätt att lösa.
Du har de båda planen uttryckta på något sätt; på parameterfri form, på parameterform, eller med en normalvektor och en position.
Det du gör är då att lösa ekvationerna som uppstår när du likställer punkter.
Ett väldigt enkelt sätt att lösa det på är att rotera och translatera båda planen så att ena av dem ligger i, säg, x=0-planet. Då är det lätt att hitta skärningspunkterna och sen translatera tillbaka.Sv: Plan emot plan kollision
Två plan möts om de inte är parallella, dvs om de inte har samma normal.
Hur representerar du ett plan?Sv:Plan emot plan kollision
I detta fall sätts 2 "två dimensionella" plan in i en rymd med ytterligare en dimension (3 dimensioner).
Vidare så bildas en oändlig linje (1 plan) såvida dessa "ytor" korsar varann?
Motsvarande gäller även om man transponerar ned allt en dimension:
2 "en dimensionella linjer" linjer i en 2-dimensionell värld resulterar vid en eventuell tangering
i en noll-dimensionell punkt!? no?Sv: Plan emot plan kollision
Hur ser typdeklarationen av Vector2 samt Vector3 ut?
Vad representerar medskickade p2 och varför används den aldrig?
Jag skulle vilja se formel-definitionerna av de båda planen.
Sen borde det vara relativt lätt att först hitta en skärningspunkt
om en sådan existerar(ej parallella plan), för att sen få ut en
definition på denna "3-dimensionella linje".Sv: Plan emot plan kollision
Korrekt.
Snittet av två n-dimensionella "plan" inbäddade i ett (n+1)-dimensionellt rum är ett (n-1)-dimensionellt "plan".Sv:Plan emot plan kollision
Sv: Plan emot plan kollision
Har inte tid att sätta upp ekvationerna just nu, men i princip är det ju bara det du ska göra. Bryt ut en variabel, sätt in den i en annan ekvation, så får du linjens utseende i ett plan. Sen använder du den utbrutna variabeln för att hitta dess värden.Sv: Plan emot plan kollision
a1 x + b1 y + c1 z = d1 (plan 1)
a2 x + b2 y + c2 z = d2 (plan 2)
Skärningslinjens projektion på xy-planet ges då av
(a1 c2 - a2 c1) x + (b1 c2 - b2 c1) y = c2 d1 - c1 d2
Denna kan parametriseras, t.ex. enligt
x = ( (b1 c2 - b2 c1) t + (b2 d1 - b1 d2) ) / (a1 b2 - a2 b1)
y = ( (a2 c1 - a1 c2) t + (a1 d2 - a2 d1) ) / (a1 b2 - a2 b1)
vilket ger
z = t
Observera att ovanstående formler endast fungerar om
1) c1 och c2 ej båda är 0
2) a1 b2 - a2 b1 != 0Sv:Plan emot plan kollision
Sv: Plan emot plan kollision
Så kan du göra. Annars har jag ju gett dig en parametrisering av linjen.
<b>När formlen inte fungerar är alternativ "1" då när de inte kolliderar alls och alternativ "2" är när de ligger ovanpå varandra?.</b>
Nej.
När villkor 1 inte är uppfyllt (dvs c1 = c2 = 0), är båda planen vertikala, och så även en eventuell skärningslinje. Projektionen av skärningslinjen blir då bara en punkt i xy-planet varför parametriseringen inte funkar.
När villkor 2 inte är uppfyllt (dvs a1 b2 - a2 b1 = 0), ligger planen så att skärningslinjen blir horisontell. Delen z = t i parametriseringen kommer då inte att fungera.
Dessa fall kan specialbehandlas.Sv:Plan emot plan kollision
Om c1 = c2 = 0 blir planens ekvationer
a1 x + b1 y = d1 (plan 1)
a2 x + b2 y = d2 (plan 2)
Lösningen till detta ekvationssystem är
x = (b2 d1 - b1 d2) / (a1 b2 - a2 b1)
y = (a1 d2 - a2 d1) / (a1 b2 - a2 b1)
Linjen kan därmed parametriseras genom ovanstående två formler för x och y samt z = t.
Vi ser att inte heller detta fall fungerar om a1 b2 - a2 b1 = 0, men då hamnar vi i fallet att planen är parallella och antingen saknar skärningslinje eller sammanfaller.Sv:Plan emot plan kollision
Skärningslinjen blir som sagt horisontell. Den hamnar på
z = (b2 d1 - b1 d2) / (b2 c1 - b1 c2)
x = t + d1 / a1
y = c1 ( b1 d2 - b2 d1 ) / ( b1 (b2 c1 - b1 c2) ) - a1 t / b1Sv:Plan emot plan kollision
Sv: Plan emot plan kollision
Om ( x(t), y(t), z(t) ) är en parametrisering av en rät linje och du vill ha en startpunkt och en riktning, kan du få fram en startpunkt genom att sätta t = 0, och en riktning genom att derivera och sedan sätta t = 0: ( x'(t), y'(t), z'(t) ).Sv:Plan emot plan kollision
Edit: I specialfall ett säger du att de bara kolliderar på en punkt, hur är det möjligt när båda planen är oändligt långa i alla riktningar?Sv: Plan emot plan kollision
Sv:Plan emot plan kollision
Sv:Plan emot plan kollision
Tänker inte ens svara på den frågan :'(Sv:Plan emot plan kollision
Plan 1:
A: 1
B: 0
C: 0
D: 0,5
Plan 2:
A: 0
B: 0
C: -1
D: 0
Dem hamnar under specialfall två.
y = c1 ( b1 d2 - b2 d1 ) / ( b1 (b2 c1 - b1 c2) ) - a1 t / b1
skapar då en division med noll (t / B1)
z = (b2 d1 - b1 d2) / (b2 c1 - b1 c2)
Även här får vi en division med noll (B2 * C1 - B1 * C2) = 0Sv: Plan emot plan kollision
I det aktuella fallet är Plan 1 vertikalt (beskrivs av x = 0.5) och Plan 2 är xy-planet (z = 0). Skärningslinjen mellan dessa ges av x = 0.5, y = t, z = 0.
http://www.nisus.se/archive/930920.htmlSv:Plan emot plan kollision
Sv: Plan emot plan kollision
Sv:Plan emot plan kollision
Sv: Plan emot plan kollision
Sv:Plan emot plan kollision
Antag att de två planen ges av ekvationerna
a1 x + b1 y + c1 z = d1 (plan 1)
a2 x + b2 y + c2 z = d2 (plan 2)
Sätt
A = a1 c2 - a2 c1
B = b1 c2 - b2 c1
D = d1 c2 - d2 c1
A' = a1 d2 - a2 d1
B' = b1 d2 - b2 d1
K = a1 b2 - a2 b1
Då kan linjen parametriseras genom
x = (A D + B t) / (A^2 + B^2)
y = (B D - A t) / (A^2 + B^2)
z = ((A A' + B B') + K t) / (A^2 + B^2)
Nu får vi endast problem om A^2 + B^2 = 0, dvs om A = B = 0. Men detta innebär att vektorn (a1, b1, c1) är parallell med vektorn (a2, b2, c2), vilket innebär att planen är parallella och antingen saknar skärningslinje eller har oändligt många skärningslinjer.Sv: Plan emot plan kollision