1

曲線から指定された距離だけ離れたところに曲線を描こうとしています。道路の脇は常に中央の黄色の線から一定の距離だけ離れているようなものです。これを行うコードがありますが、コードを使用すると、曲線の 1 つにオーバーラップが発生します。

これが私のコードです:

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));
            }
        }

そして、これが結果の写真です: 重なりのある曲線

ありとあらゆる助けをいただければ幸いです。

4

0 に答える 0