# 1 Programming Interest Group Tutorial Eight Computational Geometry.

## Presentation on theme: "1 Programming Interest Group Tutorial Eight Computational Geometry."— Presentation transcript:

1 Programming Interest Group http://www.comp.hkbu.edu.hk/~chxw/pig/index.htm Tutorial Eight Computational Geometry

2 Introduction Computational geometry is the branch of computer science that studies algorithms for solving geometric problems. Applications Computer graphics, robotics, VLSI design, computer-aided design, etc. Two dimensions, three dimensions, etc. Common objects in two dimensions point, line, line segment, vertices, polygon, circle, etc.

3 Points A point is defined by its two coordinates in the plane typedef struct { double x; double y; } point; x y p(a,b) 0 a b

4 Distance What’s the distance between two given points? double distance(point p1, point p2) { double dx, dy; dx = p1.x – p2.x; dy = p1.y – p2.y; return sqrt(dx*dx + dy*dy); }

5 Lines Consider lines in the plane Two possible representations By equations such as y = ax + b where a is the slope of the line and b is the y-intercept. by any pair of points (x 1, y 1 ) and (x 2, y 2 ) which lie on the line Then the slope will be (y 1 -y 2 )/(x 1 -x 2 ) We use the formula ax + by + c = 0 to represent a line

6 Lines typedef struct { double a;/* x-coefficient */ double b;/* y-coefficient */ double c;/* constant term */ } line; If the y-coefficient is 0, set the x-coefficient to 1; Otherwise, set the y-coefficient to 1.

7 Lines Given two points p1, p2, determine the line points_to_line(point p1, point p2, line *m) { if (p1.x == p2.x) { m->a = 1; m->b = 0; m->c = -p1.x; } else { m->b = 1; m->a = -(p1.y – p2.y) / (p1.x – p2.x); m->c = -(m->a * p1.x) – (m->b * p1.y); } Should be (fabs(p1.x-p2.x) <= EPSILON), where EPSILON is a very small positive number like 0.00000000001

8 Lines Given a point and the slope, determine the line point_and_slope_to_line(point p, double s, line *m) { m->a = -s; m->b = 1; m->c = -( (l->a * p.x) + (l->b * p.y) ); }

9 Line Intersection Two distinct lines have one intersection point unless they are parallel int parallelQ(line m1, line m2) { return ( (fabs(m1.a - m2.a) <= EPSILON ) && (fabs(m1.b – m2.b) <= EPSILON) ); } int same_lineQ(line m1, line m2) { return ( parallelQ(m1, m2) && (fabs(m1.c – m2.c) <= EPSILON) ); }

10 Line Intersection intersection_point(line m1, line m2, point *p) { if (same_lineQ(m1, m2)) { printf(“Warning: identical lines.\n”); p->x = p->y = 0.0; } if (parallelQ(m1, m2)) { printf(“Error: Distinct parallel lines do not intersect.\n”); return ; } p->x = (m2.b * m1.c – m1.b * m2.c) / (m2.a * m1.b – m1.a * m2.b); if (fabs(m1.b) > EPSILON) /* test for vertical line */ p->y = - (m1.a * p->x + m1.c ) / m1.b; else p->y = - (m2.a * p->x + m2.c ) / m2.b; }

11 Closest Point Identify the point on line m which is closest to a given point p closest_point(point p_in, line m, point *p_c) { line perp;/* perpendicular to m if (fabs(m.b) <= EPSILON) {/* vertical line */ p_c->x = -m.c; p_c->y = p_in.y; return; } if (fabs(m.a) <= EPSILON) {/* horizontal line */ p_c->x = p_in.x; p_c->y = -m.c; return; } point_and_slope_to_line(p_in, 1/m.a, &perp); intersection_point(m, perp, p_c); }

12 Line Segments A line segment is the portion of a line which lines between two given points inclusive. typedef struct { point p1, p2; /* endpoints of line segment */ } segment;

13 Line Segment Intersections To test whether two segments intersect It’s complicated due to tricky special cases int segment_intersect(segment s1, segment s2) { line m1, m2; point p;/* intersection point */ points_to_line(s1.p1, s1.p2, &m1); points_to_line(s2.p1, s2.p2, &m2); if (same_lineQ(m1, m2) )/* overlapping or disjoint segments */ return ( point_in_box(s1.p1, s2.p1, s2.p2) || point_in_box(s1.p2, s2.p1, s2.p2) || point_in_box(s2.p1, s1.p1, s1.p2) || point_in_box(s2.p2, s1.p1, s1.p2) ); if ( parallelQ(m1, m2) ) return 0; intersection_point(m1, m2, &p); return (point_in_box(p, s1.p1, s1.p2) && point_in_box(p, s2.p1, s2.p2) ); }

14 Line Segment Intersections Whether a point lies in a box? #define max(A, B)((A) > (B) ? (A) : (B)) #define min(A, B)((A) < (B) ? (A) : (B)) int point_in_box (point p, point b1, point b2) { return ( (p.x >= min(b1.x, b2.x)) && (p.x <= max(b1.x, b2.x)) && (p.y >= min(b1.y, b2.y)) && (p.y <= max(b1.y, b2.y)) ); }

15 Triangles and Trigonometry Angle is the union of two rays sharing a common endpoint. Trigonometry is the branch of mathematics dealing with angles and their measurement. Two measures of angles Radians: from 0 to 2π Degree: from 0 to 360 Right angle: 90 o or π/2 radians

16 Triangles and Trigonometry Right triangle contains a right internal angle. Pythagorean theorem: |a| 2 + |b| 2 = |c| 2 a and b are the two shorter sides, c is the longest side, or hypotenuse. a b c

17 Triangles and Trigonometry Two important trigonometric formulae Law of Sines: Law of Cosines: a b c A B C

18 Area of a Triangle The signed area of a triangle can be calculated directly from its coordinate representation A(T) = (a x b y – a y b x + a y c x – a x c y + b x c y – c x b y )/2 double signed_triangle_area (point a, point b, point c) { return ( (a.x*b.y – a.y*b.x + a.y*c.x – a.x*c.y + b.x*c.y – c.x*b.y) / 2.0 ); } double triangle_area (point a, point b, point c) { return fabs(signed_triangle_area(a,b,c)); }

19 Circles A circle is defined as the set of points at a given distance (or radius) from its center (x c, y c ). A disk is circle plus its interior. typedef struct { point c;/* center of circle */ double r;/* radius of circle */ } point;

20 Polygons Polygons are closed chains of non- intersecting line segments. We can represent a polygon by listing its n vertices in order around the boundary of the polygon. typedef struct { int n; /* number of points in polygon */ point p[MAXPOLY]; /* array of points */ } polygon;

Similar presentations