 # Imagine’s coordinates system¶

The coordinate system use by Imagine is very similar to Cartesian Coordinate System, with some exceptions:

• Coordinate system starts at x,y (0,0), which is the top left corner and extends to right and bottom accordingly
• There are no negative coordinates, a point must always be bound to the box its located at, hence 0,0 and greater
• Coordinates of the point are relative its parent bounding box

## Classes¶

The whole coordinate system is represented in a handful of classes, but most importantly - its interfaces:

• `Imagine\Image\PointInterface` - represents a single point in a bounding box
• `Imagine\Image\BoxInterface` - represents dimensions (width, height)

## PointInterface¶

Every coordinate contains the following methods:

• `->getX()` - returns horizontal position of the coordinate
• `->getY()` - returns vertical position of a coordinate
• `->in(BoxInterface \$box)` - returns `true` if current coordinate appears to be inside of a given bounding `\$box`
• `->__toString()` - returns string representation of the current `PointInterface`, e.g. `(0, 0)`

### Center coordinate¶

It is very well known use case when a coordinate is supposed to represent a center of something.

As part of showing off OO approach to image processing, I added a simple implementation of the core `Imagine\Image\PointInterface`, which can be found at `Imagine\Image\Point\Center`. The way it works is simple, it expects and instance of `Imagine\Image\BoxInterface` in its constructor and calculates the center position based on that.

```<?php

\$size = new Imagine\Image\Box(50, 50);

\$center = new Imagine\Image\Point\Center(\$size);

var_dump(array(
'x' => \$center->getX(),
'y' => \$center->getY(),
));

// would output position of (x,y) 25,25
```

## BoxInterface¶

Every box or image or shape has a size, size has the following methods:

• `->getWidth()` - returns integer width
• `->getHeight()` - returns integer height
• `->scale(\$ratio)` - returns a new `BoxInterface` instance with each side multiplied by `\$ratio`
• `->increase(\$size)` - returns a new `BoxInterface`, with given `\$size` added to each side
• `->contains(BoxInterface \$box, PointInterface \$start = null)` - checks that the given `\$box` is contained inside the current `BoxInterface` at `\$start` position. If no `\$start` position is given, its assumed to be (0,0)
• `->square()` - returns integer square of current `BoxInterface`, useful for determining total number of pixels in a box for example
• `->__toString()` - returns string representation of the current `BoxInterface`, e.g. `100x100 px`
• `->widen(\$width)` - resizes box to given width, constraining proportions and returns the new box
• `->heighten(\$height)` - resizes box to given height, constraining proportions and returns the new box