コード例 #1
0
ファイル: ClTests.cs プロジェクト: robsonfelix/Cassowary.net
        public static bool Inconsistent3()
        {
            try
            {
                ClVariable      w      = new ClVariable("w");
                ClVariable      x      = new ClVariable("x");
                ClVariable      y      = new ClVariable("y");
                ClVariable      z      = new ClVariable("z");
                ClSimplexSolver solver = new ClSimplexSolver();

                solver
                .AddConstraint(new ClLinearInequality(w, Cl.GEQ, 10.0))
                .AddConstraint(new ClLinearInequality(x, Cl.GEQ, w))
                .AddConstraint(new ClLinearInequality(y, Cl.GEQ, x))
                .AddConstraint(new ClLinearInequality(z, Cl.GEQ, y))
                .AddConstraint(new ClLinearInequality(z, Cl.GEQ, 8.0))
                .AddConstraint(new ClLinearInequality(z, Cl.LEQ, 4.0));

                // no exception, we failed!
                return(false);
            }
            catch (ExClRequiredFailure)
            {
                // we want this exception to get thrown
                Console.WriteLine("-- got the exception");
                return(true);
            }
        }
コード例 #2
0
ファイル: Playground.cs プロジェクト: visualjc/Cassowary.net
        public void Z3()
        {
            Stopwatch w = new Stopwatch();

            w.Restart();
            var solver = new ClSimplexSolver()
            {
                AutoSolve = false
            };

            Console.WriteLine("cons {0}ms", w.ElapsedMilliseconds);

            w.Restart();
            solver.AddConstraint(new ClVariable("x"), new ClVariable("y"), new ClVariable("z"), (x, y, z) =>
                                 x > 1 &&
                                 y == x + 1 &&
                                 y < 3 &&
                                 z == x + y * 3
                                 );
            Console.WriteLine("setup {0}ms", w.ElapsedMilliseconds);

            w.Restart();
            solver = solver.Solve();
            Console.WriteLine("solve {0}ms", w.ElapsedMilliseconds);

            w.Restart();
            Console.WriteLine("x " + ((ClVariable)solver.GetVariable("x")).Value);
            Console.WriteLine("y " + ((ClVariable)solver.GetVariable("y")).Value);
            Console.WriteLine("z " + ((ClVariable)solver.GetVariable("z")).Value);
            Console.WriteLine("read {0}ms", w.ElapsedMilliseconds);
        }
コード例 #3
0
ファイル: ClTests.cs プロジェクト: robsonfelix/Cassowary.net
        public static bool AddDelete1()
        {
            bool            okResult = true;
            ClVariable      x        = new ClVariable("x");
            ClSimplexSolver solver   = new ClSimplexSolver();

            solver.AddConstraint(new ClLinearEquation(x, 100, ClStrength.Weak));

            ClLinearInequality c10 = new ClLinearInequality(x, Cl.LEQ, 10.0);
            ClLinearInequality c20 = new ClLinearInequality(x, Cl.LEQ, 20.0);

            solver
            .AddConstraint(c10)
            .AddConstraint(c20);

            okResult = okResult && Cl.Approx(x, 10.0);
            Console.WriteLine("x == " + x.Value);

            solver.RemoveConstraint(c10);
            okResult = okResult && Cl.Approx(x, 20.0);
            Console.WriteLine("x == " + x.Value);

            solver.RemoveConstraint(c20);
            okResult = okResult && Cl.Approx(x, 100.0);
            Console.WriteLine("x == " + x.Value);

            ClLinearInequality c10again = new ClLinearInequality(x, Cl.LEQ, 10.0);

            solver
            .AddConstraint(c10)
            .AddConstraint(c10again);

            okResult = okResult && Cl.Approx(x, 10.0);
            Console.WriteLine("x == " + x.Value);

            solver.RemoveConstraint(c10);
            okResult = okResult && Cl.Approx(x, 10.0);
            Console.WriteLine("x == " + x.Value);

            solver.RemoveConstraint(c10again);
            okResult = okResult && Cl.Approx(x, 100.0);
            Console.WriteLine("x == " + x.Value);

            return(okResult);
        }
