示例#1
0
    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));
    }
示例#2
0
 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)));
 }
示例#3
0
    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));
    }
示例#4
0
 public static Exp angle3d(ExpVector d0, ExpVector d1)
 {
     return(Exp.Atan2(ExpVector.Cross(d0, d1).Magnitude(), ExpVector.Dot(d0, d1)));
 }