Jump to content

[C++] Trying to zoom and pan an object


Noskiw

Recommended Posts

Currently, I'm trying to create an OpenGL project which creates a visual for data in a file for an assignment, for example, a pie chart. While I have this pie chart correctly and accurately displaying the data, another part of the assignment is being able to zoom in and move the object, of which I have no idea where to start.

 

This is the code for the pie chart.

#include "OGLPieChart.h"
#include <Windows.h>
#include <gl/GL.h>
#include <math.h>
#include <fstream>
#include <sstream>
#include <iostream>

using namespace std;

OGLPieChart::OGLPieChart()
{
	//init the OGLRectangle to a fixed size
	m_topleft.SetX(-50.0f);
	m_topleft.SetY(50.0f);

	m_bottomright.SetX(50.0f);
	m_bottomright.SetY(-50.0f);
}

OGLPieChart::~OGLPieChart()
{
	
}

void OGLPieChart::Render()
{
	float PI = 3.14159;
	float radius = 200;
	string DataLine;

	//Changed from int(s) to float(s) to stop angle equation equalling 0 later on.
	float NeverMarried = 0;
	float MarriedCivSpouse = 0;
	float Widowed = 0;
	float Divorced = 0;
	float Seperated = 0;
	float MarriedSpouseAbsent = 0;

	//Only reading from file so using ifstream instead of ofstream and fstream
	ifstream DataFile("..\\.\\adult_test_data.csv");

	if (!DataFile.is_open())
	{
		cout << "Unable to open file.";
		return;
	}
	else
	{
		string DataLine;

		while (!DataFile.eof())
		{
			getline(DataFile, DataLine);
			istringstream StringData(DataLine);

			while (StringData)
			{
				getline(StringData, DataLine, ',');

				if (DataLine == " Never-married")
				{
					NeverMarried += 1;
				}
				else if (DataLine == " Married-civ-spouse")
				{
					MarriedCivSpouse += 1;
				}
				else if (DataLine == " Widowed")
				{
					Widowed += 1;
				}
				else if (DataLine == " Divorced")
				{
					Divorced += 1;
				}
				else if (DataLine == " Separated")
				{
					Seperated += 1;
				}
				else if (DataLine == " Married-spouse-absent")
				{
					MarriedSpouseAbsent += 1;
				}
			}
		}
	}

	DataFile.close();

	int MaritalStatusTotal = (NeverMarried + MarriedCivSpouse + Widowed + Divorced + Seperated + MarriedSpouseAbsent);

	float NeverMarriedAngle = (NeverMarried / MaritalStatusTotal) * 360;
	float MarriedCivSpouseAngle = (MarriedCivSpouse / MaritalStatusTotal) * 360;
	float WidowedAngle = (Widowed / MaritalStatusTotal) * 360;
	float DivorcedAngle = (Divorced / MaritalStatusTotal) * 360;
	float SeperatedAngle = (Seperated / MaritalStatusTotal) * 360;
	float MarriedSpouseAbsentAngle = (MarriedSpouseAbsent / MaritalStatusTotal) * 360;

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(0.0f, 1.0f, 1.0f);
	glVertex2f(0, 0);

	for (int i = 0; i <= NeverMarriedAngle; i++)
	{
		glVertex2f(radius * cos(i * PI /  180), radius * sin(i * PI / 180));
	}

	glEnd();

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(1.0f, 1.0f, 0.0f);
	glVertex2f(0, 0);

	for (int j = NeverMarriedAngle; j <= NeverMarriedAngle + MarriedCivSpouseAngle; j++)
	{
		glVertex2f(radius * cos(j * PI / 180), radius * sin(j * PI / 180));
	}

	glEnd();

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(0.2, 0.3, 0.;
	glVertex2f(0, 0);

	for (int k = NeverMarriedAngle + MarriedCivSpouseAngle; k <= NeverMarriedAngle + MarriedCivSpouseAngle + WidowedAngle; k++)
	{
		glVertex2f(radius * cos(k * PI / 180), radius * sin(k * PI / 180));
	}

	glEnd();

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(0.1, 0.1, 1);
	glVertex2f(0, 0);

	for (int a = NeverMarriedAngle + MarriedCivSpouseAngle + WidowedAngle; a <= NeverMarriedAngle + MarriedCivSpouseAngle + WidowedAngle + DivorcedAngle; a++)
	{
		glVertex2f(radius * cos(a * PI / 180), radius * sin(a * PI / 180));
	}

	glEnd();

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(0.1, 0.2, 0.4);
	glVertex2f(0, 0);

	for (int b = NeverMarriedAngle + MarriedCivSpouseAngle + WidowedAngle + DivorcedAngle; b <= NeverMarriedAngle + MarriedCivSpouseAngle + WidowedAngle + DivorcedAngle + SeperatedAngle; b++)
	{
		glVertex2f(radius * cos(b * PI / 180), radius * sin(b * PI / 180));
	}

	glEnd();

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(0.8, 0.3, 0.1);
	glVertex2f(0, 0);

	for (int c = NeverMarriedAngle + MarriedCivSpouseAngle + WidowedAngle + DivorcedAngle + SeperatedAngle; c <= NeverMarriedAngle + MarriedCivSpouseAngle + WidowedAngle + DivorcedAngle + SeperatedAngle + MarriedSpouseAbsentAngle; c++)
	{
		glVertex2f(radius * cos(c * PI / 180), radius * sin(c * PI / 180));
	}

	glEnd();
}

bool OGLPieChart::MouseMove( int x, int y )
{
	m_topleft.SetX( (float) x );
	m_topleft.SetY( (float) y );
	
	m_bottomright.SetX( (float) x + 100.0f );
	m_bottomright.SetY( (float) y + 100.0f);
	

	return true;
}

bool OGLPieChart::MouseLBUp( int x, int y )
{
	return true;
}
bool OGLPieChart::MouseLBDown( int x, int y )
{
	return true;
}

And it produces this result:

 

11ba1d4e579efb36e628bd24b2e04553.png

Unfortunately, a constraint for this assignment is that we cannot use GLUT, it is an optional constraint but it would lose me 8% should I use it.

 

Any help with zooming and panning it would be extremely appreciated.

Link to comment
Share on other sites

For panning, just alter the center point so that rather than start each section at 0,0 you start them at centerX,centerY. Add some code to change what centerX and centerY are if they click and drag the mouse.

 

For zoom you could probably just increase/decrease the radius value.

Link to comment
Share on other sites

For panning, just alter the center point so that rather than start each section at 0,0 you start them at centerX,centerY. Add some code to change what centerX and centerY are if they click and drag the mouse.

 

For zoom you could probably just increase/decrease the radius value.

So what you're saying is I could add some parameters to the Render function, with the default value as 0. How do I then detect a mouseclick, and/or mousewheel events?

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.