コード例 #4
0
        protected void AddNewControl(UIElement cntl)
        {
            ClVariable clX      = FindClVariableByUIElementAndProperty(cntl, "X");
            ClVariable clY      = FindClVariableByUIElementAndProperty(cntl, "Y");
            ClVariable clWidth  = FindClVariableByUIElementAndProperty(cntl, "Width");
            ClVariable clHeight = FindClVariableByUIElementAndProperty(cntl, "Height");
            ClVariable clLeft   = FindClVariableByUIElementAndProperty(cntl, "Left");
            ClVariable clRight  = FindClVariableByUIElementAndProperty(cntl, "Right");
            ClVariable clCenter = FindClVariableByUIElementAndProperty(cntl, "Center");
            ClVariable clMiddle = FindClVariableByUIElementAndProperty(cntl, "Middle");
            ClVariable clTop    = FindClVariableByUIElementAndProperty(cntl, "Top");
            ClVariable clBottom = FindClVariableByUIElementAndProperty(cntl, "Bottom");

            // X = Left
            solver.AddConstraint(new ClLinearEquation(clX, new ClLinearExpression(clLeft), ClStrength.Required));

            // X = Center - (Width/2)
            solver.AddConstraint(new ClLinearEquation(clX,
                                                      new ClLinearExpression(clCenter).Minus(new ClLinearExpression(clWidth).Divide(2)), ClStrength.Required));

            // X = Right - Width
            solver.AddConstraintNoException(new ClLinearEquation(clX,
                                                                 new ClLinearExpression(clRight).Minus(clWidth), ClStrength.Required));

            // Y = Top
            solver.AddConstraint(new ClLinearEquation(clY, new ClLinearExpression(clTop), ClStrength.Required));

            // Y = Middle - (Height/2)
            solver.AddConstraint(new ClLinearEquation(clY,
                                                      new ClLinearExpression(clMiddle).Minus(new ClLinearExpression(clHeight).Divide(2)), ClStrength.Required));

            // Y = Bottom - Height
            solver.AddConstraint(new ClLinearEquation(clY,
                                                      new ClLinearExpression(clBottom).Minus(clHeight), ClStrength.Required));
        }
コード例 #5
0
ファイル: ClTests.cs プロジェクト: robsonfelix/Cassowary.net
        public static bool AddDelete2()
        {
            bool            okResult = true;
            ClVariable      x        = new ClVariable("x");
            ClVariable      y        = new ClVariable("y");
            ClSimplexSolver solver   = new ClSimplexSolver();

            solver
            .AddConstraint(new ClLinearEquation(x, 100.0, ClStrength.Weak))
            .AddConstraint(new ClLinearEquation(y, 120.0, ClStrength.Strong));

            ClLinearInequality c10 = new ClLinearInequality(x, Cl.LEQ, 10.0);
            ClLinearInequality c20 = new ClLinearInequality(x, Cl.LEQ, 20.0);

            solver
            .AddConstraint(c10)
            .AddConstraint(c20);
            okResult = okResult && Cl.Approx(x, 10.0) && Cl.Approx(y, 120.0);
            Console.WriteLine("x == " + x.Value + ", y == " + y.Value);

            solver.RemoveConstraint(c10);
            okResult = okResult && Cl.Approx(x, 20.0) && Cl.Approx(y, 120.0);
            Console.WriteLine("x == " + x.Value + ", y == " + y.Value);

            ClLinearEquation cxy = new ClLinearEquation(Cl.Times(2.0, x), y);

            solver.AddConstraint(cxy);
            okResult = okResult && Cl.Approx(x, 20.0) && Cl.Approx(y, 40.0);
            Console.WriteLine("x == " + x.Value + ", y == " + y.Value);

            solver.RemoveConstraint(c20);
            okResult = okResult && Cl.Approx(x, 60.0) && Cl.Approx(y, 120.0);
            Console.WriteLine("x == " + x.Value + ", y == " + y.Value);

            solver.RemoveConstraint(cxy);
            okResult = okResult && Cl.Approx(x, 100.0) && Cl.Approx(y, 120.0);
            Console.WriteLine("x == " + x.Value + ", y == " + y.Value);

            return(okResult);
        }
コード例 #6
0
        public AutoLayoutPanel() : base()
        {
            Controls         = new Hashtable();
            Constraints      = new ArrayList();
            ControlVariables = new Hashtable();
            solver           = new ClSimplexSolver();
            VarConstraints   = new Hashtable();

            // Register ourselves.
            FindClControlByUIElement(this);

            // Force our X/Y to be 0, 0
            solver.AddConstraint(new ClLinearEquation(
                                     FindClVariableByUIElementAndProperty(this, "X"),
                                     new ClLinearExpression(0.0),
                                     ClStrength.Required));

            solver.AddConstraint(new ClLinearEquation(
                                     FindClVariableByUIElementAndProperty(this, "Y"),
                                     new ClLinearExpression(0.0),
                                     ClStrength.Required));
        }
