algorytm.org

Implementacja w Php



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 Php
Ocena użytkownikóww: *****  / 0
SłabyŚwietny
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>
Dodaj komentarz