class Disp3D::NodeArrows
Public Class Methods
new(geom, name = nil)
click to toggle source
Calls superclass method
# File lib/node/node_arrows.rb, line 7 def initialize(geom, name = nil) Util3D.check_arg_type(Symbol, name, true) Util3D.check_arg_type(GMath3D::FiniteLine, geom, false, true) super @width = 1.0 end
Protected Instance Methods
draw_element()
click to toggle source
# File lib/node/node_arrows.rb, line 15 def draw_element if(@geom) GL.LineWidth(@width) draw_color GL.Begin(GL::LINES) if(@geom.kind_of?(GMath3D::FiniteLine)) draw_element_inner(@geom) elsif(@geom.kind_of?(Array)) @geom.each_with_index do |line, i| draw_colors(i) draw_element_inner(line) end else raise end GL.End() end end
draw_element_inner(line)
click to toggle source
# File lib/node/node_arrows.rb, line 34 def draw_element_inner(line) start_point = line.start_point end_point = line.end_point GL.Vertex( start_point.x, start_point.y, start_point.z ) GL.Vertex( end_point.x, end_point.y, end_point.z ) # draw arrow head! head_angle = 15.0 ; head_ratio = 0.2 ; vector = line.direction orh = vector.arbitrary_orthogonal orh2 = vector.cross(orh) orh2 = orh2.normalize body_length = vector.length orh_length = body_length*Math.tan(head_angle*Math::PI/180.0) head_vec1 = Vector3.new( -vector.x + orh.x*orh_length, -vector.y + orh.y*orh_length, -vector.z + orh.z*orh_length ) head_vec2 = Vector3.new( -vector.x + orh2.x*orh_length, -vector.y + orh2.y*orh_length, -vector.z + orh2.z*orh_length ) head_vec3 = Vector3.new( -vector.x - orh.x*orh_length, -vector.y - orh.y*orh_length, -vector.z - orh.z*orh_length ) head_vec4 = Vector3.new( -vector.x - orh2.x*orh_length, -vector.y - orh2.y*orh_length, -vector.z - orh2.z*orh_length ) head_bases = Array.new(4) head_bases[0] = Vector3.new( end_point.x + head_vec1.x*head_ratio, end_point.y + head_vec1.y*head_ratio, end_point.z + head_vec1.z*head_ratio ) head_bases[1] = Vector3.new( end_point.x + head_vec2.x*head_ratio, end_point.y + head_vec2.y*head_ratio, end_point.z + head_vec2.z*head_ratio ) head_bases[2] = Vector3.new( end_point.x + head_vec3.x*head_ratio, end_point.y + head_vec3.y*head_ratio, end_point.z + head_vec3.z*head_ratio ) head_bases[3] = Vector3.new( end_point.x + head_vec4.x*head_ratio, end_point.y + head_vec4.y*head_ratio, end_point.z + head_vec4.z*head_ratio ) head_bases.each do | head_base | GL.Vertex( head_base.x, head_base.y, head_base.z ) GL.Vertex( end_point.x, end_point.y, end_point.z ) end arrow_size_minus = head_bases.size - 1 arrow_size_minus.times do |i| GL.Vertex( head_bases[i ].x, head_bases[i ].y, head_bases[i ].z ) GL.Vertex( head_bases[i+1].x, head_bases[i+1].y, head_bases[i+1].z ) end GL.Vertex( head_bases[arrow_size_minus].x, head_bases[arrow_size_minus].y, head_bases[arrow_size_minus].z ) GL.Vertex( head_bases[0].x, head_bases[0].y, head_bases[0].z ) end