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