class Vector
# 2つの位置ベクトルで表される点の間の距離を返す
@distance: (pos1, pos2) ->
Math.sqrt((pos1.x - pos2.x) * (pos1.x - pos2.x) +
(pos1.y - pos2.y) * (pos1.y - pos2.y))
constructor: (@x, @y) ->
set: (x, y) -> @x = x; @y = y; return
toString: -> "(#{@x}, #{@y})"
# 自身と同じ内容のVectorオブジェクトを生成して返す
getClone: -> new Vector(@x, @y)
# ベクトルの絶対値(長さ)
abs: -> Math.sqrt(@x * @x + @y * @y)
# ベクトルとスカラーの乗除算
# 以降のメソッド群でも、Eqがついていれば元のオブジェクトを変更し、
# Eqがついていなければ新しいベクトルを生成して返す
times: (a) -> new Vector(@x * a, @y * a)
timesEq: (a) -> @x *= a; @y *= a; return
div: (a) -> new Vector(@x / a, @y / a)
divEq: (a) -> @x /= a; @y /= a; return
# ベクトル同士の加減算
plus: (other) -> new Vector(@x + other.x, @y + other.y)
plusEq: (other) -> @x += other.x; @y += other.y; return
minus: (other) -> new Vector(@x - other.x, @y - other.y)
minusEq: (other) -> @x -= other.x; @y -= other.y; return
# 2つのベクトルの内席となす角
inprod: (other) -> @x * other.x + @y * other.y
ang: (other) -> Math.acos(@inprod(other) / @.abs() / other.abs())
# 単位ベクトル、逆ベクトル、直交ベクトルを返す
getUnit: -> a = @abs(); new Vector(@x / a, @y / a)
getInverse: -> new Vector(-@x, -@y)
getOrthogonalR: -> new Vector(@y, -@x)
getOrthogonalL: -> new Vector(-@y, @x)
getUnitOrthogonalR: -> a = @abs(); new Vector(@y / a, -@x / a)
getUnitOrthogonalL: -> a = @abs(); new Vector(-@y / a, @x / a)
# このVectorが引数のVectorの向きに対してどちらに向いているか
isHeadingToRightOf: (other) ->
if @x * other.y - @y * other.x >=0 then true else false
isHeadingToLeftOf: (other) -> return not @isHeadingToRightOf(other)
# 以下、Vectorを位置ベクトルと考えたときのMovingAgentとの位置関係
#
# Vectorの位置がMovingAgentの前方か
isInFrontOf: (movingAgent) ->
inprod = movingAgent.v.x * (@x - movingAgent.pos.x) +
movingAgent.v.y * (@y - movingAgent.pos.y)
if inprod >= 0 then true else false
# Vectorの位置がMovingAgentの後方か
isInTheRearOf: (movingAgent) -> not @isInFrontOf(movingAgent)
# Vectorの位置がMovingAgentの右方か
isOnTheRightOf: (movingAgent) ->
inprod = (@x - movingAgent.pos.x) * movingAgent.v.y -
(@y - movingAgent.pos.y) * movingAgent.v.x
if inprod >= 0 then true else false
# Vectorの位置がMovingAgentの左方か
isOnTheLeftOf: (movingAgent) -> not @isOnTheRightOf(movingAgent)