Presentation is loading. Please wait.

Presentation is loading. Please wait.

A question about polygons Devising a computational method for determining if a point lies in a plane convex polygon.

Similar presentations


Presentation on theme: "A question about polygons Devising a computational method for determining if a point lies in a plane convex polygon."— Presentation transcript:

1 A question about polygons Devising a computational method for determining if a point lies in a plane convex polygon

2 Problem background Recall our ‘globe.cpp’ ray-tracing demo It depicted a scene showing two objects One of the objects was a square tabletop Its edges ran parallel to x- and z-axes That fact made it easy to determine if the spot where a ray hit the tabletop fell inside or outside of the square’s boundary edges We were lucky!

3 Alternative geometry? What if we wanted to depict our globe as resting on a tabletop that wasn’t a nicely aligned square? For example, could we show a tabletop that was a hexagon? The only change is that the edges of this six-sided tabletop can’t all be lined up with the coordinate system axes We need a new approach to determining if a ray hits a spot that’s on our tabletop

4 A simpler problem How can we tell if a point lies in a triangle? a b c p q Point p lies inside triangle ΔabcPoint q lies outside triangle Δabc

5 Triangle algorithm Draw vectors from a to b and from a to c We can regard these vectors as the axes for a “skewed” coordinate system Then every point in the triangle’s plane would have a unique pair of coordinates We can compute those coordinates using Cramer’s Rule (from linear algebra)

6 The algorithm idea a b c p ap = c 1 *ab + c 2 *ac c 1 = det( ap, ac )/det( ab, ac ) c 2 = det( ab, ap )/det( ab, ac )

7 Cartesian Analogy p = (c 1,c 2 ) x-axis y-axis x + y = 1 p lies outside the triangle if c 1 1

8 Determinant function: 2x2 typedef float scalar_t; typedef struct { scalar_t x, y; } vector_t; scalar_t det( vector_t a, vector_t b ) { returna.x * b.y – b.x * a.y; }

9 Constructing a regular hexagon ( cos(0*theta), sin(0*theta) ) ( cos(1*theta), sin(1*theta) )( cos(2*theta), sin(2*theta) ) ( cos(3*theta), sin(3*theta) ) ( cos(4*theta), sin(4*theta) ) ( cos(5*theta), sin(5*theta) ) theta = 2*PI / 6

10 Subdividing the hexagon A point p lies outside the hexagon -- unless it lies inside one of these four sub-triangles

11 Same approach for n-gons Demo program ‘hexagon.cpp’ illustrates the use of our just-described algorithm Every convex polygon can be subdivided into triangles, so the same ideas can be applied to any regular n-sided polygon Exercise: modify the demo-program so it draws an octagon, a pentagon, a septagon

12 Extension to a tetrahedron A tetrahedron is a 3D analog of a triangle It has 4 vertices, located in space (but not all vertices can lie in the same plane) Each face of a tetrahedron is a triangle o a b c

13 Cramer’s Rule in 3D typedef float scalar_t; typedef struct { scalar_t x, y, z; } vector_t; scalar_t det( vector_t a, vector_t b, vector_t c ) { scalar_tsum = 0.0; sum += a.x * b.y * c.z – a.x * b.z * c.y; sum += a.y * b.z * c.x – a.y * b.x * c.z; sum += a.z * b.x * c.y – a.z * b.y * c.x; returnsum; }

14 Is point in tetrahedron? Let o, a, b, c be vertices of a tetrahedron Form the three vectors oa, ob, oc and regard them as the coordinate axes in a “skewed” 3D coordinate system Then any point p in space has a unique triple of coordinates: op = c 1 *oa + c 2 *ob + c 3 *oc These three coordinates can be computed using Cramer’s Rule

15 Details of Cramer Rule c 1 = det( op, ob, oc )/det( oa, ob, oc ) c 2 = det( oa, op, oc )/det( oa, ob, oc ) c 3 = det( oa, ob, op )/det( oa, ob, oc ) Point p lies inside the tetrahedron – unless c 1 < 0 or c 2 < 0 or c 3 < 0 orc 1 + c 2 + c 3 > 1

16 Convex polyhedron Just as a convex polygon can be divided into subtriangles, any convex polyhedron can be divided into several tetrahedrons We can tell if a point lies in the polyhedron by testing to see it lies in one of the solid’s tetrahedral parts An example: the regular dodecahedron can be raytraced by using these ideas!


Download ppt "A question about polygons Devising a computational method for determining if a point lies in a plane convex polygon."

Similar presentations


Ads by Google