Top Banner
A little bit of geometry Jordi Cortadella Department of Computer Science
19

A little bit of geometry Jordi Cortadella Department of Computer Science.

Dec 31, 2015

Download

Documents

Millicent Burns
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: A little bit of geometry Jordi Cortadella Department of Computer Science.

A little bit of geometry

Jordi CortadellaDepartment of Computer Science

Page 2: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 2

Representing points and lines in // A point has two coordinatesstruct Point { double x, y;};

// A line: y = mx + bstruct Line { double m; // Slope double b; // y-intercept;};

// A segment represented by two pointsstruct Segment { Point P, Q;};

Introduction to Programming

Page 3: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 3

Line equation from two points

Introduction to Programming

P

Q

𝒅𝒙

𝒅𝒚

𝒃

𝑦=𝑚𝑥+𝑏

𝑚=𝑑𝑦𝑑𝑥

=P .y−Q .yP .x−Q .x

𝑏=P .y−𝑚 ∙P .x

Page 4: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 4

Finding a line from a segment

// Returns the line defined by the segment.Line FindLine(const Segment& S) { Line L; L.m = (S.P.y – S.Q.y)/(S.P.x – S.Q.x); L.b = S.P.y – L.m*S.P.x; return L;}

// Be careful with vertical lines!// A special treatment is required.

Introduction to Programming

Page 5: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 5

Segment intersection

Introduction to Programming

Given two segments: do they intersect?

Page 6: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 6

Preliminary problem

Introduction to Programming

𝐴

Do the two points fall on the same side of the line?

𝐵

Page 7: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 7

Relative position of a point

Introduction to Programming

(𝑥1 , 𝑦1)

(𝑥2 , 𝑦 2)

𝐴(𝑥3, 𝑦3)

𝑑𝑥

𝑑𝑦𝐿(𝑥3 , 𝑦 3 ′ )

Is above, below or on the line?Compute the sign of

𝑦 3− 𝑦3 ′

Page 8: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 8

Relative position of two points

Introduction to Programming

Point A:

Point B:

We are only interested on whether and have the same signand not on the actual sign of the expressions.

𝑚 𝑏

same sign?

Page 9: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 9

Points at the same side// Returns true if A and B at are the same side// of the line defined by S, and false otherwise.

bool SameSide(const Segment& S, const Point& A, const Point& B) { double dx = S.P.x – S.Q.x; double dy = S.P.y – S.Q.y; double dxA = A.x – S.P.x; double dyA = A.y – S.P.y; double dxB = B.x – S.P.x; double dyB = B.y – S.P.y; return (dy*dxA – dx*dyA > 0) == (dy*dxB – dx*dyB > 0); // or also: (dy*dxA – dx*dyA)*(dy*dxB – dx*dyB) >= 0}

Introduction to Programming

Important: the function works for any line (even vertical lines!).The expressions are perfectly symmetric with regard to the x and y axes.

Note: we work with real numbers.Some inaccuracies may occur when the points are close to the segment.

Page 10: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 10

The original problem: segment intersection

Introduction to Programming

// Returns true if S1 and S2 intersect, and false otherwise.bool Intersect(const Segment& S1, const Segment& S2);

𝑅

𝑆

𝑇

𝑉

Page 11: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 11

Segment intersection

// Returns true if S1 and S2 intersect,// and false otherwise.

bool Intersect(const Segment& S1, const Segment& S2) {

return SameSide(S1, S2.P, S2.Q) or SameSide(S2, S1.P, S1.Q);

}

Introduction to Programming

Page 12: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 12

Representation of polygons

Introduction to Programming

(1,3)

(4,1)

(7,3)

(5,4)

(6,7)

(2,6)

• A polygon can be represented by asequence of vertices.

• Two consecutive vertices representan edge of the polygon.

• The last edge is represented by thefirst and last vertices of the sequence.

Vertices: (1,3) (4,1) (7,3) (5,4) (6,7) (2,6)

Edges: (1,3)-(4,1)-(7,3)-(5,4)-(6,7)-(2,6)-(1,3)

// A polygon (an ordered set of vertices)typedef vector<Point> Polygon;

Page 13: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 13

Why artificial vision is so difficult?

Introduction to Programming

Page 14: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 14

Point inside a polygon?

Introduction to Programming

Humanview

1.8 4.2 5.9 6.0 8.1 9.4 7.3 5.5 3.2 2.62.6 2.7 4.3 7.9 9.3 8.6 8.3 4.1 3.5 2.9

7.15.4

Polygon:

Point:

Computerview

Page 15: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 15

Point inside a polygon?

Introduction to Programming

Use the crossing number algorithm:• Draw a ray (half-line) from the point• Count the number of crossing edges:

even outside odd inside

4

2

3

1

Page 16: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 16

Point inside a polygon?

Introduction to Programming

We will use a horizontal ray (x coordinate = )

A

Page 17: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 17

Point inside a polygon?#include <limits> // To use the infinity value// Returns true if the point is inside the polygon,// and false otherwise.bool InsidePolygon(const Polygon& P, const Point& A) { Segment Ray; // Horizontal ray Ray.P = A; Ray.Q.x = numeric_limits<double>::infinity(); Ray.Q.y = A.y;

Segment Edge; Edge.P = P[P.size() - 1]; // The last point of P bool inside = false; for (int dst = 0; dst < P.size(); ++dst) { Edge.Q = P[dst]; if (Intersect(Ray, Edge)) inside = not inside; Edge.P = Edge.Q; } return inside;}Introduction to Programming

Page 18: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 18

Point inside a polygon?

Introduction to Programming

Again, problems with the accuracy of real numbers.How about the ray intersecting a vertex?(this problem is beyond the scope of this course)

Page 19: A little bit of geometry Jordi Cortadella Department of Computer Science.

© Dept. CS, UPC 19

Summary• Computational geometry has a vast range of

applications in different domains: Visualization, Computer Graphics, Virtual Reality, Robotics, etc.

• Challenge: finding fast solutions for complex geometric problems (think of a 3D real-time video game processing millions of pixels per second).

• Dealing with the accuracy of real numbers is always an issue, but no so important if a certain tolerance for errors is allowed.

Introduction to Programming