public static ExpVector NormalAtInPlane(this IEntity self, Exp t, IPlane plane) { if (self.plane != null) { var tang = self.TangentAt(t); if (tang == null) { return(null); } var n = ExpVector.Cross(tang, Vector3.forward); if (plane == self.plane) { return(n); } return(plane.DirToFrom(n, self.plane)); } Param p = new Param("pOn"); var pt = self.PointOn(p); var result = new ExpVector(pt.x.Deriv(p).Deriv(p), pt.y.Deriv(p).Deriv(p), pt.z.Deriv(p).Deriv(p)); result.x.Substitute(p, t); result.y.Substitute(p, t); result.z.Substitute(p, t); if (plane == null) { return(result); } return(plane.DirToPlane(result)); }
public static Exp pointLineDistance(ExpVector p, ExpVector p0, ExpVector p1, bool is3d) { if (is3d) { var d = p0 - p1; return(ExpVector.Cross(d, p0 - p).Magnitude() / d.Magnitude()); } return(((p0.y - p1.y) * p.x + (p1.x - p0.x) * p.y + p0.x * p1.y - p1.x * p0.y) / Exp.Sqrt(Exp.Sqr(p1.x - p0.x) + Exp.Sqr(p1.y - p0.y))); }
public void GenerateEquations(EquationSystem sys) { sys.AddParameters(parameters); sys.AddEquation(u.Magnitude() - 1.0); sys.AddEquation(v.Magnitude() - 1.0); var cross = ExpVector.Cross(u, v); var dot = ExpVector.Dot(u, v); sys.AddEquation(Exp.Atan2(cross.Magnitude(), dot) - Math.PI / 2); sys.AddEquation(n - ExpVector.Cross(u, v)); }
public static Exp angle3d(ExpVector d0, ExpVector d1) { return(Exp.Atan2(ExpVector.Cross(d0, d1).Magnitude(), ExpVector.Dot(d0, d1))); }