void Task2::CreateParaline(float xvalue, float yvalue){
	//make parallel line between points
	Vector2f X1 = makeVector2f(startX1[0],(xvalue-scatterOrigin[0]));
	Vector2f Y1 = makeVector2f(startX2[0],(yvalue-scatterOrigin[1]));

	viewer->addLine( X1, Y1);
}
void Task2::DrawHyperbola(){
	viewer->clear();
	CreateAxis();
	
	float u= minu;
	//Create a hyperbola
	for(int i=0; i < NumSamples; i++){
		u = u + (maxu-minu)/NumSamples;

		//Relative to the axis X
		float pointX = (a * cosh(u));
		float pointX2 = -(a * cosh(u));
		float pointY =(b * sinh(u));

		double rad = 45*3.1415926/180;

		float newX = pointX * cos(rad) - pointY * sin(rad) +scatterOrigin[0];
		float newX2 = pointX2 * cos(rad) - pointY * sin(rad)+scatterOrigin[0];
		float newY = pointY * cos(rad) + pointX * sin(rad)+scatterOrigin[1];
		float newY2 = pointY * cos(rad) + pointX2 * sin(rad)+scatterOrigin[1];

		const Vector2f A = makeVector2f(newX,newY);
		const Vector2f B= makeVector2f(newX2,newY2);
			
		CreateParaline(newX,newY);
		CreateParaline(newX2,newY2);

		//Drawing the points on the screen
		viewer->addPoint(A); 
		viewer->addPoint(B);
	}

	// display changes
    viewer->refresh();
}
Task2::Task2()          
{          
	viewer = NULL;

	//scatterplot axis
	scatterOrigin = makeVector2f(-1.5,0.0);
	endAxisX = makeVector2f(12,0.0);
	endAxisY = makeVector2f(-1.5,13.5);
	endAxisYDown = makeVector2f(-1.5,-13.5);
	endAxisXLeft= makeVector2f(-13.5,0.0);

	//parallel cord axis
	startX1 = makeVector2f(17.5,-13.5);
	endX1 = makeVector2f(17.5,13.5);
	startX2 = makeVector2f(20,-13.5);
	endX2 = makeVector2f(20,13.5);

	NumSamples = 10;

	//slope values
	slope = -1;
	Yorigo = 13.5;

	//circle values
	Radius = 1;
	Center = makeVector2f(0,0);

	//hyperbola values
	a = 1;
	b = 1;
	minu = -3;
	maxu = 3;
}                                               
void Experiment2D22::drawPlot() {
	int rows = scaledData.size();
	int cols = scaledData[0].size();

	for (int i = 0;i < rows;i++)
	{
		for (int j = 0;j < cols-1;j++) {
			viewer->addLine(makeVector2f(j*3,scaledData[i][j]),makeVector2f((j+1)*3,scaledData[i][j+1]), makeVector4f(1, 0, 0, 0.5));
		}
	}
}
void Experiment2D22::drawaxis() {
	for (int i = 0;i < names.size();i++) {

		Line parallelAxis;

		parallelAxis.vertices[0] = viewer->addPoint(makeVector2f(i * 3, 0));
		parallelAxis.vertices[1] = viewer->addPoint(makeVector2f(i * 3, 5));

		viewer->addLine(makeVector2f(i * 3, 0), makeVector2f(i * 3, 5),makeVector4f(0.5, 0.5, 0.5, 0.5),5);
	
	}

}
Experiment1_1::Experiment1_1()           //Constructor
{
    viewer = NULL;                       // Why?
    start_point = makeVector2f(0,1); 
    line_slope = -1.0f;
    line_len = 1.42f;
 
    center = makeVector2f(4.0,4.0);
    radius = 4.0f;

    hyp_a=1.0f;
    hyp_b=1.0f;
    
}
void Task2::DrawCircle(){
	viewer->clear();
	CreateAxis();
	
	//Traslating the point of center to the right coordinate
	float xCenter = Center[0]+scatterOrigin[0];
	float yCenter = Center[1]+scatterOrigin[1];

	//Create a circle by iterating over 360 degrees.
	for(int i=1; i < NumSamples; i++){

		float pointX = xCenter + Radius * cos(2 * 3.14159265 * float(i)/float(NumSamples-1));
		float pointY = yCenter + Radius * sin(2 * 3.14159265 * float(i)/float(NumSamples-1));
		//radiens not degrees
		const Vector2f A = makeVector2f(pointX,pointY);
		
		CreateParaline(pointX,pointY);	

		viewer->addPoint(A);  
	}

	// display changes
    viewer->refresh();

}
void AssignmentFour::magnitudeDistributionHelper(int n, float32 minX, float32 maxX, float32 minY, float32 maxY, vector<Vector2f> &points) {
	float32 spread = (float32) (sqrt(n) * 1.2);

	float32 dx = (maxX - minX) / spread;
	float32 dy = (maxY - minY) / spread;

	if (n <= 0) {
		return;
	}

	vector< pair<float32, Vector2f> > magnitudes;

	for (int xi = 0; xi < n; ++xi) {
		for (int yi = 0; yi < n; ++yi) {
			float32 x = minX + xi*dx;
			float32 y = minY + yi*dy;
			Vector2f v = makeVector2f(x, y);
			float32 magnitude = getMagnitude(v);
			magnitudes.push_back(make_pair(magnitude, v));
		}
	}

	sort(magnitudes.begin(), magnitudes.end(), [](const pair<float32, Vector2f> &m1, const pair<float32, Vector2f> &m2) -> bool {
		return m1.first > m2.first;
	});

	for (size_t i = 0; i < (size_t) n; ++i) {
		points.push_back(magnitudes[i].second);
	}
}
void Task2::NegativeSlope()
{
	viewer->clear();
	CreateAxis();

	float pointX= scatterOrigin[0];
	float pointY= Yorigo;

	Vector4f color=makeVector4f(1,0,0,1);
	int size= 5;
	
	float pace=(endAxisX[0]-scatterOrigin[0])/NumSamples;

	for(int i=0; i<=NumSamples; i++){ 
		Vector2f scatterPoint= makeVector2f(pointX,pointY);
		viewer->addPoint(scatterPoint);

		CreateParaline(pointX, pointY);

		pointX+= pace;
		pointY= slope*(pointX-scatterOrigin[0])+Yorigo;
	}

	// display changes
    viewer->refresh();
}
Exemple #10
0
void Experiment1_1::DrawParallelPlot(float XSep)
{
    float XOff=2.0;                        //Offset between the scatter plot and the parallel plot
    //float XSep=5.0;                        //Separation between the axis of the parallel plot
    
    for(int i=0;i<(int)Data.size();i++)
    {
        viewer->addLine(makeVector2f(XOff+max_Data[0],Data[i][0]-min_Data[0]+0.1+min_Data[1]), makeVector2f(XOff+max_Data[0]+XSep,Data[i][1]-min_Data[1]+0.1+min_Data[1]),makeVector4f(Data[i][0]/DataColorRange[0], Data[i][1]/DataColorRange[1], 0.5 /*((float) i)/Data.size()*/ , 1)  );
    }
    //Axes
   
     viewer->addLine(makeVector2f(XOff+max_Data[0],min_Data[1]), makeVector2f(XOff+max_Data[0],max_Data[0]-min_Data[0]+0.1+min_Data[1]), makeVector4f(1,0,1,1), 3);
     viewer->addLine(makeVector2f(XOff+XSep+max_Data[0],min_Data[1]), makeVector2f(XOff+XSep+max_Data[0],max_Data[1]-min_Data[1]+0.1+min_Data[1]), makeVector4f(1,0,1,1), 3);

    // display changes
    viewer->refresh();
}
void Assignment5::Euler() {

    //viewer->clear();

    Vector2f seedPoint = makeVector2f(xStart,yStart);

    Vector2f from = seedPoint;
    Vector2f to;
    
    for(int i = 0; i<nrStepsEuler; i++) {
      
        to = from + makeVector2f((-from[1])*stepSizeEuler, (from[0]/2)*stepSizeEuler);
        DrawLine(from, to, makeVector4f(0,0,1,1)); 
        from = to;
        
    }

    viewer->refresh();

}
Exemple #12
0
Vector2f normalToPolarCoords(const Vector3f &normal) {
   if (normal[0] == 0.0f && normal[1] == 0.0f) {
      if (normal[2] >= 0.0f)
         return makeVector2f(0.0f, 0.0f);
      else
         return makeVector2f((float)M_PI, 0.0f);
   } else {
      Vector3f normDir = normal / norm(normal);
      Vector3f planeDir = normDir; planeDir[2] = 0.0f;
      float32 d = norm(planeDir);
      Vector2f result;
      result[0] = acos(normDir[2]);
      result[1] = asin(planeDir[0]/d);
      if (planeDir[1] < 0) {
         result[1] = (float)M_PI - result[1];
      }
      if (result[1] < 0.0f) {
         result[1]+= 2.0f*(float)M_PI;
      }
      return result;
   }
}
void GeoXGLWidget3D::findClosestPoint(int x, int y)
{
  int ind = -1;
  double modelview[16], projection[16];
  int viewport[4];
  glGetDoublev( GL_PROJECTION_MATRIX, projection );
  glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
  glGetIntegerv( GL_VIEWPORT, viewport );
  double winX, winY, winZ;
  for(int i = 0; i < (int)points.size(); i++)
  {
    gluProject(points[i].position[0],points[i].position[1],points[i].position[2],
            modelview,projection,viewport,&winX,&winY,&winZ);
    if((makeVector2f(winX,viewport[3]-winY)-makeVector2f(x,y)).getSqrNorm() < 16.0f)
    {
      if(points[i].canBeModified)
      {
        pickedPointIndex = i;
        pickedZ = winZ;
        break;
      }
    }
  }
}
void Assignment5::Runge_Kutta() {

    //viewer->clear();

    Vector2f seedPoint = makeVector2f(xStart,yStart);
    Vector2f from = seedPoint;
    Vector2f to;

    Vector2f v1;

    float32 v2_x;
    float32 v2_y;
    Vector2f v2;
   
    float32 v3_x;
    float32 v3_y;
    Vector2f v3;

    float32 v4_x;
    float32 v4_y;
    Vector2f v4;
    
    for(int i = 0; i<nrStepsRK; i++) {
    
        // v1
        v1 = makeVector2f(-from[1], from[0]/2);

        // v2
        v2_x = from[0] + (stepSizeRK/2)*v1[0];
        v2_y = from[1] + (stepSizeRK/2)*v1[1];
        v2 = makeVector2f(-v2_y, v2_x/2);
       
        // v3
        v3_x = from[0] + (stepSizeRK/2)*v2[0];
        v3_y = from[1] + (stepSizeRK/2)*v2[1];
        v3 = makeVector2f(-v3_y, v3_x/2);

        // v4
        v4_x = from[0] + stepSizeRK*v3[0];
        v4_y = from[1] + stepSizeRK*v3[1];
        v4 = makeVector2f(-v4_y, v4_x/2);

        to = from + makeVector2f(stepSizeRK*((v1[0]/6)+(v2[0]/3)+(v3[0]/3)+(v4[0]/6)), stepSizeRK*((v1[1]/6)+(v2[1]/3)+(v3[1]/3)+(v4[1]/6)));
        DrawLine(from, to, makeVector4f(1,0,0,1));
        from = to;
    }


    viewer->refresh();

}
Exemple #15
0
void Experiment1_1::DrawScatterPlot()
{
    max_Data = makeVector2f(Data[0][0], Data[0][1]);
    min_Data = makeVector2f(Data[0][0], Data[0][1]);
    for(int i=0;i<(int)Data.size();i++)
    {
        if(i>0)
        {
          if (Data[i][0] > max_Data [0])
          {
            max_Data[0]=Data[i][0];
          }
          if (Data[i][1] > max_Data [1])
          {
            max_Data[1]=Data[i][1];
          }
          if (Data[i][0] < min_Data [0])
          {
            min_Data[0]=Data[i][0];
          }
          if (Data[i][1] < min_Data [1])
          {
            min_Data[1]=Data[i][1];
          }

        }
    }
    DataColorRange = makeVector2f(max_Data[0]-min_Data[0], max_Data[1]-min_Data[1]);
    if (max_Data[0]<0)
        max_Data[0]=0;
    if (max_Data[1]<0)
        max_Data[1]=0;
    if (min_Data[0]>0)
        min_Data[0]=0;
    if (min_Data[1]>0)
        min_Data[1]=0;

    for(int i=0;i<(int)Data.size();i++)
    {
        Point2D NewPoint(Data[i][0], Data[i][1]);
        NewPoint.color = makeVector4f(Data[i][0]/DataColorRange[0], Data[i][1]/DataColorRange[1], 0.5 /*((float) i)/Data.size()*/, 1);
        viewer->addPoint(NewPoint);
    }
    //Axes
    Point2D Origin(0, 0);
    Origin.color = makeVector4f(1,1,1,1);
    Origin.size = 10;
    const int idOrigin = viewer->addPoint(Origin);

    Point2D XNeg(min_Data[0], 0);
    Point2D XPos(max_Data[0], 0);
    XNeg.color = makeVector4f(1,0,0,1);
    XPos.color = makeVector4f(1,0,0,1);
    XNeg.size = 10;
    XPos.size = 10;
    const int idXNeg = viewer->addPoint(XNeg);
    const int idXPos = viewer->addPoint(XPos);

    Point2D YNeg(0, min_Data[1]);
    Point2D YPos(0, max_Data[1]);
    YPos.color = makeVector4f(0,1,0,1);
    YNeg.color = makeVector4f(0,1,0,1);
    YPos.size = 10;
    YNeg.size = 10;
    const int idYPos = viewer->addPoint(YNeg);
    const int idYNeg = viewer->addPoint(YPos);

    //X-Axis
    Line Axis;
    Axis.vertices[0] = idXNeg;
    Axis.vertices[1] = idXPos;
    Axis.color = makeVector4f(1,1,1,1);
    Axis.thickness = 3;
    viewer->addLine(Axis);

    //Y-Axis
    Axis.vertices[0] = idYNeg;
    Axis.vertices[1] = idYPos;
    viewer->addLine(Axis);

    // display changes
    viewer->refresh();
}
static Vector2f to(Vector2d p)
{
    return makeVector2f(p[0], p[1]);
}
template<> Vector2f initVal<Vector2f>() { return makeVector2f(0.0, 0.0); }
Vector2f AssignmentFour::FieldValue(Vector2f xi) {
	StaticVector<float, 2U> vec = Field.sample(xi[0], xi[1]);
	Vector2f v = makeVector2f(vec[0], vec[1]);
	if (DirectionFieldOnly) v.normalize();
	return IntegrateBackwards ? -v : v;
}
Vector2f AssignmentFour::ExampleFieldValue(Vector2f vec) {
	Vector2f v = makeVector2f(-vec[1], vec[0] / 2.0f);
	return IntegrateBackwards ? -v : v;
}
void ExampleExperimentFields::DrawTexture()
{
    viewer->clear();

    //Load the texture using Qt
    QImage image(ImageFilename.c_str());

    //Get its (original) dimensions. Used as bounds later.
    const float fWidth = (float)image.width();
    const float fHeight = (float)image.height();

    //Resize to power-of-two and mirror.
    image = image.mirrored().scaled(NextPOT(image.width()), NextPOT(image.height()));

    //Get its new integer dimensions.
    const int iWidth = image.width();
    const int iHeight = image.height();

    if (bColoredTexture)
    {
        //Create three color channels for the texture
        //Each of them is represented using a scalar field
        ScalarField2 Red;
        Red.init(makeVector2f(-fWidth, -fHeight), makeVector2f(fWidth, fHeight), makeVector2ui(iWidth, iHeight));
        ScalarField2 Green;
        Green.init(makeVector2f(-fWidth, -fHeight), makeVector2f(fWidth, fHeight), makeVector2ui(iWidth, iHeight));
        ScalarField2 Blue;
        Blue.init(makeVector2f(-fWidth, -fHeight), makeVector2f(fWidth, fHeight), makeVector2ui(iWidth, iHeight));

        //Fill the scalar fields
        for(size_t j=0; j<Red.dims()[1]; j++)
        {
            for(size_t i=0; i<Red.dims()[0]; i++)
            {
                Red.setNodeScalar(i, j, (float)(qRed(image.pixel(i, j))) / 255.0 );
                Green.setNodeScalar(i, j, (float)(qGreen(image.pixel(i, j))) / 255.0 );
                Blue.setNodeScalar(i, j, (float)(qBlue(image.pixel(i, j))) / 255.0 );
            }
        }

        //Set the texture in the viewer
        viewer->setTextureRGB(Red.getData(), Green.getData(), Blue.getData());
    }
    else
    {
        //Create one gray color channel represented as a scalar field
        ScalarField2 Gray;
        Gray.init(makeVector2f(-fWidth, -fHeight), makeVector2f(fWidth, fHeight), makeVector2ui(iWidth, iHeight));

        //Set the values at the vertices
        for(size_t j=0; j<Gray.dims()[1]; j++)
        {
            for(size_t i=0; i<Gray.dims()[0]; i++)
            {
                Gray.setNodeScalar(i, j, (float)(qGray(image.pixel(i, j))) / 255.0 );
            }
        }

        //Set the texture in the viewer
        viewer->setTextureGray(Gray.getData());
    }

    viewer->refresh();
}
Exemple #21
0
void Experiment3_1::DrawIsoContour_Asymp()
{
    viewer->clear();

    //Load scalar field
    ScalarField2 field;
    if (!field.load(scalar_filename))
    {
        output << "Error loading field file " << scalar_filename << "\n";
        return;
    }


    //Get the minimum/maximum value in that field
    float32 min = std::numeric_limits<float32>::max();
    float32 max = -std::numeric_limits<float32>::max();
    for(size_t j=0; j<field.dims()[1]; j++)
    {
        for(size_t i=0; i< field.dims()[0]; i++)
        {
            const float32 val = field.nodeScalar(i,j);
            min = val < min ? val : min;
            max = val > max ? val : max;
        }
    }

  //Plot the grid
  //Traverse one dimension first and then the other dimension
   for(size_t j=0; j<field.dims()[1]; j++)
    {
        viewer->addLine(field.nodePosition(0,j), field.nodePosition(field.dims()[0]-1,j), makeVector4f(0.5,0.5,0.5,grid_alpha), 1);
    }
   for(size_t i=0; i<field.dims()[0]; i++)
    {
        viewer->addLine(field.nodePosition(i,0), field.nodePosition(i,field.dims()[1]-1), makeVector4f(0.5,0.5,0.5,grid_alpha), 1);
    }

  //Optionally overlay data on the grid
  if (grid_w_data == true )
  {
    //Draw a point for each grid vertex.
    for(size_t j=0; j<field.dims()[1]; j++)
    {
        for(size_t i=0; i<field.dims()[0]; i++)
        {
            const float32 val = field.nodeScalar(i, j);
            const float32 c = (val - min) / (max - min);

            Point2D p;
            p.position  = field.nodePosition(i, j);
            p.size = 5;
            //Use a grayscale depending on the actual value
            p.color[0] = c; p.color[1] = c; p.color[2] = c;
            viewer->addPoint(p);
        }
    }
  }



    viewer->refresh();



  //Plot the Iso Contour
  //Traverse the cells
   for(size_t i=0; i<field.dims()[0]-1; i++)
    {
      for(size_t j=0; j<field.dims()[1]-1; j++)
       {
          
         //Compute Max and Min values in each cell
         float32 fval[4];
         fval[0]= field.nodeScalar(i,j);
         fval[1]= field.nodeScalar(i,j+1);
         fval[2]= field.nodeScalar(i+1,j+1);
         fval[3]= field.nodeScalar(i+1,j);

         vector <Vector2f> Pos;
         Pos.resize(4);
         Pos[0]=field.nodePosition(i,j);
         Pos[1]=field.nodePosition(i,j+1);
         Pos[2]=field.nodePosition(i+1,j+1);
         Pos[3]=field.nodePosition(i+1,j);

         //output << "** "<< Pos[0][0] << " " << Pos[0][1] <<"\n";
         //output << field.nodePosition(i,j)[0] << " "<< field.nodePosition(i,j)[1] << "\n" ;

         
         float32 maxf, minf;
         maxf=fmax(fval[0],fval[1]);
         maxf=fmax(maxf,fval[2]);
         maxf=fmax(maxf,fval[3]);
         minf=fmin(fval[0],fval[1]);
         minf=fmin(minf,fval[2]);
         minf=fmin(minf,fval[3]);


         //Check if the iso contour passes the grid
         if((iso_c < minf)  || (iso_c > maxf))
           continue;
         else   //We plot the iso contour
         {
            
              float32 EdgeChar[3][4];

             //Now figure out the signs for the four nodes
               bool sign[4]= {0,0,0,0};
               for(int k=0; k<4; k++)
               {
                 if(fval[k]>=iso_c)
                  sign[k] = 1;
               }

               //Traverse the nodes clockwise and see if the edge carries a crossing point
               for(int k=0; k<4; k++)
               {
                  if( sign[k] ^ sign[(k+1)%4] )
                  {
                    EdgeChar[2][k] = 1;
                    float32 x,y;
                    x = ( (Pos[(k+1)%4][0] - Pos[k][0])*iso_c + Pos[k][0] * fval[(k+1)%4] -  Pos[(k+1)%4][0] * fval[k] ) / ( fval[(k+1)%4] - fval[k] ) ;
                    y = ( (Pos[(k+1)%4][1] - Pos[k][1])*iso_c + Pos[k][1] * fval[(k+1)%4] -  Pos[(k+1)%4][1] * fval[k] ) / ( fval[(k+1)%4] - fval[k] ) ;
                    EdgeChar[0][k] = x;
                    EdgeChar[1][k] = y;

                  }
                  else
                    EdgeChar[2][k] = 0;

                } 
   
                //Count the number of edges that have a valid crossing point. It should be either 2 or 4 
               int EdgeCount=0; 
               for(int k=0; k<4; k++)
               {
                  if(EdgeChar[2][k]==1)
                  EdgeCount++;
               }
               
               if(EdgeCount == 2)
               {
                  //Simply plot the contour
                  vector <Vector2f> LineEnd;
                  LineEnd.clear();
                  LineEnd.resize(2);
                  int index=0;

                  for(int k=0; k<4; k++)
                  {
                    if(EdgeChar[2][k]==1)
                    {
                      LineEnd[index]= makeVector2f(EdgeChar[0][k], EdgeChar[1][k]) ;
                      index++;
                    }
                  }
                  viewer->addLine(LineEnd[0], LineEnd[1], makeVector4f(0.5,0.5,0.5,iso_alpha), 2);
                  viewer->refresh();
                  
                  
               }
               else   //Cell has the contour intersecting at 4 points
               {
                 //There is an ambiguity to be resolved
                 float32 fmid= (fval[3]*fval[1] - fval[2]*fval[0]) / ( fval[3]+fval[1] -fval[2] - fval[0] ) ;
                
                  vector <Vector2f> LineEnd;
                  LineEnd.clear();
                  LineEnd.resize(4);

                  for(int k=0; k<4; k++)
                  {
                      LineEnd[k]= makeVector2f(EdgeChar[0][k], EdgeChar[1][k]) ;
                  }


		 if(fval[1] < iso_c)
		 {
                    if(iso_c > fmid)  //Connect 3 to 0 and 1 to 2
                    {
                              viewer->addLine(LineEnd[3], LineEnd[0], makeVector4f(1,0.5,0.5,iso_alpha), 2);
                              viewer->addLine(LineEnd[1], LineEnd[2], makeVector4f(1,0.5,0.5,iso_alpha), 2);
                              viewer->refresh();
                    }
                    else            //Connect 0 to 1  and 2 to 3    
                    {
                              viewer->addLine(LineEnd[0], LineEnd[1], makeVector4f(1,0.5,0.5,iso_alpha), 2);
                              viewer->addLine(LineEnd[2], LineEnd[3], makeVector4f(1,0.5,0.5,iso_alpha), 2);
                              viewer->refresh();
                    }

		 }
		 else
		 {
                    if(iso_c > fmid)  //Connect 0 to 1  and 2 to 3
                    {
                              viewer->addLine(LineEnd[0], LineEnd[1], makeVector4f(1,0.5,0.5,iso_alpha), 2);
                              viewer->addLine(LineEnd[2], LineEnd[3], makeVector4f(1,0.5,0.5,iso_alpha), 2);
                                viewer->refresh();

                    }
                    else                //Connect 3 to 0 and 1 to 2
                    {
                                            
                              viewer->addLine(LineEnd[3], LineEnd[0], makeVector4f(1,0.5,0.5,iso_alpha), 2);
                              viewer->addLine(LineEnd[1], LineEnd[2], makeVector4f(1,0.5,0.5,iso_alpha), 2);
                               viewer->refresh();

                    }
		 }
         
                 
               
               }
               
          }

           
    }

  }
}