Ejemplo n.º 1
0
        public static void Hexagon(Shape a, Point pStart, Point pEnd)
        {
            // find rotate matrix angle 60 with center is start point
            AffineTransformation transformer = new AffineTransformation();

            transformer.Translate(-pStart.X, -pStart.Y);
            transformer.Rotate(60 * Math.PI / 180);
            transformer.Translate(pStart.X, pStart.Y);

            Point p1 = transformer.Transform(pEnd);
            Point p2 = transformer.Transform(p1);
            Point p3 = transformer.Transform(p2);
            Point p4 = transformer.Transform(p3);
            Point p5 = transformer.Transform(p4);

            //list 6 points of hexagon
            a.controlPoints.Clear();
            a.controlPoints.Add(pEnd);
            a.controlPoints.Add(p1);
            a.controlPoints.Add(p2);
            a.controlPoints.Add(p3);
            a.controlPoints.Add(p4);
            a.controlPoints.Add(p5);
            //use function polygon to draw
            Polygon(a);
        }
Ejemplo n.º 2
0
        public static void Triangle(Shape a, Point pStart, Point pEnd)
        {
            // rotate pEnd angle 60 to get new controlpoint
            AffineTransformation transformer = new AffineTransformation();

            transformer.Translate(-pStart.X, -pStart.Y);
            transformer.Rotate(60 * Math.PI / 180);
            transformer.Translate(pStart.X, pStart.Y);
            Point p = transformer.Transform(pEnd);

            //list 3 points of triangel
            a.controlPoints.Clear();
            a.controlPoints.Add(pStart);
            a.controlPoints.Add(pEnd);
            a.controlPoints.Add(p);
            //use polygon function to draw triangle
            Polygon(a);
        }
Ejemplo n.º 3
0
        public static void Pentagon(Shape a, Point pStart, Point pEnd)
        {
            // rotate pStart angle 72 to get new controlpoint
            AffineTransformation transformer = new AffineTransformation();

            transformer.Translate(-pStart.X, -pStart.Y);
            transformer.Rotate(72 * Math.PI / 180);
            transformer.Translate(pStart.X, pStart.Y);

            Point p1 = transformer.Transform(pEnd);
            Point p2 = transformer.Transform(p1);
            Point p3 = transformer.Transform(p2);
            Point p4 = transformer.Transform(p3);

            //list 5 point of pentagon
            a.controlPoints.Clear();
            a.controlPoints.Add(pEnd);
            a.controlPoints.Add(p1);
            a.controlPoints.Add(p2);
            a.controlPoints.Add(p3);
            a.controlPoints.Add(p4);
            //use polygon function to draw pentagon
            Polygon(a);
        }
