Ejemplo n.º 1
0
        // Because all of these tests were written assuming open drive coordinates, but our geometry is in
        // Unity coordinates, rather than re-write all the test cases, we just convert from OpenDRIVE to Unity here
        static Geometry ConstructGeometryFromOpenDriveCoordinates(
            GeometryKind geometryKind, float headingDegrees, float length, float sAbsolute, float x, float z,
            ArcData arcData     = default, SpiralData spiralData         = default,
            Poly3Data poly3Data = default, ParamPoly3Data paramPoly3Data = default)
        {
            var pose = OpenDriveMapElementFactory.FromOpenDriveGlobalToUnity(math.radians(headingDegrees), x, z);

            return(ConstructGeometry(geometryKind, pose, length, sAbsolute,
                                     arcData, spiralData, poly3Data, paramPoly3Data));
        }
Ejemplo n.º 2
0
 static Geometry ConstructGeometry(
     GeometryKind geometryKind, RigidTransform pose, float length, float sAbsolute,
     ArcData arcData     = default, SpiralData spiralData         = default,
     Poly3Data poly3Data = default, ParamPoly3Data paramPoly3Data = default)
 {
     return(new Geometry()
     {
         length = length,
         sRoad = sAbsolute,
         startPose = pose,
         geometryKind = geometryKind,
         arcData = arcData,
         spiralData = spiralData,
         poly3Data = poly3Data,
         paramPoly3Data = paramPoly3Data
     });
 }
Ejemplo n.º 3
0
        // Because all of these tests were written assuming open drive coordinates, but our geometry is in
        // Unity coordinates, rather than re-write all the test cases, we just convert from OpenDRIVE to Unity here
        static Geometry ConstructGeometryFromOpenDriveCoordinates(
            float headingDegrees, float length, float sAbsolute, float x, float z,
            GeometryKind geometryKind, ArcData arcData = default, SpiralData spiralData = default,
            Poly3Data poly3Data = default, ParamPoly3Data paramPoly3Data = default)
        {
            var pose = OpenDriveMapElementFactory.FromOpenDriveGlobalToUnity(math.radians(headingDegrees), x, z);

            return(new Geometry()
            {
                length = length,
                sRoad = sAbsolute,
                startPose = pose,
                geometryKind = geometryKind,
                arcData = arcData,
                spiralData = spiralData,
                poly3Data = poly3Data,
                paramPoly3Data = paramPoly3Data
            });
        }
Ejemplo n.º 4
0
    /* IEnumerator ArcSequence(float arc)
     * {
     *  float start = (180 - Mathf.CeilToInt(180 / arc) * arc) * 0.5f - 90;
     *  for (int i = 0; i < 3; i++)
     *  {
     *      float angle = start;
     *      for (int j = 0; j < 2; j++)
     *      {
     *          for (; angle <= 90; angle += 2 * arc)
     *              ShootArc(angle, arc);
     *          angle = start + arc;
     *          yield return waveTime;
     *      }
     *  }
     * } */

    IEnumerator ArcSequence(ArcData data)
    {
        float halfSpan = data.span * 0.5f;

        for (int i = 0; i < waves; i++)
        {
            float angle = data.start;
            for (int j = 0; j < 2; j++)
            {
                for (; angle <= 90; angle += data.span)
                {
                    ShootArc(angle, data.arc);
                }
                angle = data.start + halfSpan;
                while (angle > data.minStart)
                {
                    angle -= data.span;
                }
                yield return(waveTime);
            }
        }
    }
Ejemplo n.º 5
0
		private static void DrawCornerArc(Graphics g,ArcData arc,eStyleBorderType border,int lineWidth, Color color)
		{
			using(Pen pen=CreatePen(border,lineWidth,color))
			{
				g.DrawArc(pen,arc.X,arc.Y,arc.Width,arc.Height,arc.StartAngle,arc.SweepAngle);
			}
		}
Ejemplo n.º 6
0
		internal static ArcData GetCornerArc(Rectangle bounds, int cornerDiameter, eCornerArc corner)
		{
			ArcData a;
			int diameter=cornerDiameter*2;
			switch(corner)
			{
				case eCornerArc.TopLeft:
					a=new ArcData(bounds.X,bounds.Y,diameter,diameter,180,90);
					break;
                case eCornerArc.TopRight:
					a=new ArcData(bounds.Right-diameter,bounds.Y,diameter,diameter,270,90);
					break;
				case eCornerArc.BottomLeft:
					a=new ArcData(bounds.X,bounds.Bottom-diameter,diameter,diameter,90,90);
					break;
				default: // eCornerArc.BottomRight:
					a=new ArcData(bounds.Right-diameter,bounds.Bottom-diameter,diameter,diameter,0,90);
					break;
			}
			return a; 
		}
