| Class | AppMath::Graph |
| In: |
graph.rb
|
| Parent: | Object |
class for representing a ‘window to the real world’ With the x-direction there is associated a real interval, and with the y-directon there is also associated a real interval. With hese intervals there are associated integer numbers width and height, which govern the ‘pixelation’ of these intervals.
| bgr_color | [R] | |
| fac | [RW] | |
| grid_color | [RW] | |
| n_div | [RW] | |
| text_color | [RW] |
# File graph.rb, line 39
39: def initialize(parent,nx,ny,iv_x,iv_y)
40: @fac = R.c 1.04
41: @bgr_color = 'lightgreen'
42: @n_div = 5
43: @grid_color = 'darkgray'
44: @text_color = 'black'
45:
46: @parent = parent
47: @w = nx
48: @h = ny
49: set_size_x!(iv_x)
50: set_size_y!(iv_y)
51: # sets @a, @b, @c, @d, @ivx, @ivy
52: col = @bgr_color
53: @canvas = TkCanvas.new(parent){
54: width nx
55: height ny
56: background col
57: }
58: @canvas.pack
59: end
# File graph.rb, line 65
65: def clear(color=@bgr_color)
66: magic = 2 # not expected to need this
67: TkcRectangle.new(@canvas, 0, 0, @w + magic, @h + magic,
68: 'width'=> 0, 'fill' => color)
69: end
# File graph.rb, line 89
89: def draw(arr_x, arr_y, color, auto_adjust = true)
90: # clear(@bgr_color)
91: nx = arr_x.length
92: ny = arr_y.length
93: n = Basics.inf(nx,ny)
94: if auto_adjust
95: ivx_e = Iv.from_array(arr_x) * @fac # the values to be shown
96: # should stay a bit apat from the rim of the diagram
97: ivy_e = Iv.from_array(arr_y) * @fac
98: divx = ivx_e.axis_division(@n_div)
99: divy = ivy_e.axis_division(@n_div)
100: d_x = divx[0]
101: d_y = divy[0]
102: v_x = divx[1]
103: v_y = divy[1]
104: ivxNew = Iv.new(v_x.first, v_x.last)
105: ivyNew = Iv.new(v_y.first, v_y.last)
106: set_size_x!(ivxNew)
107: set_size_y!(ivyNew)
108: grid_x(v_x, grid_color)
109: grid_y(v_y, grid_color)
110: end
111:
112: for i in 1...n
113: xa = arr_x[i-1]
114: xb = arr_x[i]
115: ya = arr_y[i-1]
116: yb = arr_y[i]
117: pa = ipos(xa,ya)
118: pb = ipos(xb,yb)
119: line = TkcLine.new(@canvas,pa[0],pa[1],pb[0],pb[1])
120: line.fill(color)
121: end
122: if @bgr_color != @text_color # only then writing the text works, and
123: # so we have a method to avoid writing text
124: # some magic numbers here
125: t_x = (@w * 0.1).to_i
126: t_y = (@h * 0.1).to_i
127: t_w = (@w * 0.75).to_i
128: t_h = (@h * 0.02).to_i
129: t_h = Basics.sup(t_h,10)
130:
131: font_text = "LucidaConsole "+t_h.to_s
132:
133: xl = @ivx.low.to_s
134: xu = @ivx.upp.to_s
135: yl = @ivy.low.to_s
136: yu = @ivy.upp.to_s
137:
138: x_text=xl + " < x < " + xu + " , dx_grid = " + d_x.to_s
139: y_text=yl + " < y < " + yu + " , dy_grid = " + d_y.to_s
140: full_text = x_text + "\n\n" + y_text
141:
142: txt=TkcText.new(@canvas,t_x,t_y){
143: anchor "nw"
144: width t_w
145: text full_text
146: font font_text
147: }
148: txt.fill(@text_color)
149: end
150: end
# File graph.rb, line 152
152: def draw_func(f, n, color = 'red', auto_adjust_y = true)
153: xi = @ivx.low
154: arr_x = Array.new(n, xi)
155: dx = @ivx.size/(n - 1.0)
156: arr_y = Array.new(n, 0.0)
157: for i in 0...n
158: arr_x[i] = xi
159: yi = f.at(xi)
160: arr_y[i] = yi.to_f
161: xi += dx
162: end
163: draw(arr_x, arr_y, color, auto_adjust_y)
164: end
# File graph.rb, line 71
71: def grid_x(anArray, color=@grid_color)
72: anArray.each{ |x|
73: pa = ipos(x,@ivy.low)
74: pb = ipos(x,@ivy.upp)
75: line = TkcLine.new(@canvas,pa[0],pa[1],pb[0],pb[1])
76: line.fill(color)
77: }
78: end
# File graph.rb, line 80
80: def grid_y(anArray, color=@grid_color)
81: anArray.each{ |y|
82: pa = ipos(@ivx.low,y)
83: pb = ipos(@ivx.upp,y)
84: line = TkcLine.new(@canvas,pa[0],pa[1],pb[0],pb[1])
85: line.fill(color)
86: }
87: end
# File graph.rb, line 170
170: def set_size_x!(aIv)
171: @ivx = aIv
172: @b = (@w - 1.0)/@ivx.size
173: @a = -@b * @ivx.low
174: end