コード例 #7
0
ファイル: ClTests.cs プロジェクト: robsonfelix/Cassowary.net
        public static bool Simple1()
        {
            bool            okResult = true;
            ClVariable      x        = new ClVariable(167);
            ClVariable      y        = new ClVariable(2);
            ClSimplexSolver solver   = new ClSimplexSolver();

            ClLinearEquation eq = new ClLinearEquation(x, new ClLinearExpression(y));

            solver.AddConstraint(eq);
            okResult = (x.Value == y.Value);

            Console.WriteLine("x == " + x.Value);
            Console.WriteLine("y == " + y.Value);

            return(okResult);
        }
コード例 #8
0
ファイル: ClTests.cs プロジェクト: robsonfelix/Cassowary.net
        public static bool Inconsistent1()
        {
            try
            {
                ClVariable      x      = new ClVariable("x");
                ClSimplexSolver solver = new ClSimplexSolver();

                solver
                .AddConstraint(new ClLinearEquation(x, 10.0))
                .AddConstraint(new ClLinearEquation(x, 5.0));

                // no exception, we failed!
                return(false);
            }
            catch (ExClRequiredFailure)
            {
                // we want this exception to get thrown
                Console.WriteLine("-- got the exception");
                return(true);
            }
        }
コード例 #9
0
ファイル: ClTests.cs プロジェクト: robsonfelix/Cassowary.net
        public static bool Casso1()
        {
            bool            okResult = true;
            ClVariable      x        = new ClVariable("x");
            ClVariable      y        = new ClVariable("y");
            ClSimplexSolver solver   = new ClSimplexSolver();

            solver
            .AddConstraint(new ClLinearInequality(x, Cl.LEQ, y))
            .AddConstraint(new ClLinearEquation(y, Cl.Plus(x, 3.0)))
            .AddConstraint(new ClLinearEquation(x, 10.0, ClStrength.Weak))
            .AddConstraint(new ClLinearEquation(y, 10.0, ClStrength.Weak));

            okResult = okResult &&
                       (Cl.Approx(x, 10.0) && Cl.Approx(y, 13.0) ||
                        Cl.Approx(x, 7.0) && Cl.Approx(y, 10.0));

            Console.WriteLine("x == " + x.Value + ", y == " + y.Value);

            return(okResult);
        }
コード例 #10
0
 public void AddConstraints(IEnumerable <IFluentLayout <T> > fluentLayouts)
 {
     foreach (var fluentLayout in fluentLayouts)
     {
         foreach (var constraint in GetConstraintsFromFluentLayout(fluentLayout))
         {
             solver.AddConstraint(constraint);
         }
     }
     solver.Solve();
     _constraints.AddRange(fluentLayouts);
 }
