GIDForums  

Go Back   GIDForums > Computer Programming Forums > C Programming Language
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

 
 
Thread Tools Search this Thread Rate Thread
  #71  
Old 22-May-2007, 01:29
promsan promsan is offline
Junior Member
 
Join Date: May 2007
Location: North of the rhubarb triangle, GB
Posts: 53
promsan is on a distinguished road
Smile

Re: Linked Lists advice request


I thought I'd post this extra for anyone who happens to search for the topics in this thread in future:

(paraphrased)
Quote:
firstly:
new_x = sin(old_x - mid_point) + mid_point
new_y = cos(old_y - mid_point) + mid_point)

is a good way to go, you may need a minus in front of the
cos, it depends on how the rotation goes.

Secondly, the extern error stuff means you have made prototypes for
functions that you haven't made yet.

Thirdly, stick with the:
typedef struct <structure name>
{
//structure stuff
}
<structure short name>

then to declare a new variable of that type,
<structure short name> <variable name>

The variable name needs to be a pointer by the way. (add a * in front of
the name)

BUT!
Remember to allocate memory space for it!

Do this by:
<variable name> = malloc(sizeof(<structure short name>));

If you declare your structures and assign variables like that, it may get
rid of that semicolon error in the switch too (maybe)

Example of structure:
typedef struct long_shape_type
{
int coord1;
int coord2;
}
shape_type

Then to create a new shape_type variable:

shape_type *new_shape;
new_shape = malloc(sizeof(shape_type));

Then you should be able to use the shape_type variable.

  #72  
Old 22-May-2007, 18:31
promsan promsan is offline
Junior Member
 
Join Date: May 2007
Location: North of the rhubarb triangle, GB
Posts: 53
promsan is on a distinguished road
Red face

Re: Linked Lists advice request


here's what I've got anyway... it's pug ugly, but it sort of works (a bit):
CPP / C++ / C Code:
/* SHAPESHIFTER by J McNeill MAY 2007 UNIVERSITY OF YORK, DEPT OF ELECTRONICS */

#include <stdio.h>
#include "graphics_lib.h"
#include <math.h>
#include <conio.h>
//#include "console_lib.h" //for gotoxy (int x, int y)

#define PI 3.14159265

#define RETURN 13
#define LEFTARROW 75
#define RIGHTARROW 77
#define UPARROW 72
#define DOWNARROW 80
#define ROLL 97
#define BANK 122
#define PITCH 44
#define YAW 46
#define LENGTHEN 45
#define SHORTEN 61
#define ROTATIONCW 91
#define ROTATIONACW 93

//common line structure
typedef struct long_line_type {
    int start_x, start_y;
    int end_x, end_y;
    int x;
    int y;
    int size;
	char move;
    int radius;
    int colour;
    struct long_line_type *prev;
    struct long_line_type *next;
} line_type;

//triangle structure
struct triangle {
  int corner1x;
  int corner1y;
  int corner2x;
  int corner2y;
  int corner3x;
  int corner3y;
  int colour;
  float theta;
  char move;
  int new_x;
  int new_y;
  int x;
  int y;
  int corner1xtemp;
  int corner1ytemp;
  int corner2xtemp;
  int corner2ytemp;
  int corner3xtemp;
  int corner3ytemp;
  int centrepoint_x;
  int centrepoint_y;
} tangle;

//line structure
typedef struct line_structure {
    int start_x, start_y;
    int end_x, end_y;
    int colour;
    struct lines *prev;
    struct lines *next;
	char move;
	int new_start_x;
	int new_start_y;
	int new_end_x;
	int new_end_y;
	int mid_point_x;
	int mid_point_y;
	double theta;
	char key_press;
} lin;

//square structure
struct rectangle {
  int corner1x;
  int corner1y;
  int corner2x;
  int corner2y;
  int corner3x;
  int corner3y;
  int corner4x;
  int corner4y;
  int colour;
  double theta;
    struct rectangle *prev;
    struct rectangle *next;
} square;

//circle structure
struct circle {
  int cx;
  int cy;
  int radius;
  int colour;
  double theta;
} c;

struct circle *c_pointer;
void display_circle(struct circle *c_pointer);
void erase_circle(struct circle *c_pointer);
void get_circle(struct circle *c_pointer);
void c_menu(struct circle *c_pointer);

struct rectangle *square_pointer;
void display_square(struct rectangle *square_pointer);
void erase_square(struct rectangle *square_pointer);
void get_square(struct rectangle *square_pointer);
void square_menu(struct rectangle *square_pointer);

struct line_structure *line_pointer;
void display_line(struct line_structure *line_pointer);
void get_line(struct line_structure *line_pointer);
void erase_line(struct line_structure *line_pointer);
void rot_line(struct line_structure *line_pointer);
void line_menu(struct line_structure *line_pointer);

struct triangle *triangle_pointer;
void display_tangle(struct triangle *triangle_pointer);
void get_tangle(struct triangle *triangle_pointer);
void rotate_tangle(struct triangle *triangle_pointer);
void erase_tangle(struct triangle *triangle_pointer);
void display_temp_tangle(struct triangle *triangle_pointer);
void t_menu(struct triangle *triangle_pointer);