Ejemplo n.º 4
0
        private void openGLControl1_MouseMove(object sender, MouseEventArgs e)
        {
            pEnd = e.Location;
            //If is drawing, draw continue with new pEnd coor.
            if (isDrawing)
            {
                Thread thread = new Thread
                (
                    delegate ()
                    {
                        //update last control point with pEnd
                        shapes.Last().controlPoints[shapes.Last().controlPoints.Count - 1] = pEnd;
                        //Clear list point, draw with new list point
                        shapes.Last().listPoints.Clear();

                        switch (userType)
                        {
                            case Shape.shapeType.LINE:
                                DrawingAlgorithm.Line(shapes.Last(), pStart, pEnd);
                                break;
                            case Shape.shapeType.CIRCLE:
                                DrawingAlgorithm.Circle(shapes.Last(), pStart, pEnd);
                                break;
                            case Shape.shapeType.RECTANGLE:
                                DrawingAlgorithm.Rectangle(shapes.Last(), pStart, pEnd);
                                break;
                            case Shape.shapeType.ELLIPSE:
                                DrawingAlgorithm.Ellipse(shapes.Last(), pStart, pEnd);
                                break;
                            case Shape.shapeType.TRIANGLE:
                                DrawingAlgorithm.Triangle(shapes.Last(), pStart, pEnd);
                                break;
                            case Shape.shapeType.PENTAGON:
                                DrawingAlgorithm.Pentagon(shapes.Last(), pStart, pEnd);
                                break;
                            case Shape.shapeType.HEXAGON:
                                DrawingAlgorithm.Hexagon(shapes.Last(), pStart, pEnd);
                                break;
                            case Shape.shapeType.POLYGON:
                                DrawingAlgorithm.Polygon(shapes.Last());
                                break;
                        }
                        isShapesChanged = true;
                    }
                );
                thread.IsBackground = true;
                thread.Start();
            }

            //Use affine transform to list control points
            else if (isTransforming)
            {
                Thread thread = new Thread
                (
                    delegate ()
                    {
                        //turn off fill color
                        if (shapes[choosingShape].isColored == true)
                        {
                            shapes[choosingShape].isColored = false;
                            shapes[choosingShape].fillPoints.Clear();
                        }

                        AffineTransformation transformer = new AffineTransformation();
                        //If select extrapoint(rotate/scale)
                        if (choosingControl == -1)
                        {
                            //Rotate
                            if (rotateOrScale == 0)
                            {
                                //calculate angle rotate
                                Tuple<double, double> vecA = new Tuple<double, double>(backupShape.extraPoint.X - backupShape.centerPoint.Item1, backupShape.extraPoint.Y - backupShape.centerPoint.Item2);
                                Tuple<double, double> vecB = new Tuple<double, double>(pEnd.X - backupShape.centerPoint.Item1, pEnd.Y - backupShape.centerPoint.Item2);
                                double lenA = Math.Sqrt(vecA.Item1 * vecA.Item1 + vecA.Item2 * vecA.Item2);
                                double lenB = Math.Sqrt(vecB.Item1 * vecB.Item1 + vecB.Item2 * vecB.Item2);
                                double phi = Math.Acos((vecA.Item1 * vecB.Item1 + vecA.Item2 * vecB.Item2) / (lenA * lenB));
                                if (vecA.Item1 * vecB.Item2 - vecA.Item2 * vecB.Item1 < 0)
                                    phi = -phi;

                                //rotate step
                                transformer.LoadIdentity();
                                transformer.Translate(-backupShape.centerPoint.Item1, -backupShape.centerPoint.Item2);
                                transformer.Rotate(phi);
                                transformer.Translate(backupShape.centerPoint.Item1, backupShape.centerPoint.Item2);

                                //change list control points
                                for (int i = 0; i < shapes[choosingShape].controlPoints.Count; i++)
                                    shapes[choosingShape].controlPoints[i] = transformer.Transform(backupShape.controlPoints[i]);
                            }
                            //Scale shape
                            else if (rotateOrScale == 1)
                            {
                                //calculate scale coef 
                                Tuple<double, double> vecA = new Tuple<double, double>(backupShape.extraPoint.X - backupShape.centerPoint.Item1, backupShape.extraPoint.Y - backupShape.centerPoint.Item2);
                                Tuple<double, double> vecB = new Tuple<double, double>(pEnd.X - backupShape.centerPoint.Item1, pEnd.Y - backupShape.centerPoint.Item2);
                                double sx = vecB.Item1 / vecA.Item1;
                                double sy = vecB.Item2 / vecA.Item2;
                                double s = Math.Max(sx, sy);

                                //Scale step
                                transformer.LoadIdentity();
                                transformer.Translate(-backupShape.centerPoint.Item1, -backupShape.centerPoint.Item2);
                                transformer.Scale(s, s);
                                transformer.Translate(backupShape.centerPoint.Item1, backupShape.centerPoint.Item2);
                                //change list control points
                                for (int i = 0; i < shapes[choosingShape].controlPoints.Count; i++)
                                    shapes[choosingShape].controlPoints[i] = transformer.Transform(backupShape.controlPoints[i]);
                            }
                        }
                        //select control point-> change coordinates of control point
                        else if (choosingControl >= 0)
                        {
                            shapes[choosingShape].controlPoints[choosingControl] = pEnd;
                        }
                        //select a control point, translation
                        else if (choosingRaster >= 0)
                        {
                            //transliteration
                            transformer.LoadIdentity();
                            transformer.Translate(pEnd.X - pStart.X, pEnd.Y - pStart.Y);
                            //Transform control point
                            for (int i = 0; i < shapes[choosingShape].controlPoints.Count; i++)
                                shapes[choosingShape].controlPoints[i] = transformer.Transform(backupShape.controlPoints[i]);
                        }

                        //delete and create new list points
                        shapes[choosingShape].listPoints.Clear();

                        Point controlPoint0 = shapes[choosingShape].controlPoints[0];
                        Point controlPoint1 = shapes[choosingShape].controlPoints[1];

                        switch (shapes[choosingShape].type)
                        {
                            case Shape.shapeType.LINE:
                                DrawingAlgorithm.Line(shapes[choosingShape], controlPoint0, controlPoint1);
                                break;
                            case Shape.shapeType.CIRCLE:
                                DrawingAlgorithm.Circle(shapes[choosingShape], controlPoint0, controlPoint1);
                                break;
                            case Shape.shapeType.RECTANGLE:
                                DrawingAlgorithm.Polygon(shapes[choosingShape]);
                                break;
                            case Shape.shapeType.ELLIPSE:
                                DrawingAlgorithm.Ellipse(shapes[choosingShape], controlPoint0, controlPoint1);
                                break;
                            case Shape.shapeType.TRIANGLE:
                                DrawingAlgorithm.Polygon(shapes[choosingShape]);
                                break;
                            case Shape.shapeType.PENTAGON:
                                DrawingAlgorithm.Polygon(shapes[choosingShape]);
                                break;
                            case Shape.shapeType.HEXAGON:
                                DrawingAlgorithm.Polygon(shapes[choosingShape]);
                                break;
                            case Shape.shapeType.POLYGON:
                                DrawingAlgorithm.Polygon(shapes[choosingShape]);
                                break;
                        }

                        isShapesChanged = true;
                    }
                );
                thread.IsBackground = true;
                thread.Start();
            }
        }