Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
better vector handling
  • Loading branch information
kristianmandrup committed May 6, 2011
1 parent 12ef60c commit 4d9fdad
Show file tree
Hide file tree
Showing 12 changed files with 372 additions and 211 deletions.
1 change: 1 addition & 0 deletions lib/geo_magic.rb
Expand Up @@ -10,6 +10,7 @@ module GeoMagic
require 'geo_magic/remote'
require 'geo_magic/calculate'
require 'geo_magic/distance'
require 'geo_magic/direction'
require 'geo_magic/radius'
require 'geo_magic/vector'
require 'geo_magic/meta'
Expand Down
12 changes: 10 additions & 2 deletions lib/geo_magic/distance.rb
@@ -1,6 +1,6 @@
require 'geo_magic/calculate'
require 'geo_magic/distance/class_methods'
require 'geo_magic/distance/vector'
require 'geo_magic/vector/distance_vector'
require 'geo_magic/distance/formula'
require 'geo_magic/distance/point_distance'
require 'geo_magic/distance/points_distance'
Expand Down Expand Up @@ -43,7 +43,15 @@ def #{op} dist_unit
end
}
end


# from(@low_left, :NW)
def from point, direction
raise ArgumentError, "Invalid direction: #{direction}" if !valid_directions.include?(direction)
raise ArgumentError, "First argument must be a GeoMagic::Point, was: #{point}" if !point.kind_of?(GeoMagic::Point)
vector = GeoMagic::Vector.in_direction(direction, self)
point.move_vector(vector)
end

def number
distance.round_to(precision[unit])
end
Expand Down
124 changes: 0 additions & 124 deletions lib/geo_magic/distance/vector.rb

This file was deleted.

4 changes: 2 additions & 2 deletions lib/geo_magic/radius/rectangular.rb
Expand Up @@ -4,8 +4,8 @@ class RectangularRadius < Radius

def initialize center_point, vector_distance
super center_point
vector_distance = GeoMagic::Distance::Vector.create_from vector_distance
raise ArgumentError, "#{self.class} radius distance must be a Distance::Vector with lat and long distance" if !vector_distance.kind_of? GeoMagic::Distance::Vector
vector_distance = GeoMagic::DistanceVector.create_from vector_distance
raise ArgumentError, "#{self.class} radius distance must be a GeoMagic::DistanceVector with lat and long distance" if !vector_distance.kind_of? GeoMagic::DistanceVector
@vector_distance = vector_distance
end

Expand Down
92 changes: 12 additions & 80 deletions lib/geo_magic/vector.rb
@@ -1,85 +1,17 @@
module GeoMagic
class Vector
attr_accessor :p0, :p1

def initialize p0, p1
raise ArgumentError, "Vector must be initialized with a start end ending point, was: #{p0}, #{p1}" if ![p0, p1].are_points?
@p0 = p0
@p1 = p1
end

def self.create_at center, vector
new center, center.move_vector(vector)
end

def length type = nil
rad_dist = case type
when nil
GeoMagic::Distance.distance(p0, p1)
when :latitude
(p0.latitude - p1.latitude).abs
when :longitude
(p0.longitude - p1.longitude).abs
else
raise ArgumentError, "Bad argument for calculating lenght, valid args are: nil, :latitude or :longitude"
class Vector
# The vector from the origin O = (0,0) to the point A = (2,3) is simply written as (2,3).
def apply_to arg
def apply_to arg
raise ArgumentError, "Argument must be a GeoMagic::Point or a GeoMagic::PointVector" if !arg.any_kind_of?(GeoMagic::Vector, GeoMagic::PointVector)
case arg
when GeoMagic::Point
when GeoMagic::PointVector
end
end
d = GeoMagic::Distance.new rad_dist, :radians
d.lat_factor = p0.middle_point(p1).latitude_factor if type == :latitude
d
end

def lat_distance
length(:latitude).in_radians
end

def long_distance
length(:longitude).in_radians
end

def vector_distance
GeoMagic::Distance::Vector.new length(:latitude), length(:longitude), :lat_factor => lat_factor
end

def lat_factor
p0.middle_point(p1).latitude_factor
end

# distance between points p0 and p1 that define the vector

def distance unit = :radians
dist = ::GeoMagic::Distance.calculate p0, p1
unit != :radians ? dist[unit] : dist
end

def distance_from center, unit = :meters
point = center.move delta_latitude, delta_longitude
dist = ::GeoMagic::Distance.calculate center, point
unit != :radians ? dist[unit] : dist
end

def [] key
case key
when 0, :p0
p0
when 1, :p1
p1
else
raise "Vector key must be either 0/1 or :p0/:p1"
end
end

protected

def connection_length
Math.sqrt((delta_longitude + delta_latitude).abs)
end

def delta_longitude
(p0.longitude - p1.longitude)**2
end

def delta_latitude
(p0.latitude - p1.latitude)**2
end
end
end

require 'geo_magic/vector/point_vector'
require 'geo_magic/vector/direction_vector'
59 changes: 59 additions & 0 deletions lib/geo_magic/vector/direction_vector.rb
@@ -0,0 +1,59 @@
module GeoMagic
module Direction
class Vector < GeoMagic::Vector
attr_accessor :direction, :distance

def initialize direction, distance
raise ArgumentError, "Invalid direction: #{direction}" if !valid_directions.include?(direction)
raise ArgumentError, "First argument must be a GeoMagic::Distance, was: #{distance}" if !distance.kind_of?(GeoMagic::Distance)
@direction = direction
@distance = distance
end

def self.valid_directions
[:north, :south, :east, :west, :NW, :NE, :SW, :SE]
end

def to_point_vector
GeoMagic::PointVector.from_origin calc_point
end

def apply_to arg
raise ArgumentError, "Argument must be a GeoMagic::Point or a GeoMagic::PointVector" if !arg.any_kind_of?(GeoMagic::Vector, GeoMagic::PointVector)
case arg
when GeoMagic::Point
when GeoMagic::PointVector
end
end

protected

def calc_point
va = 45
c = distance
a = c * 0.7071067770164218 # Math.sin(45 * Math.PI / 180);
b = Math.sqrt((c * c) - (a * a));

lat, lng = case direction
when :north
[0, -distance]
when :south
[0, distance]
when :west
[-distance, 0]
when :east
[distance, 0]
when :NW
[a, b]
when :SW
[a, -b]
when :NE
[-a, b]
when :SE
[-a, -b]
end
GeoMagic::Point.new lat, lng
end
end
end
end

0 comments on commit 4d9fdad

Please sign in to comment.