FortuneVoronoi.Fortune.ParabolicCut C# (CSharp) Méthode

ParabolicCut() static private méthode

static private ParabolicCut ( double x1, double y1, double x2, double y2, double ys ) : double
x1 double
y1 double
x2 double
y2 double
ys double
Résultat double
        internal static double ParabolicCut(double x1, double y1, double x2, double y2, double ys)
        {
            //			y1=-y1;
            //			y2=-y2;
            //			ys=-ys;
            //
            if(Math.Abs(x1-x2)<1e-10 && Math.Abs(y1-y2)<1e-10)
            {
            //				if(y1>y2)
            //					return double.PositiveInfinity;
            //				if(y1<y2)
            //					return double.NegativeInfinity;
            //				return x;
                throw new Exception("Identical datapoints are not allowed!");
            }

            if(Math.Abs(y1-ys)<1e-10 && Math.Abs(y2-ys)<1e-10)
                return (x1+x2)/2;
            if(Math.Abs(y1-ys)<1e-10)
                return x1;
            if(Math.Abs(y2-ys)<1e-10)
                return x2;
            double a1 = 1/(2*(y1-ys));
            double a2 = 1/(2*(y2-ys));
            if(Math.Abs(a1-a2)<1e-10)
                return (x1+x2)/2;
            double xs1 = 0.5/(2*a1-2*a2)*(4*a1*x1-4*a2*x2+2*Math.Sqrt(-8*a1*x1*a2*x2-2*a1*y1+2*a1*y2+4*a1*a2*x2*x2+2*a2*y1+4*a2*a1*x1*x1-2*a2*y2));
            double xs2 = 0.5/(2*a1-2*a2)*(4*a1*x1-4*a2*x2-2*Math.Sqrt(-8*a1*x1*a2*x2-2*a1*y1+2*a1*y2+4*a1*a2*x2*x2+2*a2*y1+4*a2*a1*x1*x1-2*a2*y2));
            xs1=Math.Round(xs1,10);
            xs2=Math.Round(xs2,10);
            if(xs1>xs2)
            {
                double h = xs1;
                xs1=xs2;
                xs2=h;
            }
            if(y1>=y2)
                return xs2;
            return xs1;
        }

Usage Example

Exemple #1
0
 public float Cut(float ys, float x)
 {
     if (!Flipped)
     {
         return(Convert.ToSingle(Math.Round(x - Fortune.ParabolicCut(Edge.LeftData[0], Edge.LeftData[1], Edge.RightData[0], Edge.RightData[1], ys), 10)));
     }
     return(Convert.ToSingle(Math.Round(x - Fortune.ParabolicCut(Edge.RightData[0], Edge.RightData[1], Edge.LeftData[0], Edge.LeftData[1], ys), 10)));
 }
All Usage Examples Of FortuneVoronoi.Fortune::ParabolicCut