## AngleSweep Class

An `AngleSweep` is a pair of angles at start and end of an interval.

• For stroking purposes, the "included interval" is all angles numerically reached by theta = start + f*(end-start), where f is between 0 and 1.
• This stroking formula is simple numbers -- 2PI shifts are not involved.
• 2PI shifts do become important in the reverse mapping of an angle to a fraction.
• If (start < end) the angle proceeds CCW around the unit circle.
• If (end < start) the angle proceeds CW around the unit circle.
• Angles beyond 360 are fine as endpoints.
• (350,370) covers the same unit angles as (-10,10).
• (370,350) covers the same unit angles as (10,-10).

### Methods

Name Description
angleToPositivePeriodicFraction(theta: Angle): number map an angle to a fractional coordinate which is:

the start angle is at fraction 0
the end angle is at fraction 1
interior angles are between 0 and 1
all exterior angles are at fractions greater than 1
* the periodic jump is at full wraparound to the start angle

angleToSignedPeriodicFraction(theta: Angle): number map an angle to a fractional coordinate which is:

the start angle is at fraction 0
the end angle is at fraction 1
interior angles are between 0 and 1
small negative for angles just "before" the start angle
more than one for angles just "after" the end angle
the periodic jump is at the middle of the "outside" interval

angleToUnboundedFraction(theta: Angle): number return the fractionalized position of the angle,
computed without consideration of 2PI period.

capLatitudeInPlace(): void Restrict start and end angles into the range (-90,+90) in degrees.
clone(): return a clone of this sweep.
cloneMinusRadians(radians: number): Return the angle obtained by subtracting radians from this angle.
fractionPeriod(): number return 2PI divided by the sweep radians (i.e.
fractionToAngle(fraction: number): Convert fractional position in the sweep to strongly typed Angle object.
fractionToRadians(fraction: number): number Convert fractional position in the sweep to radians.
interpolate(fraction: number, other: AngleSweep): Return a sweep with limits interpolated between this and other.
isAlmostEqual(other: AngleSweep): boolean test if start and end angles match with radians tolerance.
isAlmostEqualAllowPeriodShift(other: AngleSweep): boolean test if start and end angles match, with explicit name to clarify that there is no test for 360-degree shifts.
isAlmostEqualNoPeriodShift(other: AngleSweep): boolean test if start and end angles match, explicit name to clarify that 360-degree shifts are allowed.
isAngleInSweep(angle: Angle): boolean test if an angle is within the sweep
radiansArraytoPositivePeriodicFractions(data: GrowableFloat64Array): void Convert each value in an array from radians to fraction.
radiansToPositivePeriodicFraction(radians: number): number Convert a radians value to a fraction that is always positive and can wrap.
radiansToSignedPeriodicFraction(radians: number): number Convert a radians value to a fraction, allowing wraparound.
reverseInPlace(): void Reverse the start and end angle in place.
setFrom(other: AngleSweep): void copy from other AngleSweep.
setFromJSON(json?: any): void set this AngleSweep from various sources:

* if json is undefined, a full-circle sweep is returned.

setStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360): void directly set the start and end angles in degrees
setStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI): void directly set the start and end angles in radians
toJSON(): any Convert an AngleSweep to a JSON object.
create360(startRadians?: number): Static create a full circle sweep (CCW).
createFullLatitude(): Static create a sweep from the south pole to the north pole.
createStartEnd(startAngle: Angle, endAngle: Angle, result?: AngleSweep): Static create an angle sweep from strongly typed start and end angles
createStartEndDegrees(startDegrees: number = 0, endDegrees: number = 360, result?: AngleSweep): Static create an AngleSweep from start and end angles given in degrees.
createStartEndRadians(startRadians: number = 0, endRadians: number = 2.0 * Math.PI, result?: AngleSweep): Static create an AngleSweep from start and end angles given in radians.
createStartSweep(startAngle: Angle, sweepAngle: Angle, result?: AngleSweep): Static Create an angle sweep with limits given as (strongly typed) angles for start and sweep
createStartSweepDegrees(startDegrees: number = 0, sweepDegrees: number = 360, result?: AngleSweep): Static create an AngleSweep from start and sweep given in degrees.
createStartSweepRadians(startRadians: number = 0, sweepRadians: number = Math.PI, result?: AngleSweep): Static create an AngleSweep from start and end angles given in radians.
fromJSON(json?: AngleSweepProps): Static create an AngleSweep from a json object.

### Properties

Name Type Description
endAngle Accessor ReadOnly Return the (strongly typed) end angle
endDegrees Accessor ReadOnly number Read-property for degrees at the end of this AngleSweep.
endRadians Accessor ReadOnly number Read-property for degrees at the end of this AngleSweep.
isCCW Accessor ReadOnly boolean Ask if the sweep is counterclockwise, i.e.
isFullCircle Accessor ReadOnly boolean Ask if the sweep is a full circle.
isFullLatitudeSweep Accessor ReadOnly boolean Ask if the sweep is a full sweep from south pole to north pole.
startAngle Accessor ReadOnly Return the (strongly typed) start angle
startDegrees Accessor ReadOnly number Read-property for degrees at the start of this AngleSweep.
startRadians Accessor ReadOnly number Read-property for degrees at the start of this AngleSweep.
sweepDegrees Accessor ReadOnly number Read-property for signed start-to-end sweep in degrees.