Ejemplo n.º 1
0
        //使用固定elevation與azimuth
        //elevation > 0, -90< azimuth < 0
        private void AddTicks(Graphics g)
        {
            Point3[]     pta = new Point3[2];
            Point3       labelPt;
            StringFormat sf = new StringFormat();

            sf.Alignment = StringAlignment.Center;
            SolidBrush tbrush = new SolidBrush(cs.TickColor);
            SolidBrush abrush = new SolidBrush(cs.LabelColor);
            Pen        apen   = new Pen(cs.AxisColor, cs.AxisThickness);

            apen.DashStyle = cs.AxisStyle;
            SizeF tickNumberOffset = g.MeasureString(cs.XMax.ToString(".#"), cs.TickFont);
            SizeF labelOffset      = g.MeasureString(cs.XLabel.ToString(), cs.LabelFont);
            //int nameMappingPos = Constants.Draw3DXTickNumber / 3;
            int keepIdx = 1;

            //PointF namePt = new PointF();
            for (float x = cs.XMin + cs.XTick; x < cs.XMax; x += cs.XTick)
            {
                labelPt = new Point3(x + tickNumberOffset.Height / 2
                                     , pts[1].Y + tickNumberOffset.Width / 2
                                     , pts[1].Z, pts[1].W);
                labelPt.Transform(transMatrix, panel.Size, cs);
                g.DrawString(x.ToString(".#"), cs.TickFont, tbrush
                             , new PointF(labelPt.X, labelPt.Y), sf);
                keepIdx++;
                //if (keepIdx < nameMappingPos)
                //{
                //    keepIdx++;
                //}
                //else
                //{
                //    SizeF s = g.MeasureString(x.ToString(".#"), cs.TickFont);
                //    namePt = new PointF(labelPt.X + s.Width + 6, labelPt.Y);
                //    keepIdx = -Constants.Draw3DXTickNumber;
                //}
            }

            //Add x axis label
            //pta[0] = new Point3(pts[0]);
            //pta[0].Transform(transMatrix, panel.Size, cs);
            //pta[1] = new Point3(pts[1]);
            //pta[1].Transform(transMatrix, panel.Size, cs);
            //float theta = (float)Math.Atan((pta[1].Y - pta[0].Y) / (pta[1].X - pta[0].X));
            //theta = theta * 180 / (float)Math.PI;
            //GraphicsState gs = g.Save();
            //g.TranslateTransform(namePt.X, namePt.Y);
            //g.RotateTransform(theta);
            //g.DrawString(cs.XLabel, cs.LabelFont, abrush, new PointF(0, 0), sf);
            //g.Restore(gs);

            //Use keepIdx / 2 * cs.XTick + cs.XTick / 2 to put labelX between 2 ticks
            float pos_x = (keepIdx + 1) * cs.XTick / 2.0f;

            labelPt = new Point3(pos_x
                                 , pts[1].Y + tickNumberOffset.Width
                                 , pts[1].Z, pts[1].W);
            labelPt.Transform(transMatrix, panel.Size, cs);
            g.DrawString(cs.XLabel, cs.LabelFont, abrush
                         , new PointF(labelPt.X, labelPt.Y + labelOffset.Height / 2.0f));

            //Add y ticks
            tickNumberOffset = g.MeasureString(cs.YMax.ToString(".#"), cs.TickFont);
            //nameMappingPos = Constants.Draw3DYTickNumber * 2 / 3;
            //keepIdx = 1;
            for (float y = cs.YMin + cs.YTick; y < cs.YMax; y += cs.YTick)
            {
                labelPt = new Point3(pts[1].X, y, pts[1].Z, pts[1].W);
                labelPt.Transform(transMatrix, panel.Size, cs);
                g.DrawString(y.ToString(".#"), cs.TickFont, tbrush
                             , new PointF(labelPt.X, labelPt.Y + 3), sf);
                //if (keepIdx < nameMappingPos)
                //{
                //    keepIdx++;
                //}
                //else
                //{
                //    SizeF s = g.MeasureString(y.ToString(".#"), cs.TickFont);
                //    namePt = new PointF(labelPt.X, labelPt.Y + s.Height + 3);
                //    keepIdx = -Constants.Draw3DYTickNumber;
                //}
            }
            //Add y axis label
            labelPt = new Point3(pts[1].X - tickNumberOffset.Width, (cs.YMax + cs.YMin) / 2, pts[1].Z, pts[1].W);
            labelPt.Transform(transMatrix, panel.Size, cs);

            g.DrawString(cs.YLabel, cs.LabelFont, abrush
                         , new PointF(labelPt.X - 3, labelPt.Y + 12));

            //Add z ticks
            SizeF tickNumbeSize = g.MeasureString(cs.ZMax.ToString(".0"), cs.TickFont);

            //nameMappingPos = Constants.Draw3DZTickNumber / 2;
            //keepIdx = 1;
            for (float z = cs.ZMin + cs.ZTick; z < cs.ZMax; z += cs.ZTick)
            {
                //labelPt = new Point3(pts[1].X - tickNumbeSize.Width, pts[2].Y - tickNumbeSize.Width, z, pts[1].W);
                labelPt = new Point3(pts[1].X
                                     , pts[2].Y
                                     , z, pts[1].W);
                labelPt.Transform(transMatrix, panel.Size, cs);
                PointF pt = new PointF(labelPt.X - tickNumbeSize.Width + 6
                                       , labelPt.Y - tickNumbeSize.Height / 2);
                g.DrawString(z.ToString(".0"), cs.TickFont, tbrush
                             , pt, sf);
                //if (keepIdx < nameMappingPos)
                //{
                //    keepIdx++;
                //}
                //else
                //{
                //    SizeF s = g.MeasureString(z.ToString(".0"), cs.TickFont);
                //    namePt = new PointF(pt.X - s.Width - 12, pt.Y);
                //    keepIdx = -Constants.Draw3DZTickNumber;
                //}
            }
            //Add z axis label
            //gs = g.Save();
            //g.TranslateTransform(namePt.X, namePt.Y);
            //g.RotateTransform(270);
            labelPt = new Point3(pts[1].X, pts[2].Y, (cs.ZMax + cs.ZMin) / 2, pts[1].W);
            labelPt.Transform(transMatrix, panel.Size, cs);
            SizeF  sZlabel  = g.MeasureString(cs.ZLabel, cs.LabelFont);
            PointF ptZlabel = new PointF(labelPt.X - tickNumbeSize.Width - sZlabel.Width - 2
                                         , labelPt.Y - sZlabel.Height / 2);

            g.DrawString(cs.ZLabel, cs.LabelFont, abrush, ptZlabel, sf);
            //g.Restore(gs);

            abrush = new SolidBrush(cs.TitleColor);
            g.DrawString(cs.Title, cs.TitleFont, abrush
                         , new PointF(panel.Size.Width / 2, panel.Size.Height / 30), sf);
            apen.Dispose();
            abrush.Dispose();
            tbrush.Dispose();
        }
