//
// Transformer.h
// TikZiT
//
// Copyright 2010 Aleks Kissinger. All rights reserved.
//
//
// This file is part of TikZiT.
//
// TikZiT is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// TikZiT is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with TikZiT. If not, see .
//
#import
extern float const PIXELS_PER_UNIT;
/*!
@class Transformer
@brief Do affine coordinate transforms between an abstract co-ordinate
space (such as the graph's) and the screen's.
This currently allows zooming and panning.
*/
@interface Transformer : NSObject {
NSPoint origin;
float x_scale;
float y_scale;
}
/*!
@brief The screen co-ordinate of the abstract space origin.
*/
@property (assign) NSPoint origin;
/*!
@brief The scale (from abstract space to screen space)
@detail This is the size of a single unit (a distance of 1.0)
of the abstract space on the screen.
Around 50 is a reasonable value.
*/
@property (assign) float scale;
/*!
@brief Whether co-ordinates are flipped about the X axis
@detail TikZ considers X co-ordinates to run left to right,
which is not necessarily how the screen views
them.
*/
@property (assign,getter=isFlippedAboutXAxis) BOOL flippedAboutXAxis;
/*!
@brief Whether co-ordinates are flipped about the Y axis
@detail TikZ considers Y co-ordinates to run up the page,
which is not necessarily how the screen views
them.
*/
@property (assign,getter=isFlippedAboutYAxis) BOOL flippedAboutYAxis;
/*!
@brief Transform a point from screen space to abstract space.
@param p a point in screen space.
@result A point in abstract space.
*/
- (NSPoint)fromScreen:(NSPoint)p;
/*!
@brief Transform a point from abstract space to screen space.
@param p a point in abstract space.
@result A point in screen space.
*/
- (NSPoint)toScreen:(NSPoint)p;
/*!
@brief Scale a distance from screen space to abstract space.
@param dist a distance in screen space.
@result A distance in abstract space.
*/
- (float)scaleFromScreen:(float)dist;
/*!
@brief Scale a distance from abstract space to screen space.
@param dist a distance in abstract space.
@result A distance in screen space.
*/
- (float)scaleToScreen:(float)dist;
/*!
@brief Scale a rectangle from screen space to abstract space.
@param r a rectangle in screen space.
@result A rectangle in abstract space.
*/
- (NSRect)rectFromScreen:(NSRect)r;
/*!
@brief Scale a rectangle from abstract space to screen space.
@param r a rectangle in abstract space.
@result A rectangle in screen space.
*/
- (NSRect)rectToScreen:(NSRect)r;
/*!
@brief Factory method to get an identity transformer.
@result A transformer.
*/
+ (Transformer*)transformer;
/*!
@brief Factory method to get a transformer identical to another
@result A transformer.
*/
+ (Transformer*)transformerWithTransformer:(Transformer*)t;
/*!
@brief Factory method to get a transformer.
@param o The screen co-ordinate of the abstract space origin
@param scale The scale (from abstract space to screen space)
@result A transformer.
*/
+ (Transformer*)transformerWithOrigin:(NSPoint)o andScale:(float)scale;
/*!
@brief Get a global 'actual size' transformer.
@result A transformer.
*/
+ (Transformer*)defaultTransformer;
/*!
@brief A transformer set up from two bounding rects.
graphRect is made as large as possible while still fitting into screenRect.
@result A transformer.
*/
+ (Transformer*)transformerToFit:(NSRect)graphRect intoScreenRect:(NSRect)screenRect flippedAboutXAxis:(BOOL)flipX flippedAboutYAxis:(BOOL)flipY;
+ (Transformer*)transformerToFit:(NSRect)graphRect intoScreenRect:(NSRect)screenRect flippedAboutXAxis:(BOOL)flipX;
+ (Transformer*)transformerToFit:(NSRect)graphRect intoScreenRect:(NSRect)screenRect flippedAboutYAxis:(BOOL)flipY;
+ (Transformer*)transformerToFit:(NSRect)graphRect intoScreenRect:(NSRect)screenRect;
@end
// vi:ft=objc:noet:ts=4:sts=4:sw=4