Exemplo n.º 1
0
        public double Apply(NumericVariable numericVariable, MembershipFunction msf)
        {
            if (msf.Count == 0)
                return (numericVariable.MaxValue - numericVariable.MinValue) / 2.0;
            if (msf[0].Y > 0 && msf[0].X > numericVariable.MinValue)
            {
                msf.Add(numericVariable.MinValue, msf[0].Y);
            }
            if (msf[msf.Count - 1].Y > 0 && msf[msf.Count - 1].X < numericVariable.MaxValue)
            {
                msf.Add(numericVariable.MaxValue, msf[msf.Count - 1].Y);
            }

            var numerator = 0d;
            var denominator = 0d;
            for (var i = 0; i < msf.Count - 1; i++)
            {
                var value1 = msf[i];
                var value2 = msf[i + 1];

                var min = Math.Min(value1.Y, value2.Y);
                var max = Math.Max(value1.Y, value2.Y);
                
                var line = new LineSegment(value1, value2);
                var m = line.Gradient.Value;
                var b = line.B.Value;
                numerator += ((m / 3.0) * (Math.Pow(value2.X, 3) - Math.Pow(value1.X, 3))) + ((b / 2.0) * (Math.Pow(value2.X, 2) - Math.Pow(value1.X, 2)));
                denominator += ((max + min) / 2.0) * (value2.X - value1.X);

            }
            return numerator / denominator;
        }
Exemplo n.º 2
0
        public Point Intersect(LineSegment segment)
        {
            if (Start.Equals(segment.End))
                return Start;
            if (End.Equals(segment.Start))
                return End;
            if ( Gradient == segment.Gradient)
                return null;
            
            if (Gradient == null)
                return intersectWithVertical(Start.X, segment);
            if (segment.Gradient == null)
                return intersectWithVertical(segment.Start.X, this);
            if (Gradient == 0)
                return intersectWithHorizontal(Start.Y, segment);
            if (segment.Gradient == 0)
                return intersectWithHorizontal(segment.Start.Y, this);

            var b1 = Start.Y - Start.X * Gradient.Value;
            var b2 = segment.Start.Y - segment.Start.X * segment.Gradient.Value;

            var x = (b1 - b2)/(segment.Gradient.Value - Gradient.Value);
            var y = Gradient.Value*x + b1;

            var point = new Point(x, y);

            if (Contains(point) && segment.Contains(point))
                return point;

            return null;
        }
Exemplo n.º 3
0
        public void Intersects_2b()
        {
            var sut = new LineSegment(new Point(0, 0), new Point(4, 4));

            var result = sut.Intersect(new LineSegment(new Point(-2, 4), new Point(0, 0)));
            Assert.AreEqual(new Point(0, 0), result);
        }
Exemplo n.º 4
0
        public void Constructor()
        {
            var sut = new LineSegment(new Point(0, 0), new Point(2, 2));

            Assert.AreEqual(new Point(0, 0), sut.Start);
            Assert.AreEqual(new Point(2, 2), sut.End);
            Assert.AreEqual(1 , sut.Gradient);
        }
Exemplo n.º 5
0
        public void Contains_Point()
        {
            var sut = new LineSegment(new Point(0, 0), new Point(2, 2));

            Assert.IsTrue(sut.Contains(new Point(0, 0)));
            Assert.IsTrue(sut.Contains(new Point(1, 1)));
            Assert.IsTrue(sut.Contains(new Point(2, 2)));
        }
Exemplo n.º 6
0
        public void Does_Not_Contain_Point()
        {
            var sut = new LineSegment(new Point(0, 0), new Point(2, 2));

            Assert.IsFalse(sut.Contains(new Point(-1, -1)));
            Assert.IsFalse(sut.Contains(new Point(3, 3)));
            Assert.IsFalse(sut.Contains(new Point(3, 0)));
            Assert.IsFalse(sut.Contains(new Point(1, 2)));
        }