コード例 #11
0
ファイル: ClTests.cs プロジェクト: robsonfelix/Cassowary.net
        public static bool AddDel(int nCns, int nVars, int nResolves)
        {
            Timer  timer    = new Timer();
            double ineqProb = 0.12;
            int    maxVars  = 3;

            Console.WriteLine("starting timing test. nCns = " + nCns +
                              ", nVars = " + nVars + ", nResolves = " + nResolves);

            timer.Start();
            ClSimplexSolver solver = new ClSimplexSolver();

            ClVariable[] rgpclv = new ClVariable[nVars];
            for (int i = 0; i < nVars; i++)
            {
                rgpclv[i] = new ClVariable(i, "x");
                solver.AddStay(rgpclv[i]);
            }

            ClConstraint[] rgpcns = new ClConstraint[nCns];
            int            nvs    = 0;
            int            k;
            int            j;
            double         coeff;

            for (j = 0; j < nCns; j++)
            {
                // number of variables in this constraint
                nvs = RandomInRange(1, maxVars);
                ClLinearExpression expr = new ClLinearExpression(UniformRandomDiscretized() * 20.0 - 10.0);
                for (k = 0; k < nvs; k++)
                {
                    coeff = UniformRandomDiscretized() * 10 - 5;
                    int iclv = (int)(UniformRandomDiscretized() * nVars);
                    expr.AddExpression(Cl.Times(rgpclv[iclv], coeff));
                }
                if (UniformRandomDiscretized() < ineqProb)
                {
                    rgpcns[j] = new ClLinearInequality(expr);
                }
                else
                {
                    rgpcns[j] = new ClLinearEquation(expr);
                }
                if (Trace)
                {
                    TracePrint("Constraint " + j + " is " + rgpcns[j]);
                }
            }

            Console.WriteLine("done building data structures");
            Console.WriteLine("time = " + timer.ElapsedTime);
            timer.Start();
            int cExceptions = 0;

            for (j = 0; j < nCns; j++)
            {
                // add the constraint -- if it's incompatible, just ignore it
                try
                {
                    solver.AddConstraint(rgpcns[j]);
                }
                catch (ExClRequiredFailure)
                {
                    cExceptions++;
                    if (Trace)
                    {
                        TracePrint("got exception adding " + rgpcns[j]);
                    }

                    rgpcns[j] = null;
                }
            }
            Console.WriteLine("done adding constraints [" + cExceptions + " exceptions]");
            Console.WriteLine("time = " + timer.ElapsedTime + "\n");
            timer.Start();

            int e1Index = (int)(UniformRandomDiscretized() * nVars);
            int e2Index = (int)(UniformRandomDiscretized() * nVars);

            Console.WriteLine("indices " + e1Index + ", " + e2Index);

            ClEditConstraint edit1 = new ClEditConstraint(rgpclv[e1Index], ClStrength.Strong);
            ClEditConstraint edit2 = new ClEditConstraint(rgpclv[e2Index], ClStrength.Strong);

            solver
            .AddConstraint(edit1)
            .AddConstraint(edit2);

            Console.WriteLine("done creating edit constraints -- about to start resolves");
            Console.WriteLine("time = " + timer.ElapsedTime + "\n");
            timer.Start();

            for (int m = 0; m < nResolves; m++)
            {
                solver.Resolve(rgpclv[e1Index].Value * 1.001,
                               rgpclv[e2Index].Value * 1.001);
            }

            Console.WriteLine("done resolves -- now removing constraints");
            Console.WriteLine("time = " + timer.ElapsedTime + "\n");

            solver.RemoveConstraint(edit1);
            solver.RemoveConstraint(edit2);

            timer.Start();

            for (j = 0; j < nCns; j++)
            {
                if (rgpcns[j] != null)
                {
                    solver.RemoveConstraint(rgpcns[j]);
                }
            }

            Console.WriteLine("done removing constraints and AddDel timing test");
            Console.WriteLine("time = " + timer.ElapsedTime + "\n");

            timer.Start();

            return(true);
        }
コード例 #12
0
 public void SingleParameterGreaterThanOrEqualToExpression()
 {
     _solver.AddConstraint(a => a >= 10);
     Assert.IsTrue(((ClVariable)_solver.GetVariable("a")).Value >= 10);
 }
コード例 #13
0
ファイル: ClTests.cs プロジェクト: visualjc/Cassowary.net
        public void Playground()
        {
            var x = new ClVariable("x");

            _solver.AddConstraint(x, a => a < -1);

            Assert.IsTrue(x.Value < -1);
        }
