Nadesłany przez Michał Knasiecki, 03 sierpnia 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
odcinki.cpp:
//Program sprawdza, czy dwa odcinki sie przecinaja //Program pobrano ze strony www.algorytm.org //Opracowal Michal Knasiecki #include <conio.h> #include <stdio.h> #include <stdlib.h> struct wsp //wspolrzedne punktow { int x,y; }; int przynaleznosc(wsp x,wsp y,wsp z) //Ta funkcja sprawdza, czy punkt z należy do odcinka |xy| { int det; //wyznacznik macierzy det=x.x*y.y+y.x*z.y+z.x*x.y-z.x*y.y-x.x*z.y-y.x*x.y; if (det!=0) return(0); else { if ( (min(x.x,y.x)<=z.x)&&(z.x<=max(x.x,y.x)) && (min(x.y,y.y)<=z.y)&&(z.y<=max(x.y,y.y)) ) return(1); else return(0); } } int det_matrix(wsp x,wsp y,wsp z) { return(x.x*y.y+y.x*z.y+z.x*x.y-z.x*y.y-x.x*z.y-y.x*x.y); } void main(void) { int i,det; //wyznacznik macierzy wsp punkty[4]; //tablica punktow clrscr(); printf("Wprowadzanie wspolrzednych punktow."); printf("\nOdcinek 1"); printf("\nPunkt #1"); printf("\nX= "); scanf("%i",&punkty[0].x); printf("\nY= "); scanf("%i",&punkty[0].y); printf("\nPunkt #2"); printf("\nX= "); scanf("%i",&punkty[1].x); printf("\nY= "); scanf("%i",&punkty[1].y); printf("\nOdcinek 2"); printf("\nPunkt #1"); printf("\nX= "); scanf("%i",&punkty[2].x); printf("\nY= "); scanf("%i",&punkty[2].y); printf("\nPunkt #2"); printf("\nX= "); scanf("%i",&punkty[3].x); printf("\nY= "); scanf("%i",&punkty[3].y); clrscr(); //Sprawdzanie, czy jakiś punkt należy do drugiego odcinka if (przynaleznosc(punkty[0],punkty[1],punkty[2])==1) printf("Odcinki sie przecinaja- przynaleznosc"); else if (przynaleznosc(punkty[0],punkty[1],punkty[3])==1) printf("Odcinki sie przecinaja- przynaleznosc"); else if (przynaleznosc(punkty[2],punkty[3],punkty[0])==1) printf("Odcinki sie przecinaja- przynaleznosc"); else if (przynaleznosc(punkty[2],punkty[3],punkty[1])==1) printf("Odcinki sie przecinaja- przynaleznosc"); else //zaden punkt nie nalezy do drugego odcinka if ( (det_matrix(punkty[0],punkty[1],punkty[2]))*(det_matrix(punkty[0],punkty[1],punkty[3]))>=0 ) printf("Odcinki sie NIE przecinaja"); else if ( (det_matrix(punkty[2],punkty[3],punkty[0]))*(det_matrix(punkty[2],punkty[3],punkty[1]))>=0 ) printf("Odcinki sie NIE przecinaja"); else //znaki wyznaczników sa równe printf("Odcinki sie przecinaja- punkty leza po przeciwnych stronach"); getch(); }
o1:(44128,40806)->(59311,40806)
o2:(30391,46879)->(37319,35938)
odcinki te nie przecinają się bo odcinek 1 leci w prawo i zaczyna się dużo później od zakresu x w których zmienia się odcinek 2,
a program twierdzi co innego