int menu(void); 


 /*
 * THE MAIN FUNCTION - the programme starts executing here
 */

int main()
{
	int i;
	i = menu(); 

	printf("exiting main(), i = %d\n", i);
    return 0;
}

/* **********  functions  *********** */

   /*************/
   /* MAIN MENU */
   /*************/

int menu(void)
{	
	int i, choice1, choice2;
	i = choice1 = choice2 = 0;

	printf("Welcome to S H @ P E S H I F T E R\n   ");
	printf("This is a vector drawing programme\n   ");
	printf("Enter data to plot and draw a shape\n\n");
    printf("Menu                                 \n");
	printf("Choose a shape:                      \n");
    printf("1: New Line                          \n");
    printf("2: New Circle                        \n");
    printf("3: New Triangle                      \n");
    printf("4: New Square                        \n");
    printf("5: Exit Programme                    \n");
    printf("Enter your choice:                     ");

  while(choice1 < 1 || choice1 > 5) {
    scanf("%d", &choice1);

    switch(choice1) {
      case 1: 
	    printf("You selected draw Line\n");
	    line_menu(&line);
        break;
      case 2:
        printf("You selected draw Circle\n , choice1 = %d \n", choice1);
		c_menu(&circle);
        break;
      case 3:
        printf("You selected draw Triangle\n");
		t_menu(&c);
        break;
      case 4:
        printf("You selected draw Square\n");
		square_menu(&square);
        break;
      case 5:
        printf("You selected exit (press CTRL-C) \n");
        break;
      default:
        printf("Not recognised in main menu, try again \n");

    }  //close switch1
  }    //close while1
  return 0;
}      //close function


   /*****************/
   /*   LINE MENU   */
   /*****************/

void line_menu(struct line_structure *line_pointer) 
{

	char move;

	lin line;
	setbkcolor(WHITE);
	setcolor(BLACK);

	printf("Controls:\n");
	printf("Use the arrow buttons to move the shape\n");
	printf("Use the A & Z, < & >, buttons to warp the shape\n");
	printf("Use the + & - buttons to resize the shape\n");
	printf("Use the [ & ] buttons to rotate the shape\n");
	printf("press any key to continue\n");
	getch();
	cleardevice();
	get_line(&line);
	initwindow(600, 400);
	display_line(&line);

do
{
 move=getch();
 if( move == 0 )
  move=getch();

    switch(move)
 {
//move left
 case 77:
  {
   erase_line(&line);
   line.start_x++;
   line.end_x++;
   line.colour;
   display_line(&line);
  }
  break;
//move right
 case 75:
     {
   erase_line(&line);
   line.start_x--;
   line.end_x--;
   line.colour;
   display_line(&line);
  }
  break;
  //move up
 case 72:
  {
   erase_line(&line);
   line.start_y--;
   line.end_y--;
   line.colour;
   display_line(&line);
  }
  break;
//move down
 case 80:
     {
   erase_line(&line);
   line.start_y++;
   line.end_y++;
   line.colour;
   display_line(&line);
  }
  break;
  //rotate x cw
 case 97:  //"A"
  {
   erase_line(&line);
   line.start_x++;
   line.end_x--;
   line.colour;
   display_line(&line);
  }
  break;
//rotate x acw
 case 122: // "Z"
     {
   erase_line(&line);
   line.start_x--;
   line.end_x++;
   line.colour;
   display_line(&line);
  }
  break;
  //rotate y cw
 case 44: //">"
  {
   erase_line(&line);
   line.start_y++;
   line.end_y--;
   line.colour;
   display_line(&line);
  }
  break;
//rotate y acw
 case 46: //"<"
     {
   erase_line(&line);
   line.start_y--;
   line.end_y++;
   line.colour;
   display_line(&line);
  }
  break;
    //lengthen
 case 45:  //"-" adds both start/end x/y
  {
   erase_line(&line);
   //display_line(&line);
   line.start_x++;
   line.start_y++;
   line.end_x--;
   line.end_y--;
   line.colour;
   display_line(&line);
  }
  break;
//shorten
 case 61: // "=" adds both, but doesn't erase
	 {
   erase_line(&line);
   //display_line(&line);
   line.start_x--;
   line.start_y--;
   line.end_x++;
   line.end_y++;
   line.colour;
   //erase_line(&line);
   display_line(&line);
  }
  break;
//+theta
 case 91: // "[" rotation matrix!?!
	 {
   	 //cleardevice();
	 //rot_line(&line);
   //display_line(&line);
   erase_line(&line);
   
   line.new_start_x = line.start_x * cos((line.theta * PI)/180) - line.start_y * sin((line.theta * PI)/180);
   line.new_start_y = line.start_x * sin((line.theta * PI)/180) + line.start_y * cos((line.theta * PI)/180);
   line.new_end_x = line.end_x * cos((line.theta) * PI/180) - line.end_y * sin((line.theta) * PI/180);
   line.new_end_y = line.end_x * sin((line.theta) * PI/180) + line.end_y * cos((line.theta) * PI/180);
    line.theta--;
    line.new_start_x++;
    line.new_start_y++;
   //erase_line(&line);
   line.colour;
   rot_line(&line);
   //display_line(&line);
  }
  break;
  //-theta
 case 93: // "]" rotation matrix!?!
	 {
   //rot_line(&line);
   erase_line(&line);
   //display_line(&line);
   line.new_start_x = line.start_x * sin((line.theta * PI)/180) - line.start_y * cos((line.theta * PI)/180);
   line.new_start_y = line.start_x * cos((line.theta * PI)/180) + line.start_y * sin((line.theta * PI)/180);
   line.new_end_x = line.end_x * sin((line.theta * PI)/180) - line.start_y * cos((line.theta * PI)/180);
   line.new_end_y = line.end_x * cos((line.theta * PI)/180) + line.start_y * sin((line.theta * PI)/180);
  line.theta++;
     line.new_start_x++;
    line.new_start_y++;
   //erase_line(&line);
   //display_line(&line);
   line.colour;
   rot_line(&line);
  }
  break;
} //switch
}
while(move!=13);
  getch();
cleardevice();
   
	printf("Press ctrl-c to close the programme");

	getch();
    
//	return 0;

} 

