MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Solved

Posted on 1998-09-02

this is a follow up to my question titled 'Draw Graphs'...

commercial toolkits are out of the question bcos my school project does not have a budget for it (such toolkits cost money rite??)

pls forgive me for i have just started learning VC++.... so can you kindly explain in more details the following:

1) Drawing of grids using the LineTo, TextOut etc etc functions.

2) For the program to generate the graph... let say i got two variables, theta and displacement, i will calculate the displacement at certain interval of theta. eg, at theta equal to 5, 10, 15, 20.... displacements are d1, d2, d3, d4. as such i would have the various pts. question is, how do i map this points into the grid i have drawn?? also, how to i join this various pts up after i mapped them into the grid i drawn??

the project gonna due very soon and i just can't seem to solve the problem. your help is very much appreciated. thanz in advance.

commercial toolkits are out of the question bcos my school project does not have a budget for it (such toolkits cost money rite??)

pls forgive me for i have just started learning VC++.... so can you kindly explain in more details the following:

1) Drawing of grids using the LineTo, TextOut etc etc functions.

2) For the program to generate the graph... let say i got two variables, theta and displacement, i will calculate the displacement at certain interval of theta. eg, at theta equal to 5, 10, 15, 20.... displacements are d1, d2, d3, d4. as such i would have the various pts. question is, how do i map this points into the grid i have drawn?? also, how to i join this various pts up after i mapped them into the grid i drawn??

the project gonna due very soon and i just can't seem to solve the problem. your help is very much appreciated. thanz in advance.

2 Comments

I think you need basically help with the drawing - and not with the logic behind it.

So i'll post here some code which may help you. A short explanation:

The class gridInfo describes the grid to draw.

The function check_grid() makes sure that the grid data is valid.

The function grid_to_coord() converts a grid coordinate into a screen coordinate

(i think that's what you wanted, but i'm not sure)

wrap_value() 'rounds' the given value to the next given number.

The function paint_grid() paints the grid.

I think you should implement the function which actually draws the graph by yourself -

it is not hard to do, just take you some time, a block of paper and you should be able

to make it.

class gridInfo {

public:

double x_min;

double x_max;

double y_min;

double y_max;

double delta_x_intense; // intense coordinate lines, for example 10

double delta_y_intense; // which would mean that -20;-10;0;10;20;...

double delta_x_light; // light coordinate lines, for example 1;

double delta_y_light;

};

void check_grid(gridInfo& gi)

{

ASSERT( (gi.x_max-gi.x_min)>0 );

ASSERT( (gi.y_max-gi.y_min)>0 );

}

void grid_to_coord(CRect& rcPaint,gridInfo& gi,double grid_x,double grid_y,

int& coord_x,int& coord_y)

{

check_grid(gi);

grid_x-=gi.x_min;

grid_y-=gi.y_min;

ASSERT(grid_x>=0); ASSERT(grid_y>=0);

// 0<=grid_x/y

grid_x/=(gi.x_max-gi.x_min

grid_y/=(gi.y_max-gi.y_min

// 0<=grix_x/y<=1

// by standard, the positive values grow into negative screen coordinates ->

grid_y=1-grid_y;

// now map these [0..1]|[0..1] coordinates in the target (screen) rectangle

coord_x=( grid_x*((double)rcPaint.Wi

coord_y=( grid_y*((double)rcPaint.He

// rcPaint.left<=coord_x<=rcP

// rcPaint.top<=coord_y<=rcPa

}

double wrap_value(double value,double mod,BOOL wrapUp)

{

BOOL usePositive; // value+ or value-? (see below)

// if value is less than zero, fmod()<0 too!

usePositive =wrapUp;

if(value<0) wrapUp=wrapUp?FALSE:TRUE;

if(usePositive)

value=value+fmod(value,mod

else

value=value-fmod(value,mod

return value;

}

void paint_grid(CDC& dc,CRect& rcPaint,gridInfo& gi)

{

CPen intense_line(PS_SOLID,1,RG

CPen light_line(PS_SOLID,1,RGB(

CPen *old;

double counter;

dc.FillSolidRect(rcPaint,0

old=dc.SelectObject(&light

/*** draw light x-axis lines ***/

for(counter=wrap_value(gi.

counter<=wrap_value(gi.x_m

counter+=gi.delta_x_light)

int sx,sy;

grid_to_coord(rcPaint,gi,c

dc.MoveTo(sx,rcPaint.top);

dc.LineTo(sx,rcPaint.botto

}

/*** draw light y-axis lines ***/

for(counter=wrap_value(gi.

counter<=wrap_value(gi.y_m

counter+=gi.delta_y_light)

int sx,sy;

grid_to_coord(rcPaint,gi,0

dc.MoveTo(rcPaint.left,sy)

dc.LineTo(rcPaint.right,sy

}

dc.SelectObject(&intense_l

/*** draw intense x-axis lines ***/

for(counter=wrap_value(gi.

counter<=wrap_value(gi.x_m

counter+=gi.delta_x_intens

int sx,sy;

grid_to_coord(rcPaint,gi,c

dc.MoveTo(sx,rcPaint.top);

dc.LineTo(sx,rcPaint.botto

}

/*** draw intense y-axis lines ***/

for(counter=wrap_value(gi.

counter<=wrap_value(gi.y_m

counter+=gi.delta_y_intens

int sx,sy;

grid_to_coord(rcPaint,gi,0

dc.MoveTo(rcPaint.left,sy)

dc.LineTo(rcPaint.right,sy

}

}

To see a fast example, create a SDI-app, and put this in the CView::OnDraw() function:

(of course, you have to place to code above somewhere)

gridInfo testgrid;

CRect testrect;

testgrid.x_min=-20;

testgrid.x_max=20;

testgrid.y_min=-20;

testgrid.y_max=20;

testgrid.delta_x_intense=1

testgrid.delta_y_intense=1

testgrid.delta_x_light=1;

testgrid.delta_y_light=1;

testrect=CRect(50,50,250,2

paint_grid(*pDC,testrect,t

What's missing are labels and the graph :)

I hope this helped a bit

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Title | # Comments | Views | Activity |
---|---|---|---|

Unable to build a Win32 solution with EXE and DLL projects inside: Visual Studio 2010 | 3 | 105 | |

Error creating a new C++ project in ,net | 20 | 41 | |

How to properly read C++ console input into several variables with scanf | 2 | 20 | |

Gaming Software | 1 | 17 |

The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

Join the community of 500,000 technology professionals and ask your questions.