Sprawdzenie czy punkt jest zawarty w kwadracie

Jozdowska Edyta · 19 Listopad 2019

Ten post powstał przez przypadek :). Przygotowuję właśnie post na temat szukania, czy punkt jest zawarty w wielokącie wypukłym i wklęsłym. Chciałabym temat potraktować poważnie i zawrzeć podstawy matematyczne jak i sam kod.
Jednak post rozrósł mi się do tego stopnia, że postanowiłam go podzielić.

Ten fragment, który właśnie czytasz dotyczy znacznie prostszego przypadku, gdy szukamy naszego punktu w kwadracie. Rozpatrzenie tego przypadku, pozwoli nam lepiej zrozumieć sam zapis kodu w trudniejszych wariantach.

Do czego to może mieć odniesienie? Choćby do pracy z danymi na mapach, które często wykonuję.

Od czego zaczynamy? Jak zazwyczaj, bez teorii nie ruszymy dalej.

Teoria

Nie będę przytaczać definicji punktu, ani kwadratu. To jak tłumaczyć, że 2 + 2 jest 4. Nie mam zamiaru wypisywać tutaj na to dowodu matematycznego. Pierwsze nie znam go, a drugie podobno jest baaaardzo długi ;)

Ze szkoły powinniśmy wiedzieć też, jaki jest zapis współrzędnych obiektów w układzie kartezjańskim. Jeśli nie, niech poniższy obrazek (Rysunek 1) posłuży jako wytłumaczenie.

Image:  Rysunek 1. Kwadrat i punkt w układzie kartezjańskim, współrzędne wierzchołków
Rysunek 1. Kwadrat i punkt w układzie kartezjańskim, współrzędne wierzchołków

Ogólne założenie jest takie. Należy sprawdzić, czy współrzędne punktu P oznaczone jako [px, py] są większe lub równe od początku obszaru oznaczonego jako [x1, y1], a mniejsze lub równe od końca obszaru w układzie oznaczone jako [x2, y2].

Wybrałam PHP jako język dla mojego testu. Może być to jednak równie Python, jak też JS.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
// *** Very simple Class to check 
// *** that point is on square or on border

class pointInSquare { 
//$vertexA = array(x1,y1)
 public $vertexA;

// $vertexB = array(x2,y2)
 public $vertexB;

// $point = array(xp, yp)
 public $point;

    function __construct($vA, $vB, $p){
       $this->vertexA = $vA;
       $this->vertexB = $vB;
       $this->point =  $p;
    }
    
   function init(){  
       // return boolean

        if($this->valiParameters()){
            return $this->checkPointInSquare();
        }else{
            echo "Some parameters are invalid.\n
                  Check, that they are an arrays of only two elements (x,y) values";
            exit;
        }
    }       

    function checkPointInSquare(){
        //return boolean
        // main body of class, the essential check that point by px and py is in square
    
        return   $this->point[0] >= $this->vertexA[0] &&
                 $this->point[0] <= $this->vertexB[0] &&
                 $this->point[1] >= $this->vertexA[1] &&
                 $this->point[1] <= $this->vertexB[1];
    }

    function valiParameters(){    
        //return boolean

        return  $this->arrayOfTwo($this->vertexA) && 
                $this->arrayOfTwo($this->vertexB) && 
                $this->arrayOfTwo($this->point);
    }

    
    function arrayOfTwo($el){
        // retun boolean
        // validation for values
        
        return is_array($el) && count($el) == 2;
    }

    function __desrtuct(){
    }
}


$test = new pointInSquare([0,0],[10,10], [10,10]);

var_dump($test->init());

}

W późniejszym czasie dodam kod w JS i w PYTHON.

Jozdowska Edyta * FullStack Developer

Pisanie kodu jest moją pasją. Zajmuję się tym od przeszło 10 lat, z większą lub mniejszą intensywnością.
Piszę kod w PHP, JS, SCSS i Python. Nie stronię też od poznawania nowych, lub jak kto woli starych rozwiązań jak Jekyll oraz innych języków np. Java.

więcej o mnie