示例#1
0
        public static List <GenericInstantiator.EdgeAggregator> InstantiateReflexiveAngles(GroundedClause clause)
        {
            List <GenericInstantiator.EdgeAggregator> newGrounded = new List <GenericInstantiator.EdgeAggregator>();

            Triangle newTriangle = clause as Triangle;

            if (newTriangle == null)
            {
                return(newGrounded);
            }

            //
            // Compare all angles in this new triangle to all the angles in the old triangles
            //
            foreach (Triangle oldTriangle in candidateTriangles)
            {
                if (newTriangle.HasAngle(oldTriangle.AngleA))
                {
                    GenericInstantiator.EdgeAggregator newClause = GenerateAngleCongruence(newTriangle, oldTriangle.AngleA);
                    if (newClause != null)
                    {
                        newGrounded.Add(newClause);
                    }
                }

                if (newTriangle.HasAngle(oldTriangle.AngleB))
                {
                    GenericInstantiator.EdgeAggregator newClause = GenerateAngleCongruence(newTriangle, oldTriangle.AngleB);
                    if (newClause != null)
                    {
                        newGrounded.Add(newClause);
                    }
                }

                if (newTriangle.HasAngle(oldTriangle.AngleC))
                {
                    GenericInstantiator.EdgeAggregator newClause = GenerateAngleCongruence(newTriangle, oldTriangle.AngleC);
                    if (newClause != null)
                    {
                        newGrounded.Add(newClause);
                    }
                }
            }

            candidateTriangles.Add(newTriangle);

            return(newGrounded);
        }
        //
        // DO NOT generate a new clause, instead, report the result and generate all applicable
        //
        private static List<EdgeAggregator> StrengthenToRightTriangle(Triangle tri, RightAngle ra, GroundedClause original)
        {
            List<EdgeAggregator> newGrounded = new List<EdgeAggregator>();

            // This angle must belong to this triangle.
            if (!tri.HasAngle(ra)) return newGrounded;

            // Strengthen the old triangle to a right triangle
            Strengthened newStrengthened = new Strengthened(tri, new RightTriangle(tri));
            tri.SetProvenToBeRight();

            // Hypergraph
            List<GroundedClause> antecedent = new List<GroundedClause>();
            antecedent.Add(tri);
            antecedent.Add(original);

            newGrounded.Add(new EdgeAggregator(antecedent, newStrengthened, annotation));

            return newGrounded;
        }
示例#3
0
 public bool LinksTriangles(Triangle ct1, Triangle ct2)
 {
     return((ct1.HasAngle(smallerAngle) && ct2.HasAngle(largerAngle)) ||
            (ct1.HasAngle(largerAngle) && ct2.HasAngle(smallerAngle)));
 }
示例#4
0
        private static List<EdgeAggregator> InstantiateToAltitude(Triangle triangle, Perpendicular perp, GroundedClause original)
        {
            List<EdgeAggregator> newGrounded = new List<EdgeAggregator>();

            // Acquire the side of the triangle containing the intersection point
            // This point may or may not be directly on the triangle side
            Segment baseSegment = triangle.GetSegmentWithPointOnOrExtends(perp.intersect);
            if (baseSegment == null) return newGrounded;

            // The altitude must pass through the intersection point as well as the opposing vertex
            Point oppositeVertex = triangle.OtherPoint(baseSegment);

            Segment altitude = new Segment(perp.intersect, oppositeVertex);

            // The alitude must alig with the intersection
            if (!perp.ImpliesRay(altitude)) return newGrounded;

            // The opposing side must align with the intersection
            if (!perp.OtherSegment(altitude).IsCollinearWith(baseSegment)) return newGrounded;

            //
            // Create the new Altitude object
            //
            Altitude newAltitude = new Altitude(triangle, altitude);

            // For hypergraph
            List<GroundedClause> antecedent = new List<GroundedClause>();
            antecedent.Add(triangle);
            antecedent.Add(original);

            newGrounded.Add(new EdgeAggregator(antecedent, newAltitude, annotation));

            //
            // Check if this induces a second altitude for a right triangle (although we don't know this is a strengthened triangle)
            // The intersection must be on the vertex of the triangle
            if (triangle.HasPoint(perp.intersect))
            {
                Angle possRightAngle = new Angle(triangle.OtherPoint(new Segment(perp.intersect, oppositeVertex)), perp.intersect, oppositeVertex);

                if (triangle.HasAngle(possRightAngle))
                {
                    Altitude secondAltitude = new Altitude(triangle, new Segment(perp.intersect, oppositeVertex));
                    newGrounded.Add(new EdgeAggregator(antecedent, secondAltitude, annotation));
                }
            }

            return newGrounded;
        }
示例#5
0
 public bool LinksTriangles(Triangle ct1, Triangle ct2)
 {
     return (ct1.HasAngle(smallerAngle) && ct2.HasAngle(largerAngle)) ||
            (ct1.HasAngle(largerAngle) && ct2.HasAngle(smallerAngle));
 }
示例#6
0
 public bool LinksTriangles(Triangle ct1, Triangle ct2)
 {
     return(ct1.HasAngle(ca1) && ct2.HasAngle(ca2) || ct1.HasAngle(ca2) && ct2.HasAngle(ca1));
 }
示例#7
0
 public bool LinksTriangles(Triangle ct1, Triangle ct2)
 {
     return ct1.HasAngle(ca1) && ct2.HasAngle(ca2) || ct1.HasAngle(ca2) && ct2.HasAngle(ca1);
 }