/********* LINE DRAWING FUNCTIONS ***********/

//new display line code based on midpoint
void display_line(struct line_structure *line_pointer)
{
 setcolor(line_pointer->colour);
 line(line_pointer->mid_point_x - line_pointer->start_x,line_pointer->mid_point_y - line_pointer->start_y,line_pointer->mid_point_x + line_pointer->end_x,line_pointer->mid_point_y + line_pointer->end_y);
} 

void display_new_line(struct line_structure *line_pointer)
{
 setcolor(line_pointer->colour);
 line(line_pointer->mid_point_x - line_pointer->new_start_x,line_pointer->mid_point_y - line_pointer->new_start_y,line_pointer->mid_point_x + line_pointer->new_end_x,line_pointer->mid_point_y + line_pointer->new_end_y);
}

void erase_line(struct line_structure *line_pointer)
{
    setcolor(0);
 line(line_pointer->start_x,line_pointer->start_y,line_pointer->end_x,line_pointer->end_y);
} 

void get_line(struct line_structure *line_pointer)
{
printf("Please enter co-ordinates for the start and of your line.\nThe range is (x=0-600; y=0-400): \n       start x: ");
scanf("%d", &line_pointer->start_x);
printf("       start y: ");
scanf("%d", &line_pointer->start_y);
printf("       end x: ");
scanf("%d", &line_pointer->end_x);
printf("       end y: ");
scanf("%d", &line_pointer->end_y);
printf("Choose an integer representing a colour from the following options\n");

            printf("0\tBLACK\t\t\t8\tDARKGREY\n");
            printf("1\tBLUE\t\t\t9\tLIGHTBLUE\n");
            printf("2\tGREEN\t\t\t10\tLIGHTGREEN\n");
            printf("3\tCYAN\t\t\t11\tLIGHTCYAN\n");

            printf("4\tRED\t\t\t12\tLIGHTRED\n");
            printf("5\tMAGENTA\t\t\t13\tLIGHTMAGENTA\n");
            printf("6\tBROWN\t\t\t14\tYELLOW\n");
            printf("7\tLIGHTGREY\t\t15\tWHITE\n\n");

            printf("What colour do you want the shape to be?:");
           
scanf("%d", &line_pointer->colour);
//printf("and a number for the angle (0-360): ");
//scanf("%lf", &line_pointer->theta);
printf("and a number for mid point x (0-600): ");
scanf("%lf", &line_pointer->mid_point_x);
printf("and a number for mid point y (0-400): ");
scanf("%lf", &line_pointer->mid_point_y);
printf("\nPlotting shape now...check graphics window\n");
//printf("%d, %d, %d, %d, <-and there they are. \n", line_pointer->start_x, line_pointer->start_y, line_pointer->end_x, line_pointer->end_y, line_pointer->colour);
}

  void rot_line(struct line_structure *line_pointer)
{
 setcolor(line_pointer->colour);
 line(line_pointer->new_start_x,line_pointer->new_start_y,line_pointer->new_end_x,line_pointer->new_end_y);
   }

/****************************/

   /*********************/
   /*   CIRCLE MENU     */
   /*********************/
 
