Пример #1
0
        /// <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));
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        //[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
            }
        }
Пример #6
0
 /// <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));
 }
Пример #7
0
 internal static intersectionFigData CircleLineIntersection(AbstractCircle circle, straightEdgeBehave line)
 {
     return(CircleLineIntersection(circle, line.center, line.normalDir));
 }
Пример #8
0
 /// <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));
 }
Пример #9
0
 /// <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));
 }
Пример #10
0
 /// <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));
 }