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); }
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); }
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); }
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(); } }