Используйте ArrayList для отображения нескольких векторных объектов Java

Я создаю Ray Tracer на java, и мне просто нужно распечатать каждую из трех сфер, которые я сделал.

Я создал 3 сферических объекта и сохранил их в файле arrayylist в основном файле, который теперь передаю на камеру, чтобы создать изображение.

Для этого мне нужно выяснить:

  • Если точка пересечения не нулевая, получите расстояние между началом луча и точкой пересечения.
  • Если это первая сфера во внутреннем цикле, установите переменную на это расстояние - если нет, посмотрите, меньше ли это расстояние, чем ранее измеренное расстояние - если да, сохраните это расстояние для сравнения с другими сферами и установите индекс ближайшей сферы на индекс оцениваемой сферы (счетчик, используемый во внутреннем цикле, проходящем через сферы).
  • Вне этого внутреннего цикла запишите пиксель обратно в буферное изображение, но при вызове localReflectionModel используйте ближайшую сферу (используя индекс ближайшей сферы, которую вы сохранили во внутреннем цикле).

Код:

for(int x = 0; x < filmResolutionX; x++) {

      for(int y =0; y < filmResolutionY; y++) {

          for (int z = 0; z < s.size(); z++) {

          double planeX = -0.5+ x / (double) filmResolutionX;
          double planeY = 0.5 - y / (double) filmResolutionY;
          double planeZ = 1;

          Coord3D planes = new Coord3D(planeX, planeY, planeZ);
          Coord3D Origin = new Coord3D(0,0,0);
          Ray plane = new Ray(Origin, planes);
          Coord3D iPoint = plane.intersectionPoint(s.get(z));
 Color colorSphere = new Color(0xD72448);
          if (iPoint != null){
             double distance = plane.getOrigin().distanceBetween(iPoint);
          }
          if (z == 0) {
             double distanceCheck1 = plane.getOrigin().distanceBetween(iPoint);
          } else if (z != 0) {

          }

          if (iPoint == null) {
              newImage.setRGB(x, y, 0);
          } else {
                colorSphere =  s.get(z).localReflectionModel(iPoint, l, plane);
              int rgb = colorSphere.getRGB();
              newImage.setRGB(x, y, rgb);

            }

            }

        }
    }

    return newImage;
    }
}

У меня проблемы с попыткой сравнить расстояния от предыдущих сфер. Когда я пытаюсь сослаться на переменные Distance или Distance check 1, я получаю сообщение об ошибке, говорящее, что расстояние не может быть разрешено в переменной


person Bhetzie    schedule 08.05.2014    source источник


Ответы (1)


Похоже, у вас возникли трудности с областью действия. Если вы объявляете переменные внутри блока, как в случае if (something) { double x = ...; }, переменные видны только внутри объявленного блока.

Если позже вы захотите получить доступ к этим переменным, вы должны изменить область видимости, чтобы они были видны в блоке, в котором вы хотите их использовать. Конечно, вы можете просто объявить их на глобальном уровне, но искусство заключается в поиске наименьшего эффективный объем.

person blueygh2    schedule 08.05.2014
comment
Вау ... Не могу поверить, что я это пропустил! Спасибо!! - person Bhetzie; 08.05.2014