27
2D Coordinate Systems and Drawing

2D Coordinate Systems and Drawing

  • Upload
    sandro

  • View
    21

  • Download
    0

Embed Size (px)

DESCRIPTION

2D Coordinate Systems and Drawing. Coordinate Systems. Screen coordinate system World coordinate system World window Viewport Window to viewport mapping. Screen Coordinate System. 2D regular Cartesian grid Origin (0, 0) at the lower left (OpenGL convention) - PowerPoint PPT Presentation

Citation preview

Page 1: 2D Coordinate Systems  and Drawing

2D Coordinate Systems and Drawing

Page 2: 2D Coordinate Systems  and Drawing

Coordinate Systems

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

Page 3: 2D Coordinate Systems  and Drawing

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 Drawing

Screen Coordinate System

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

Page 5: 2D Coordinate Systems  and Drawing

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 Drawing

Objects should be specified independent of the screen coordinate system.

Page 7: 2D Coordinate Systems  and Drawing

2D Drawing

Screen

World

Objects (in world coordinate system)

World Window

Screen Window

Page 8: 2D Coordinate Systems  and Drawing

Define a world window

Page 9: 2D Coordinate Systems  and Drawing

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 Drawing

Viewport• A rectangular region in the screen for display

(in screen coordinate system)glViewport(V_L, V_B, V_R-V_L, V_T-V_B)

Page 11: 2D Coordinate Systems  and Drawing

An Example

void DrawQuad(){ glViewport(50, 50, 300, 200); 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 Drawing

Remember to…• Remember to specify the matrix type:

void DrawQuad(){ glViewport(50, 50, 300, 200); 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 Drawing

How to achieve this mapping?

gluOrtho2D(-1, 1, -1, 1); glViewport(50, 50, 300, 200);

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

Page 14: 2D Coordinate Systems  and Drawing

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 Drawing

Basic Information

W_R - W_L V_R - V_L

W_T

– W

_B

V_T

– V_

B

Page 16: 2D Coordinate Systems  and Drawing

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 Drawing

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 Drawing

Practical Questions

• How to initialize– The world window– The viewport

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

Page 19: 2D Coordinate Systems  and Drawing

A simple way to initialize the world window

• Cover everything

Page 20: 2D Coordinate Systems  and Drawing

• Call gluOrtho2D() with new ranges

Zoom In/Out

Page 21: 2D Coordinate Systems  and Drawing

Distortion Example

void DrawQuad(){ glViewport(50, 50, 300, 200); 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 Drawing

Aspect Ratio

(0.5, 0.5)

width

heig

htr= width/height

Page 23: 2D Coordinate Systems  and Drawing

Distortion happens when aspect ratios are not consistent

void DrawQuad(){ glViewport(50, 50, 300, 200); 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 Drawing

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 Drawing

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 Drawing

Example

(center_x, center_y)

world_width

world_height=world_width*view_port_height/view_port_width

wor

ld_h

eigh

t

Page 27: 2D Coordinate Systems  and Drawing

Example

(center_x, center_y)

world_width

wor

ld_h

eigh

t

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