Source for file Math.class.php
Documentation is available at Math.class.php
* This work is hereby released into the Public Domain.
* To view a copy of the public domain dedication,
* visit http://creativecommons.org/licenses/publicdomain/ or send a letter to
* Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
require_once dirname(__FILE__ ). "/../Graph.class.php";
* @param int $style Line style
$this->style = (int) $style;
* @param int $thickness Shape thickness in pixels
public function hide($hide) {
$this->hide = (bool) $hide;
public function show($shape) {
$this->hide = (bool) !$shape;
* @package linea21.externals
public function setX($x) {
public function setY($y) {
* @param array Point location
return array($this->x, $this->y);
* Get distance to another point
* @param awPoint $p A point
return sqrt(pow($p->x - $this->x, 2) + pow($p->y - $this->y, 2));
* Move the point to another location
* @param Point A Point with the new awlocation
public function move($x, $y) {
* @package linea21.externals
* The line slope (the m in y = mx + p)
* The y-intercept value of the line (the p in y = mx + p)
* @param awPoint $p1 First point
* @param awPoint $p2 Second point
* @param int $type Style of line (default to solid)
* @param int $thickness Line thickness (default to 1)
public function __construct($p1 = NULL, $p2 = NULL, $type = awLine::SOLID, $thickness = 1) {
* Build a line from 4 coords
* @param int $x1 Left position
* @param int $y1 Top position
* @param int $x2 Right position
* @param int $y2 Bottom position
public static function build($x1, $y1, $x2, $y2) {
* Change X values of the line
* @param int $x1 Begin value
* @param int $x2 End value
public function setX($x1, $x2) {
// Resets slope and origin values so they are
// recalculated when and if needed.
* Change Y values of the line
* @param int $y1 Begin value
* @param int $y2 End value
public function setY($y1, $y2) {
// Resets slope and origin values so they are
// recalculated when and if needed.
* @param awPoint $p1 First point
* @param awPoint $p2 Second point
// Resets slope and origin values so they are
// recalculated when and if needed.
* @param array Line location
return array($this->p1, $this->p2);
$square = pow($this->p2->x - $this->p1->x, 2) + pow($this->p2->y - $this->p1->y, 2);
* Calculate the line slope
private function calculateSlope() {
$slope = ($this->p1->y - $this->p2->y) / ($this->p1->x - $this->p2->x);
* Calculate the y-intercept value of the line
private function calculateOrigin() {
$this->origin = $this->p1->y; // Or p2->y
$origin = ($y2 * $x1 - $y1 * $x2) / ($x1 - $x2);
* Calculate the slope and y-intercept value of the line
private function calculateEquation() {
$this->calculateOrigin();
* Get the line slope value
} elseif($this->slope !== NULL) {
* Get the line y-intercept value
} elseif($this->origin !== NULL) {
$this->calculateOrigin();
* @return array An array containing the slope and y-intercept value of the line
return array($slope, $origin);
* Return the x coordinate of a point on the line
* given its y coordinate.
* @param float $y The y coordinate of the Point
* @return float $x The corresponding x coordinate
$x = ($y - $origin) / $slope;
* Return the y coordinate of a point on the line
* given its x coordinate.
* @param float $x The x coordinate of the Point
* @return float $y The corresponding y coordinate
$y = $slope * $x + $origin;
* Test if the line can be considered as a point
return ($this->p1->x === $this->p2->x and $this->p1->y === $this->p2->y);
* Test if the line is a vertical line
return ($this->p1->x === $this->p2->x);
* Test if the line is an horizontal line
return ($this->p1->y === $this->p2->y);
* Returns TRUE if the line is going all the way from the top
* to the bottom of the polygon surrounding box.
* @param $polygon Polygon A Polygon object
list ($xMin, $xMax) = $polygon->getBoxXRange();
list ($yMin, $yMax) = $polygon->getBoxYRange();
if($this->p1->y < $this->p2->y) {
$this->isOnBoxTopSide($top, $xMin, $xMax, $yMin)
$this->isOnBoxBottomSide($bottom, $xMin, $xMax, $yMax)
* Returns TRUE if the line is going all the way from the left side
* to the right side of the polygon surrounding box.
* @param $polygon Polygon A Polygon object
list ($xMin, $xMax) = $polygon->getBoxXRange();
list ($yMin, $yMax) = $polygon->getBoxYRange();
if($this->p1->x < $this->p2->x) {
$this->isOnBoxLeftSide($left, $yMin, $yMax, $xMin)
$this->isOnBoxRightSide($right, $yMin, $yMax, $xMax)
private function isOnBoxTopSide(awPoint $point, $xMin, $xMax, $yMin) {
private function isOnBoxBottomSide(awPoint $point, $xMin, $xMax, $yMax) {
private function isOnBoxLeftSide(awPoint $point, $yMin, $yMax, $xMin) {
private function isOnBoxRightSide(awPoint $point, $yMin, $yMax, $xMax) {
* A vector is a type of line
* The sense of the vector goes from $p1 to $p2.
* @package linea21.externals
* Get vector angle in radians
$width = ($this->p2->x - $this->p1->x);
$height = ($this->p2->y - $this->p1->y) * - 1;
if($width >= 0 and $height >= 0) {
return acos($width / $size);
} else if($width <= 0 and $height >= 0) {
return acos($width / $size);
if($width >= 0 and $height >= 0) {
return 2 * M_PI - acos($width / $size);
} else if($width <= 0 and $height >= 0) {
return 2 * M_PI - acos($width / $size);
* @package linea21.externals
* Set a point in the polygon
* @param int $pos Point position
public function set($pos, $point) {
* Add a point at the end of the polygon
public function append($point) {
* Get a point at a position in the polygon
* @param int $pos Point position
public function get($pos) {
* Count number of points in the polygon
public function count() {
* Returns all points in the polygon
* Returns the different lines formed by the polygon vertices
for($i = 0; $i < $count - 1; $i++ ) {
$lines[] = new Line($this->get($i), $this->get($i + 1));
$lines[] = new Line($this->get($count - 1), $this->get(0));
* Get the upper-left and lower-right points
* of the bounding box around the polygon
* @return array An array of two Point objects
for($i = 0; $i < $count; $i++ ) {
list ($x[], $y[]) = $point->getLocation();
$upperLeft = new Point(min($x), min($y));
$lowerRight = new Point(max($x), max($y));
return array($upperLeft, $lowerRight);
* Return the range of the polygon on the y axis,
* i.e. the minimum and maximum y value of any point in the polygon
list (, $yMin) = $p1->getLocation();
list (, $yMax) = $p2->getLocation();
return array($yMin, $yMax);
* Return the range of the polygon on the x axis,
* i.e. the minimum and maximum x value of any point in the polygon
list ($xMin, ) = $p1->getLocation();
list ($xMax, ) = $p2->getLocation();
return array($xMin, $xMax);
|