2016-09-08 10 views
0

Ich habe eine Point3D und Richtung Vector3D innerhalb einer Rect3D BoundingBox. Ich möchte die Punkteinheit erweitern, die es "trifft" Rect3D und dann den Punkt bekommen, der den Vektor um 50 erweitert. Kann mir jemand helfen, zu der Methode zu gelangen, dies zu berechnen?3D-Linie/Vektor-Schnittpunkt von Rect3D/Plane

Etwas wie:

public Point3D CalculatePoint(Point3D innerPoint, Rect3D rect, double extendOutside) 

enter image description here

+2

Sie können Ihren Punkt in jede Richtung erweitern, und die Antwort auf Ihre Frage ist eine Fläche (kein einzelner Punkt). Andernfalls sollten Sie einen Vektor (Richtung) der Erweiterung angeben. Und besser, solche Fragen im http://math.stackexchange.com/ zu stellen, weil sie nicht mit C# und WPF verwandt sind. – shfire

+0

Ich fragte hier, weil ich dieses mathematische Wissen nicht in einen C# -Code oder eine C# -Methode umwandeln kann. Deshalb habe ich hier gefragt. –

+0

Von welchem ​​mathematischen Wissen sprichst du? Sie haben noch kein Problem klargestellt. – MBo

Antwort

1

Wenn Sie eine Box gegeben sind und definieren es nach seinen 8 Eckpunkten AH mit seinen 6 Gesichter zum Beispiel wie folgt definiert:

ABC 
ADE 
FBC 
FGH 
DGH 
ABE 

und eine Linie, die durch einen Richtungsvektor <vx,vy,vz> und Punkt (x0,y0,z0) definiert wird, könnten Sie einfach durch eac gehen h von ihnen und erhalten Sie die 2 verschiedenen Punkte, wo die Linie schneidet. Gegeben, so einen Punkt, Richtungsvektor und 3 Ecken des Kastens ...

//p0 is point on line 
//direction is direction vector of line 
//A,B,C are points on plane 
Vector3 lpIntersect(Vector3 p0, Vector3 direction, Vector3 A, Vector3 B, Vector3 C){ 
    Vector3 n = (B - C).cross(C - A); 
    Vector3 num = (p0-A)*n; 
    Vector3 denom = direction*n; 
    if((num.x==0 && num.y==0 && num.z==0) || 
     (denom.x==0 && denom.y==0 && denom.z==0)) 
     return Vector3(0,0,0); 
    return num/denom; 
} 

Sobald Sie die 2 Punkte nennen haben sie (Ax,Ay,Az) und (Bx,By,Bz) und eine Gleichung für die Linie wie

x = x0 + vx*t 
y = y0 + vy*t 
z = z0 + vz*t 

können Sie überprüfen Sie, um zu sehen, welcher Punkt in die Richtung geht, die Sie gaben, indem Sie die oben genannten Punkte einstecken und für t lösen, um zum Beispiel (x-x0)/vx zu erhalten, und wenn t>=0 dann der Punkt in die Richtung geht, die Sie gaben, ist es der andere Punkt:

if (((Ax-x0)/vx)>=0){ 
    x = Ax + vx*50; 
    y = Ay + vy*50; 
    z = Az + vz*50; 
} 
else{ 
    x = Bx + vx*50; 
    y = By + vy*50; 
    z = Bz + vz*50; 
}