Page 1 of 1

arrow head on axis

Posted: Tue Feb 02, 2010 4:42 pm
by 13051164
version: 3.5.3425.20245

Hi All,

My chart displays a tower series that looks like this.
A rotation tool is used to allow user other view angles.
The problem is that once the chart has been rotated, user is a bit-disoriented.

To fix this, I'd like to draw an axis with an arrowhead, like this. If this is not possible or too complicated, this could be considered ok.

I played with the feature demo and managed to have an axis without ticks and labels, moved using the Z parameter. But I haven't found a way to create the arrowhead at the end of the axis.

Also, as a bonus ;-), how could I replace the circle created using the data points in white by a real nicer circle such as this? Ideally, the circle should behave as the white data points: It's on Z=0 and parts of it should therefore be hidden behind the tower according to perspective laws.

Please help.

TIA,
Serge Wautier.

Re: arrow head on axis

Posted: Wed Feb 03, 2010 11:35 am
by 10050769
Hello serge wautier,
To fix this, I'd like to draw an axis with an arrowhead, like this. If this is not possible or too complicated, this could be considered ok.
You could use Tool AxisArrows, You can find an example of use to Demo AllFeatures\Welcome !\Tools\Axis Arrows.
Also, as a bonus ;-), how could I replace the circle created using the data points in white by a real nicer circle such as this? Ideally, the circle should behave as the white data points: It's on Z=0 and parts of it should therefore be hidden behind the tower according to perspective laws
.

I suggest that try, using Events BeforeDraw or BeforeDrawSeries , draw directly a shape in canvas you can examples in Demos AllFeatures\Welcome !\Canvas, and change shape.Style= ellipse or circle.

If trying the above suggestions does not behave as you'd like, please tell us exactly what do you want, because we could help you.

Thanks,

Re: arrow head on axis

Posted: Fri Feb 05, 2010 11:00 am
by 13051164
Sandra,

Thanks for your reply. I hadn't seen the Axis tab in the tools section ;-)

The AxisArrow tool is what I need but it doesn't seem flexible enough in my case :-( :
- It's drawn on a vertical plan. I need it drawn on the horizontal plan (bottom axis).
- It doesn't follow the ZPosition setting of its axis. I need the bottom axis and arrow drawn for Y=0 with Y values ranging from -max to max.

Here's a screenshot of a typical chart with axis correctly positionned (tChart1.Axes.Bottom.ZPosition = 50). You can see the arrow head remains at ZPosition 0. Also when you rotate the chart (there's a rotate tool), you can see that the arrow head is not very visible due to being drawn in a vertical plan instead of horizontal plan.

FWIW, here's my sample VS2008 project source code (and compiled debug version)

Can you help? It would be great because this axisarrow tool is what I need.

TIA,

Serge.

Re: arrow head on axis

Posted: Fri Feb 05, 2010 3:12 pm
by yeray
Hi Serge,

I'm afraid that this is not possible right now. I'll add this to the wish list to be considered for inclusion in future releases (TF02014665).

In the meanwhile, I think you should be able to do it manually. Here is a starting point that shows how you could draw your arrow:

Code: Select all

    Steema.TeeChart.Drawing.Point3D[] arrow = new Steema.TeeChart.Drawing.Point3D[7];      

    void tChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g)
    {
        ArrowRecalc();

        tChart1.Graphics3D.Brush.Color = Color.Green;
        tChart1.Graphics3D.Polygon(arrow);        
    }

    private void ArrowRecalc()
    {
        int arrowWidth = 30;
        int arrowLength = 20;
        int arrowHeadLength = 10;

        arrow[0].X = tChart1.Axes.Bottom.IEndPos;
        arrow[0].Y = tChart1.Axes.Bottom.Position;
        arrow[0].Z = (int)((tChart1.Axes.Depth.IEndPos * tChart1.Axes.Bottom.ZPosition / 100) + (arrowWidth / 4));

        arrow[1].X = arrow[0].X + (arrowLength - arrowHeadLength);
        arrow[1].Y = arrow[0].Y;
        arrow[1].Z = arrow[0].Z;

        arrow[2].X = arrow[1].X;
        arrow[2].Y = arrow[1].Y;
        arrow[2].Z = arrow[1].Z + (arrowWidth / 4);

        arrow[3].X = arrow[2].X + arrowHeadLength;
        arrow[3].Y = arrow[2].Y;
        arrow[3].Z = arrow[2].Z - (arrowWidth / 2);

        arrow[4].X = arrow[3].X - arrowHeadLength;
        arrow[4].Y = arrow[3].Y;
        arrow[4].Z = arrow[3].Z - (arrowWidth / 2);

        arrow[5].X = arrow[4].X;
        arrow[5].Y = arrow[4].Y;
        arrow[5].Z = arrow[4].Z + (arrowWidth / 4);

        arrow[6].X = arrow[5].X - (arrowLength - arrowHeadLength);
        arrow[6].Y = arrow[5].Y;
        arrow[6].Z = arrow[5].Z;
    }
Once you have your arrow drawn you need to check if the mouse is over this area at OnMouseClick or OnMouseDown events and call SetMinMax to move your chart.