#### Dirac

##### 22710180

JASS:

```
library Loc /* v1.1.0
*/uses/*
*/ LinkedListModule /* thehelper.net/forums/showthread.php/168775-LinkedListModule
Replacement of the Location native.
***********************************************************************
*
* struct Loc
*
* readonly real x
* readonly real y
* readonly real z
* - These 3 read-only variables are the Loc's coordinates
*
* static method create takes real x, real y, real z returns Loc
* - Creates a new Loc with the given coordinates.
* method destroy takes nothing returns nothing
* - Deallocates the Loc.
*
* method move takes real x, real y, real z returns nothing
* - Assigns the Loc new coordinates.
*
* static method join takes Loc A, Loc B returns nothing
* - Joins two Locs together. You can join multiple Locs
* method disjoint takes nothing returns nothing
* - Breaks the joint of the given Loc.
*
* These 4 read-only members store the relation between
* two Locs. Can be set manually using the "get" methods
* or automatically using the join method.
* readonly real angle
* - The angle between the Locs in the XY plane.
* readonly real distance
* - The distance between the Locs in the XY plane.
* readonly real slope
* - The relation between the height difference of the
* - two Locs and the distance between them
* readonly real zangle
* - The angle of the Locs in the Z plane.
* readonly real modulo
* - The distance between the Locs in the XYZ plane.
*
* method angleGet takes Loc fromWhatLoc returns nothing
* method distanceGet takes Loc fromWhatLoc returns nothing
* method slopeGet takes Loc fromWhatLoc returns nothing
* - Sets the respective member to the required value.
*
**********************************************************************/
struct Loc extends array
implement LinkedList
readonly static location point = Location(0,0)
readonly real x
readonly real y
readonly real z
readonly real angle
readonly real distance
readonly real slope
method operator zangle takes nothing returns real
return Atan(slope)
endmethod
method operator modulo takes nothing returns real
return distance/Cos(zangle)
endmethod
method angleGet takes Loc v returns real
set angle = Atan2(y-v.y,x-v.x)
return angle
endmethod
method distanceGet takes Loc v returns real
set distance = SquareRoot((v.x-x)*(v.x-x)+(v.y-y)*(v.y-y))
return distance
endmethod
method slopeGet takes Loc v returns real
set slope = (v.z-z)/distance
return slope
endmethod
method calculate takes Loc v returns nothing
call this.angleGet(v)
call this.distanceGet(v)
call this.slopeGet(v)
endmethod
private method refresh takes nothing returns nothing
local thistype exit = this
loop
set this = next
exitwhen this == exit
call exit.calculate(this)
set angle = exit.angle+bj_PI
set distance = exit.distance
set slope = -exit.slope
endloop
endmethod
static method join takes Loc A, Loc B returns nothing
set A.next.prev = B.prev
set B.prev.next = A.next
set A.next = B
set B.prev = A
call A.refresh()
endmethod
method disjoint takes nothing returns nothing
call this.removeNode()
endmethod
method move takes real sx, real sy, real sz returns nothing
call MoveLocation(point,sx,sy)
set x = sx
set y = sy
set z = sz+GetLocationZ(point)
call this.refresh()
endmethod
static method create takes real sx, real sy, real sz returns thistype
local thistype this = createNode()
call this.move(sx,sy,sz)
return this
endmethod
method destroy takes nothing returns nothing
call this.removeNode()
call this.deallocate()
endmethod
endstruct
endlibrary
```