27
2D Coordinate Systems and Drawing

2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

2D Coordinate Systemsand Drawing

Page 2: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Coordinate Systems

• Screen coordinate system• World coordinate system• World window• Viewport• Window to viewport mapping 

Page 3: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Screen Coordinate System

• 2D regular Cartesian grid• Origin (0, 0) at the lower left

(OpenGL convention)

• Pixels are defined at intersections

• Defined relatively to the display window

Your Monitor Screeny

x(0, 0) (2, 2)

Page 4: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Screen Coordinate System

• Not easy to use in practice– Window size can vary

Page 5: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Screen Coordinate System

• Not easy to use in practice– Window size can vary– People prefer to specify objects in their actual sizes

Page 6: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Objects should be specified independent of the screen coordinate system.

Page 7: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

2D Drawing

Screen

World

Objects (in world coordinate system)

World Window

Screen Window

Page 8: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Define a world window

Page 9: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Define a world window

• A rectangular region in the world that is to be displayed (in world coordinate system)

gluOrtho2D(W_L, W_R, W_B, W_T)

OpenGL function:2D orthogonal projection

Page 10: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Viewport

• A rectangular region in the screen for display (in screen coordinate system)

glViewport(V_L, V_R, V_B, _T)

Page 11: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

An Example

void DrawQuad(){

glViewport(50, 50, 350, 250);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1, 1, -1, 1);glBegin(GL_QUADS);glVertex2f(-0.5, -0.5);glVertex2f( 0.5, -0.5);glVertex2f( 0.5, 0.5);glVertex2f(-0.5, 0.5);glEnd();

}

(‐0.5, ‐0.5) (0.5, ‐0.5)

(‐0.5, 0.5) (0.5, 0.5)

(‐1, ‐1)

(1,  1)

(0,  0)

(400, 300)

(50,  50)

(350,  250)

Page 12: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Remember to…

• Remember to specify the matrix type:

void DrawQuad(){

glViewport(50, 50, 350, 250);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1, 1, -1, 1);glBegin(GL_QUADS);glVertex2f(-0.5, -0.5);glVertex2f( 0.5, -0.5);glVertex2f( 0.5, 0.5);glVertex2f(-0.5, 0.5);glEnd();

}

Page 13: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

How to achieve this mapping?

gluOrtho2D(-1, 1, -1, 1); glViewport(50, 50, 350, 250);

No need to do mapping by yourself, just call those two functions!

Page 14: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

The problem

• Input:– World window: W_L, W_R, W_B, W_T– Viewport: V_L, V_R, V_B, V_T– Some point (x, y) in the world coordinate system

• Output:– (sx, sy) on the screen

Page 15: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Basic Information

W_R ‐W_L V_R ‐ V_L

W_T

 –W_B

V_T –V_

B

Page 16: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Keep the Same Ratio

W_R ‐W_L V_R ‐ V_L

x ‐W_Lsx ‐ V_L

(x ‐W_L) / (W_R ‐W_L) = (sx ‐ V_L) / (V_R ‐ V_L)

sx = (x ‐W_L)(V_R ‐ V_L) / (W_R ‐W_L) +V_L

Page 17: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Keep the Same Ratio

y – W_B sy – V_B

(y – W_B) / (W_T – W_B) = (sy – V_B) / (V_T – V_B)

sy = (y – W_B)(V_T ‐ V_B) / (W_T ‐W_B) +V_B

W_T

 –W_B

V_T –V_

B

Page 18: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Practical Questions

• How to initialize– The world window– The viewport

• How to transform– Translation– Zoom in, zoom out…

Page 19: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

A simple way to initialize the world window

• Cover everything

Page 20: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

• Call gluOrtho2D() with new ranges

Zoom In/Out

Page 21: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Distortion Example

void DrawQuad(){

glViewport(50, 50, 350, 250);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1, 1, -1, 1);glBegin(GL_QUADS);glVertex2f(-0.5, -0.5);glVertex2f( 0.5, -0.5);glVertex2f( 0.5, 0.5);glVertex2f(-0.5, 0.5);glEnd();

}

(‐0.5, ‐0.5) (0.5, ‐0.5)

(‐0.5, 0.5) (0.5, 0.5)

(‐1, ‐1)

(1,  1)

(0,  0)

(400, 300)

(50,  50)

(350,  250)

Page 22: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Aspect Ratio

(0.5, 0.5)

width

heightr= width/height

Page 23: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Distortion happens when aspect ratios are not consistent 

void DrawQuad(){

glViewport(50, 50, 350, 250);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1, 1, -1, 1);glBegin(GL_QUADS);glVertex2f(-0.5, -0.5);glVertex2f( 0.5, -0.5);glVertex2f( 0.5, 0.5);glVertex2f(-0.5, 0.5);glEnd();

}

(‐0.5, ‐0.5) (0.5, ‐0.5)

(‐0.5, 0.5) (0.5, 0.5)

(‐1, ‐1)

(1,  1)

(0,  0)

(400, 300)

(50,  50)

(350,  250)

Page 24: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Two solutions

(‐0.5, ‐0.5) (0.5, ‐0.5)

(‐0.5, 0.5) (0.5, 0.5)

(‐0.5, ‐0.5) (0.5, ‐0.5)

(‐0.5, 0.5) (0.5, 0.5)

Page 25: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Where to define viewport?

• Two places– Initialization: the same size as the whole window

– Every time the user resizes the window• Call Viewport in your resize callback function

Page 26: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Example

(center_x, center_y)

world_width

world_height=world_width*view_port_height/view_port_width

world_h

eight

Page 27: 2D Coordinate Systems and Drawingweb.cse.ohio-state.edu/~wang.3602/courses/cse581-2012-spring/2D.pdf · Screen Coordinate System • 2D regular Cartesian grid • Origin (0, 0) at

Example

(center_x, center_y)

world_width

world_h

eight

W_L=center_x‐world_width/2

W_R=center_x+world_width/2

W_B=center_y+world_height/2

W_T=center_y+world_height/2