0

Hello!

I'm trying to alter a raytracer program which is supposed to create a picture of 25 spheres. It's an exercise in optimization so I'm basically trying to make the program run without any unnecessary code, making the program specific for the intended output. I'm using a C++ array to add the spheres.

I've done a couple of changes but now I've come across some problems, which is why I need help. So, I've got a couple of questions regarding this:

//std::vector<CSphere> spheres; implementation of vector previously used, replaced with array
	CSphere* spheres = new CSphere[25];
	srand(10);
	int c = 0;
	for (int i = 0; i < 5; ++i)
	{
		for (int j = 0; j < 5; ++j)
		{
			float sx = -5.0f + 10.0f * ((float)i / 5.0f);
			float sy = -5.0f + 10.0f * ((float)j / 5.0f);

			float x = sx + 1.0f * ((float)rand() / (float)RAND_MAX);
			float y = sy + 1.0f * ((float)rand() / (float)RAND_MAX);
			float z = 0.0f;
			float r = 0.5f + 0.5f * (float)rand() / (float)RAND_MAX;

			spheres[c++].m_C = CVector3f(x, y, z);
			spheres[c].m_R = r;
			///CSphere c(CVector3f(x, y, z ), r); 
			///spheres.push_back(c); push back replaced.. but is it right?
		}
	}

My intention is to replace the vector with an array containing the spheres and replacing the push_back accordingly. The program works fine but I'm not sure if this is completely right. m_C returns the center of a sphere and m_R the radius.

This code might be relevant for you to help me:

class CSphere
{
public:
	CVector3f m_C;
	float m_R;
	CSphere(const CVector3f& c, float r) : m_C(c), m_R(r) {}
	CSphere() {}
	
	bool Intersect(float& t, const CRay& ray)
		{
			CVector3f oc = m_C - ray.m_O;
			float l2oc = oc.x * oc.x + oc.y * oc.y + oc.z * oc.z;
			float r2 = m_R * m_R;
			if (l2oc < r2) 
			{ 
				float tca = oc.x * ray.m_D.x + oc.y * ray.m_D.y + oc.z * ray.m_D.z;
				float l2hc = (r2 - l2oc) / 1.0f + (tca * tca);
				t = tca + (float)sqrt(l2hc);
				return true;
			} 
			else 
			{
				float tca = oc.x * ray.m_D.x + oc.y * ray.m_D.y + oc.z * ray.m_D.z;
				if (tca < 0.0f) // points away from the sphere
					return false;
				float l2hc = (r2 - l2oc) / 1.0f + (tca * tca);
				if (l2hc > 0)
				{
					t = tca - (float)sqrt(l2hc);
					return true;
				}
				return false;
			}
		}
	
};

Also, how and where do I delete the array? I figure it's at the end of the program, like this: delete [] spheres;

2
Contributors
1
Reply
2
Views
6 Years
Discussion Span
Last Post by daviddoria
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.