Polygons
The objective of this section is to cover geometric constructions using points and vectors. In particular, this section focuses on polygons.
Equilateral Triangle
Determine the points a, b, c of an equilateral triangle in basis ( o, u, v, n ), where o is the origin, u, v and n are its orthonormal basis vectors.
""" Inputs
"""
o = Point3d( ox, oy, oz )
u = Vector3d( ux, uy, uz )
v = Vector3d( vx, vy, vz )
n = Vector3d( nx, ny, nz )
Solution
One way to construct an equilateral triangle is to establish its coordinates in the world's XY-plane and then transform it to the arbitrary basis. Therefore, for convenience point a can be set at [0.0, 0.0], point b at [1.0, 0.0] and point c at [0.5, √3/2].
""" Output
"""
a = o + u * 0.0 + v * 0.0
b = o + u * 1.0 + v * 0.0
c = o + u * 0.5 + v * 0.5 * math.sqrt( 3 )
Inscribed Hexagon
Determine the points a, b, c, d, e, f of a hexagon inscribed in circle ( o, u, v, r ), where o is the center, u and v are orthonormal basis vectors and r is the radius of the circle.
""" Inputs
"""
o = Point3d( ox, oy, oz )
u = Vector3d( ux, uy, uz )
v = Vector3d( vx, vy, vz )
r = 2.0
Solution
One way to construct the hexagon is by noticing that if it is conveniently registered in the world's XY-plane it is easy to transform it in any arbitrary basis. By setting the center of the circle to [0, 0] and the first point at [r, 0], we only need to compute one more point [r/2, r√3/2] and then use reflections about the X and Y axes to determine the locations of the remaining points.
""" Output
"""
x = r / 2
y = x * math.sqrt( 3 )
a = o + u * r + v * 0
b = o + u * x + v * y
c = o - u * x + v * y
d = o - u * r + v * 0
e = o - u * x - v * y
f = o + u * x - v * y
Regular Polygon
Generate the points for a regular polygon of n sides, provided with its side's length s in the plane ( o, u, v ), where o is the origin, u and v are its orthonormal basis vectors.
""" Inputs
"""
o = Point3d( ox, oy, oz )
u = Vector3d( ux, uy, uz )
v = Vector3d( vx, vy, vz )
s = 2.0
n = 12
Solution
The simplest approach involves dividing a circle by the number of sides of the inscribed regular polygon. Thus the angle between consecutive radial line from the circle's center to the points of the polygon is a = 2Ï€ / n. With a bit of trigonometry, the radius r and side s of the polygon are associated by r = 0.5 * s / sin( a / 2 ).
""" Output
"""
def RegularPolygon( o, u, v, s, n ):
a = 2.0 * math.pi / n
r = 0.5 * s / math.sin( a / 2 )
return [( o + u * r * math.cos( a * i )
+ v * r * math.sin( a * i ) )
for i in range( n )]