/// <summary> /// Finds the intersection of two circles from MGO input /// </summary> /// <param name="circle1">First Circle</param> /// <param name="circle2">Second Circle</param> /// <returns></returns> internal static intersectionFigData CircleCircleIntersection(AbstractCircle circle1, AbstractCircle circle2) { Vector3 center1 = circle1.centerPos; Vector3 center2 = circle2.centerPos; Vector3 norm1 = circle1.normalDir; Vector3 norm2 = circle2.normalDir; float r1 = circle1.Radius; float r2 = circle2.Radius; return(CircleCircleIntersection(center1, center2, norm1, norm2, r1, r2)); }
private MasterGeoObj[] checkSpherecircle(AbstractSphere abstractSphere, AbstractCircle abstractCircle) { intersectionFigData data = IntersectionMath.SphereCircleIntersection(abstractSphere, abstractCircle); MasterGeoObj[] mgoResult = null; if (data.figtype == GeoObjType.point) { if (data.vectordata.Length == 1) { mgoResult = new MasterGeoObj[] { GeoObjConstruction.dPoint(data.vectordata[0]).setIntersectionFigure(0) }; } else if (data.vectordata.Length == 2) { mgoResult = new MasterGeoObj[] { GeoObjConstruction.dPoint(data.vectordata[0]).setIntersectionFigure(0), GeoObjConstruction.dPoint(data.vectordata[1]).setIntersectionFigure(1) }; } } return(mgoResult); }
private MasterGeoObj[] checkCircleStraightEdge(AbstractCircle abstractCircle, straightEdgeBehave straightEdgeBehave) { intersectionFigData data = IntersectionMath.CircleLineIntersection(abstractCircle, straightEdgeBehave); MasterGeoObj[] mgoResult = null; if (data.figtype == GeoObjType.point) { if (data.vectordata.Length == 1) { mgoResult = new MasterGeoObj[] { GeoObjConstruction.dPoint(data.vectordata[0]).setIntersectionFigure(0) }; } else if (data.vectordata.Length == 2) { mgoResult = new MasterGeoObj[] { GeoObjConstruction.dPoint(data.vectordata[0]).setIntersectionFigure(0), GeoObjConstruction.dPoint(data.vectordata[1]).setIntersectionFigure(1) }; } } return(mgoResult); }
private AbstractGeoObj[] CheckCircleCircle(AbstractCircle abstractCircle1, AbstractCircle abstractCircle2) { intersectionFigData data = IntersectionMath.CircleCircleIntersection(abstractCircle1, abstractCircle2); AbstractGeoObj[] mgoResult = null; if (data.figtype == GeoObjType.point) { if (data.vectordata.Length == 1) { mgoResult = new AbstractGeoObj[] { GeoObjConstruction.dPoint(data.vectordata[0]).setIntersectionFigure(0) }; } else if (data.vectordata.Length == 2) { mgoResult = new AbstractGeoObj[] { GeoObjConstruction.dPoint(data.vectordata[0]).setIntersectionFigure(0), GeoObjConstruction.dPoint(data.vectordata[1]).setIntersectionFigure(1) }; } } return(mgoResult); }
//[ContextMenu("Saves to File")] for debugging uncomment and make public /// <param name="clear">If true completely clears out the list of objects previously saved during session</param> private void AbstractGeoObjtoGeoObj(bool clear) { AbstractGeoObj[] allObj = FindObjectsOfType <AbstractGeoObj>().Where(g => (g.tag != "NoSave" && ((g.GetComponent <AnchorableBehaviour>() != null && !g.GetComponent <AnchorableBehaviour>().isAttached) || g.GetComponent <AnchorableBehaviour>() == null))).ToArray(); if (clear) { GeoObjDB.list = new List <GeoObj>(); } foreach (AbstractGeoObj obj in allObj) { List <string> dependencyList = new List <string>(); GeoObjDef thisObjDef; switch (obj.figType) { case GeoObjType.point: thisObjDef = determineDef(obj, GeoObjType.point); GeoObjDB.list.Add(new GeoObj(obj.figName, obj.transform.position, thisObjDef, GeoObjType.point)); break; case GeoObjType.line: thisObjDef = determineDef(obj, GeoObjType.line); AbstractLineSegment thisLineRef = obj.GetComponent <AbstractLineSegment>(); HW_GeoSolver.ins.geomanager.neighborsOfNode(thisLineRef.figName) .Where(d => HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractPoint>() != null).ToList() .ForEach(d => dependencyList.Add(HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractGeoObj>().figName)); GeoObjDB.list.Add(new GeoObj(obj.figName, obj.transform.position, obj.transform.rotation, new figData.line(thisLineRef.vertex0, thisLineRef.vertex1), thisObjDef, dependencyList, GeoObjType.line)); break; case GeoObjType.polygon: thisObjDef = determineDef(obj, GeoObjType.polygon); AbstractPolygon thisPolyRef = obj.GetComponent <AbstractPolygon>(); dependencyList = new List <string>(); thisPolyRef.pointList.ForEach(p => dependencyList.Add(p.figName)); thisPolyRef.lineList.ForEach(l => dependencyList.Add(l.figName)); GeoObjDB.list.Add(new GeoObj( obj.figName, obj.transform.position, obj.transform.rotation, new figData.polygon(thisPolyRef.normDir, thisPolyRef.lineList.Count), thisObjDef, dependencyList, GeoObjType.polygon)); break; case GeoObjType.prism: thisObjDef = determineDef(obj, GeoObjType.prism); InteractablePrism thisPrismRef = obj.GetComponent <InteractablePrism>(); // no abstract version List <string> bases = new List <string>(); List <string> sides = new List <string>(); List <string> edges = new List <string>(); thisPrismRef.bases.ForEach(b => bases.Add(b.figName)); thisPrismRef.sides.ForEach(s => sides.Add(s.figName)); thisPrismRef.lineSegments.ForEach(e => edges.Add(e.figName)); GeoObjDB.list.Add(new GeoObj(obj.figName, obj.transform.position, obj.transform.rotation, new figData.prism(bases, sides, edges), thisObjDef, GeoObjType.prism)); break; case GeoObjType.pyramid: thisObjDef = determineDef(obj, GeoObjType.pyramid); DependentPyramid thisPyramidRef = GetComponent <DependentPyramid>(); // no abstract version HW_GeoSolver.ins.geomanager.neighborsOfNode(thisPyramidRef.figName).ToList() .ForEach(d => dependencyList.Add(HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractGeoObj>().figName)); GeoObjDB.list.Add(new GeoObj( obj.figName, obj.transform.position, obj.transform.rotation, new figData.pyramid(thisPyramidRef.apex.figName, thisPyramidRef.apex.transform.position), thisObjDef, dependencyList, GeoObjType.pyramid)); break; case GeoObjType.circle: thisObjDef = determineDef(obj, GeoObjType.circle); AbstractCircle thisCircleRef = obj.GetComponent <AbstractCircle>(); HW_GeoSolver.ins.geomanager.neighborsOfNode(thisCircleRef.figName).ToList() .ForEach(d => dependencyList.Add(HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractGeoObj>().figName)); GeoObjDB.list.Add(new GeoObj( obj.figName, obj.transform.position, obj.transform.rotation, new figData.circle(thisCircleRef.centerPos, thisCircleRef.edgePos, thisCircleRef.normalDir), thisObjDef, dependencyList, GeoObjType.circle)); break; case GeoObjType.sphere: thisObjDef = determineDef(obj, GeoObjType.sphere); AbstractSphere thisSphereRef = obj.GetComponent <AbstractSphere>(); HW_GeoSolver.ins.geomanager.neighborsOfNode(thisSphereRef.figName).ToList() .ForEach(d => dependencyList.Add(HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractGeoObj>().figName)); GeoObjDB.list.Add(new GeoObj(obj.figName, obj.transform.position, obj.transform.rotation, new figData.sphere(thisSphereRef.edgePosition), thisObjDef, dependencyList, GeoObjType.sphere)); break; case GeoObjType.revolvedsurface: thisObjDef = determineDef(obj, GeoObjType.revolvedsurface); AbstractRevolvedSurface thisRevSurfRef = obj.GetComponent <AbstractRevolvedSurface>(); HW_GeoSolver.ins.geomanager.neighborsOfNode(thisRevSurfRef.figName).ToList() .ForEach(d => dependencyList.Add(HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractGeoObj>().figName)); GeoObjDB.list.Add(new GeoObj(obj.figName, obj.transform.position, obj.transform.rotation, new figData.revSurf(thisRevSurfRef.normalDirection), thisObjDef, dependencyList, GeoObjType.revolvedsurface)); break; //case GeoObjType.torus: // thisObjDef = determineDef(obj, GeoObjType.torus); // Case doesn't exist yet. // break; case GeoObjType.flatface: thisObjDef = GeoObjDef.none; GeoObjDB.list.Add(new GeoObj(obj.name, obj.transform.position, obj.transform.rotation, thisObjDef, GeoObjType.flatface)); break; case GeoObjType.straightedge: thisObjDef = GeoObjDef.none; GeoObjDB.list.Add(new GeoObj(obj.name, obj.transform.position, obj.transform.rotation, thisObjDef, GeoObjType.straightedge)); break; default: Debug.Log("Object type not supported within XMLManager! " + obj.figType + " was attempted and failed to serialize."); break; } } if (!clear) { GeoObjDB.list.Distinct(); //if you dont clear the list then remove exact duplicates } }
/// <summary> /// Finds the intersection between a circle and a line with MGO input. /// </summary> /// <param name="circle"></param> /// <param name="linePos"></param> /// <param name="lineDir"></param> /// <returns></returns> internal static intersectionFigData CircleLineIntersection(AbstractCircle circle, Vector3 linePos, Vector3 lineDir) { return(CircleLineIntersection(linePos, lineDir, circle.centerPos, circle.normalDir, circle.Radius)); }
internal static intersectionFigData CircleLineIntersection(AbstractCircle circle, straightEdgeBehave line) { return(CircleLineIntersection(circle, line.center, line.normalDir)); }
/// <summary> /// /// </summary> /// <param name="circle"></param> /// <param name="planePos"></param> /// <param name="planeNorm"></param> /// <returns></returns> internal static intersectionFigData CirclePlaneIntersection(AbstractCircle circle, Vector3 planePos, Vector3 planeNorm) { return(CirclePlaneIntersection(circle.centerPos, circle.normalDir, circle.Radius, planePos, planeNorm)); }
/// <summary> /// /// </summary> /// <param name="circle"></param> /// <param name="flatface"></param> /// <returns></returns> internal static intersectionFigData CirclePlaneIntersection(AbstractCircle circle, flatfaceBehave flatface) { return(CirclePlaneIntersection(circle, flatface.Position3, flatface.normalDir)); }
/// <summary> /// /// </summary> /// <param name="sphere"></param> /// <param name="circle"></param> /// <returns></returns> internal static intersectionFigData SphereCircleIntersection(AbstractSphere sphere, AbstractCircle circle) { return(SphereCircleIntersection(sphere.centerPosition, sphere.radius, circle.centerPos, circle.normalDir, circle.Radius)); }