Exemplo n.º 7
0
        private static Point intersectWithHorizontal(double y, LineSegment segment)
        {
            if (y < Math.Min(segment.Start.Y, segment.End.Y) || y > Math.Max(segment.Start.Y, segment.End.Y))
                return null;

            var b = segment.Start.Y - segment.Start.X*segment.Gradient.Value;

            var x = (y - b) / segment.Gradient.Value;

            return new Point(x, y);
        }
Exemplo n.º 8
0
        private static Point intersectWithVertical(double x, LineSegment segment)
        {
            if (x < Math.Min(segment.Start.X, segment.End.X) || x > Math.Max(segment.Start.X, segment.End.X))
                return null;

            var b = segment.Start.Y - segment.Start.X*segment.Gradient.Value;

            var y = segment.Gradient.Value*x + b;

            return new Point(x, y);
        }
Exemplo n.º 9
0
        private static MembershipFunction combine(MembershipFunction first, MembershipFunction second)
        {
            if (!first.Any())
                return second;
            if (!second.Any())
                return first;
            
            var scanPoints = getScanPoints(first, second);
            
            var result = new MembershipFunction();
            for (var i = 0; i < scanPoints.Count; i++)
            {
                var scanPoint = scanPoints[i];

                var valueFirst = first.Apply(scanPoint);
                var valueSecond = second.Apply(scanPoint);

                result.Add(scanPoint, Math.Max(valueFirst, valueSecond));
                
                // Check if there is an intersection between this scan point and the next
                // and add it to the list of scan points:
                var nextKeyFirst = getNextKey(first, scanPoint);
                var nextKeySecond = getNextKey(second, scanPoint);
                if (nextKeyFirst.HasValue && nextKeySecond.HasValue)
                {
                    var nextValueFirst = first[nextKeyFirst.Value];
                    var nextValueSecond = second[nextKeySecond.Value];

                    if (valueFirst >= valueSecond && nextValueFirst < nextValueSecond ||
                        valueFirst < valueSecond && nextValueFirst >= nextValueSecond)
                    {
                        var lineFirst = new LineSegment(new Point(scanPoint, valueFirst),
                            new Point(nextKeyFirst.Value, nextValueFirst));
                        var lineSecond = new LineSegment(new Point(scanPoint, valueSecond),
                            new Point(nextKeySecond.Value, nextValueSecond));

                        var intersection = lineFirst.Intersect(lineSecond);
                        if (intersection != null && !scanPoints.Contains(intersection.X) && intersection.X > scanPoint)
                            scanPoints.Insert(i + 1, intersection.X);
                    }
                }
            }

            return result.ClearUp();
        }
Exemplo n.º 10
0
        public void ToStringTest()
        {
            var sut = new LineSegment(new Point(0, 0), new Point(2, 2));

            Assert.AreEqual("(0;0) -> (2;2)", sut.ToString());
        }
Exemplo n.º 11
0
        public void Dont_Intersects_6()
        {
            var sut = new LineSegment(new Point(0, 0), new Point(4, 4));

            var result = sut.Intersect(new LineSegment(new Point(5, 0), new Point(5, 5)));
            Assert.IsNull(result);
        }
Exemplo n.º 12
0
        public void Intersects_7()
        {
            var sut = new LineSegment(new Point(3, 0.5), new Point(5, 0.5));

            var result = sut.Intersect(new LineSegment(new Point(3, 0.5), new Point(4, 1)));
            Assert.AreEqual(new Point(3, 0.5), result);
        }
Exemplo n.º 13
0
        public void Intersects_5()
        {
            var line1 = new LineSegment(new Point(0, 0), new Point(4, 4));
            var line2 = new LineSegment(new Point(3, 0), new Point(3, 6));

            Assert.AreEqual(new Point(3, 3), line1.Intersect(line2));
            Assert.AreEqual(new Point(3, 3), line2.Intersect(line1));
        }