Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C++ (http://www.go4expert.com/forums/cpp/)
-   -   help with c++ bezier programme (http://www.go4expert.com/forums/help-cpp-bezier-programme-t647/)

Rich999 19Mar2006 06:05

help with c++ bezier programme
 
Ive been trying to write a programme to draw a bezier curve, and have got stuck cos i cant debug it anymore. Alot of runtime errors. Doh! :eek:
My last option is to just post the whole damn thing on a forum and hope someone can help me.
Here is the code

Code:

#pragma windows 500000,500000
#include <windows.h>
#include <dbos/graphics.h>
#include <iostream.h>
#include <math.h>

int controlpoints();
int translate();
int clearscreen();
int replot();
int scale();
int fact(int i);
int nCi(int i);
double bu(int i,double u);
void C(double u);
void calc_bez();
void draw_bez();


int degrees=3;
double controlpoint[8][3]={{0,350,0},{250,350,0},{300,100,0},{350,500,0},{400,200,0},{450,450,0},{500,350,0},{650,350,0}};
double controlpointT[8][3];
double translation[3];
int handle;
double scalingfactor;
int a=1;
int b=0;

const int number=1000;
double bez_points[number][3];

int main()
{  int width=650;  int height=650;

  winio("%gr[black]&", width, height);
  winio("%ca[Bezier Curve]&");
  winio("%ww&");
  winio("\t%bfBezier Curve Options%sf\n&");
  winio("\n \tDegrees Of Bezier Curve\t%dd%1rd\n&",1, &degrees);
  winio("\n \t%^bt[Change Control Points]\n&", controlpoints);
  winio("\n \t%2`ga%rb[Show Control Lines]\n \t%rb[Don`t Show Control Lines]\n\n&",&a,&b,&a,&b);
  winio("\n \t%bfTRANSFORMATIONS:%sf\n&");
  winio("\n \t%^bt[Translate]\n&", translate);
  winio("\n \t%^bt[Scale]\n&", scale);
  winio("\n \t%bt[Rotate]\n&");
  winio("\n\n \t%bf%bt[Quit]%sf&");
  winio("%lw", &handle);
}

int translate()
{
  if (degrees<1)
  {
      winio("%ca[Error]&");
      winio("The bezier curve must have at least 1 degree.\n\nPlease increase the number of degrees&");
      winio("\n\n%bt[Back to main menu]");
  }

  else if (degrees>7)
  {
      winio("%ca[Error]&");
      winio("The bezier curve cannot have more than 7 degrees.\n\nPlease decrease the number of degrees&");
      winio("\n\n%bt[Back to main menu]");
  }

  else if  (degrees<=7)
  {
  winio("%ca[Translating]%ww&");
  winio("Please enter the amounts by which you wish to translate your bezier curve\n\n&");
  winio("Enter translaton co-ordinates for the x co-ordinate:\t%rf\n\n&",&translation[0]);
  winio("Enter translation co-ordinates for the y co-ordinate:\t%rf\n\n&",&translation[1]);
  winio("Enter translation co-ordinates for the z co-ordinates:\t%rf\n\n&",&translation[2]);
  winio("%bt[Next]");

  for (int i=0; i<8; i++)
  {
      for (int j=0; j<3; j++)
      {
        controlpointT[i][j]=controlpoint[i][j]+translation[j];

        controlpoint[i][j]=controlpointT[i][j];
      }
  }

  winio("%ca[Translating]&");
  winio("%^bt[Replot Graph]\t\t&", replot);
  winio("%bt[Return To Main Menu Without Re-Plotting]");
  }

  return 1;
}

int scale()
{
  winio("%ca[Scaling]&");
  winio("Please enter the scaling factor, by which you wish to scale your bezier curve\n\n&");
  winio("Please note, the scaling factor must be between 0 and 1:\t%rf\n\n&", &scalingfactor);
  winio("%bt[Next]");


  winio("%ca[Scaling]&");
  winio("%^bt[Replot Graph]\t\t&", replot);
  winio("%bt[Return To Main Menu Without Re-Plotting]");

  return 1;
}

int clearscreen()
{
  clear_screen();
  return 1;
}

int controlpoints()
{
  if (degrees>7)
  {
      winio("%ca[Error]&");
      winio("The bezier curve must cannot have more than 7 degrees.\n\nPlease decrease the number of degrees and re-plot the control points&");
      winio("\n\n%bt[Back to main menu]");
  }

  else if (degrees<1)
  {
      winio("%ca[Error]&");
      winio("The bezier curve must have at least 1 degree.\n\nPlease increase the number of degrees and re-plot the control points&");
      winio("\n\n%bt[Back to main menu]");
  }

  else if (degrees<=7)
  {
      winio("%ca[Control Points]&");
      winio("%ww&");
      for (int y=0; y<degrees+1; y++)
      {
        winio("Enter control point %wd co-ordinates (x,y,z):\t%rf\t%rf\t%rf\n\n&",y+1,&controlpoint[y][0],&controlpoint[y][1],&controlpoint[y][2]);
      }
      winio("%bt[Done]");

      clearscreen();

      if (a==1)
      {
        for (int i=0; i<degrees; i++)
        {
           
            draw_line(controlpoint[i][0],controlpoint[i][1],controlpoint[i+1][0],controlpoint[i+1][1],9);
        }
      }
      // draw curve
     
      draw_bez();
  }

  return 1;
}

int replot()
{
  for (int d=1; d<degrees+1; d++)
  {
        clearscreen();

        if (a==1)
        {
            for (int i=0; i<degrees; i++)
            {
             
              draw_line(controlpoint[i][0],controlpoint[i][1],controlpoint[i+1][0],controlpoint[i+1][1],9);
            }
        }
  }

  return 0;
}

int fact(int i)
{
  if (i<=1) return 1;
  else return i*fact(i-1);
}

int nCi(int i)
{
  return fact(degrees)/(fact(degrees-i)*fact(i));
}


double bu(int i,double u)
{
  return nCi(i)*pow(1-u,degrees-1)*pow(u,i);
}

void C(double u)
{
  double point[3];
 
  for (int k=0;k<3;k++)
  {
      for (int i=0;i<degrees+1;i++)
      {
        for (int j=0;j<number;j++)
        {
            point[k]=bu(i,u)*controlpoint[i][k];

            bez_points[j][k]=point[k];           
        }
      }
  }
}

void calc_bez()
{
  double u;

  for (int i=0;i<number;i++)
  {
      u=(i)/(number-1);
     
      C(u);
  }
}

void draw_bez()
{
  calc_bez();

  for (int i=0;i<number;i++)
  {
      draw_line(bez_points[i][0],bez_points[i][1],bez_points[i+1][0],bez_points[i+1][1],9);
  }
}

Thanks in advance.

shabbir 19Mar2006 08:41

Re: help with c++ bezier programme
 
Duplicate thread closed.


All times are GMT +5.5. The time now is 05:55.