void c_menu(struct circle *c_pointer)
{
  
		char move;

	setbkcolor(WHITE);
	setcolor(BLACK);

	c_pointer = &c;

	printf("Controls:\n");
	printf("Use the arrow buttons to move the shape\n");
	printf("Use the A & Z, < & >, buttons to warp the shape\n");
	printf("Use the + & - buttons to resize the shape\n");
	printf("Use the [ & ] buttons to rotate the shape\n");
	printf("press any key to continue\n");
	getch();
	cleardevice();
		
	get_circle(c_pointer);

	//printf("The origin is at (%d,%d), and the radius is (%d).\n");
    //printf("It's colour is code %d \n", c.cx, c.cy, c.radius,  c.colour);
    
	initwindow(600, 400);
	display_circle(c_pointer); 


	do
{
 move=getch();
 if( move == 0 )
  move=getch();

    switch(move)
 {
//move left
 case 77:
  {
   erase_circle(&c);
   c.cx++;
   c.cx++;
   c.colour;
   display_circle(&c);
  }
  break;
//move right
 case 75:
     {
   erase_circle(&c);
   c.cx--;
   c.cx--;
   c.colour;
   display_circle(&c);
  }
  break;
  //move up
 case 72:
  {
   erase_circle(&c);
   c.cy--;
   c.cy--;
   c.colour;
   display_circle(&c);
  }
  break;
//move down
 case 80:
     {
   erase_circle(&c);
   c.cy++;
   c.cy++;
   c.colour;
   display_circle(&c);
  }
  break;
  //rotate x cw
 case 97:  //"A"
  {
   erase_circle(&c);
   c.cx++;
   c.cx--;
   c.colour;
   display_circle(&c);
  }
  break;
//rotate x acw
 case 122: // "Z"
     {
   erase_circle(&c);
   c.cx--;
   c.cx++;
   c.colour;
   display_circle(&c);
  }
  break;
    //lengthen
 case 45:  //"-"
  {
   erase_circle(&c);
   c.radius++;
   c.colour;
   display_circle(&c);
  }
  break;
//shorten
 case 61: // "="
     {
   erase_circle(&c);
   c.radius--;
   c.colour;
   display_circle(&c);
  }
  break;
} //switch
}
while(move!=13);
  getch();
cleardevice();

	printf("Press ctrl-c to close the programme");

	getch();

    //return 0;
}

/************** CIRCLE DRAWING FUNCTIONS **************/


void display_circle(struct circle *c_pointer)
{
  setcolor(c_pointer->colour);
  circle(c_pointer->cx, c_pointer->cy, c_pointer->radius);
}

void erase_circle(struct circle *c_pointer)
{
  setcolor(0);
  circle(c_pointer->cx, c_pointer->cy, c_pointer->radius);
}


void get_circle(struct circle *c_pointer)
{
  printf("Please enter co-ordinates for the centre-point of your circle.\nThe range is (x=0-600; y=0-400): \n       centre co-ordinate 1x: ");
  scanf ("%d", &c_pointer->cx);
  printf("       centre co-ordinate 1y: ");
  scanf ("%d", &c_pointer->cy);
  printf("       radius: ");
  scanf ("%d", &c_pointer->radius);
  printf("and a number for the colour (0-15): ");
  scanf ("%d", &c_pointer->colour);
  printf("%d, %d, %d, %d, %d, %d, %d, %d, %d <-and there they are. \n", c_pointer->cx, c_pointer->cy, c_pointer->radius, c_pointer->colour);
}


/****************************/


   /*********************/
   /*  TRIANGLE MENU    */
   /*********************/

void t_menu(struct triangle *triangle_pointer)
{
	char move;

	triangle_pointer = &tangle;

	setbkcolor(WHITE);
	setcolor(BLACK);

	printf("Controls:\n");
	printf("Use the arrow buttons to move the shape\n");
	printf("Use the A & Z, < & >, buttons to warp the shape\n");
	printf("Use the + & - buttons to resize the shape\n");
	printf("Use the [ & ] buttons to rotate the shape\n");
	printf("press any key to continue\n");
	getch();
	cleardevice();

	get_tangle(triangle_pointer);
	initwindow(600, 400);

	display_tangle(triangle_pointer); 

    rotate_tangle(triangle_pointer);

	do
{
 move=getch();
 if( move == 0 )
  move=getch();

    switch(move)
 {
//move left
 case 77:
  {
   erase_tangle(&tangle);
   tangle.corner1x++;
   tangle.corner2x++;
   tangle.corner3x++;
   tangle.colour;
   display_tangle(&tangle);
  }
  break;
//move right
 case 75:
     {
   erase_tangle(&tangle);
   tangle.corner1x--;
   tangle.corner2x--;
   tangle.corner3x--;
   tangle.colour;
   display_tangle(&tangle);
  }
  break;
  //move up
 case 72:
  {
   erase_tangle(&tangle);
   tangle.corner1y--;
   tangle.corner2y--;
   tangle.corner3y--;
   tangle.colour;
   display_tangle(&tangle);
  }
  break;
//move down
 case 80:
     {
   erase_tangle(&tangle);
   tangle.corner1y++;
   tangle.corner2y++;
   tangle.corner3y++;
   tangle.colour;
   display_tangle(&tangle);
  }
  break;
  //rotate x cw
 case 97:  //"A"
  {
  erase_tangle(&tangle);
   tangle.corner1x++;
   tangle.corner1y--;
   tangle.corner2x--;
   tangle.corner2y--;
   tangle.corner3x++;
   tangle.corner3y++;
    tangle.colour;
   display_tangle(&tangle);
  }
  break;
//rotate x acw
 case 122: // "Z"
     {
erase_tangle(&tangle);
   tangle.corner1x--;
   tangle.corner1y++;
   tangle.corner2x++;
   tangle.corner2y++;
   tangle.corner3x--;
   tangle.corner3y--;
    tangle.colour;
    display_tangle(&tangle);
  }
  break;
  //rotate y cw
 case 44: //">"
  {
   erase_tangle(&tangle);
   tangle.corner1x++;
   tangle.corner1y++;
   tangle.corner2x++;
   tangle.corner2y--;
   tangle.corner3x--;
   tangle.corner3y--;
    tangle.colour;
   display_tangle(&tangle);
  }
  break;
//rotate y acw
 case 46: //"<"
     {
   erase_tangle(&tangle);
   tangle.corner1x--;
   tangle.corner1y--;
   tangle.corner2x--;
   tangle.corner2y++;
   tangle.corner3x++;
   tangle.corner3y++;
    tangle.colour;
   display_tangle(&tangle);
  }
  break;
    //lengthen
 case 45:  //"-" adds both start/end x/y
  {
   erase_tangle(&tangle);
   tangle.corner1x++;
   tangle.corner1y++;
   tangle.corner2x++;
   tangle.corner2y--;
   tangle.corner3x--;
   tangle.corner3y--;
    tangle.colour;
   display_tangle(&tangle);
  }
  break;
//shorten
 case 61: // "=" adds both, but doesn't erase
     {
   erase_tangle(&tangle);
   tangle.corner1x--;
   tangle.corner1y--;
   tangle.corner2x--;
   tangle.corner2y++;
   tangle.corner3x++;
   tangle.corner3y++;
    tangle.colour;
   display_tangle(&tangle);
  }
  break;
//tangle rotate
 case 91: // "[" 
     {
   erase_tangle(&tangle);
   rotate_tangle(&tangle);
   tangle.colour; 
   display_temp_tangle(&tangle);
  }
  break;
  //-tangle rotate
 case 93: // "]" 
     {
   erase_tangle(&tangle);
   rotate_tangle(&tangle);
   tangle.colour; 
   display_temp_tangle(&tangle);
  }
  break;
} //switch
}
while(move!=13);
  getch();
cleardevice();

	printf("Press ctrl-c to close the programme");

	getch();

    //return 0;
}


