algorytm.org

Implementacja w C/C++

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Przecinanie się odcinków - Implementacja w C/C++
Ocena użytkownikóww: *****  / 15
SłabyŚwietny
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();
}
Komentarze
photo
-3 # r 2011-11-13 18:54
próbuję dla liczb
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
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-3 # r 2011-11-14 09:20
sorry, pewnie dla tak dużych liczb nie działa, ale wystarczyło zamienić na longi i nie mnożyć tylko porównywać wyznaczniki
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-4 # łubidubi 2012-05-22 04:58
jakim cudem liczysz wyznacznik macierzy 3x2?
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz