private void pictElemento_MouseClick(object sender, MouseEventArgs e) { if (radManual.Checked) { // solo se cuentan los clicks en modo manual // se asegura que el PictureBox obtenga el foco pictElemento.Focus(); // se guarda la coordenada del click, y se aumenta el contador tempClicks[countClick] = new CCirculo(e.X, e.Y, 0); countClick++; switch (countClick) { case 1: lblPunto1.Visible = true; btnCancel.Enabled = true; break; case 2: lblPunto2.Visible = true; break; case 3: // con tres clicks se dibuja el circulo AddElemento(); ResetCountClick(); break; } } }
/// <summary> /// Constructor con asignacion. Se crea un duplicado del elemento CCirculo que se pasa como argumento /// </summary> /// <param name="punto">elemento CCirculo que se va a duplicar</param> public CCirculo(CCirculo punto) { x = punto.x; y = punto.y; r = punto.r; }
/// <summary> /// Se calcula el nuevo elemento usando los 3-clicks realizados sobre la imagen, y se agrega al List /// </summary> public void AddElemento(CCirculo[] tempClicks, string elemento) { // tomado del script calcCircle.m CCuadrado punto = new CCuadrado(); double epsilon = 0.000000001; bool ax_is_0 = (Math.Abs(tempClicks[1].x - tempClicks[0].x) <= epsilon); bool bx_is_0 = (Math.Abs(tempClicks[2].x - tempClicks[1].x) <= epsilon); // check whether both lines are vertical - collinear if (ax_is_0 && bx_is_0) { MessageBox.Show("Los puntos ingresados pertenecen a una misma linea recta", "Error al dibujar!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } int delta_a_x = tempClicks[1].x - tempClicks[0].x; int delta_a_y = tempClicks[1].y - tempClicks[0].y; int delta_b_x = tempClicks[2].x - tempClicks[1].x; int delta_b_y = tempClicks[2].y - tempClicks[1].y; // make sure delta gradients are not vertical // swap points to change deltas if (ax_is_0) { int temp; temp = tempClicks[1].x; tempClicks[1].x = tempClicks[2].x; tempClicks[2].x = temp; temp = tempClicks[1].y; tempClicks[1].y = tempClicks[2].y; tempClicks[2].y = temp; delta_a_x = tempClicks[1].x - tempClicks[0].x; delta_a_y = tempClicks[1].y - tempClicks[0].y; } if (bx_is_0) { int temp; temp = tempClicks[0].x; tempClicks[0].x = tempClicks[1].x; tempClicks[1].x = temp; temp = tempClicks[0].y; tempClicks[0].y = tempClicks[1].y; tempClicks[1].y = temp; delta_b_x = tempClicks[2].x - tempClicks[1].x; delta_b_y = tempClicks[2].y - tempClicks[1].y; } double grad_a = (double)delta_a_y / (double)delta_a_x; double grad_b = (double)delta_b_y / (double)delta_b_x; // check whether the given points are collinear if (Math.Abs(grad_a - grad_b) <= epsilon) { MessageBox.Show("Los puntos ingresados pertenecen a una misma linea recta", "Error al dibujar!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // swap grads and points if grad_a is 0 if (Math.Abs(grad_a) <= epsilon) { double temp2; temp2 = grad_a; grad_a = grad_b; grad_b = temp2; int temp; temp = tempClicks[0].x; tempClicks[0].x = tempClicks[2].x; tempClicks[2].x = temp; temp = tempClicks[0].y; tempClicks[0].y = tempClicks[2].y; tempClicks[2].y = temp; } // calculate centre - where the lines perpendicular to the centre of segments a and b intersect punto.x = Convert.ToInt32((grad_a * grad_b * (tempClicks[0].y - tempClicks[2].y) + grad_b * (tempClicks[0].x + tempClicks[1].x) - grad_a * (tempClicks[1].x + tempClicks[2].x)) / (2 * (grad_b - grad_a))); punto.y = Convert.ToInt32(((tempClicks[0].x + tempClicks[1].x) / 2 - punto.x) / grad_a + (tempClicks[0].y + tempClicks[1].y) / 2); punto.width = Convert.ToInt32(Math.Sqrt(Math.Pow(punto.x - tempClicks[0].x, 2) + Math.Pow(punto.y - tempClicks[0].y, 2))); // si no existen areas dibujadas entonces se agrega la primera a la lista // si la nueva area dibujada está al inicio de un area previamente creada entonces la nueva area modifica el area creada if (padre.actual.areasCore.Count < 1) { // se crea la primera area AddArea(punto, elemento); } else { // hay areas creadas, se verifica si se debe sobre escribir o se crea una segunda area if (trackElementos.Value == padre.actual.areasCore[lstAreas.SelectedIndex].ini) { // se cambia el punto obtenido a las coordenadas originales, considerando que el tamaño del pictCore y de la imagen son diferentes CCuadrado corregido = new CCuadrado(punto); corregido = MainForm.CorregirPictBox2Original(corregido, padre.actual.datacuboHigh.widthSeg, pictCore.Height); padre.actual.areasCore[lstAreas.SelectedIndex].x = corregido.x; padre.actual.areasCore[lstAreas.SelectedIndex].y = corregido.y; padre.actual.areasCore[lstAreas.SelectedIndex].width = corregido.width; // se pintan las areas el pictCore controlPaint = true; pictCore.Invalidate(); } else { // se crea una nueva area AddArea(punto, elemento); } } btnClear.Enabled = true; btnDelete.Enabled = true; }