Перемещение кривой по обратному наклону каждой точки без наложения

Я пытаюсь нарисовать кривые на определенном расстоянии от кривой. Вроде как стороны дороги всегда на определенном расстоянии от желтых линий в центре. У меня есть код, чтобы сделать это, однако, когда это делается с использованием моего кода, он заканчивается перекрытием в одной из кривых.

Вот мой код:

for (int i = 0; i < curves.Count; i++)
        {
            for (float j = 0; j < 1; j += .001f)
            {
                Vector2 temp = Vector2.CatmullRom(curves[i].Points[0], curves[i].Points[1], curves[i].Points[2], curves[i].Points[3], j);
                if (mid.Count != 0)
                {
                    if (temp != mid[mid.Count - 1])
                    {
                        mid.Add(temp);
                    }
                    else Console.WriteLine(temp == mid[mid.Count - 1]);
                }
                else mid.Add(temp);
            }
        }

for (int i = 0; i < mid.Count; i++)
        {
            if (i == 0)
            {
                Vector2 slope = mid[i] - mid[i + 1];
                double x = mid[i].X + (12 * Math.Cos(Math.Atan(-(slope.X / slope.Y)))),
                    y = mid[i].Y + (12 * Math.Sin(Math.Atan(-(slope.X / slope.Y))));
                side1.Add(new Vector2((float)x, (float)y));

                x = mid[i].X - (12 * Math.Cos(Math.Atan(-(slope.X / slope.Y))));
                y = mid[i].Y - (12 * Math.Sin(Math.Atan(-(slope.X / slope.Y))));
                side2.Add(new Vector2((float)x, (float)y));
            }
            else if (i < mid.Count - 1)
            {
                Vector2 slope1 = mid[i] - mid[i - 1],
                    slope2 = mid[i + 1] - mid[i];

                Vector2 slope = (slope1 + slope2) / 2;

                double x = mid[i].X + (12 * Math.Cos(Math.Atan(-(slope.X / slope.Y)))),
                    y = mid[i].Y + (12 * Math.Sin(Math.Atan(-(slope.X / slope.Y))));
                side1.Add(new Vector2((float)x, (float)y));

                x = mid[i].X - (12 * Math.Cos(Math.Atan(-(slope.X / slope.Y))));
                y = mid[i].Y - (12 * Math.Sin(Math.Atan(-(slope.X / slope.Y))));
                side2.Add(new Vector2((float)x, (float)y));
            }
            else
            {
                Vector2 slope = mid[i] - mid[i - 1];

                double x = mid[i].X + (12 * Math.Cos(Math.Atan(-(slope.X / slope.Y)))),
                    y = mid[i].Y + (12 * Math.Sin(Math.Atan(-(slope.X / slope.Y))));
                side1.Add(new Vector2((float)x, (float)y));

                x = mid[i].X - (12 * Math.Cos(Math.Atan(-(slope.X / slope.Y))));
                y = mid[i].Y - (12 * Math.Sin(Math.Atan(-(slope.X / slope.Y))));
                side2.Add(new Vector2((float)x, (float)y));
            }
        }

И вот фото результата: Кривые с перекрытием

Любая помощь будет принята с благодарностью.

0 ответов

Другие вопросы по тегам