Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'matrix'
- class Point
- attr_accessor :x, :y, :more_distant_points, :distance_at_points
- def initialize(x = 0.0, y = 0.0)
- @x = x
- @y = y
- #[ [Point,distance], [Point,distance], [Point,distance] ]
- @more_distant_points = Array.new(3)
- @distance_at_points = Array.new(3,-1)
- end
- def distance( point )
- sum_of_squares = ( point.x - @x ) ** 2
- sum_of_squares += ( point.y - @y) ** 2
- return_value = Math.sqrt(sum_of_squares)
- update_distances(point, return_value)
- return_value
- end
- def update_distances(point, distance)
- if distance > @distance_at_points[0]
- old_point = @more_distant_points[0]
- old_distance = @distance_at_points[0]
- @distance_at_points[0] = distance
- @more_distant_points[0] = point
- update_distances(old_point, old_distance)
- elsif distance > @distance_at_points[1]
- old_point = @more_distant_points[1]
- old_distance = @distance_at_points[1]
- @distance_at_points[1] = distance
- @more_distant_points[1] = point
- update_distances(old_point, old_distance)
- elsif distance > @distance_at_points[2]
- @distance_at_points[2] = distance
- @more_distant_points[2] = point
- end
- end
- def to_s
- content = '('+ @x.to_s + ', ' + @y.to_s + ')'
- end
- end
- class Matrix
- def []=(i, j, x)
- @rows[i][j] = x
- end
- def to_readable
- i = 0
- content = ''
- self.each do |number|
- content += number.to_s + "\t"
- i+= 1
- if i == self.column_size
- content+= "\n"
- i = 0
- end
- end
- content
- end
- end
- puntos = Array.new
- File.open("in", "r") do |f|
- f.each_line do |line|
- x_coord = line[/[-+]?[0-9]*\.?[0-9]*/].to_f
- y_coord = line[/[-+]?[0-9]*\.?[0-9]*$/].to_f
- puntos << Point.new(x_coord, y_coord)
- end
- end
- m = Matrix.empty(puntos.size, 0) * Matrix.empty(0, puntos.size)
- m.each_with_index do |e, row, col|
- m[row,col] = puntos[row].distance(puntos[col]).round(4)
- end
- resultado = m.to_readable
- resultado += "\nPunto \t\tp1 \t\tp2 \t\tp3"
- puntos.each do |p|
- resultado += "\n" + p.to_s
- p.more_distant_points.each do |q|
- resultado += "\t" + q.to_s
- end
- end
- File.write('out', resultado + "\n")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement