public static double AngleBetween(IPoint3D pt1, IPoint3D pt2, IPoint3D origin) { IVector3D v1 = IVector3D.CreateVector(pt1, origin); IVector3D v2 = IVector3D.CreateVector(pt2, origin); double dot = IVector3D.Dot(v1, v2); double cos = dot / (v1.Mag() * v2.Mag()); double angle = Math.Acos(cos); if (Double.IsNaN(angle)) { angle = (double)0; } return(angle); }
public double DistanceTo(IPoint3D pt) { IVector3D vec = this - pt; return(vec.Mag()); }
public static double Dist(IVector3D vector1, IVector3D vector2) { IVector3D vec = IVector3D.Sub(vector1, vector2); return(vec.Mag()); }
/// <summary> /// Computes the discrete Gaussian curvature as in the paper "Discrete Differential-Geometry Operators for Triangulated /// 2-Manifolds" (http://www.cs.caltech.edu/~mmeyer/Publications/diffGeomOps.pdf) /// </summary> public double ComputesGaussianCurvature(int vKey) { IVector3D meanCurvatureVector = new IVector3D(); if (IsNakedVertex(vKey)) { return(0.0); } IVector3D vect1 = new IVector3D(); IVector3D vect2 = new IVector3D(); IVector3D vect3 = new IVector3D(); double mixed = 0.0; double gauss = 0.0; int[] nKey = iM.Topology.GetVertexAdjacentVertices(vKey); ITopologicVertex v = iM.GetVertexWithKey(vKey); int next_i; for (int i = 0; i < nKey.Length; i++) { next_i = i + 1; if (i == nKey.Length - 1) { next_i = 0; } ITopologicVertex p1 = iM.GetVertexWithKey(nKey[i]); ITopologicVertex p2 = iM.GetVertexWithKey(nKey[next_i]); vect1 = IVector3D.CreateVector(v.Position, p1.Position); vect2 = IVector3D.CreateVector(p1.Position, p2.Position); vect3 = IVector3D.CreateVector(p2.Position, v.Position); double c12 = IVector3D.Dot(vect1, vect2); double c23 = IVector3D.Dot(vect2, vect3); double c31 = IVector3D.Dot(vect3, vect1); vect2 = IVector3D.Cross(vect1, vect3, false); double area = 0.5 * vect2.Mag(); // This angle is obtuse if (c31 > 0.0) { mixed += 0.5 * area; } else if (c12 > 0.0 || c23 > 0.0) { mixed += 0.25 * area; } else { if (area > 0.0 && area > -1e-9 * (c12 + c23)) { mixed -= 0.125 * 0.5 * (c12 * IVector3D.Dot(vect3, vect3) + c23 * IVector3D.Dot(vect1, vect1)) / area; } } gauss += Math.Abs(Math.Atan2(2.0 * area, -c31)); vect3 *= c12; vect1 *= -c23; vect3 += vect1; meanCurvatureVector += vect3 * (0.5 / area); } meanCurvatureVector *= (0.5 / mixed); // Discrete gaussian curvature return((2.0 * Math.PI - gauss) / mixed); }