Nadesłany przez Damian Frańczuk, 21 września 2015 14:56
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
odcinki.php:
<html> <body> <?php //Przecinanie się odcinków //www.algorytm.org $data = [ 'A' => ['x' => 6, 'y' => 3], 'B' => ['x' => 8, 'y' => 1], 'C' => ['x' => 7, 'y' => 2], 'D' => ['x' => 6, 'y' => 4] ]; echo calcIsIntersected($data); //Sprawdza czy odcinki się przecinają function calcIsIntersected($data) { if (calcAbsoluteBelong($data)) { return true; } else { if (calcDeterminant($data['A'], $data['B'], $data['C']) * calcDeterminant($data['A'], $data['B'], $data['D']) >= 0 || calcDeterminant($data['C'], $data['D'], $data['A']) * calcDeterminant($data['C'], $data['D'], $data['B']) >= 0) { return false; } else { return true; } } } //Sprawdza czy koniec jednego z odcinków leży na drugim function calcAbsoluteBelong($data) { return calcBelongsToSection($data['A'], $data['B'], $data['C']) || calcBelongsToSection($data['A'], $data['B'], $data['D']) || calcBelongsToSection($data['C'], $data['D'], $data['A']) || calcBelongsToSection($data['C'], $data['D'], $data['B']); } //Sprawdza czy punkt C leży na odcinku AB function calcBelongsToSection($A, $B, $C) { $det = $A['x'] * $B['y'] + $B['x'] * $C['y'] + $C['x'] * $A['y'] - $C['x'] * $B['y'] - $A['x'] * $C['y'] - $B['x'] * $A['y']; if ($det != 0) { return false; } else { if ((min([$A['x'], $B['x']]) <= $C['x']) && ($C['x'] <= max([$A['x'], $B['x']])) && (min([$A['y'], $B['y']]) <= $C['y']) && ($C['y'] <= max([$A['y']], $B['y']))) { return true; } else { return false; } } } //Liczy wyznacznik function calcDeterminant($A, $B, $C) { return $A['x'] * $B['y'] + $B['x'] * $C['y'] + $C['x'] * $A['y'] - $C['x'] * $B['y'] - $A['x'] * $C['y'] - $B['x'] * $A['y']; } ?></body> </html>