Ejemplo n.º 2
0
        private void AddGrid(Graphics g)
        {
            using (Pen apen = new Pen(cs.GridColor))
            {
                apen.DashStyle = cs.GridStyle;
                Point3[] ptx = new Point3[3];
                Point3[] pty = new Point3[3];
                Point3[] ptz = new Point3[3];
                ptx[0] = new Point3(0, pts[1].Y, pts[1].Z, pts[1].W);
                pty[0] = new Point3(pts[1].X, 0, pts[1].Z, pts[1].W);
                ptz[0] = new Point3(pts[2].X, pts[2].Y, 0, pts[2].W);
                ptx[1] = new Point3(pts[2].X, pts[2].Y, pts[1].Z, pts[1].W);
                ptx[2] = new Point3(pts[2].X, pts[2].Y, pts[3].Z, pts[1].W);
                pty[1] = new Point3(pts[0].X, pts[0].Y, pts[1].Z, pts[1].W);
                pty[2] = new Point3(pts[0].X, pts[0].Y, pts[3].Z, pts[1].W);
                ptz[1] = new Point3(pts[0].X, pts[2].Y, pts[1].Z, pts[1].W);
                ptz[2] = new Point3(pts[0].X, pts[1].Y, pts[1].Z, pts[1].W);

                Point3[] pta = new Point3[3];
                if (cs.IsXGrid)
                {
                    for (float x = cs.XMin; x <= cs.XMax; x += cs.XTick)
                    {
                        for (int i = 0; i < ptx.Length; i++)
                        {
                            pta[i] = new Point3(x, ptx[i].Y, ptx[i].Z, ptx[i].W);
                        }
                        for (int i = 0; i < pta.Length; i++)
                        {
                            pta[i].Transform(transMatrix, panel.Size, cs);
                        }
                        g.DrawLine(apen, pta[0].X, pta[0].Y, pta[1].X, pta[1].Y);
                        g.DrawLine(apen, pta[1].X, pta[1].Y, pta[2].X, pta[2].Y);
                    }
                }
                if (cs.IsYGrid)
                {
                    for (float y = cs.YMin; y <= cs.YMax; y += cs.YTick)
                    {
                        for (int i = 0; i < pty.Length; i++)
                        {
                            pta[i] = new Point3(pty[i].X, y, pty[i].Z, pty[i].W);
                        }
                        for (int i = 0; i < pta.Length; i++)
                        {
                            pta[i].Transform(transMatrix, panel.Size, cs);
                        }
                        g.DrawLine(apen, pta[0].X, pta[0].Y, pta[1].X, pta[1].Y);
                        g.DrawLine(apen, pta[1].X, pta[1].Y, pta[2].X, pta[2].Y);
                    }
                }
                if (cs.IsZGrid)
                {
                    for (float z = cs.ZMin; z <= cs.ZMax; z += cs.ZTick)
                    {
                        for (int i = 0; i < ptz.Length; i++)
                        {
                            pta[i] = new Point3(ptz[i].X, ptz[i].Y, z, ptz[i].W);
                        }
                        for (int i = 0; i < pta.Length; i++)
                        {
                            pta[i].Transform(transMatrix, panel.Size, cs);
                        }
                        g.DrawLine(apen, pta[0].X, pta[0].Y, pta[1].X, pta[1].Y);
                        g.DrawLine(apen, pta[1].X, pta[1].Y, pta[2].X, pta[2].Y);
                    }
                }
            }
        }