J'ai écrit une méthode simple d'assistant qui calcule la distance d'un point à un plan. Cependant, il semble retourner des résultats absurdes. Le code que j'ai pour créer un avion est donc:Distance à un avion
Plane = new Plane(vertices.First().Position, vertices.Skip(1).First().Position, vertices.Skip(2).First().Position);
Assez simple, j'espère que vous serez d'accord. Il crée une structure plane XNA en utilisant trois points.
Maintenant, immédiatement après ce que je fais:
foreach (var v in vertices)
{
float d = Math.Abs(v.ComputeDistance(Plane));
if (d > Constants.TOLERANCE)
throw new ArgumentException("all points in a polygon must share a common plane");
}
En utilisant le même ensemble de sommets que je construisais le plan, je reçois cette exception jeté! Mathématiquement c'est impossible, puisque ces trois points doivent se trouver sur le plan.
méthode Mon ComputeDistance est:
public static float ComputeDistance(this Vector3 point, Plane plane)
{
float dot = Vector3.Dot(plane.Normal, point);
float value = dot - plane.D;
return value;
}
AsI comprendre, cela est exact. Alors, que pourrais-je faire de mal? Ou pourrais-je rencontrer un bug dans l'implémentation de XNA?
Quelques exemples de données:
Points:
{X:0 Y:-0.5000001 Z:0.8660254}
{X:0.75 Y:-0.5000001 Z:-0.4330128}
{X:-0.75 Y:-0.5000001 Z:-0.4330126}
Plane created:
{Normal:{X:0 Y:0.9999999 Z:0} D:0.5} //I believe D should equal -0.5?
Distance from point 1 to plane:
1.0
Quelle est la valeur de 'Constants.TOLERANCE'? – DGH
TOLERANCE = 1e-5f – Martin
Cependant, la tolérance n'est pas le problème. Comme vous pouvez le voir à partir des nouveaux exemples de données que je viens d'éditer dans la distance est relativement vaste. – Martin