コード例 #1
0
        public Punto Interseca(Cerchio cerchio)
        {
            /*
             *  - i punti A e B sono i centri dei due cerchi
             *  - i punti C e D sono i punti di intersezione dei due cerchi
             *  - P è il centro dell'intersezione tra i due cerchi = punto medio del segmento cd
             *  - il raggio del cerchio A è la lunghezza dei segmenti ac e ad (noto)
             *  - il raggio del cerchio B è la lunghezza dei segmenti bc e bd (noto)
             *  - la distanza tra i due centri è la lunghezza del segmento ab
             */

            // Calcolo la lunghezza del segmento ab  = la distanza tra i due centri
            double distanza_x      = Centro.Ascissa - cerchio.Centro.Ascissa;
            double distanza_y      = Centro.Ordinata - cerchio.Centro.Ordinata;
            double distanza_centri = Math.Sqrt((distanza_x * distanza_x) + (distanza_y * distanza_y));

            // Calcolo la lunghezza del segmento che unisce il centro del cerchio A con il punto P (segmento ap):
            double ap = (((Raggio * Raggio) - (cerchio.Raggio * cerchio.Raggio) + (distanza_centri * distanza_centri)) / (2 * distanza_centri));

            // Conoscendo sia ap che ac utilizzo il teorema di pitagora per calcolarmi il segmento cp
            double cp = Math.Sqrt((Raggio * Raggio) - (ap * ap));

            // Conoscendo sia ap che ab calcolo le coordinate del punto P (centro dell'intersezione tra i due cerchi)
            double p_ascissa  = Centro.Ascissa + ap * (cerchio.Centro.Ascissa - Centro.Ascissa) / distanza_centri;
            double p_ordinata = Centro.Ordinata + ap * (cerchio.Centro.Ordinata - Centro.Ordinata) / distanza_centri;

            // Ritorno il centro dell'intersezione tra i due cerchi
            Punto intersezione;

            intersezione = new Punto(p_ascissa, p_ordinata);
            return(intersezione);
        }
コード例 #2
0
        private Punto Media_Pesata(Cerchio cerchio)
        {
            /*
             * - i punti A e B sono i centri dei due cerchi
             * - la distanza tra i due centri è la lunghezza del segmento ab
             * - i punti C e D sono i punti in cui i due cerchi intersecano il segmento ab
             * - il segmento cd è il segmento su cui devo trovare un nuovo punto P (in "proporzione" ai raggi dei due cerchi)
             */

            double somma_raggi = Raggio + cerchio.Raggio;
            double peso_1, peso_2;
            double ascissa, ordinata;

            // Calcolo i pesi e controllo che siano validi
            peso_1 = Raggio / somma_raggi;
            System.Diagnostics.Debug.Assert(peso_1 >= 0 && peso_1 <= 1);
            peso_2 = cerchio.Raggio / somma_raggi;
            System.Diagnostics.Debug.Assert(peso_2 >= 0 && peso_2 <= 1);

            // Calcolo le coordinate del nuovo punto P
            ascissa  = this.Centro.Ascissa * peso_2 + cerchio.Centro.Ascissa * peso_1;
            ordinata = this.Centro.Ordinata * peso_2 + cerchio.Centro.Ordinata * peso_1;

            // Ritorno un punto sul segmento cd
            return(new Punto(ascissa, ordinata));
        }
コード例 #3
0
        public bool Ctrl_Intersezione(Cerchio cerchio)
        {
            // Calcolo la distanza tra i due centri e la somma dei due raggi
            double distanza_x      = Centro.Ascissa - cerchio.Centro.Ascissa;
            double distanza_y      = Centro.Ordinata - cerchio.Centro.Ordinata;
            double distanza_centri = Math.Sqrt((distanza_x * distanza_x) + (distanza_y * distanza_y));
            double somma_raggi     = (Raggio + cerchio.Raggio);

            // Verifico l'intersezione
            if (distanza_centri <= somma_raggi)
            {
                return(true); // Intersecano
            }
            else
            {
                return(false); // Non intersecano
            }
        }