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.
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
.