elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Calcular la intersección de dos segmentos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Calcular la intersección de dos segmentos  (Leído 15,338 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Calcular la intersección de dos segmentos
« en: 31 Octubre 2011, 01:43 am »

Hola.

Estoy haciendo un programa en c++; el cual debe calcularme la intersección entre dos segmentos.

Tengo planteado todo el problema.  Y además, me calcula bien casi todos los tipos de intersecciones.

Mi código es:

Código:

//Este programa calcula la interseccion de dos segmentos

#include<stdio.h>
#include<stdlib.h>

int main (void){
   
    float a,b,c,d;
   
    printf("\n Introduzca el primer numero del primer segmento");
    scanf ("%f",&a);
 
    printf("\n Introduzca el segundo numero del primer segmento");
    scanf ("%f",&b);
   
    printf("\n Introduzca el primer numero del segundo segmento");
    scanf ("%f",&c);
   
    printf("\n Introduzca el segundo numero del segundo segmento");
    scanf ("%f",&d);
   
   
          if (b<c){
          printf ("La interseccion es vacia");
          }
          else { if (a>d)
          printf ("La interseccion es vacia"); 
         
          else {if (a<c, b>d)
                   printf ("La interseccion es %f,%f", c,d);
                    else
                     {if (a>c, b>d)
                 printf ("La interseccion es %f,%f", a,d);
                 
              else {
          if (a<c, b==d) {
                   printf ("La interseccion es %f,%f", c,b);
                   }
                   else {if (a==c, b==d)
                   printf ("La intersección es %f,%f", a,c);
                   
           
           
     
            else {
          if (b==c){
          printf ("La interseccion es el punto %f",b);
          }
       
   
          else { if (a==d)
          printf ("La interseccion es el punto %f",a);
                   
                   
                   
          else{
          if (a<c, b>d) {
                   printf ("La interseccion es %f,%f", c,d);
                   }
                   
                   
                   }}}}}}}}
           
   system("pause");
}



Bien; ahora planteo el problema... Me coge bien todas las intersecciones, excepto los dos tipos siguientes:

Código:
else {if (a<c, b>d)
                   printf ("La interseccion es %f,%f", c,d);
                    else
                   
                  {if (a>c, b>d)
                 printf ("La interseccion es %f,%f", a,d);

Al ir cambiando el código, siempre me sale bien uno de los dos tipos de intersecciones de arriba, pero no soy capaz de que me salgan los dos a la vez. Con eso, completaría el programa que estoy creando.

Muchas gracias.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Calcular la intersección de dos segmentos
« Respuesta #1 en: 31 Octubre 2011, 01:58 am »

En ese programa asumes, por alguna razón que esto:
Código
  1. if (a<c, b>d)
Es valido y hace lo que tu esperas de el (No es así).

En C la coma es un operador secuencial, este evalúa su expresión a la izquierda y descarta su resultado. A continuación se evalúa la expresión a su derecha y ese es su resultado. Por ejemplo esto:
Código
  1. 2, 5
Es una expresión y su resultado es 5.


En tu caso esto:
Código
  1. if ( a < c, b > d)
Es equivalente a:
Código
  1. if ( b > d )


Lo que debes hacer es utilizar los operadores lógicos AND/OR. Cual utilizar depende del caso y su explicación la puedes encontrar en un buen libro (Revisa los temas fijos del foro).

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Calcular la intersección de dos segmentos
« Respuesta #2 en: 31 Octubre 2011, 02:08 am »

¡Muchísimas gracias! He estado toda la noche mirando todo el código, y al final era solo poniendo & en vez de ",".

En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Calcular la intersección de dos segmentos
« Respuesta #3 en: 31 Octubre 2011, 14:18 pm »

¡Buenas!

Creo que se puede hacer mucho mas corto añadiendo dos variables mas, inf y sup que indiquen el infimo y supremo del conjunto resultante, si existe:
Código
  1. //Este programa calcula la interseccion de dos segmentos
  2.  
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5.  
  6. int main (void){
  7.  
  8.    float a,b,c,d,inf,sup;
  9.  
  10.    printf("\n Introduzca el primer numero del primer segmento");
  11.    scanf ("%f",&a);
  12.  
  13.    printf("\n Introduzca el segundo numero del primer segmento");
  14.    scanf ("%f",&b);
  15.  
  16.    printf("\n Introduzca el primer numero del segundo segmento");
  17.    scanf ("%f",&c);
  18.  
  19.    printf("\n Introduzca el segundo numero del segundo segmento");
  20.    scanf ("%f",&d);
  21.    getchar(); // leemos el salto de linea que queda en stdin
  22.  
  23.    //comprobamos que los intervalos esten bien definidos (a <= b y c <=d)
  24.    if(a > b || c > d)
  25.    {
  26.        printf("Los intervalos no estan bien definidos.\n");
  27.    }
  28.    else
  29.    {
  30.        //si el supremo de uno de los intervalos es menor que el infimo del otro
  31.        if(b < c || d < a)
  32.        {
  33.            //el conjunto es vacio
  34.            printf("Interseccion vacia.\n");
  35.        }
  36.        else
  37.        {
  38.            inf = a; //probamos con uno de los valores candidatos a infimo
  39.            if(c > a) //y si no es el mayor de los infimos, lo cambiamos
  40.                inf = c;
  41.  
  42.            sup = b; //probamos candidato a supremo
  43.            if(d < b) //si no es el minimo de los dos supremos, lo cambiamos
  44.                sup = d;
  45.  
  46.            printf("Interseccion: %f , %f\n",inf,sup);
  47.        }
  48.    }
  49.  
  50.    printf("Pulsar intro para terminar...");
  51.    //leemos hasta que se wencuentre intro
  52.    while(getchar() != '\n');
  53.  
  54.    return 0;
  55. }
  56.  

Espero que entiendas la logica del programa, sino, pregunta.
Se puede acortar todavia mas si conoces el operador condicional ternario.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Calcular la intersección de dos segmentos
« Respuesta #4 en: 31 Octubre 2011, 14:40 pm »

Ah, muchas gracias a ti también.

Por ahora lo voy a hacer así, porque estoy empezando, supongo que en los manuales vendrá después cómo usar esos conceptos.

De todas formas voy a probar.

Gracias de nuevo.
En línea

ghastlyX
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.900



Ver Perfil
Re: Calcular la intersección de dos segmentos
« Respuesta #5 en: 31 Octubre 2011, 15:50 pm »

Esto se suele resolver con la técnica de máximos-mínimos, generalizable a más dimensiones. Si se tienen dos segmentos en R, su intersección claramente será el máximo de los extremos izquierdos y el mínimo de los extremos derechos (siempre que esta exista, es decir, que el máximo sea menor o igual que el mínimo).

De esta forma, queda un código muy simple:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5.    int a1, b1, a2, b2;
  6.    cin >> a1 >> b1 >> a2 >> b2;
  7.    int a = max(a1, a2), b = min(b1, b2);
  8.    if (a <= b) cout << a << " " << b << endl;
  9.    else cout << "Interseccion vacia" << endl;
  10. }
En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Calcular la intersección de dos segmentos
« Respuesta #6 en: 31 Octubre 2011, 23:11 pm »

Ah, muchas gracias a ti también.

Todavía no he estudiado los tipos de librerías, así que no conocía la de <iostream>, pero muchas gracias, estoy practicando con este tipo ahora ^^
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Reto - Intersección de 2 cubos
Ejercicios
[D4N93R] 4 7,479 Último mensaje 19 Agosto 2010, 21:36 pm
por [D4N93R]
Intersección de recta y punto
Programación C/C++
kaostias 4 3,451 Último mensaje 26 Noviembre 2013, 18:23 pm
por kaostias
Intersección linea - triángulo « 1 2 »
Programación C/C++
BlackM4ster 11 6,878 Último mensaje 20 Julio 2014, 21:31 pm
por leosansan
Calculo Intersección de rectangulos
Dudas Generales
guillehampp 8 8,232 Último mensaje 11 Mayo 2019, 20:25 pm
por r32
Intersección de dos vectores
Programación C/C++
tokyo13 2 3,524 Último mensaje 30 Junio 2019, 07:17 am
por CalgaryCorpus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines