Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!iuvax!ux1.cso.uiuc.edu!uxc.cso.uiuc.edu!uxc.cso.uiuc.edu!m.cs.uiuc.edu!s.cs.uiuc.edu!mccaugh From: mccaugh@s.cs.uiuc.edu Newsgroups: comp.graphics Subject: Re: Common questions about polygons? Message-ID: <207400030@s.cs.uiuc.edu> Date: 26 Sep 89 04:23:00 GMT References: <568@vall.dsv.su.se> Lines: 105 Nf-ID: #R:vall.dsv.su.se:568:s.cs.uiuc.edu:207400030:000:3983 Nf-From: s.cs.uiuc.edu!mccaugh Sep 25 23:23:00 1989 (*************************************************************) (* *) (* Assumptions: n > 2 (at least 3 sides) *) (* 0 < k < n (at least 1 side missing/given) *) (* standard Cartesian-coordinate system *) (* all constructions proceed clockwise *) (* *) (* *) (* *) (* TYPE vertex = RECORD *) (* x,y: Real *) (* END{vertex}; *) (* *) (*************************************************************) PROCEDURE Polygon (n, { number of sides altogether }; k: { number of vertices to find } Integer; VAR Points: { sequence of vertices } ARRAY[1..n] OF vertex; ); { generate missing vertices of regular convex n-gon from given ones } { at least one side (2 vertices) given, and missing ones come last } VAR a1,b1, a2,b2, x, u,v,x2, m1,mj, s,mx, M, C, T, W: Real; i,j: Integer; FUNCTION Sgn (z:Real): Real; BEGIN IF z < 0.0 THEN Sgn := -1.0 ELSE IF z > 0.0 THEN Sgn := 1.0 ELSE Sgn := 0.0 END{Sgn}; BEGIN{Polygon} i := n - k; a1 := Point[i].x; b1 := Point[i].y; a2 := Point[i+1].x; b2 := Point[i+1].y; IF n = 4 THEN BEGIN IF a1 = a2 THEN x := Abs(b2-b1) ELSE x := Abs(a2-a1); FOR j := i TO 3 DO BEGIN IF a1 = a2 THEN BEGIN u := a2 + Sgn(b2-b1)*x; v := b2 END ELSE BEGIN { b1 = b2 } u := a2; v := b2 + Sgn(b1-b2)*x END; Point[j+1].x := u; Point[j+1].y := v; a1 := a2; b1 := b2; a2 := u; b2 := v END{FOR} END{IF} ELSE BEGIN { n <> 4, so alpha <> 90 degrees } x2 := Sqr(a1-a2) + Sqr(b1-b2); x := Sqrt(x2); { x = length(side) } m1 := -Tan(360.0/n); { m1 = Tan(interior angle) } FOR j := n-k TO n-1 DO BEGIN IF m1*(b1-b2) = a1-a2 THEN BEGIN { a1 <> a2 } mj := (b1-b2)/(a1-a2); IF mj > 0 THEN s := Sgn(b1-b2) ELSE s := Sgn(b2-b1); u := a2; v := b2 + s*x END ELSE BEGIN { m1*mj <> 1 } IF a1 = a2 THEN mx := -1.0/m1 ELSE BEGIN mj := (b1-b2)/(a1-a2); mx := (m1 + mj)/(1.0 - m1*mj) END; M := 1.0 + Sqr(mx); C := mx*a1 - b1; T := a1 + (b1 + C)*mx; W := x2 - Sqr(a1) - Sqr(b1 + C); u := (T + Sqrt(M*W + Sqr(T)))/M; v := mx*u - C END; Point[j+1].x := u; Point[j+1].y := v; a1 := a2; b1 := b2; a2 := u; b2 := v END{FOR} END{Polygon}.