/************* TRIANGLE DRAWING FUNCTIONS ***************/

void display_tangle(struct triangle *triangle_pointer)
{
  setcolor(triangle_pointer->colour);
  line(triangle_pointer->corner1x, triangle_pointer->corner1y, triangle_pointer->corner2x, triangle_pointer->corner2y);
  line(triangle_pointer->corner2x, triangle_pointer->corner2y, triangle_pointer->corner3x, triangle_pointer->corner3y);
  line(triangle_pointer->corner3x, triangle_pointer->corner3y, triangle_pointer->corner1x, triangle_pointer->corner1y);  
  //setfillstyle(SOLID_FILL, WHITE);
  //floodfill(tangle.corner1x, tangle.corner1y, tangle.colour);
}

void erase_tangle(struct triangle *triangle_pointer)
{
  setcolor(0);
  line(triangle_pointer->corner1x, triangle_pointer->corner1y, triangle_pointer->corner2x, triangle_pointer->corner2y);
  line(triangle_pointer->corner2x, triangle_pointer->corner2y, triangle_pointer->corner3x, triangle_pointer->corner3y);
  line(triangle_pointer->corner3x, triangle_pointer->corner3y, triangle_pointer->corner1x, triangle_pointer->corner1y);
}

void display_temp_tangle(struct triangle *triangle_pointer)
{
  setcolor(triangle_pointer->colour);
  line(triangle_pointer->corner1xtemp, triangle_pointer->corner1ytemp, triangle_pointer->corner2xtemp, triangle_pointer->corner2ytemp);
  line(triangle_pointer->corner2xtemp, triangle_pointer->corner2ytemp, triangle_pointer->corner3xtemp, triangle_pointer->corner3ytemp);
  line(triangle_pointer->corner3xtemp, triangle_pointer->corner3ytemp, triangle_pointer->corner1xtemp, triangle_pointer->corner1ytemp);
}

void get_tangle(struct triangle *triangle_pointer)
{
  printf("Please enter co-ordinates for the corners of your triangle.\nThe range is (x=0-600; y=0-400): \n       corner 1x: ");
  scanf ("%d", &triangle_pointer->corner1x);
  printf("       corner 1y: ");
  scanf ("%d", &triangle_pointer->corner1y);
  printf("       corner 2x: ");
  scanf ("%d", &triangle_pointer->corner2x);
  printf("       corner 2y: ");
  scanf ("%d", &triangle_pointer->corner2y);
  printf("       corner 3x: ");
  scanf ("%d", &triangle_pointer->corner3x);
  printf("       corner 3y: ");
  scanf ("%d", &triangle_pointer->corner3y);
  printf("       centre point x: ");
  scanf ("%d", &triangle_pointer->centrepoint_x);
  printf("       centre point y: ");
  scanf ("%d", &triangle_pointer->centrepoint_y);
  //printf("Enter an angle to rotate by:\n");
  //scanf ("%d", &triangle_pointer->theta);	
  printf("and a number for the colour (0-15): ");
  scanf ("%d", &triangle_pointer->colour);
  printf("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d <-and there they are. \n", triangle_pointer->corner1x, triangle_pointer->corner1y, triangle_pointer->corner2x, triangle_pointer->corner2y, triangle_pointer->corner3x, triangle_pointer->corner3y, triangle_pointer->centrepoint_x, triangle_pointer->centrepoint_y, triangle_pointer->theta, triangle_pointer->colour);
}

