public void GenerateRoadPolygon(int steps) { if (RoadPolygons == null) { RoadPolygons = new Ets2Point[0]; } if (RoadPolygons != null && RoadPolygons.Count() == steps) { return; } if (StartNode == null || EndNode == null) { return; } if (Type != Ets2ItemType.Road) { return; } var ps = new Ets2Point[steps]; var sx = StartNode.X; var ex = EndNode.X; var sz = StartNode.Z; var ez = EndNode.Z; var radius = (float)Math.Sqrt((sx - ex) * (sx - ex) + (sz - ez) * (sz - ez)); var tangentSX = (float)Math.Cos(-StartNode.Yaw) * radius; var tangentEX = (float)Math.Cos(-EndNode.Yaw) * radius; var tangentSZ = (float)Math.Sin(-StartNode.Yaw) * radius; var tangentEZ = (float)Math.Sin(-EndNode.Yaw) * radius; for (int k = 0; k < steps; k++) { var s = (float)k / (float)(steps - 1); var x = (float)Ets2CurveHelper.Hermite(s, sx, ex, tangentSX, tangentEX); var z = (float)Ets2CurveHelper.Hermite(s, sz, ez, tangentSZ, tangentEZ); ps[k] = new Ets2Point(x, 0, z, 0); } RoadPolygons = ps; }
public void GenerateRoadPolygon(int steps) { if (RoadPolygons == null) { RoadPolygons = new PointF[0]; } if (RoadPolygons != null && RoadPolygons.Count() == steps) { return; } if (StartNode == null || EndNode == null) { return; } if (Type != Ets2ItemType.Road) { return; } var ps = new PointF[steps]; var sx = StartNode.X; var ex = EndNode.X; var sy = StartNode.Z; var ey = EndNode.Z; var radius = (float)Math.Sqrt((sx - ex) * (sx - ex) + (sy - ey) * (sy - ey)); var tangentSX = (float)Math.Cos(-StartNode.Yaw) * radius; var tangentEX = (float)Math.Cos(-EndNode.Yaw) * radius; var tangentSY = (float)Math.Sin(-StartNode.Yaw) * radius; var tangentEY = (float)Math.Sin(-EndNode.Yaw) * radius; for (int k = 0; k < steps; k++) { var s = (float)k / (float)(steps - 1); var x = (float)Ets2CurveHelper.Hermite(s, sx, ex, tangentSX, tangentEX); var y = (float)Ets2CurveHelper.Hermite(s, sy, ey, tangentSY, tangentEY); ps[k] = new PointF(x, y); } RoadPolygons = ps; }