Ejemplo n.º 7
0
 private static void DrawCornerArc(Graphics g, ArcData arc, eStyleBorderType border, int lineWidth, Color color)
 {
     SmoothingMode sm = g.SmoothingMode;
     if (sm == SmoothingMode.None) g.SmoothingMode = SmoothingMode.HighQuality;
     using (Pen pen = CreatePen(border, lineWidth, color))
     {
         g.DrawArc(pen, arc.X, arc.Y, arc.Width, arc.Height, arc.StartAngle, arc.SweepAngle);
     }
     if (sm == SmoothingMode.None) g.SmoothingMode = sm;
 }
Ejemplo n.º 8
0
    public static Vector3 ArcNormalised(out ArcData data, Vector3 startPosition, Vector3 startNormal, Vector3 endPosition, float t)
    {
        //Vector3 currentNormal;
        Vector3 toEndNormal;
        //Vector3 toStartNormal;
        Vector3 endNormal;
        Vector3 startInsideNormal;
        Vector3 endInsideNormal;
        //Vector3 startPoint;
        //Vector3 endPoint;
        //Vector3 anglePoint;
        Vector3 circleCentre = Vector3.zero;
        Vector3 intersect    = Vector3.zero;
        float   radius;
        float   angle       = 0;
        float   properAngle = 0;
        float   angleToStart;
        //float angleToEnd;
        float worldAngle;
        float worldAngleTwo;

        startPosition.y = 0;
        endPosition.y   = 0;
        startNormal.y   = 0;

        toEndNormal   = Vector3.Normalize(endPosition - startPosition);
        properAngle   = AngleHalf(startNormal, toEndNormal, Vector3.up);
        worldAngle    = Vector3.Angle(Vector3.forward, startNormal);
        worldAngleTwo = AngleHalf(Vector3.forward, startNormal, Vector3.up);

        if (properAngle > 0)
        {
            //anglePoint = startNormal * (Vector3.Distance(startPosition, endPosition) * 0.5f);


            //toStartNormal = Vector3.Normalize(startPosition - endPosition);
            angle = Vector3.Angle(startNormal, toEndNormal);

            endNormal = Quaternion.Euler(new Vector3(0, angle, 0)) * -toEndNormal;

            endInsideNormal   = Quaternion.Euler(new Vector3(0, -90, 0)) * endNormal;
            startInsideNormal = Quaternion.Euler(new Vector3(0, 90, 0)) * startNormal;
            angleToStart      = AngleFull(startInsideNormal, endInsideNormal, Vector3.up);
        }
        else
        {
            //anglePoint = startNormal * (Vector3.Distance(startPosition, endPosition) * 0.5f);


            //toStartNormal = Vector3.Normalize(startPosition - endPosition);
            angle = Vector3.Angle(startNormal, toEndNormal);

            endNormal = Quaternion.Euler(new Vector3(0, -angle, 0)) * -toEndNormal;

            endInsideNormal   = Quaternion.Euler(new Vector3(0, 90, 0)) * endNormal;
            startInsideNormal = Quaternion.Euler(new Vector3(0, -90, 0)) * startNormal;
            angleToStart      = AngleFull(endInsideNormal, startInsideNormal, Vector3.up);
        }
        if (LineLineIntersection(out intersect, startPosition, startInsideNormal * 100000, endPosition, endInsideNormal * 100000))
        {
            circleCentre = intersect;
        }
        else
        {
        }
        radius = Vector3.Distance(circleCentre, startPosition);

        Vector3 newPos = Vector3.zero;


        if (angleToStart < 1)
        {
        }
        else
        {
        }

        Vector3 tNormal;

        if (LineLineIntersection(out intersect, startPosition, startInsideNormal * 100000, endPosition, endInsideNormal * 100000))
        {
            if (properAngle > 0)
            {
                if (worldAngleTwo >= 0)
                {
                    newPos = Orbit(circleCentre, radius, -90 + t * (angleToStart) + worldAngle);
                }
                else
                {
                    newPos = Orbit(circleCentre, radius, -90 + t * (angleToStart) - worldAngle);
                }
            }
            else
            {
                if (worldAngleTwo >= 0)
                {
                    newPos = Orbit2(circleCentre, radius, -90 + t * (angleToStart) - worldAngle);
                }
                else
                {
                    newPos = Orbit2(circleCentre, radius, -90 + t * (angleToStart) + worldAngle);
                }
            }
            tNormal = Vector3.Normalize(circleCentre - newPos);
        }
        else
        {
            newPos    = Vector3.Lerp(startPosition, endPosition, t);
            tNormal   = Quaternion.Euler(0, 90, 0) * Vector3.Normalize(endPosition - startPosition);
            endNormal = Vector3.Normalize(startPosition - endPosition);
        }


        //float newAngle =AngleFull(startNormal, endNormal, Vector3.up);

        data = new ArcData(startPosition, startNormal, endPosition, -endNormal, radius, 2 * radius * Mathf.PI, angleToStart, circleCentre, ArcFunctions.ArcLength(startPosition, startNormal, endPosition), tNormal);

        return(newPos);
    }