示例#1
0
        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;
                }
            }
        }
示例#2
0
 /// <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;
 }
示例#3
0
        /// <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;
        }