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; }
public bool LinksTriangles(Triangle ct1, Triangle ct2) { return((ct1.HasAngle(smallerAngle) && ct2.HasAngle(largerAngle)) || (ct1.HasAngle(largerAngle) && ct2.HasAngle(smallerAngle))); }
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; }
public bool LinksTriangles(Triangle ct1, Triangle ct2) { return (ct1.HasAngle(smallerAngle) && ct2.HasAngle(largerAngle)) || (ct1.HasAngle(largerAngle) && ct2.HasAngle(smallerAngle)); }
public bool LinksTriangles(Triangle ct1, Triangle ct2) { return(ct1.HasAngle(ca1) && ct2.HasAngle(ca2) || ct1.HasAngle(ca2) && ct2.HasAngle(ca1)); }
public bool LinksTriangles(Triangle ct1, Triangle ct2) { return ct1.HasAngle(ca1) && ct2.HasAngle(ca2) || ct1.HasAngle(ca2) && ct2.HasAngle(ca1); }