void rotate_tangle(struct triangle *triangle_pointer)
{
tangle.corner1xtemp = (cos(tangle.corner1x-tangle.centrepoint_x)*tangle.corner1x+tangle.centrepoint_x);
tangle.corner1ytemp = (-sin(tangle.corner1y-tangle.centrepoint_y)*tangle.corner1x+tangle.centrepoint_y);

tangle.corner2xtemp = (sin(tangle.corner2x-tangle.centrepoint_x)*tangle.corner1x+tangle.centrepoint_x);
tangle.corner2ytemp = (cos(tangle.corner2y-tangle.centrepoint_y)*tangle.corner1x+tangle.centrepoint_y);

tangle.corner3xtemp = (sin(tangle.corner3x-tangle.centrepoint_x)*tangle.corner1x+tangle.centrepoint_x);
tangle.corner3ytemp = (cos(tangle.corner3y-tangle.centrepoint_y)*tangle.corner1x+tangle.centrepoint_y);
}/*
void rotate_tangle(struct triangle *triangle_pointer)
{     
tangle.corner1xtemp = cos(tangle.theta) * tangle.corner1x - sin(tangle.theta) * tangle.corner1y;
tangle.corner1ytemp = sin(tangle.theta) * tangle.corner1x + cos(tangle.theta) * tangle.corner1y;
tangle.corner2xtemp = cos(tangle.theta) * tangle.corner2x - sin(tangle.theta) * tangle.corner2y;
tangle.corner2ytemp = sin(tangle.theta) * tangle.corner2x + cos(tangle.theta) * tangle.corner2y;
tangle.corner3xtemp = cos(tangle.theta) * tangle.corner3x - sin(tangle.theta) * tangle.corner3y;
tangle.corner3ytemp = sin(tangle.theta) * tangle.corner3x + cos(tangle.theta) * tangle.corner3y;
}*/

/****************************/


   /*********************/
   /*   SQUARE MENU     */
   /*********************/

void square_menu(struct rectangle *square_pointer)
{
  	char move;
    
	//rect square;

	square_pointer = &square;

	setbkcolor(WHITE);
	setcolor(BLACK);

	printf("Controls:\n");
	printf("Use the arrow buttons to move the shape\n");
	printf("Use the A & Z, < & >, buttons to warp the shape\n");
	printf("Use the + & - buttons to resize the shape\n");
	printf("Use the [ & ] buttons to rotate the shape\n");
	printf("press any key to continue\n");
	getch();
	cleardevice();	
		
	get_square(square_pointer);
  
	initwindow(600, 400);
	display_square(square_pointer); 


	do
{
 move=getch();
 if( move == 0 )
  move=getch();

    switch(move)
 {
//move left
 case 77:
  {
   erase_square(&square);
   square.corner1x++;
   square.corner2x++;
   square.corner3x++;
   square.corner3x++;
   square.colour;
   display_square(&square);
  }
  break;
//move right
 case 75:
     {
   erase_square(&square);
   square.corner1x--;
   square.corner2x--;
   square.corner3x--;
   square.corner3x--;
   square.colour;
   display_square(&square);
  }
  break;
  //move up
 case 72:
  {
   erase_square(&square);
   square.corner1y--;
   square.corner2y--;
   square.corner3y--;
   square.corner3y--;
   square.colour;
   display_square(&square);
  }
  break;
//move down
 case 80:
     {
   erase_square(&square);
   square.corner1y++;
   square.corner2y++;
   square.corner3y++;
   square.corner3y++;
   square.colour;
   display_square(&square);
  }
  break;
  //rotate x cw
 case 97:  //"A"
  {
   erase_square(&square);
   square.corner1x++;
   square.corner2x--;
   square.corner3x++;
   square.corner3x--;
   square.corner1y++;
   square.corner2y--;
   square.corner3y++;
   square.corner3y--;
   square.colour;
   display_square(&square);
  }
  break;
//rotate x acw
 case 122: // "Z"
     {
   erase_square(&square);
   square.corner1x--;
   square.corner2x++;
   square.corner3x--;
   square.corner3x++;
   square.corner1y--;
   square.corner2y++;
   square.corner3y--;
   square.corner3y++;
   square.colour;
   display_square(&square);
  }
  break;
  //rotate y cw
 case 44: //">"
  {
   erase_square(&square);
   square.corner1x++;
   square.corner2x++;
   square.corner3x--;
   square.corner3x--;
   square.corner1y++;
   square.corner2y++;
   square.corner3y--;
   square.corner3y--;
   square.colour;
   display_square(&square);
  }
  break;
//rotate y acw
 case 46: //"<"
     {
   erase_square(&square);
   square.corner1x--;
   square.corner2x--;
   square.corner3x++;
   square.corner3x++;
   square.corner1y--;
   square.corner2y--;
   square.corner3y++;
   square.corner3y++;
   square.colour;
   display_square(&square);
  }
  break;
    //lengthen
 case 45:  //"-" 
  {
   erase_square(&square);
   square.corner1x++;
   square.corner2x++;
   square.corner3x++;
   square.corner3x++;
   square.corner1y++;
   square.corner2y++;
   square.corner3y++;
   square.corner3y++;
   square.colour;
   display_square(&square);
  }
  break;
//shorten
 case 61: // "=" 
     {
   erase_square(&square);
   square.corner1x--;
   square.corner2x--;
   square.corner3x--;
   square.corner3x--;
   square.corner1y--;
   square.corner2y--;
   square.corner3y--;
   square.corner3y--;
   square.colour;
   display_square(&square);
  }
/*
  break;
//tangle rotate
 case 91: // "[" 
     {
   erase_square(&square);
   square.colour;
   //display_square(&square);
   rotate_square(&square);
   display_temp_square(&square);
  }
  break;
  //-tangle rotate
 case 93: // "]" 
     {
   erase_square(&square);
   square.colour;
   //display_square(&square);
   rotate_square(&square);
   display_temp_square(&square);
  }
  break;*/
} //switch
}
while(move!=13);
  getch();
cleardevice();

	printf("Press ctrl-c to close the programme");

	getch();

    //return 0;
}