コード例 #14
0
ファイル: LayoutTests.cs プロジェクト: visualjc/Cassowary.net
        private void BuildStrongConstraints(ClSimplexSolver solver)
        {
            solver.AddConstraint(new ClLinearInequality(_updateRight, Cl.Operator.LessThanOrEqualTo, _newpostLeft, ClStrength.Strong));
            solver.AddConstraint(new ClLinearInequality(_newpostRight, Cl.Operator.LessThanOrEqualTo, _quitLeft, ClStrength.Strong));
            //_solver.AddConstraint(new ClLinearEquation(bottomRight_width, new ClLinearExpression(topRight_width), ClStrength.Strong));
            //_solver.AddConstraint(new ClLinearEquation(right_width, new ClLinearExpression(topRight_width), ClStrength.Strong));
            solver.AddConstraint(new ClLinearEquation(_bottomRightBottom, new ClLinearExpression(_rightBottom), ClStrength.Strong));
            solver.AddConstraint(new ClLinearEquation(_newpostHeight, new ClLinearExpression(_updateHeight), ClStrength.Strong));
            solver.AddConstraint(new ClLinearEquation(_newpostWidth, new ClLinearExpression(_updateWidth), ClStrength.Strong));
            solver.AddConstraint(new ClLinearEquation(_updateHeight, new ClLinearExpression(_quitHeight), ClStrength.Strong));
            solver.AddConstraint(new ClLinearEquation(_quitWidth, new ClLinearExpression(_updateWidth), ClStrength.Strong));

            solver.AddConstraint(new ClLinearInequality(_lTitleBottom, Cl.Operator.LessThanOrEqualTo, _titleTop, ClStrength.Strong));
            solver.AddConstraint(new ClLinearInequality(_titleBottom, Cl.Operator.LessThanOrEqualTo, _lBodyTop, ClStrength.Strong));
            solver.AddConstraint(new ClLinearInequality(_lBodyBottom, Cl.Operator.LessThanOrEqualTo, _blogentryTop, ClStrength.Strong));

            solver.AddConstraint(new ClLinearEquation(_titleWidth, new ClLinearExpression(_blogentryWidth), ClStrength.Strong));

            solver.AddConstraint(new ClLinearInequality(_lRecentBottom, Cl.Operator.LessThanOrEqualTo, _articlesTop, ClStrength.Strong));

            solver.AddConstraint(new ClLinearInequality(_topRightBottom, Cl.Operator.LessThanOrEqualTo, _bottomRightTop, ClStrength.Strong));
            solver.AddConstraint(new ClLinearInequality(_leftRight, Cl.Operator.LessThanOrEqualTo, _rightLeft, ClStrength.Strong));
            //_solver.AddConstraint(new ClLinearEquation(left_height, new ClLinearExpression(right_height), ClStrength.Strong));
            //_solver.AddConstraint(new ClLinearEquation(fr_height, new ClLinearExpression(right_height), ClStrength.Strong));

            // alignment
            solver.AddConstraint(new ClLinearEquation(_lTitleLeft, new ClLinearExpression(_titleLeft), ClStrength.Strong));
            solver.AddConstraint(new ClLinearEquation(_titleLeft, new ClLinearExpression(_blogentryLeft), ClStrength.Strong));
            solver.AddConstraint(new ClLinearEquation(_lBodyLeft, new ClLinearExpression(_blogentryLeft), ClStrength.Strong));
            solver.AddConstraint(new ClLinearEquation(_lRecentLeft, new ClLinearExpression(_articlesLeft), ClStrength.Strong));
        }
