Autor
|
Tema: Calcular la intersección de dos segmentos (Leído 15,866 veces)
|
DickGumshoe
|
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: //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: 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
Mensajes: 1.639
|
En ese programa asumes, por alguna razón que esto: 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: 2, 5
Es una expresión y su resultado es 5. En tu caso esto: if ( a < c, b > d)
Es equivalente a: 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
|
¡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
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡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: //Este programa calcula la interseccion de dos segmentos #include<stdio.h> #include<stdlib.h> int main (void){ float a,b,c,d,inf,sup; printf("\n Introduzca el primer numero del primer segmento"); printf("\n Introduzca el segundo numero del primer segmento"); printf("\n Introduzca el primer numero del segundo segmento"); printf("\n Introduzca el segundo numero del segundo segmento"); getchar(); // leemos el salto de linea que queda en stdin //comprobamos que los intervalos esten bien definidos (a <= b y c <=d) if(a > b || c > d) { printf("Los intervalos no estan bien definidos.\n"); } else { //si el supremo de uno de los intervalos es menor que el infimo del otro if(b < c || d < a) { //el conjunto es vacio printf("Interseccion vacia.\n"); } else { inf = a; //probamos con uno de los valores candidatos a infimo if(c > a) //y si no es el mayor de los infimos, lo cambiamos inf = c; sup = b; //probamos candidato a supremo if(d < b) //si no es el minimo de los dos supremos, lo cambiamos sup = d; printf("Interseccion: %f , %f\n",inf ,sup ); } } printf("Pulsar intro para terminar..."); //leemos hasta que se wencuentre intro return 0; }
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
|
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
Mensajes: 1.900
|
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: #include <iostream> using namespace std; int main() { int a1, b1, a2, b2; cin >> a1 >> b1 >> a2 >> b2; int a = max(a1, a2), b = min(b1, b2); if (a <= b) cout << a << " " << b << endl; else cout << "Interseccion vacia" << endl; }
|
|
|
En línea
|
|
|
|
DickGumshoe
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Reto - Intersección de 2 cubos
Ejercicios
|
[D4N93R]
|
4
|
7,866
|
19 Agosto 2010, 21:36 pm
por [D4N93R]
|
|
|
Intersección de recta y punto
Programación C/C++
|
kaostias
|
4
|
3,752
|
26 Noviembre 2013, 18:23 pm
por kaostias
|
|
|
Intersección linea - triángulo
« 1 2 »
Programación C/C++
|
BlackM4ster
|
11
|
7,604
|
20 Julio 2014, 21:31 pm
por leosansan
|
|
|
Calculo Intersección de rectangulos
Dudas Generales
|
guillehampp
|
8
|
8,887
|
11 Mayo 2019, 20:25 pm
por r32
|
|
|
Intersección de dos vectores
Programación C/C++
|
tokyo13
|
2
|
4,001
|
30 Junio 2019, 07:17 am
por CalgaryCorpus
|
|