private void mouse_Move(object sender, MouseEventArgs e) { ShapeConstruction construct = new ShapeConstruction(); if (selectedType != Shape.shapeType.NONE) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { // Liên tục cập nhật điểm cuối chuột pEnd = e.Location; switch (selectedType) { // Chọn không gì cả case Shape.shapeType.NONE: { break; } // Chon vẽ đường thẳng case Shape.shapeType.LINE: { // Liên tục xóa để vẽ lại shapes.Last().rasterPoints.Clear(); construct.ConstructLine(shapes.Last(), pStart, pEnd); break; } // Chọn vẽ đường tròn case Shape.shapeType.CIRCLE: { shapes.Last().rasterPoints.Clear(); construct.ConstructCircle(shapes.Last(), pStart, pEnd); break; } // Chọn vẽ hình chữ nhật case Shape.shapeType.RECTANGLE: { shapes.Last().rasterPoints.Clear(); construct.ConstructRectangle(shapes.Last(), pStart, pEnd); break; } // Chọn vẽ elip case Shape.shapeType.ELLIPSE: { shapes.Last().rasterPoints.Clear(); construct.ConstructEllipse(shapes.Last(), pStart, pEnd); break; } // Chọn vẽ tam giác case Shape.shapeType.TRIANGLE: { shapes.Last().rasterPoints.Clear(); construct.ConstructTriangle(shapes.Last(), pStart, pEnd); break; } // Chọn vẽ ngũ giác case Shape.shapeType.PENTAGON: { shapes.Last().rasterPoints.Clear(); construct.ConstructPentagon(shapes.Last(), pStart, pEnd); break; } // Chọn vẽ lục giác case Shape.shapeType.HEXAGON: { shapes.Last().rasterPoints.Clear(); construct.ConstructHexagon(shapes.Last(), pStart, pEnd); break; } // Chọn vẽ đa giác case Shape.shapeType.POLYGON: { // Vẽ các đt nối tiếp lẫn nhau. // click chuột và di chuyển chuột 1 ít để tạo điểm. if (e.Button == System.Windows.Forms.MouseButtons.Left) { NewPolygon.Add(pStart); if (NewPolygon.Count > 1) { construct.ConstructLine(shapes.Last(), NewPolygon[NewPolygon.Count - 2], NewPolygon.Last()); } } break; } } } shapesChanged = true; } else { // Nếu chọn nút None để tiến vào trạng thái không vẽ if (selectedShape != -1) { // Nếu chọn biến đổi tịnh tiến if (selectedAffine == 1) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { pEnd = e.Location; Point translate_vector = new Point(); translate_vector.X = pEnd.X - pLast.X; translate_vector.Y = pEnd.Y - pLast.Y; shapes[selectedShape].Translate(translate_vector); pLast = pEnd; shapesChanged = true; } } // Nếu chọn co giãn hình if (selectedAffine == 2) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { pEnd = e.Location; pStart = shapes[selectedShape].inputPoint[0]; shapes[selectedShape].rasterPoints.Clear(); shapes[selectedShape].inputPoint.Clear(); shapes[selectedShape].ControlPoint.Clear(); switch (shapes[selectedShape].type) { case Shape.shapeType.LINE: construct.ConstructLine(shapes[selectedShape], pStart, pEnd); break; case Shape.shapeType.CIRCLE: construct.ConstructCircle(shapes[selectedShape], pStart, pEnd); break; case Shape.shapeType.RECTANGLE: construct.ConstructRectangle(shapes[selectedShape], pStart, pEnd); break; case Shape.shapeType.ELLIPSE: construct.ConstructEllipse(shapes[selectedShape], pStart, pEnd); break; case Shape.shapeType.TRIANGLE: construct.ConstructTriangle(shapes[selectedShape], pStart, pEnd); break; case Shape.shapeType.PENTAGON: construct.ConstructPentagon(shapes[selectedShape], pStart, pEnd); break; case Shape.shapeType.HEXAGON: construct.ConstructHexagon(shapes[selectedShape], pStart, pEnd); break; } shapesChanged = true; } } } } }
// Lúc nhấn chuột private void mouse_Down(object sender, MouseEventArgs e) { if (selectedType != Shape.shapeType.NONE) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { pStart = pEnd = e.Location; // Vẽ hình theo nút đã lựa chọn shapes.Add(new Shape(selectedType, selectedWidth, selectedColor)); shapes.Last().rasterPoints.Add(pStart); } // Chuột phải cho việc kết thúc vẽ đa giác if (e.Button == System.Windows.Forms.MouseButtons.Right) { // Nếu chọn vẽ polygon - vẽ đa giác. if (selectedType == Shape.shapeType.POLYGON) { // Tập điểm lớn hơn 2 thì vẽ if (NewPolygon.Count > 2) { ShapeConstruction construct = new ShapeConstruction(); // vẽ đt từ điểm đầu đến cuối để hoàn thiện hình. construct.ConstructLine(shapes.Last(), NewPolygon[0], NewPolygon.Last()); // cập nhật vẽ. shapesChanged = true; // tạo lại tập điểm mới. NewPolygon = new List <Point>(); } } } } else { // Hiển thị control point nếu không trong trạng thái vẽ. - Nút None là thiết lập trái thái không vẽ. // Nhấn chuột trái if (e.Button == System.Windows.Forms.MouseButtons.Left) { pStart = pEnd = e.Location; pLast = pStart; // Tính khoảng cách min từ chuột đến hình double minDistance = 1000.0; // Hằng số epsilon double epsilon = 10.0; for (int i = 0; i < shapes.Count; i++) { for (int j = 0; j < shapes[i].rasterPoints.Count; j++) { int dx = shapes[i].rasterPoints[j].X - e.Location.X; int dy = shapes[i].rasterPoints[j].Y - e.Location.Y; double distance = Math.Sqrt(dx * dx + dy * dy); if (distance < minDistance) { // Chọn hình hiển thị control point. selectedShape = i; // Thiết lập minDistance để chọn ra hình nào gần hơn. minDistance = distance; } } } // Khoảng cách nhỏ hơn epsilon thì chọn hình if (minDistance <= epsilon) { shapesChanged = true; return; } // nếu không gần bất cứ hình nào thì tắt hết control point. selectedShape = -1; shapesChanged = true; return; } } }