コード例 #15
0
ファイル: LayoutTests.cs プロジェクト: visualjc/Cassowary.net
        private void BuildRequiredConstraints(ClSimplexSolver solver)
        {
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_bottomRightHeight), _bottomRightTop), new ClLinearExpression(_bottomRightBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_bottomRightWidth), _bottomRightLeft), new ClLinearExpression(_bottomRightRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_bottomRightTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_bottomRightBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_bottomRightLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_bottomRightRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_updateHeight), _updateTop), new ClLinearExpression(_updateBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_updateWidth), _updateLeft), new ClLinearExpression(_updateRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_updateTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_updateBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_updateLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_updateRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_updateRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_updateBottom, Cl.Operator.LessThanOrEqualTo, _bottomRightHeight));
            solver.AddConstraint(new ClLinearInequality(_updateRight, Cl.Operator.LessThanOrEqualTo, _bottomRightWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_newpostHeight), _newpostTop), new ClLinearExpression(_newpostBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_newpostWidth), _newpostLeft), new ClLinearExpression(_newpostRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_newpostTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_newpostBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_newpostLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_newpostRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_newpostRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_newpostBottom, Cl.Operator.LessThanOrEqualTo, _bottomRightHeight));
            solver.AddConstraint(new ClLinearInequality(_newpostRight, Cl.Operator.LessThanOrEqualTo, _bottomRightWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_quitHeight), _quitTop), new ClLinearExpression(_quitBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_quitWidth), _quitLeft), new ClLinearExpression(_quitRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_quitTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_quitBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_quitLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_quitRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_quitRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_quitBottom, Cl.Operator.LessThanOrEqualTo, _bottomRightHeight));
            solver.AddConstraint(new ClLinearInequality(_quitRight, Cl.Operator.LessThanOrEqualTo, _bottomRightWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_topRightHeight), _topRightTop), new ClLinearExpression(_topRightBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_topRightWidth), _topRightLeft), new ClLinearExpression(_topRightRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_topRightTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_topRightBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_topRightLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_topRightRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_topRightRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_lTitleHeight), _lTitleTop), new ClLinearExpression(_lTitleBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_lTitleWidth), _lTitleLeft), new ClLinearExpression(_lTitleRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lTitleTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lTitleBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lTitleLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lTitleRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lTitleRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lTitleBottom, Cl.Operator.LessThanOrEqualTo, _topRightHeight));
            solver.AddConstraint(new ClLinearInequality(_lTitleRight, Cl.Operator.LessThanOrEqualTo, _topRightWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_titleHeight), _titleTop), new ClLinearExpression(_titleBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_titleWidth), _titleLeft), new ClLinearExpression(_titleRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_titleTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_titleBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_titleLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_titleRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_titleRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_titleBottom, Cl.Operator.LessThanOrEqualTo, _topRightHeight));
            solver.AddConstraint(new ClLinearInequality(_titleRight, Cl.Operator.LessThanOrEqualTo, _topRightWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_lBodyHeight), _lBodyTop), new ClLinearExpression(_lBodyBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_lBodyWidth), _lBodyLeft), new ClLinearExpression(_lBodyRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lBodyTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lBodyBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lBodyLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lBodyRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lBodyRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lBodyBottom, Cl.Operator.LessThanOrEqualTo, _topRightHeight));
            solver.AddConstraint(new ClLinearInequality(_lBodyRight, Cl.Operator.LessThanOrEqualTo, _topRightWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_blogentryHeight), _blogentryTop), new ClLinearExpression(_blogentryBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_blogentryWidth), _blogentryLeft), new ClLinearExpression(_blogentryRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_blogentryTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_blogentryBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_blogentryLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_blogentryRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_blogentryRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_blogentryBottom, Cl.Operator.LessThanOrEqualTo, _topRightHeight));
            solver.AddConstraint(new ClLinearInequality(_blogentryRight, Cl.Operator.LessThanOrEqualTo, _topRightWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_leftHeight), _leftTop), new ClLinearExpression(_leftBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_leftWidth), _leftLeft), new ClLinearExpression(_leftRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_lRecentHeight), _lRecentTop), new ClLinearExpression(_lRecentBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_lRecentWidth), _lRecentLeft), new ClLinearExpression(_lRecentRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lRecentTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lRecentBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lRecentLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lRecentRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lRecentRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_lRecentBottom, Cl.Operator.LessThanOrEqualTo, _leftHeight));
            solver.AddConstraint(new ClLinearInequality(_lRecentRight, Cl.Operator.LessThanOrEqualTo, _leftWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_articlesHeight), _articlesTop), new ClLinearExpression(_articlesBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_articlesWidth), _articlesLeft), new ClLinearExpression(_articlesRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_articlesTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_articlesBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_articlesLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_articlesRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_articlesRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_articlesBottom, Cl.Operator.LessThanOrEqualTo, _leftHeight));
            solver.AddConstraint(new ClLinearInequality(_articlesRight, Cl.Operator.LessThanOrEqualTo, _leftWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_leftHeight), _leftTop), new ClLinearExpression(_leftBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_leftWidth), _leftLeft), new ClLinearExpression(_leftRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_leftRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_rightHeight), _rightTop), new ClLinearExpression(_rightBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_rightWidth), _rightLeft), new ClLinearExpression(_rightRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_rightTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_rightBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_rightLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_rightRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_rightRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));

            solver.AddConstraint(new ClLinearInequality(_topRightBottom, Cl.Operator.LessThanOrEqualTo, _rightHeight));
            solver.AddConstraint(new ClLinearInequality(_topRightRight, Cl.Operator.LessThanOrEqualTo, _rightWidth));

            solver.AddConstraint(new ClLinearInequality(_bottomRightBottom, Cl.Operator.LessThanOrEqualTo, _rightHeight));
            solver.AddConstraint(new ClLinearInequality(_bottomRightRight, Cl.Operator.LessThanOrEqualTo, _rightWidth));

            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_frHeight), _frTop), new ClLinearExpression(_frBottom), ClStrength.Required));
            solver.AddConstraint(new ClLinearEquation(Cl.Plus(new ClLinearExpression(_frWidth), _frLeft), new ClLinearExpression(_frRight), ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_frTop, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_frBottom, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_frLeft, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_frRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));
            solver.AddConstraint(new ClLinearInequality(_frRight, Cl.Operator.GreaterThanOrEqualTo, 0, ClStrength.Required));

            solver.AddConstraint(new ClLinearInequality(_leftBottom, Cl.Operator.LessThanOrEqualTo, _frHeight));
            solver.AddConstraint(new ClLinearInequality(_leftRight, Cl.Operator.LessThanOrEqualTo, _frWidth));
            solver.AddConstraint(new ClLinearInequality(_rightBottom, Cl.Operator.LessThanOrEqualTo, _frHeight));
            solver.AddConstraint(new ClLinearInequality(_rightRight, Cl.Operator.LessThanOrEqualTo, _frWidth));
        }
