Вход Регистрация
Файл: toolkit/geometry/Size.php
Строк: 157
<?php

/**
 * @package geometry
 * @author Антон Кургузенков <kurguzenkov@list.ru>
 *
 * @version 0.01
 * @since 2012-11-09
 */

require_once 'exceptions.php';

/**
 * Класс, описывающий размер как пару высота-ширина.
 */

class Size {

    
/**
     * ширина
     *
     * @var int
     */
    
private $width;

    
/**
     * высота
     *
     * @var int
     */

    
private $height;

    
/**
     * @param int $width
     * @param int $height
     * @throws IllegalArgumentException
     */

    
public function __construct($width$height) {
        
$this->setWidth($width);
        
$this->setHeight($height);
    }

    
/**
     * Устанавливает больше ли, (по высоте <b>или</b> по ширине)
     * размер заданного размера.
     *
     * @param Size $s
     * @return boolean
     */

    
public function greatThen(Size $s) {
        return 
$this->getWidth() > $s->getWidth() || $this->getHeight() > $s->getHeight();
    }

    
/**
     * Устанавливает меньше ли, (по высоте <b>и</b> по ширине)
     * размер заданного размера.
     *
     * @param Size $s
     * @return bool
     */

    
public function lessThen(Size $s) {
        return !
$this->greatThen($s) && !$this->equals($s);
    }

    
/**
     * Устанавливает, меньше или равен ли размер (по высоте <b>и</b> по ширине)
     * заданного размера.
     *
     * @param Size
     * @return bool
     */

    
public function isInner(Size $s) {
        return 
$this->getWidth() <= $s->getWidth() && $this->getHeight() <= $s->getHeight();
    }

    
/**
     * Устанавливает равен ли заданный размер текущему.
     *
     * @param Size
     * @return bool
     */

    
public function equals(Size $s) {
        return 
$this->getWidth() == $s->getWidth() && $this->getHeight() == $s->getHeight();
    }

    
/**
     * Менеят местами высоту и ширину размера, "переварачивая" его.
     * @return Size
     */

    
public function flip() {
        
$t $this->getWidth();
        
$this->setWidth($this->getHeight());
        
$this->setHeight($t);
        return 
$this;
    }

    
/**
     * Пропорционально уменьшает размер по заданной ширине.
     * Возвращает новый размер, не изменяя старый.
     *
     * @param int $width
     * @return Size
     * @throws IllegalArgumentExceptions
     */

    
public function getByWidth($width) {
        if (!
is_integer($width)) {
            throw new 
IllegalArgumentExceptions();
        }

        if (
$width >= $this->getWidth()) {
            return 
$this;
        }

        
$height = (int) round($this->getHeight() * $width $this->getWidth());
        return new 
Size($width$height);
    }

    
/**
     * Пропорционально уменьшает размер по заданной высоте.
     * Возвращает новый размер, не изменяя старый.
     *
     * @param int $height
     * @return Size
     * @throws IllegalArgumentException */

    
public function getByHeight($height) {
        if (!
is_integer($height)) {
            throw new 
IllegalArgumentException();
        }

        if (
$height >= $this->getHeight()) {
            return 
$this;
        }

        
$width = (int) round($this->getWidth() * $height $this->getHeight());
        return new 
Size($width$height);
    }

    
/**
     * Вписывает размер в рамки, пропорционально уменьшая его.
     * Возвращает новый размер, не изменяя старый.
     *
     * @return Size
     * @throws IllegalArgumentException
     */

    
public function getByFrame() { // Size $frame || $width, $height
        
$args func_get_args();
        if (
count($args) == 2) {
            
$this->getByFrame(new Size($args[0], $args[1]));
        } else if (
count($args) == && $args[0] instanceof Size) {
            
$frame $args[0];
        } else {
            throw new 
IllegalArgumentException();
        }

        if (
$frame->getWidth() <= || $frame->getHeight() <= 0)
            throw new 
IllegalArgumentException();

        if (
$this->isInner($frame))
            return 
$this;

        
$height $frame->getHeight();
        
$width $frame->getWidth();

        if (
$this->getWidth() / $width $this->getHeight() / $height)
            return 
$this->getByWidth($width);

        return 
$this->getByHeight($height);
    }

    
/**
     * Складывает высоту и ширину размера с координатами точки или
     * высотой и шириной другого размера и возвращает получившийся размер.
     *
     * @param Size $s
     * @param Size|Point $obj
     * @return Size
     * @throws IllegalArgumentException
     */

    
public static function add(Size $s$obj) {
        if(
$obj instanceof Size) {
            return new 
Size($s->getWidth() + $obj->getWidth(), $s->getHeight() + $obj->getHeight());
        } else if (
$obj instanceof Point) {
            return new 
Size($s->getWidth() + $obj->getX(),    $s->getHeigth() + $obj->getY());
        }
        throw new 
IllegalArgumentException();
    }

    
/**
     *
     * Вычитает из высоты и ширины размера координаты точки или
     * высоту и ширину другого размера и возвращает получившийся размер.
     *
     * @param Size $s
     * @param Size|Point $obj
     * @return Size
     * @throws IllegalArgumentException
     */

    
public static function subtract(Size $s$obj) {
        if(
$obj instanceof Size) {
            return new 
Size($s->getWidth() - $obj->getWidth(), $s->getHeight() - $obj->getHeight());
        } else if (
$obj instanceof Point) {
            return new 
Size($s->getWidth() - $obj->getX(),    $s->getHeigth() - $obj->getY());
        }
        throw new 
IllegalArgumentException();
    }

    public function 
getWidth() {
        return 
$this->width;
    }

    public function 
getHeight() {
        return 
$this->height;
    }

    
/**
     * @param int
     * @throws IllegalArgumentException
     */

    
public function setWidth($width) {
        if (
is_integer($width)) {
            
$this->width $width;
        } else {
            throw new 
IllegalArgumentException();
        }
    }

    
/**
     * @param int
     * @throws IllegalArgumentException
     */

    
public function setHeight($height) {
        if (
is_integer($height)) {
            
$this->height $height;
        } else {
            throw new 
IllegalArgumentException();
        }
    }

    public function 
__toString() {
        return 
"{width: {$this->width}, height: {$this->height}}";
    }
}
?>
Онлайн: 0
Реклама