plplot 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +115 -0
- data/examples/x01.rb +284 -0
- data/examples/x02.rb +134 -0
- data/examples/x03.rb +81 -0
- data/examples/x04.rb +98 -0
- data/examples/x05.rb +33 -0
- data/examples/x06.rb +62 -0
- data/examples/x07.rb +69 -0
- data/examples/x08.rb +179 -0
- data/examples/x09.rb +371 -0
- data/examples/x10.rb +29 -0
- data/examples/x11.rb +151 -0
- data/examples/x12.rb +65 -0
- data/examples/x13.rb +86 -0
- data/examples/x14.rb +391 -0
- data/examples/x15.rb +266 -0
- data/examples/x16.rb +349 -0
- data/examples/x18.rb +146 -0
- data/examples/x20.rb +360 -0
- data/examples/x21.rb +280 -0
- data/examples/x22.rb +242 -0
- data/examples/x23.rb +361 -0
- data/examples/x24.rb +126 -0
- data/examples/x25.rb +114 -0
- data/examples/x26.rb +180 -0
- data/examples/x27.rb +124 -0
- data/examples/x28.rb +369 -0
- data/examples/x30.rb +141 -0
- data/examples/x31.rb +238 -0
- data/examples/x32.rb +159 -0
- data/ext/depend +1 -0
- data/ext/extconf.rb +75 -0
- data/ext/rbplplot.c +4982 -0
- data/lib/plplot.rb +101 -0
- metadata +115 -0
data/examples/x25.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true if $0 == __FILE__
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'plplot'
|
6
|
+
include PLplot
|
7
|
+
|
8
|
+
# Filling and clipping polygons.
|
9
|
+
|
10
|
+
#--------------------------------------------------------------------------
|
11
|
+
# Test program for filling polygons and proper clipping
|
12
|
+
#--------------------------------------------------------------------------
|
13
|
+
|
14
|
+
# Parse and process command line arguments
|
15
|
+
|
16
|
+
PLOptionParser.parse!
|
17
|
+
|
18
|
+
# Initialize plplot
|
19
|
+
|
20
|
+
plssub(3, 3)
|
21
|
+
plinit
|
22
|
+
|
23
|
+
xextreme = [
|
24
|
+
[-120.0, 120.0],
|
25
|
+
[-120.0, 120.0],
|
26
|
+
[-120.0, 120.0],
|
27
|
+
[ -80.0, 80.0],
|
28
|
+
[-220.0, -120.0],
|
29
|
+
[- 20.0, 20.0],
|
30
|
+
[ -20.0, 20.0],
|
31
|
+
[ -80.0, 80.0],
|
32
|
+
[ 20.0, 120.0]
|
33
|
+
]
|
34
|
+
|
35
|
+
yextreme = [
|
36
|
+
[-120.0, 120.0],
|
37
|
+
[ 20.0, 120.0],
|
38
|
+
[ -20.0, 120.0],
|
39
|
+
[ -20.0, 120.0],
|
40
|
+
[-120.0, 120.0],
|
41
|
+
[-120.0, 120.0],
|
42
|
+
[ -20.0, 20.0],
|
43
|
+
[ -80.0, 80.0],
|
44
|
+
[-120.0, 120.0],
|
45
|
+
]
|
46
|
+
|
47
|
+
|
48
|
+
2.times do |k|
|
49
|
+
4.times do |j|
|
50
|
+
x0 = []
|
51
|
+
y0 = []
|
52
|
+
if (j == 0)
|
53
|
+
# Polygon 1: a diamond
|
54
|
+
x0[0] = 0; y0[0] = -100
|
55
|
+
x0[1] = -100; y0[1] = 0
|
56
|
+
x0[2] = 0; y0[2] = 100
|
57
|
+
x0[3] = 100; y0[3] = 0
|
58
|
+
elsif (j == 1)
|
59
|
+
# Polygon 1: a diamond - reverse direction
|
60
|
+
x0[3] = 0; y0[3] = -100
|
61
|
+
x0[2] = -100; y0[2] = 0
|
62
|
+
x0[1] = 0; y0[1] = 100
|
63
|
+
x0[0] = 100; y0[0] = 0
|
64
|
+
npts = 4
|
65
|
+
elsif (j == 2)
|
66
|
+
# Polygon 2: a square with punctures
|
67
|
+
x0[0] = -100; y0[0] = -100
|
68
|
+
x0[1] = -100; y0[1] = -80
|
69
|
+
x0[2] = 80; y0[2] = 0
|
70
|
+
x0[3] = -100; y0[3] = 80
|
71
|
+
x0[4] = -100; y0[4] = 100
|
72
|
+
x0[5] = -80; y0[5] = 100
|
73
|
+
x0[6] = 0; y0[6] = 80
|
74
|
+
x0[7] = 80; y0[7] = 100
|
75
|
+
x0[8] = 100; y0[8] = 100
|
76
|
+
x0[9] = 100; y0[9] = -100
|
77
|
+
elsif (j == 3)
|
78
|
+
# Polygon 2: a square with punctures - reversed direction
|
79
|
+
x0[9] = -100; y0[9] = -100
|
80
|
+
x0[8] = -100; y0[8] = -80
|
81
|
+
x0[7] = 80; y0[7] = 0
|
82
|
+
x0[6] = -100; y0[6] = 80
|
83
|
+
x0[5] = -100; y0[5] = 100
|
84
|
+
x0[4] = -80; y0[4] = 100
|
85
|
+
x0[3] = 0; y0[3] = 80
|
86
|
+
x0[2] = 80; y0[2] = 100
|
87
|
+
x0[1] = 100; y0[1] = 100
|
88
|
+
x0[0] = 100; y0[0] = -100
|
89
|
+
end
|
90
|
+
|
91
|
+
xextreme.each_index do |i|
|
92
|
+
pladv(0)
|
93
|
+
plvsta
|
94
|
+
plwind(xextreme[i][0], xextreme[i][1], yextreme[i][0], yextreme[i][1])
|
95
|
+
|
96
|
+
plcol0(2)
|
97
|
+
plbox("bc", 1.0, 0, "bcnv", 10.0, 0)
|
98
|
+
plcol0(1)
|
99
|
+
plpsty(0)
|
100
|
+
if (k == 0)
|
101
|
+
plfill(x0, y0)
|
102
|
+
else
|
103
|
+
plgradient(x0, y0, 45)
|
104
|
+
end
|
105
|
+
plcol0(2)
|
106
|
+
pllsty(1)
|
107
|
+
plline(x0, y0)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# Don't forget to call plend to finish off!
|
113
|
+
|
114
|
+
plend
|
data/examples/x26.rb
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
$-w = true if $0 == __FILE__
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'plplot'
|
7
|
+
include PLplot
|
8
|
+
include Math
|
9
|
+
|
10
|
+
# Multi-lingual version of the first page of example 4.
|
11
|
+
#
|
12
|
+
# Copyright (C) 2006 Alan Irwin
|
13
|
+
# Copyright (C) 2006 Andrew Ross
|
14
|
+
#
|
15
|
+
# Thanks to the following for providing translated strings for this example:
|
16
|
+
# Valery Pipin (Russian)
|
17
|
+
#
|
18
|
+
# This file is part of PLplot.
|
19
|
+
#
|
20
|
+
# PLplot is free software; you can redistribute it and/or modify
|
21
|
+
# it under the terms of the GNU General Library Public License as published
|
22
|
+
# by the Free Software Foundation; either version 2 of the License, or
|
23
|
+
# (at your option) any later version.
|
24
|
+
#
|
25
|
+
# PLplot is distributed in the hope that it will be useful,
|
26
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
27
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
28
|
+
# GNU Library General Public License for more details.
|
29
|
+
#
|
30
|
+
# You should have received a copy of the GNU Library General Public License
|
31
|
+
# along with PLplot; if not, write to the Free Software
|
32
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
33
|
+
|
34
|
+
# This example designed just for devices (e.g., psttfc and the
|
35
|
+
# cairo-related devices) that use the pango and fontconfig libraries. The
|
36
|
+
# best choice of glyph is selected by fontconfig and automatically rendered
|
37
|
+
# by pango in way that is sensitive to complex text layout (CTL) language
|
38
|
+
# issues for each unicode character in this example. Of course, you must
|
39
|
+
# have the appropriate TrueType fonts installed to have access to all the
|
40
|
+
# required glyphs.
|
41
|
+
#
|
42
|
+
# Translation instructions: The strings to be translated are given by
|
43
|
+
# x_label, y_label, alty_label, title_label, and line_label below. The
|
44
|
+
# encoding used must be UTF-8.
|
45
|
+
#
|
46
|
+
# The following strings to be translated involve some scientific/mathematical
|
47
|
+
# jargon which is now discussed further to help translators.
|
48
|
+
#
|
49
|
+
# (1) dB is a decibel unit, see http://en.wikipedia.org/wiki/Decibel .
|
50
|
+
# (2) degrees is an angular measure, see
|
51
|
+
# http://en.wikipedia.org/wiki/Degree_(angle) .
|
52
|
+
# (3) low-pass filter is one that transmits (passes) low frequencies.
|
53
|
+
# (4) pole is in the mathematical sense, see
|
54
|
+
# http://en.wikipedia.org/wiki/Pole_(complex_analysis) . "Single Pole"
|
55
|
+
# means a particular mathematical transformation of the filter function has
|
56
|
+
# a single pole, see
|
57
|
+
# http://ccrma.stanford.edu/~jos/filters/Pole_Zero_Analysis_I.html .
|
58
|
+
# Furthermore, a single-pole filter must have an inverse square decline
|
59
|
+
# (or -20 db/decade). Since the filter plotted here does have that
|
60
|
+
# characteristic, it must by definition be a single-pole filter, see also
|
61
|
+
# http://www-k.ext.ti.com/SRVS/Data/ti/KnowledgeBases/analog/document/faqs/1p.htm
|
62
|
+
# (5) decade represents a factor of 10, see
|
63
|
+
# http://en.wikipedia.org/wiki/Decade_(log_scale) .
|
64
|
+
|
65
|
+
X_LABEL = [
|
66
|
+
"Frequency",
|
67
|
+
"Частота",
|
68
|
+
]
|
69
|
+
|
70
|
+
Y_LABEL = [
|
71
|
+
"Amplitude (dB)",
|
72
|
+
"Амплитуда (dB)",
|
73
|
+
]
|
74
|
+
|
75
|
+
ALTY_LABEL = [
|
76
|
+
"Phase shift (degrees)",
|
77
|
+
"Фазовый сдвиг (градусы)",
|
78
|
+
]
|
79
|
+
|
80
|
+
TITLE_LABEL = [
|
81
|
+
"Single Pole Low-Pass Filter",
|
82
|
+
"Однополюсный Низко-Частотный Фильтр",
|
83
|
+
]
|
84
|
+
|
85
|
+
LINE_LABEL = [
|
86
|
+
"-20 dB/decade",
|
87
|
+
"-20 dB/десяток",
|
88
|
+
]
|
89
|
+
|
90
|
+
# Makes transliteration from C example easier
|
91
|
+
def pow(a,b)
|
92
|
+
a ** b
|
93
|
+
end
|
94
|
+
|
95
|
+
#--------------------------------------------------------------------------
|
96
|
+
# plot1
|
97
|
+
#
|
98
|
+
# Log-linear plot.
|
99
|
+
#--------------------------------------------------------------------------
|
100
|
+
|
101
|
+
def plot1(type, x_label, y_label, alty_label, title_label, line_label)
|
102
|
+
|
103
|
+
pladv(0)
|
104
|
+
|
105
|
+
# Set up data for log plot
|
106
|
+
|
107
|
+
freql = NArray.float(101)
|
108
|
+
ampl = NArray.float(101)
|
109
|
+
phase = NArray.float(101)
|
110
|
+
|
111
|
+
f0 = 1.0
|
112
|
+
101.times do |i|
|
113
|
+
freql[i] = -2.0 + i / 20.0
|
114
|
+
freq = pow(10.0, freql[i])
|
115
|
+
ampl[i] = 20.0 * log10(1.0 / sqrt(1.0 + pow(freq / f0, 2)))
|
116
|
+
phase[i] = -(180 / PI) * atan(freq / f0)
|
117
|
+
end
|
118
|
+
|
119
|
+
plvpor(0.15, 0.85, 0.1, 0.9)
|
120
|
+
plwind(-2.0, 3.0, -80.0, 0.0)
|
121
|
+
|
122
|
+
# Try different axis and labelling styles.
|
123
|
+
|
124
|
+
plcol0(1)
|
125
|
+
case (type)
|
126
|
+
when 0
|
127
|
+
plbox("bclnst", 0.0, 0, "bnstv", 0.0, 0)
|
128
|
+
when 1
|
129
|
+
plbox("bcfghlnst", 0.0, 0, "bcghnstv", 0.0, 0)
|
130
|
+
end
|
131
|
+
|
132
|
+
# Plot ampl vs freq
|
133
|
+
|
134
|
+
plcol0(2)
|
135
|
+
plline(freql, ampl)
|
136
|
+
plcol0(1)
|
137
|
+
plptex(1.6, -30.0, 1.0, -20.0, 0.5, line_label)
|
138
|
+
|
139
|
+
# Put labels on
|
140
|
+
|
141
|
+
plcol0(1)
|
142
|
+
plmtex("b", 3.2, 0.5, 0.5, x_label)
|
143
|
+
plmtex("t", 2.0, 0.5, 0.5, title_label)
|
144
|
+
plcol0(2)
|
145
|
+
plmtex("l", 5.0, 0.5, 0.5, y_label)
|
146
|
+
|
147
|
+
# For the gridless case, put phase vs freq on same plot
|
148
|
+
|
149
|
+
if (type == 0)
|
150
|
+
plcol0(1)
|
151
|
+
plwind(-2.0, 3.0, -100.0, 0.0)
|
152
|
+
plbox("", 0.0, 0, "cmstv", 30.0, 3)
|
153
|
+
plcol0(3)
|
154
|
+
plline(freql, phase)
|
155
|
+
plcol0(3)
|
156
|
+
plmtex("r", 5.0, 0.5, 0.5, alty_label)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
#--------------------------------------------------------------------------
|
161
|
+
# Illustration of logarithmic axes, and redefinition of window.
|
162
|
+
#--------------------------------------------------------------------------
|
163
|
+
|
164
|
+
# Parse and process command line arguments
|
165
|
+
|
166
|
+
PLOptionParser.parse!
|
167
|
+
|
168
|
+
# Initialize plplot
|
169
|
+
|
170
|
+
plinit()
|
171
|
+
plfont(2)
|
172
|
+
|
173
|
+
# Make log plots using two different styles.
|
174
|
+
|
175
|
+
X_LABEL.each_index do |i|
|
176
|
+
plot1(i, X_LABEL[i], Y_LABEL[i], ALTY_LABEL[i], TITLE_LABEL[i],
|
177
|
+
LINE_LABEL[i])
|
178
|
+
end
|
179
|
+
|
180
|
+
plend
|
data/examples/x27.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true if $0 == __FILE__
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'plplot'
|
6
|
+
include PLplot
|
7
|
+
include NMath
|
8
|
+
|
9
|
+
# Drawing "spirograph" curves - epitrochoids, cycolids, roulettes
|
10
|
+
#
|
11
|
+
# Copyright (C) 2007 Arjen Markus
|
12
|
+
#
|
13
|
+
# This file is part of PLplot.
|
14
|
+
#
|
15
|
+
# PLplot is free software; you can redistribute it and/or modify
|
16
|
+
# it under the terms of the GNU General Library Public License as published
|
17
|
+
# by the Free Software Foundation; either version 2 of the License, or
|
18
|
+
# (at your option) any later version.
|
19
|
+
#
|
20
|
+
# PLplot is distributed in the hope that it will be useful,
|
21
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
22
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
23
|
+
# GNU Library General Public License for more details.
|
24
|
+
#
|
25
|
+
# You should have received a copy of the GNU Library General Public License
|
26
|
+
# along with PLplot; if not, write to the Free Software
|
27
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
28
|
+
|
29
|
+
def cycloid
|
30
|
+
# TODO
|
31
|
+
end
|
32
|
+
|
33
|
+
NPNT = 20000
|
34
|
+
|
35
|
+
def spiro(params)
|
36
|
+
|
37
|
+
# Fill the coordinates
|
38
|
+
|
39
|
+
windings = params[3].to_i
|
40
|
+
steps = NPNT / windings
|
41
|
+
dphi = 8.0 * acos(-1.0) / steps
|
42
|
+
|
43
|
+
p01 = params[0] - params[1]
|
44
|
+
npnt = windings * steps + 1
|
45
|
+
phi = NArray.float(npnt).indgen!.mul!(dphi)
|
46
|
+
phiw = NArray.float(npnt).indgen!.mul!(dphi * p01 / params[1])
|
47
|
+
xcoord = cos(phi).mul!(p01) + cos(phiw).mul!(params[2])
|
48
|
+
ycoord = sin(phi).mul!(p01) - sin(phiw).mul!(params[2])
|
49
|
+
|
50
|
+
xmin = xcoord.min
|
51
|
+
xmax = xcoord.max
|
52
|
+
ymin = ycoord.min
|
53
|
+
ymax = ycoord.max
|
54
|
+
|
55
|
+
if (xmax - xmin > ymax - ymin)
|
56
|
+
scale = xmax - xmin
|
57
|
+
else
|
58
|
+
scale = ymax - ymin
|
59
|
+
end
|
60
|
+
xmin = -0.65 * scale
|
61
|
+
xmax = 0.65 * scale
|
62
|
+
ymin = -0.65 * scale
|
63
|
+
ymax = 0.65 * scale
|
64
|
+
|
65
|
+
plwind(xmin, xmax, ymin, ymax)
|
66
|
+
|
67
|
+
plcol0(1)
|
68
|
+
plline(xcoord, ycoord)
|
69
|
+
end
|
70
|
+
|
71
|
+
#--------------------------------------------------------------------------
|
72
|
+
# Generates two kinds of plots:
|
73
|
+
# - construction of a cycloid (animated)
|
74
|
+
# - series of epitrochoids and hypotrochoids
|
75
|
+
#--------------------------------------------------------------------------
|
76
|
+
|
77
|
+
# R, r, p, N
|
78
|
+
params = [
|
79
|
+
[21.0, 7.0, 7.0, 3.0], # Deltoid
|
80
|
+
[21.0, 7.0, 10.0, 3.0],
|
81
|
+
[21.0, -7.0, 10.0, 3.0],
|
82
|
+
[20.0, 3.0, 7.0, 20.0],
|
83
|
+
[20.0, 3.0, 10.0, 20.0],
|
84
|
+
[20.0, -3.0, 10.0, 20.0],
|
85
|
+
[20.0, 13.0, 7.0, 20.0],
|
86
|
+
[20.0, 13.0, 20.0, 20.0],
|
87
|
+
[20.0, -13.0, 20.0, 20.0]
|
88
|
+
]
|
89
|
+
|
90
|
+
# Parse and process command line arguments
|
91
|
+
|
92
|
+
PLOptionParser.parse!
|
93
|
+
|
94
|
+
# Initialize plplot
|
95
|
+
|
96
|
+
plinit
|
97
|
+
|
98
|
+
# Illustrate the construction of a cycloid
|
99
|
+
|
100
|
+
cycloid
|
101
|
+
|
102
|
+
# Loop over the various curves
|
103
|
+
# First an overview, then all curves one by one
|
104
|
+
|
105
|
+
plssub(3, 3) # Three by three window
|
106
|
+
|
107
|
+
9.times do |i|
|
108
|
+
pladv(0)
|
109
|
+
plvpor(0.0, 1.0, 0.0, 1.0)
|
110
|
+
spiro(params[i])
|
111
|
+
end
|
112
|
+
|
113
|
+
pladv(0)
|
114
|
+
plssub(1, 1) # One window per curve
|
115
|
+
|
116
|
+
9.times do |i|
|
117
|
+
pladv(0)
|
118
|
+
plvpor(0.0, 1.0, 0.0, 1.0)
|
119
|
+
spiro(params[i])
|
120
|
+
end
|
121
|
+
|
122
|
+
# Don't forget to call plend to finish off!
|
123
|
+
|
124
|
+
plend
|
data/examples/x28.rb
ADDED
@@ -0,0 +1,369 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true if $0 == __FILE__
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'plplot'
|
6
|
+
include PLplot
|
7
|
+
include Math
|
8
|
+
|
9
|
+
# plmtex3, plptex3 demo.
|
10
|
+
#
|
11
|
+
# Copyright (C) 2007, 2008, 2009 Alan W. Irwin
|
12
|
+
#
|
13
|
+
# This file is part of PLplot.
|
14
|
+
#
|
15
|
+
# PLplot is free software; you can redistribute it and/or modify
|
16
|
+
# it under the terms of the GNU General Library Public License as published
|
17
|
+
# by the Free Software Foundation; either version 2 of the License, or
|
18
|
+
# (at your option) any later version.
|
19
|
+
#
|
20
|
+
# PLplot is distributed in the hope that it will be useful,
|
21
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
22
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
23
|
+
# GNU Library General Public License for more details.
|
24
|
+
#
|
25
|
+
# You should have received a copy of the GNU Library General Public License
|
26
|
+
# along with PLplot; if not, write to the Free Software
|
27
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
28
|
+
|
29
|
+
# Choose these values to correspond to tick marks. */
|
30
|
+
XPTS = 2
|
31
|
+
YPTS = 2
|
32
|
+
NREVOLUTION = 16
|
33
|
+
NROTATION = 8
|
34
|
+
NSHEAR = 8
|
35
|
+
|
36
|
+
#--------------------------------------------------------------------------
|
37
|
+
# Demonstrates plotting text in 3D.
|
38
|
+
#--------------------------------------------------------------------------
|
39
|
+
|
40
|
+
|
41
|
+
xmin = 0.0; xmax = 1.0; xmid = 0.5 * (xmax + xmin); xrange = xmax - xmin
|
42
|
+
ymin = 0.0; ymax = 1.0; ymid = 0.5 * (ymax + ymin); yrange = ymax - ymin
|
43
|
+
zmin = 0.0; zmax = 1.0; zmid = 0.5 * (zmax + zmin); zrange = zmax - zmin
|
44
|
+
ysmin = ymin + 0.1 * yrange
|
45
|
+
ysmax = ymax - 0.1 * yrange
|
46
|
+
ysrange = ysmax - ysmin
|
47
|
+
dysrot = ysrange / (NROTATION - 1)
|
48
|
+
dysshear = ysrange / (NSHEAR - 1)
|
49
|
+
zsmin = zmin + 0.1 * zrange
|
50
|
+
zsmax = zmax - 0.1 * zrange
|
51
|
+
zsrange = zsmax - zsmin
|
52
|
+
dzsrot = zsrange / (NROTATION - 1)
|
53
|
+
dzsshear = zsrange / (NSHEAR - 1)
|
54
|
+
pstring = "The future of our civilization depends on software freedom."
|
55
|
+
|
56
|
+
# Allocate and define the minimal x, y, and z to insure 3D box
|
57
|
+
x = NArray.float(XPTS).indgen!.mul!((xmax-xmin)/(XPTS-1)) + xmin
|
58
|
+
y = NArray.float(YPTS).indgen!.mul!((ymax-ymin)/(YPTS-1)) + ymin
|
59
|
+
z = NArray.float(YPTS, XPTS)
|
60
|
+
|
61
|
+
# Parse and process command line arguments
|
62
|
+
|
63
|
+
PLOptionParser.parse!
|
64
|
+
|
65
|
+
plinit
|
66
|
+
|
67
|
+
# Page 1: Demonstrate inclination and shear capability pattern. */
|
68
|
+
|
69
|
+
pladv(0)
|
70
|
+
plvpor(-0.15, 1.15, -0.05, 1.05)
|
71
|
+
plwind(-1.2, 1.2, -0.8, 1.5)
|
72
|
+
plw3d(1.0, 1.0, 1.0, xmin, xmax, ymin, ymax, zmin, zmax,
|
73
|
+
20.0, 45.0)
|
74
|
+
|
75
|
+
plcol0(2)
|
76
|
+
plbox3("b", "", xmax - xmin, 0,
|
77
|
+
"b", "", ymax - ymin, 0,
|
78
|
+
"bcd", "", zmax - zmin, 0)
|
79
|
+
|
80
|
+
# z = zmin
|
81
|
+
plschr(0, 1)
|
82
|
+
NREVOLUTION.times do |i|
|
83
|
+
omega = 2 * PI * i / NREVOLUTION
|
84
|
+
sin_omega = sin(omega)
|
85
|
+
cos_omega = cos(omega)
|
86
|
+
x_inclination = 0.5 * xrange * cos_omega
|
87
|
+
y_inclination = 0.5 * yrange * sin_omega
|
88
|
+
z_inclination = 0.0
|
89
|
+
x_shear = -0.5 * xrange * sin_omega
|
90
|
+
y_shear = 0.5 * yrange * cos_omega
|
91
|
+
z_shear = 0.0
|
92
|
+
plptex3(
|
93
|
+
xmid, ymid, zmin,
|
94
|
+
x_inclination, y_inclination, z_inclination,
|
95
|
+
x_shear, y_shear, z_shear,
|
96
|
+
0.0, " revolution")
|
97
|
+
end
|
98
|
+
|
99
|
+
# x = xmax
|
100
|
+
plschr(0, 1)
|
101
|
+
NREVOLUTION.times do |i|
|
102
|
+
omega = 2 * PI * i / NREVOLUTION
|
103
|
+
sin_omega = sin(omega)
|
104
|
+
cos_omega = cos(omega)
|
105
|
+
x_inclination = 0.0
|
106
|
+
y_inclination = -0.5 * yrange * cos_omega
|
107
|
+
z_inclination = 0.5 * zrange * sin_omega
|
108
|
+
x_shear = 0.0
|
109
|
+
y_shear = 0.5 * yrange * sin_omega
|
110
|
+
z_shear = 0.5 * zrange * cos_omega
|
111
|
+
plptex3(
|
112
|
+
xmax, ymid, zmid,
|
113
|
+
x_inclination, y_inclination, z_inclination,
|
114
|
+
x_shear, y_shear, z_shear,
|
115
|
+
0.0, " revolution")
|
116
|
+
end
|
117
|
+
|
118
|
+
# y = ymax
|
119
|
+
plschr(0, 1)
|
120
|
+
NREVOLUTION.times do |i|
|
121
|
+
omega = 2 * PI * i / NREVOLUTION
|
122
|
+
sin_omega = sin(omega)
|
123
|
+
cos_omega = cos(omega)
|
124
|
+
x_inclination = 0.5 * xrange * cos_omega
|
125
|
+
y_inclination = 0.0
|
126
|
+
z_inclination = 0.5 * zrange * sin_omega
|
127
|
+
x_shear = -0.5 * xrange * sin_omega
|
128
|
+
y_shear = 0.0
|
129
|
+
z_shear = 0.5 * zrange * cos_omega
|
130
|
+
plptex3(
|
131
|
+
xmid, ymax, zmid,
|
132
|
+
x_inclination, y_inclination, z_inclination,
|
133
|
+
x_shear, y_shear, z_shear,
|
134
|
+
0.0, " revolution")
|
135
|
+
end
|
136
|
+
# Draw minimal 3D grid to finish defining the 3D box.
|
137
|
+
plmesh(x, y, z, PL::DRAW_LINEXY)
|
138
|
+
|
139
|
+
# Page 2: Demonstrate rotation of string around its axis.
|
140
|
+
pladv(0)
|
141
|
+
plvpor(-0.15, 1.15, -0.05, 1.05)
|
142
|
+
plwind(-1.2, 1.2, -0.8, 1.5)
|
143
|
+
plw3d(1.0, 1.0, 1.0, xmin, xmax, ymin, ymax, zmin, zmax,
|
144
|
+
20.0, 45.0)
|
145
|
+
|
146
|
+
plcol0(2)
|
147
|
+
plbox3("b", "", xmax - xmin, 0,
|
148
|
+
"b", "", ymax - ymin, 0,
|
149
|
+
"bcd", "", zmax - zmin, 0)
|
150
|
+
|
151
|
+
# y = ymax
|
152
|
+
plschr(0, 1)
|
153
|
+
x_inclination = 1
|
154
|
+
y_inclination = 0
|
155
|
+
z_inclination = 0
|
156
|
+
x_shear = 0
|
157
|
+
NROTATION.times do |i|
|
158
|
+
omega = 2 * PI * i / NROTATION
|
159
|
+
sin_omega = sin(omega)
|
160
|
+
cos_omega = cos(omega)
|
161
|
+
y_shear = 0.5 * yrange * sin_omega
|
162
|
+
z_shear = 0.5 * zrange * cos_omega
|
163
|
+
zs = zsmax - dzsrot * i
|
164
|
+
plptex3(
|
165
|
+
xmid, ymax, zs,
|
166
|
+
x_inclination, y_inclination, z_inclination,
|
167
|
+
x_shear, y_shear, z_shear,
|
168
|
+
0.5, "rotation for y = y#dmax#u")
|
169
|
+
end
|
170
|
+
|
171
|
+
# x = xmax
|
172
|
+
plschr(0, 1)
|
173
|
+
x_inclination = 0
|
174
|
+
y_inclination = -1
|
175
|
+
z_inclination = 0
|
176
|
+
y_shear = 0
|
177
|
+
NROTATION.times do |i|
|
178
|
+
omega = 2 * PI * i / NROTATION
|
179
|
+
sin_omega = sin(omega)
|
180
|
+
cos_omega = cos(omega)
|
181
|
+
x_shear = 0.5 * xrange * sin_omega
|
182
|
+
z_shear = 0.5 * zrange * cos_omega
|
183
|
+
zs = zsmax - dzsrot * i
|
184
|
+
plptex3(
|
185
|
+
xmax, ymid, zs,
|
186
|
+
x_inclination, y_inclination, z_inclination,
|
187
|
+
x_shear, y_shear, z_shear,
|
188
|
+
0.5, "rotation for x = x#dmax#u")
|
189
|
+
end
|
190
|
+
|
191
|
+
# z = zmin
|
192
|
+
plschr(0, 1)
|
193
|
+
x_inclination = 1
|
194
|
+
y_inclination = 0
|
195
|
+
z_inclination = 0
|
196
|
+
x_shear = 0
|
197
|
+
NROTATION.times do |i|
|
198
|
+
omega = 2 * PI * i / NROTATION
|
199
|
+
sin_omega = sin(omega)
|
200
|
+
cos_omega = cos(omega)
|
201
|
+
y_shear = 0.5 * yrange * cos_omega
|
202
|
+
z_shear = 0.5 * zrange * sin_omega
|
203
|
+
ys = ysmax - dysrot * i
|
204
|
+
plptex3(
|
205
|
+
xmid, ys, zmin,
|
206
|
+
x_inclination, y_inclination, z_inclination,
|
207
|
+
x_shear, y_shear, z_shear,
|
208
|
+
0.5, "rotation for z = z#dmin#u")
|
209
|
+
end
|
210
|
+
# Draw minimal 3D grid to finish defining the 3D box. */
|
211
|
+
plmesh(x, y, z, PL::DRAW_LINEXY)
|
212
|
+
|
213
|
+
# Page 3: Demonstrate shear of string along its axis.
|
214
|
+
# Work around xcairo and pngcairo (but not pscairo) problems for
|
215
|
+
# shear vector too close to axis of string. (N.B. no workaround
|
216
|
+
# would be domega = 0.)
|
217
|
+
domega = 0.05
|
218
|
+
pladv(0)
|
219
|
+
plvpor(-0.15, 1.15, -0.05, 1.05)
|
220
|
+
plwind(-1.2, 1.2, -0.8, 1.5)
|
221
|
+
plw3d(1.0, 1.0, 1.0, xmin, xmax, ymin, ymax, zmin, zmax,
|
222
|
+
20.0, 45.0)
|
223
|
+
|
224
|
+
plcol0(2)
|
225
|
+
plbox3("b", "", xmax - xmin, 0,
|
226
|
+
"b", "", ymax - ymin, 0,
|
227
|
+
"bcd", "", zmax - zmin, 0)
|
228
|
+
|
229
|
+
# y = ymax
|
230
|
+
plschr(0, 1)
|
231
|
+
x_inclination = 1
|
232
|
+
y_inclination = 0
|
233
|
+
z_inclination = 0
|
234
|
+
y_shear = 0
|
235
|
+
NSHEAR.times do |i|
|
236
|
+
omega = domega + 2 * PI * i / NSHEAR
|
237
|
+
sin_omega = sin(omega)
|
238
|
+
cos_omega = cos(omega)
|
239
|
+
x_shear = 0.5 * xrange * sin_omega
|
240
|
+
z_shear = 0.5 * zrange * cos_omega
|
241
|
+
zs = zsmax - dzsshear * i
|
242
|
+
plptex3(
|
243
|
+
xmid, ymax, zs,
|
244
|
+
x_inclination, y_inclination, z_inclination,
|
245
|
+
x_shear, y_shear, z_shear,
|
246
|
+
0.5, "shear for y = y#dmax#u")
|
247
|
+
end
|
248
|
+
|
249
|
+
# x = xmax
|
250
|
+
plschr(0, 1)
|
251
|
+
x_inclination = 0
|
252
|
+
y_inclination = -1
|
253
|
+
z_inclination = 0
|
254
|
+
x_shear = 0
|
255
|
+
NSHEAR.times do |i|
|
256
|
+
omega = domega + 2 * PI * i / NSHEAR
|
257
|
+
sin_omega = sin(omega)
|
258
|
+
cos_omega = cos(omega)
|
259
|
+
y_shear = -0.5 * yrange * sin_omega
|
260
|
+
z_shear = 0.5 * zrange * cos_omega
|
261
|
+
zs = zsmax - dzsshear * i
|
262
|
+
plptex3(
|
263
|
+
xmax, ymid, zs,
|
264
|
+
x_inclination, y_inclination, z_inclination,
|
265
|
+
x_shear, y_shear, z_shear,
|
266
|
+
0.5, "shear for x = x#dmax#u")
|
267
|
+
end
|
268
|
+
|
269
|
+
# z = zmin
|
270
|
+
plschr(0, 1)
|
271
|
+
x_inclination = 1
|
272
|
+
y_inclination = 0
|
273
|
+
z_inclination = 0
|
274
|
+
z_shear = 0
|
275
|
+
NSHEAR.times do |i|
|
276
|
+
omega = domega + 2 * PI * i / NSHEAR
|
277
|
+
sin_omega = sin(omega)
|
278
|
+
cos_omega = cos(omega)
|
279
|
+
y_shear = 0.5 * yrange * cos_omega
|
280
|
+
x_shear = 0.5 * xrange * sin_omega
|
281
|
+
ys = ysmax - dysshear * i
|
282
|
+
plptex3(
|
283
|
+
xmid, ys, zmin,
|
284
|
+
x_inclination, y_inclination, z_inclination,
|
285
|
+
x_shear, y_shear, z_shear,
|
286
|
+
0.5, "shear for z = z#dmin#u")
|
287
|
+
end
|
288
|
+
# Draw minimal 3D grid to finish defining the 3D box.
|
289
|
+
plmesh(x, y, z, PL::DRAW_LINEXY)
|
290
|
+
|
291
|
+
# Page 4: Demonstrate drawing a string on a 3D path.
|
292
|
+
pladv(0)
|
293
|
+
plvpor(-0.15, 1.15, -0.05, 1.05)
|
294
|
+
plwind(-1.2, 1.2, -0.8, 1.5)
|
295
|
+
plw3d(1.0, 1.0, 1.0, xmin, xmax, ymin, ymax, zmin, zmax,
|
296
|
+
40.0, -30.0)
|
297
|
+
|
298
|
+
plcol0(2)
|
299
|
+
plbox3("b", "", xmax - xmin, 0,
|
300
|
+
"b", "", ymax - ymin, 0,
|
301
|
+
"bcd", "", zmax - zmin, 0)
|
302
|
+
|
303
|
+
plschr(0, 1.2)
|
304
|
+
# domega controls the spacing between the various characters of the
|
305
|
+
# string and also the maximum value of omega for the given number
|
306
|
+
# of characters in *pstring.
|
307
|
+
domega = 2 * PI / pstring.length
|
308
|
+
omega = 0
|
309
|
+
# 3D function is a helix of the given radius and pitch
|
310
|
+
radius = 0.5
|
311
|
+
pitch = 1 / (2 * PI)
|
312
|
+
pstring.split('').each do |p1string|
|
313
|
+
sin_omega = sin(omega)
|
314
|
+
cos_omega = cos(omega)
|
315
|
+
xpos = xmid + radius * sin_omega
|
316
|
+
ypos = ymid - radius * cos_omega
|
317
|
+
zpos = zmin + pitch * omega
|
318
|
+
# In general, the inclination is proportional to the derivative of
|
319
|
+
# the position wrt theta.
|
320
|
+
x_inclination = radius * cos_omega
|
321
|
+
y_inclination = radius * sin_omega
|
322
|
+
z_inclination = pitch
|
323
|
+
# The shear vector should be perpendicular to the 3D line with Z
|
324
|
+
# component maximized, but for low pitch a good approximation is
|
325
|
+
# a constant vector that is parallel to the Z axis.
|
326
|
+
x_shear = 0
|
327
|
+
y_shear = 0
|
328
|
+
z_shear = 1
|
329
|
+
plptex3(
|
330
|
+
xpos, ypos, zpos,
|
331
|
+
x_inclination, y_inclination, z_inclination,
|
332
|
+
x_shear, y_shear, z_shear,
|
333
|
+
0.5, p1string)
|
334
|
+
|
335
|
+
omega += domega
|
336
|
+
end
|
337
|
+
# Draw minimal 3D grid to finish defining the 3D box.
|
338
|
+
plmesh(x, y, z, PL::DRAW_LINEXY)
|
339
|
+
|
340
|
+
# Page 5: Demonstrate plmtex3 axis labelling capability
|
341
|
+
pladv(0)
|
342
|
+
plvpor(-0.15, 1.15, -0.05, 1.05)
|
343
|
+
plwind(-1.2, 1.2, -0.8, 1.5)
|
344
|
+
plw3d(1.0, 1.0, 1.0, xmin, xmax, ymin, ymax, zmin, zmax,
|
345
|
+
20.0, 45.0)
|
346
|
+
|
347
|
+
plcol0(2)
|
348
|
+
plbox3("b", "", xmax - xmin, 0,
|
349
|
+
"b", "", ymax - ymin, 0,
|
350
|
+
"bcd", "", zmax - zmin, 0)
|
351
|
+
|
352
|
+
plschr(0, 1)
|
353
|
+
plmtex3("xp", 3.0, 0.5, 0.5, "Arbitrarily displaced")
|
354
|
+
plmtex3("xp", 4.5, 0.5, 0.5, "primary X-axis label")
|
355
|
+
plmtex3("xs", -2.5, 0.5, 0.5, "Arbitrarily displaced")
|
356
|
+
plmtex3("xs", -1.0, 0.5, 0.5, "secondary X-axis label")
|
357
|
+
plmtex3("yp", 3.0, 0.5, 0.5, "Arbitrarily displaced")
|
358
|
+
plmtex3("yp", 4.5, 0.5, 0.5, "primary Y-axis label")
|
359
|
+
plmtex3("ys", -2.5, 0.5, 0.5, "Arbitrarily displaced")
|
360
|
+
plmtex3("ys", -1.0, 0.5, 0.5, "secondary Y-axis label")
|
361
|
+
plmtex3("zp", 4.5, 0.5, 0.5, "Arbitrarily displaced")
|
362
|
+
plmtex3("zp", 3.0, 0.5, 0.5, "primary Z-axis label")
|
363
|
+
plmtex3("zs", -2.5, 0.5, 0.5, "Arbitrarily displaced")
|
364
|
+
plmtex3("zs", -1.0, 0.5, 0.5, "secondary Z-axis label")
|
365
|
+
# Draw minimal 3D grid to finish defining the 3D box.
|
366
|
+
plmesh(x, y, z, PL::DRAW_LINEXY)
|
367
|
+
|
368
|
+
# Clean up
|
369
|
+
plend
|