Counting point size based on chart area during zooming/unzoomin
- by Gacek
Hi folks.
I heave a quite simple task. I know (I suppose) it should be easy, but from the reasons I cannot understand, I try to solve it since 2 days and I don't know where I'm making the mistake.
So, the problem is as follows:
- we have a chart with some points
- The chart starts with some known area and points have known size
- we would like to "emulate" the zooming effect. So when we zoom to some part of the chart, the size of points is getting proportionally bigger. In other words, the smaller part of the chart we select, the bigger the point should get.
So, we have something like that. We know this two parameters:
initialArea; // Initial area - area of the whole chart, counted as width*height
initialSize; // initial size of the points
Now lets assume we are handling some kind of OnZoom event. We selected some part of the chart and would like to count the current size of the points
float CountSizeOnZoom()
{
float currentArea = CountArea(...); // the area is counted for us.
float currentSize = initialSize * initialArea / currentArea;
return currentSize;
}
And it works. But the rate of change is too fast. In other words, the points are getting really big too soon. So I would like the currentSize to be invertly proportional to currentArea, but with some scaling coefficient.
So I created the second function:
float CountSizeOnZoom()
{
float currentArea = CountArea(...); % the area is counted for us.
// Lets assume we want the size of points to change ten times slower, than area of the chart changed.
float currentSize = initialSize + 0.1f* initialSize * ((initialArea / currentArea) -1);
return currentSize;
}
Lets do some calculations in mind.
if currentArea is smaller than initialArea, initialArea/currentArea > 1 and then we add "something" small and postive to initialSize. Checked, it works.
Lets check what happens if we would un-zoom. currentArea will be equal to initialArea, so we would have 0 at the right side (1-1), so new size should be equal to initialSize. Right? Yeah. So lets check it... and it doesn't work.
My question is: where is the mistake? Or maybe you have any ideas how to count this scaled size depending on current area in some other way?