Drawing an arrow at the end of a line using Graphics3D

TeeChart for Microsoft Visual Studio .NET, Xamarin Studio (Android, iOS & Forms) & Monodevelop.
Post Reply
WD_Gordon
Newbie
Newbie
Posts: 49
Joined: Wed Jun 18, 2008 12:00 am

Drawing an arrow at the end of a line using Graphics3D

Post by WD_Gordon » Wed Feb 25, 2009 8:03 pm

I and wanting to draw a line with a very pronounced arrow using the Graphics3D object. I tried using the g.Arrow method but when I specify a 7x7 pixel arrow the line is real thick. Why? And is there another way of doing this? I cannot use a DrawLine in this case as I am doing all my drawing in the AfterDraw event.

Thanks,
Kevin

Sandra
Site Admin
Site Admin
Posts: 3132
Joined: Fri Nov 07, 2008 12:00 am

Post by Sandra » Thu Feb 26, 2009 10:14 am

Hi WD_Gordon,


We doesn't understand exactly do you want. Please, could you send us a simple example project we can run "as-is" to reproduce the problem here?
You can either post your files at news://www.steema.net/steema.public.attachments newsgroup or at our upload page. Or it tells you what you want exactly.

On the other hand, TeeChart have ArrowSeries. This draw arrows using two points for example: x0,y0 (p0), x1 ,y1 (p1). Also you can see in TeeChart .NET demo arrow example AllFeatures/Welcome !\Chart styles\Standard\Arrow example, could be interesting for you.

Thanks
Best Regards,
Sandra Pazos / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

WD_Gordon
Newbie
Newbie
Posts: 49
Joined: Wed Jun 18, 2008 12:00 am

Post by WD_Gordon » Thu Feb 26, 2009 2:36 pm

Hi Sandra,

I don't need the ArrowSeries, all I am doing is drawing in the AfterDraw event. I uploaded an image named Fibonacci_Arrow.JPG, to show you what I am talking about.

The arrow at the top was drawn using the arrow method as follows:
g.Arrow(true, new Point(topLeft.X, topLeft.Y), new Point(bottomRight.X, bottomRight.Y), 10, 10, 0);

As you can see it paints a thick line as well.

Thanks,
Kevin

Sandra
Site Admin
Site Admin
Posts: 3132
Joined: Fri Nov 07, 2008 12:00 am

Post by Sandra » Fri Feb 27, 2009 10:22 am

Hi Kevin,

We suggest a similar code as next example, in AfterDraw event:

Code: Select all

        private void tChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g)
        {
   
            Point p1 = new Point(tChart1.Chart.ChartRect.Left,tChart1.Chart.ChartRect.Top);
            Point p2 = new Point(tChart1.Chart.ChartRect.Right, tChart1.Chart.ChartRect.Bottom);
            Point p3 = new Point(tChart1.Chart.ChartRect.Right-6, tChart1.Chart.ChartRect.Bottom -4) ;
            g.Brush.Color = Color.Black;
            g.Line(p1, p2);
            g.Arrow(true,p3,p2, 10, 10, 0);


        }
Hope this helps!
Best Regards,
Sandra Pazos / Development & Support
Steema Software
Avinguda Montilivi 33, 17003 Girona, Catalonia
Tel: 34 972 218 797
http://www.steema.com
Image Image Image Image Image Image
Instructions - How to post in this forum

WD_Gordon
Newbie
Newbie
Posts: 49
Joined: Wed Jun 18, 2008 12:00 am

Post by WD_Gordon » Fri Feb 27, 2009 12:44 pm

Hi Sandra,

The only problem with your example is you are assuming the the line is running at a 45° angle. The user can size this object so the line can be drawn in all directions at any degree. Any suggestions?

Thanks,
Kevin

Yeray
Site Admin
Site Admin
Posts: 9612
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Post by Yeray » Tue Mar 03, 2009 11:14 am

Hi Kevin,

Here you have an example of how you could draw a thin line with a big head:

Code: Select all

public partial class Form1 : Form
    {
        bool DrawLine;
        Point headStartPoint, fromPoint, toPoint;

        public Form1()
        {
            InitializeComponent();

            InitializeChart();
        }

        private void InitializeChart()
        {
            chartController1.Chart = tChart1;

            fromPoint = new Point();
            toPoint = new Point();
            headStartPoint = new Point();
            DrawLine = false;

            tChart1.Zoom.Allow = false;
            tChart1.Aspect.View3D = false;

            tChart1.MouseDown +=new MouseEventHandler(tChart1_MouseDown);
            tChart1.MouseUp += new MouseEventHandler(tChart1_MouseUp);
            tChart1.MouseMove += new MouseEventHandler(tChart1_MouseMove);
            tChart1.AfterDraw += new Steema.TeeChart.PaintChartEventHandler(tChart1_AfterDraw);
        }

        void tChart1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                fromPoint.X = e.X;
                fromPoint.Y = e.Y;
                DrawLine = true;
            }
        }

        void tChart1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                DrawLine = false;
            }
        }

        void tChart1_MouseMove(object sender, MouseEventArgs e)
        {
            if (DrawLine)
            {
                toPoint.X = e.X;
                toPoint.Y = e.Y;
                tChart1.Refresh();
            }
        }

        void tChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g)
        {
            if (DrawLine)
            {
                g.Brush.Color = Color.Black;
                g.Line(fromPoint, toPoint);

                int dx = toPoint.X - fromPoint.X;
                int dy = fromPoint.Y - toPoint.Y;

                if (Math.Sqrt(dx * dx + dy * dy) > 7)
                {
                    if (dx == 0)
                    {
                        if (dy > 0)
                        {
                            headStartPoint.X = toPoint.X;
                            headStartPoint.Y = toPoint.Y + 6;
                        }
                        else
                        {
                            headStartPoint.X = toPoint.X;
                            headStartPoint.Y = toPoint.Y - 6;
                        }
                    }
                    else
                    {
                        headStartPoint.X = (int)(toPoint.X - (6 * Math.Cos(Math.Atan2(dy, dx))));
                        headStartPoint.Y = (int)(toPoint.Y + (6 * Math.Sin(Math.Atan2(dy, dx))));
                    }
                    g.Arrow(true, headStartPoint, toPoint, 10, 10, 0);
                }
            }
        }
    }
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Post Reply