/************* SQUARE DRAWING FUNCTIONS ***************/

void display_square(struct rectangle *square_pointer)
{
  setcolor(square_pointer->colour);
  line(square_pointer->corner1x, square_pointer->corner1y, square_pointer->corner2x, square_pointer->corner2y);
  line(square_pointer->corner2x, square_pointer->corner2y, square_pointer->corner3x, square_pointer->corner3y);
  line(square_pointer->corner3x, square_pointer->corner3y, square_pointer->corner4x, square_pointer->corner4y);
  line(square_pointer->corner4x, square_pointer->corner4y, square_pointer->corner1x, square_pointer->corner1y);
}

void erase_square(struct rectangle *square_pointer)
{
  setcolor(0);
  line(square_pointer->corner1x, square_pointer->corner1y, square_pointer->corner2x, square_pointer->corner2y);
  line(square_pointer->corner2x, square_pointer->corner2y, square_pointer->corner3x, square_pointer->corner3y);
  line(square_pointer->corner3x, square_pointer->corner3y, square_pointer->corner4x, square_pointer->corner4y);
  line(square_pointer->corner4x, square_pointer->corner4y, square_pointer->corner1x, square_pointer->corner1y);
}

void get_square(struct rectangle *square_pointer)
{
  printf("Please enter co-ordinates for the corners of your square.\nThe range is (x=0-600; y=0-400): \n       corner 1x: ");
  scanf ("%d", &square_pointer->corner1x);
  printf("       corner 1y: ");
  scanf ("%d", &square_pointer->corner1y);
  printf("       corner 2x: ");
  scanf ("%d", &square_pointer->corner2x);
  printf("       corner 2y: ");
  scanf ("%d", &square_pointer->corner2y);
  printf("       corner 3x: ");
  scanf ("%d", &square_pointer->corner3x);
  printf("       corner 3y: ");
  scanf ("%d", &square_pointer->corner3y);
  printf("       corner 4x: ");
  scanf ("%d", &square_pointer->corner4x);
  printf("       corner 4y: ");
  scanf ("%d", &square_pointer->corner4y);
  printf("and a number for the colour (0-15): ");
  scanf ("%d", &square_pointer->colour);
  printf("%d, %d, %d, %d, %d, %d, %d, %d, %d <-and there they are. \n", square_pointer->corner1x, square_pointer->corner1y, square_pointer->corner2x, square_pointer->corner2y, square_pointer->corner3x, square_pointer->corner3y, square_pointer->corner4x, square_pointer->corner4y, square_pointer->colour);
}

/****************************/



any ideas how to make it return to the main menu?

I get a shed load of warnings though, but it still runs
Quote:
--------------------Configuration: shapeshifter - Win32 Debug--------------------
Compiling...
shapeshifter.c
C:\Documents and Settings\....\shapeshifter\shapeshifter\shapeshift er.c(179) : warning C4047: 'function' : 'struct line_structure *' differs in levels of indirection from 'void (__cdecl *)(int ,int ,int ,i
nt )'
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(179) : warning C4024: 'line_menu' : different types for formal and actual parameter 1
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(183) : warning C4047: 'function' : 'struct circle *' differs in levels of indirection from 'void (__cdecl *)(int ,int ,int )'
C:\Documents and Settings\..\shapeshifter\shapeshifter\shapeshifter .c(183) : warning C4024: 'c_menu' : different types for formal and actual parameter 1
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(187) : warning C4133: 'function' : incompatible types - from 'struct circle *' to 'struct triangle *'
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(353) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(354) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(355) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(356) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(372) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(373) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(374) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(375) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(879) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(880) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(882) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(883) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(885) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(886) : warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data

shapeshifter.obj - 0 error(s), 19 warning(s)




as nobody seems to know the trig, there's no point asking for help with filling the shape alone; but for anyone who is interested, here's some almost useful links I've been trying to use:
http://www.euclideanspace.com/maths/geometry/rotations/index.htm
http://www.euclideanspace.com/maths/geometry/rotations/euler/index.htm#sample
http://www.siggraph.org/education/materials/HyperGraph/modeling/mod_tran/2dconc.htm
  #73  
Old 23-May-2007, 00:49
Howard_L Howard_L is offline
Regular Member
 
Join Date: Apr 2007
Location: Maryland/PA, USA
Posts: 802
Howard_L is a jewel in the roughHoward_L is a jewel in the roughHoward_L is a jewel in the rough