コード例 #16
0
        public void Playground()
        {
            //Implementation of this example: https://cassowary.readthedocs.org/en/latest/topics/examples.html#quadrilaterals

            var _0 = new ClPoint(10, 10);
            var _1 = new ClPoint(10, 200);
            var _2 = new ClPoint(200, 200);
            var _3 = new ClPoint(200, 10);

            var m0 = new ClPoint(0, 0);
            var m1 = new ClPoint(0, 0);
            var m2 = new ClPoint(0, 0);
            var m3 = new ClPoint(0, 0);

            //We don't want the points to move unless necessary
            _solver.AddPointStays(new[] { _0, _1, _2, _3 });

            //Define the midpoints
// ReSharper disable CompareOfFloatsByEqualityOperator
            _solver.AddConstraint(m0.X, _0.X, _1.X, (m, a, b) => m == a * 0.5 + b * 0.5);
            _solver.AddConstraint(m0.Y, _0.Y, _1.Y, (m, a, b) => m == a * 0.5 + b * 0.5);

            _solver.AddConstraint(m1.X, _1.X, _2.X, (m, a, b) => m == a * 0.5 + b * 0.5);
            _solver.AddConstraint(m1.Y, _1.Y, _2.Y, (m, a, b) => m == a * 0.5 + b * 0.5);

            _solver.AddConstraint(m2.X, _2.X, _3.X, (m, a, b) => m == a * 0.5 + b * 0.5);
            _solver.AddConstraint(m2.Y, _2.Y, _3.Y, (m, a, b) => m == a * 0.5 + b * 0.5);

            _solver.AddConstraint(m3.X, _3.X, _0.X, (m, a, b) => m == a * 0.5 + b * 0.5);
            _solver.AddConstraint(m3.Y, _3.Y, _0.Y, (m, a, b) => m == a * 0.5 + b * 0.5);
// ReSharper restore CompareOfFloatsByEqualityOperator

            //Make sure left stays left and top stays top
            _solver.AddConstraint(_0.X, _2.X, (a, b) => a + 20 <= b);
            _solver.AddConstraint(_0.X, _3.X, (a, b) => a + 20 <= b);

            _solver.AddConstraint(_1.X, _2.X, (a, b) => a + 20 <= b);
            _solver.AddConstraint(_1.X, _3.X, (a, b) => a + 20 <= b);

            _solver.AddConstraint(_0.Y, _1.Y, (a, b) => a + 20 <= b);
            _solver.AddConstraint(_0.Y, _2.Y, (a, b) => a + 20 <= b);

            _solver.AddConstraint(_3.Y, _1.Y, (a, b) => a + 20 <= b);
            _solver.AddConstraint(_3.Y, _2.Y, (a, b) => a + 20 <= b);

            //Make sure all points stay in 500x500 convas
            _solver.AddConstraint(_0.X, a => a >= 0);
            _solver.AddConstraint(_0.Y, a => a >= 0);
            _solver.AddConstraint(_0.X, a => a <= 500);
            _solver.AddConstraint(_0.Y, a => a <= 500);

            Console.WriteLine(m0.X.Value + " " + m0.Y.Value);
            Console.WriteLine(m1.X.Value + " " + m1.Y.Value);
            Console.WriteLine(m2.X.Value + " " + m2.Y.Value);
            Console.WriteLine(m3.X.Value + " " + m3.Y.Value);

            _solver.BeginEdit(_2.X, _2.Y)
            .SuggestValue(_2.X, 300)
            .SuggestValue(_2.Y, 400)
            .EndEdit();

            Console.WriteLine(m0.X.Value + " " + m0.Y.Value);
            Console.WriteLine(m1.X.Value + " " + m1.Y.Value);
            Console.WriteLine(m2.X.Value + " " + m2.Y.Value);
            Console.WriteLine(m3.X.Value + " " + m3.Y.Value);
        }