Может ли кто-нибудь помочь мне добавить возвращаемое значение для каждого пути кодирования моего метода? - PullRequest
0 голосов
/ 10 января 2020

Я непосредственный новичок в кодировании и получаю сообщение об ошибке, что мой код не будет возвращать значение в каждом пути. Может ли кто-нибудь помочь мне решить эту проблему? Вы видите, что методы и классы взяты из библиотеки Rhino Geometry. Спасибо, что прочитали мой пост. С наилучшими пожеланиями, Оливер

bool ComputePaths (ссылка Росток кривой, Сегменты списка, Узлы списка) {

double threshold = 0.5;
bool success = false;

while(success = false)
{
  int counter = 0;
  for (int i = 0; i < segments.Count; i++)
  {
    Vector3d a = sprout.PointAtEnd - segments[i].PointAtStart;
    Vector3d b = sprout.PointAtEnd - segments[i].PointAtEnd;
    if (a.Length < threshold | b.Length < threshold)
    {
      Point3d origin = new Point3d();
      origin = sprout.PointAtStart;

      List<Curve> segmentsToJoin = new List<Curve>();
      segmentsToJoin.Add(sprout);
      segmentsToJoin.Add(segments[i]);
      Curve[] segmentsJoined = new Curve[1];
      segmentsJoined = Curve.JoinCurves(segmentsToJoin, threshold);
      sprout = segmentsJoined[0];

      Vector3d c = sprout.PointAtStart - origin;
      if (c.Length > threshold)
      {
        sprout.Reverse();
      }

      for (int j = 0; j < nodes.Count; j++)
      {
        Vector3d d = sprout.PointAtEnd - nodes[j];
        if (d.Length < threshold)
        {
          success = true;
          return success;
        }
      }
    }
    else
    {
      counter += 1;
      if(counter == segments.Count);
      {
        return success;
      }
    }
  }
}

}

Ответы [ 2 ]

1 голос
/ 10 января 2020

Я думаю, что у нас есть несколько проблем здесь:

1) как писал Рафалон в своем комментарии, вы должны использовать оператор == в то время как l oop

2) Поскольку вы имейте для l oop в течение вашего l oop, и когда вы возвращаетесь в случае успеха, вам совсем не нужно время.

3) Также ваш путь else бесполезен, так как счетчик может только будь меньше или равно i, вы никогда не встретите счетчик == сегментов. Количество, так как for l oop закончится раньше.

Просто верните true в случае успеха и false в любом другом случае на самый конец метода. Ваш код должен выглядеть примерно так:

bool ComputePaths(ref Curve sprout, List segments, List nodes)
{
    double threshold = 0.5;

    for (int i = 0; i < segments.Count; i++)
    {
        Vector3d a = sprout.PointAtEnd - segments[i].PointAtStart;
        Vector3d b = sprout.PointAtEnd - segments[i].PointAtEnd;

        if (a.Length < threshold | b.Length < threshold)
        {
            Point3d origin = new Point3d();
            origin = sprout.PointAtStart;
            List<Curve> segmentsToJoin = new List<Curve>();
            segmentsToJoin.Add(sprout);
            segmentsToJoin.Add(segments[i]);
            Curve[] segmentsJoined = new Curve[1];
            segmentsJoined = Curve.JoinCurves(segmentsToJoin, threshold);
            sprout = segmentsJoined[0];
            Vector3d c = sprout.PointAtStart - origin;

            if (c.Length > threshold)
            {
                sprout.Reverse();
            }

            for (int j = 0; j < nodes.Count; j++)
            {
                Vector3d d = sprout.PointAtEnd - nodes[j];

                if (d.Length < threshold)
                {
                    return true;
                }
            }
        }
    }

    return false;
}

ОБНОВЛЕНИЕ: Я только что понял, что вы меняете росток параметра в вашем для l oop, поэтому у вас будет другое условие, если вы введете для l oop снова во второй раз. поэтому мои пункты 2 и 3 неверны.

bool ComputePaths(ref Curve sprout, List segments, List nodes)
{
    double threshold = 0.5;
    int counter = 0;
    while(true)
    {
        for (int i = 0; i < segments.Count; i++)
        {
            Vector3d a = sprout.PointAtEnd - segments[i].PointAtStart;
            Vector3d b = sprout.PointAtEnd - segments[i].PointAtEnd;

            if (a.Length < threshold | b.Length < threshold)
            {
                Point3d origin = new Point3d();
                origin = sprout.PointAtStart;
                List<Curve> segmentsToJoin = new List<Curve>();
                segmentsToJoin.Add(sprout);
                segmentsToJoin.Add(segments[i]);
                Curve[] segmentsJoined = new Curve[1];
                segmentsJoined = Curve.JoinCurves(segmentsToJoin, threshold);
                sprout = segmentsJoined[0];
                Vector3d c = sprout.PointAtStart - origin;

                if (c.Length > threshold)
                {
                    sprout.Reverse();
                }

                for (int j = 0; j < nodes.Count; j++)
                {
                    Vector3d d = sprout.PointAtEnd - nodes[j];

                    if (d.Length < threshold)
                    {
                        return true;
                    }
                }
            }
            else
            {
                counter += 1;
                if(counter == segments.Count);
                {
                    return false;
                }
            }
        }
    }    

    return false;
}
0 голосов
/ 10 января 2020

Спасибо всем за вашу большую помощь! Это работает сейчас.

С наилучшими пожеланиями, Оливер

РЕШЕНО:

 bool ComputePaths(ref NurbsCurve sprout, List<Curve> segments, List<Vector3d> nodes)
  {
    double threshold = 0.5;
    int counter = 0;
    while(true)
    {
      for (int i = 0; i < segments.Count; i++)
      {
        Vector3d a = sprout.PointAtEnd - segments[i].PointAtStart;
        Vector3d b = sprout.PointAtEnd - segments[i].PointAtEnd;
        if (a.Length < threshold | b.Length < threshold)
        {
          Point3d origin = new Point3d();
          origin = sprout.PointAtStart;

          List<Curve> segmentsToJoin = new List<Curve>();
          segmentsToJoin.Add(sprout);
          segmentsToJoin.Add(segments[i]);
          Curve[] segmentsJoined = new Curve[1];
          segmentsJoined = Curve.JoinCurves(segmentsToJoin, threshold);
          sprout = segmentsJoined[0].ToNurbsCurve();

          Vector3d c = sprout.PointAtStart - origin;
          if (c.Length > threshold)
          {
            sprout.Reverse();
          }

          for (int j = 0; j < nodes.Count; j++)
          {
            Vector3d d = sprout.PointAtEnd - new Point3d(nodes[j].X, nodes[j].Y, nodes[j].Z);
            if (d.Length < threshold)
            {
              return true;
            }
          }
        }
        else
        {
          counter += 1;
          if(counter == segments.Count)
          {
            return false;
          }
        }
      }
    }
  }
...