我正在尝试为给定骨架代码中的球体实现光线跟踪算法
要计算Delta
,我想使用球体的半径和中心。我正在将Scene
类的对象导入:
void render(image2D<float4>& framebuffer, const Scene& scene, float w_s, float
f, const float4& background_color)
类Scene
确实是这样的:
class Scene
{
Scene(const Scene&) = default;
Scene& operator =(const Scene&) = default;
std::vector<Sphere> spheres;
public:
Scene() = default;
void addSphere(const float3& c, float r);
};
所以类Scene
包含一个向量<Sphere>
,其中Sphere
看起来像这样:
struct Sphere
{
float3 c;
float r;
};
所以我试图像这样从导入Sphere
获取中心和半径
std::cout << "Sphere radius: " << scene.spheres.(0).r << std::endl;
但是我得到scene.spheres
是私人的。我们不允许更改.h
文件。我该如何处理以获取每个球体对象的c
和r
的值?
答案 0 :(得分:1)
如果您有权访问spheres
,则可以输入:
std::cout << "Sphere radius: " << scene.spheres[0].r << std::endl;
或更好:
for (auto& x: scene.spheres)
std::cout << "Sphere radius: " << x.r << std::endl;
但是spheres
是Scene
的私有对象,除非您可以更改Scene
的定义并在{{1}上提供迭代器,否则您将无法访问它。 },或spheres
的吸气剂,或使render函数成为该类的朋友。
答案 1 :(得分:0)
你不能。
该类使您无法访问其内容,并且如果无法更改它,那么您将没有解决方案。
那是一个设计很差的课程。
答案 2 :(得分:0)
有一种简单但不可否认的解决问题的方法。我不能完全同意其中一项说法,即这是一个糟糕的设计。但是,如果不允许您触摸头文件,从而更改$user = User::find(2);
$user->payments()->create(
[
'resnumber' => 'dwwe',
'price' => '1111',
'invoice_id' =>'asdasd',
'month_key' => 'k8Cv2YfuO4jOLXd',
'month_id' => 6,
'payment' => false
]
);
dd($user->payments);
类的设计,那么您可以这样做。
您的raytracer不必说出具体对象。它所需要的只是它们的属性值。但是,当向量为私有时,您将无法获得。这是事实。但是,没有什么可以阻止您创建重复矢量并将其用于将值传递到场景矢量 并使用该重复矢量来访问属性数据。
Scene
它可以工作,但是此解决方案的问题是您需要维护2个向量。不只是一个。