Re: Linked Lists advice request


Thanks for keeping your code reduced to a small example.....NOT!
Have you even taken a minute to read the guidlines?
You're really pushin it.... suprise you haven't gotten a load.

It runs for you? I get errors. Here's what I think I see.

D:\C\mystuff\graphics\promsan> bgi++ promsan8_0x1.c -o promsan8_0x1.exe
promsan8_0x1.c: In function `int menu()':
promsan8_0x1.c:179: error: cannot convert `void (*)(int, int, int, int)' to `
line_structure*' for argument `1' to `void line_menu(line_structure*)'
-here your trying to call line_menu with a with the address of 'line' which
is defined in the structure. Does that make sense?
Do you even need to pass anything to it?
If so it needs to be declared before it is called,
like externally or in main() or menu().
Remember that things declared in a function disappear when that function ends.

promsan8_0x1.c:183: error: cannot convert `void (*)(int, int, int)' to `circle*
' for argument `1' to `void c_menu(circle*)'
- In this one, 'circle' is a structure tag, not a defined structure with an address.
One HAS been defined which you called 'c'.
Don't forget, you can define your pointers right in the structure template definition.
struct circle {
int cx;
int cy;
int radius;
int colour;
double theta;
} c, *c_pointer; (or maybe *Cptr)

again, why do you need to pass anything to the function?

promsan8_0x1.c:187: error: cannot convert `circle*' to `triangle*'
for argument `1' to `void t_menu(triangle*)'
- of course you can't convert a circle to a tringle....

And these mean the data on the right of = is type double (float)
and it's being converted to a decimal, which might be a problem to you.
Is it? I don't think so, it's just a point on the screen right?
so you need to cast the right side to an int with the 'cast' operator ().
int_on_left = (int)((double_stuff)_on_(the_right));
the (int) there is the cast. (Note the outer parens on statement part).
promsan8_0x1.c:372: warning: assignment to `int' from `double'
promsan8_0x1.c:372: warning: argument to `int' from `double'
..... etc .....
Please reduce this to one shape. Your welcome...
  #74  
Old 23-May-2007, 03:10
promsan promsan is offline
Junior Member
 
Join Date: May 2007
Location: North of the rhubarb triangle, GB
Posts: 53
promsan is on a distinguished road

Re: Linked Lists advice request


well guidelines aren't rules, and if they wanna delete it, it's fine by me.
If someone wants to work out how to do summat, having a whole set of code and errors is possibly useful: odd bits of code and errors are only meaningful to people who know stuff already. Surely the point of this forum is for people who don't know much, to find out more?
I suppose I'm being "tolerated", because there's sufficient curiosity...

Quote:
it needs to be declared before it is called,
like externally or in main() or menu().
i think it was...
CPP / C++ / C Code:
void line_menu(struct line_structure *line_pointer);

Quote:
- In this one, 'circle' is a structure tag, not a defined structure with an address.
One HAS been defined which you called 'c'.

- of course you can't convert a circle to a tringle....
whoops (i did see that before, but forgot about it - i thought i'd changed it)

still can't shake this:
Quote:
--------------------Configuration: shapeshifter - Win32 Debug--------------------
Compiling...
shapeshifter.c
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(179) : warning C4047: 'function' : 'struct line_structure *' differs in levels of indirection from 'void (__cdecl *)(int ,int ,int ,i
nt )'
C:\Documents and Settings\...\shapeshifter\shapeshifter\shapeshifte r.c(179) : warning C4024: 'line_menu' : different types for formal and actual parameter 1

shapeshifter.obj - 0 error(s), 2 warning(s)


thanks for your help anyway.
  #75  
Old 23-May-2007, 09:29
Howard_L Howard_L is offline
Regular Member
 
Join Date: Apr 2007
Location: Maryland/PA, USA
Posts: 802
Howard_L is a jewel in the roughHoward_L is a jewel in the roughHoward_L is a jewel in the rough

Re: Linked Lists advice request


Line 179 in what is posted above:
CPP / C++ / C Code:
	    line_menu(&line); 
I don't see 'line' declared in:
CPP / C++ / C Code:
void line_menu(struct line_structure *line_pointer); 
I see it declared like this somewhere:
CPP / C++ / C Code:
	lin line;
...go find it and decide what to do about it...
 
 

Recent GIDBlogProblems with the Navy (Chiefs) by crystalattice

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
triangle (polygon), drawing, sizing, and rotation programme using linked lists... promsan C Programming Language 12 14-May-2007 15:03
Doubly linked lists in C++ sweeeeeeetlipss C++ Forum 1 24-Oct-2006 00:27
[Include] Doubly-linked List dsmith C Programming Language 6 14-Apr-2006 14:12
help on linked lists any1????? nick4 C Programming Language 1 17-May-2004 10:32
linked lists, newbie needs help moltarim C Programming Language 4 06-May-2004 12:32

Network Sites: GIDNetwork · GIDWebHosts · GIDSearch · Learning Journal by J de Silva, The

All times are GMT -6. The time now is 18:17.


vBulletin, Copyright © 2000 - 2009, Jelsoft Enterprises Ltd.