crystalcell 0.0.6 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 81bccc2d33dbb516c3cf706bc0d4967522482175
4
- data.tar.gz: 75dae44df7dad2f8f1afb829aaf9c677d361db44
3
+ metadata.gz: 4a6d81b3b2df5aebe2d59092c8af9a06a86de351
4
+ data.tar.gz: 5956faf1dcd9aba246f3738ec238dd99d10bf0f6
5
5
  SHA512:
6
- metadata.gz: d1b841d618bf499652fcb37e96d594211aca99d962cbc6da58003129941c1a43c215b7f9b77e496d8c150eec09bbd37fed39e6fa0a8ec13cedf70f3e3c4ccaba
7
- data.tar.gz: 0a267fe50ac4dc24993ee28a1826d38232a8dd4baf189fd7196f7c745a43db6d944a69bdc4160de706b3f176094cdce94c37523414e5afd2c305535b47287611
6
+ metadata.gz: 93d44dd90fcc58571b9db57aa3cf1f072ab2469743d2d190bd17bf0b046f38f1ad3b2e5fd59d05fc7e3ef9efd75b706d834031830375b4d1fbf1f3c2d70b426b
7
+ data.tar.gz: 7b07a0e21b1972342ef2b647f215b4ec66c02aedeafead6de6c72d076250fc44d05366da87df2ff7a2f236b0ca0ff02d183250787cc7c2c623d2372922101a28
data/CHANGES CHANGED
@@ -1,6 +1,12 @@
1
1
  = crystalcell Changelog
2
2
 
3
- == Master (for 0.0.7)
3
+ <!-- Master -->
4
+
5
+ == Version 0.1.0 [2016-07-12] released
6
+
7
+ * Add Cell.to_povcell
8
+ * Add CrystalCell::Povray::Tetrahedron
9
+ * Add LatticeAxes.to_a
4
10
 
5
11
  == Version 0.0.6 [2016-05-31] released
6
12
 
data/Gemfile CHANGED
@@ -6,13 +6,13 @@ source "http://rubygems.org"
6
6
  # Add dependencies to develop your gem here.
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  group :development do
9
- gem "test-unit", "~> 3.1"
9
+ gem "test-unit", "~> 3.2"
10
10
  gem "rdoc", "~> 4.2"
11
11
  gem "bundler", "~> 1.11"
12
12
  gem "jeweler", "~> 2.0"
13
13
  gem "simplecov", "~> 0.11"
14
14
  gem "malge", "~> 0.0"
15
- gem "mageo", "~> 0.0"
15
+ gem "mageo", "~> 0.1"
16
16
  gem "maset", "~> 0.0"
17
17
  gem "builtinextension", "~> 0.1"
18
18
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.6
1
+ 0.1.0
data/crystalcell.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: crystalcell 0.0.6 ruby lib
5
+ # stub: crystalcell 0.1.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "crystalcell"
9
- s.version = "0.0.6"
9
+ s.version = "0.1.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["ippei94da"]
14
- s.date = "2016-05-31"
14
+ s.date = "2016-07-12"
15
15
  s.description = "This gem provides Cell, LatticeAxes, Atom classes, and so on.\n And this provides simple treatment of a periodic boundary condition.\n "
16
16
  s.email = "ippei94da@gmail.com"
17
17
  s.extra_rdoc_files = [
@@ -36,20 +36,27 @@ Gem::Specification.new do |s|
36
36
  "lib/crystalcell/povray.rb",
37
37
  "lib/crystalcell/povray/camera.rb",
38
38
  "lib/crystalcell/povray/cell.rb",
39
+ "lib/crystalcell/povray/color.rb",
39
40
  "lib/crystalcell/povray/cylinder.rb",
40
41
  "lib/crystalcell/povray/element.rb",
41
42
  "lib/crystalcell/povray/sphere.rb",
43
+ "lib/crystalcell/povray/tetrahedron.rb",
42
44
  "lib/crystalcell/povray/triangle.rb",
43
45
  "test/cif/ZrO2-25C.cif",
44
46
  "test/helper.rb",
45
47
  "test/povray/test_camera.rb",
46
48
  "test/povray/test_cell.rb",
49
+ "test/povray/test_colors.rb",
50
+ "test/povray/test_cylinder.rb",
47
51
  "test/povray/test_element.rb",
52
+ "test/povray/test_tetrahedron.rb",
53
+ "test/povray/test_triangle.rb",
48
54
  "test/test_atom.rb",
49
55
  "test/test_cell.rb",
50
56
  "test/test_element.rb",
51
57
  "test/test_latticeaxes.rb",
52
- "test/test_periodiccell.rb"
58
+ "test/test_periodiccell.rb",
59
+ "test/test_povray.rb"
53
60
  ]
54
61
  s.homepage = "http://github.com/ippei94da/crystalcell"
55
62
  s.licenses = ["MIT"]
@@ -60,34 +67,34 @@ Gem::Specification.new do |s|
60
67
  s.specification_version = 4
61
68
 
62
69
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
63
- s.add_development_dependency(%q<test-unit>, ["~> 3.1"])
70
+ s.add_development_dependency(%q<test-unit>, ["~> 3.2"])
64
71
  s.add_development_dependency(%q<rdoc>, ["~> 4.2"])
65
72
  s.add_development_dependency(%q<bundler>, ["~> 1.11"])
66
73
  s.add_development_dependency(%q<jeweler>, ["~> 2.0"])
67
74
  s.add_development_dependency(%q<simplecov>, ["~> 0.11"])
68
75
  s.add_development_dependency(%q<malge>, ["~> 0.0"])
69
- s.add_development_dependency(%q<mageo>, ["~> 0.0"])
76
+ s.add_development_dependency(%q<mageo>, ["~> 0.1"])
70
77
  s.add_development_dependency(%q<maset>, ["~> 0.0"])
71
78
  s.add_development_dependency(%q<builtinextension>, ["~> 0.1"])
72
79
  else
73
- s.add_dependency(%q<test-unit>, ["~> 3.1"])
80
+ s.add_dependency(%q<test-unit>, ["~> 3.2"])
74
81
  s.add_dependency(%q<rdoc>, ["~> 4.2"])
75
82
  s.add_dependency(%q<bundler>, ["~> 1.11"])
76
83
  s.add_dependency(%q<jeweler>, ["~> 2.0"])
77
84
  s.add_dependency(%q<simplecov>, ["~> 0.11"])
78
85
  s.add_dependency(%q<malge>, ["~> 0.0"])
79
- s.add_dependency(%q<mageo>, ["~> 0.0"])
86
+ s.add_dependency(%q<mageo>, ["~> 0.1"])
80
87
  s.add_dependency(%q<maset>, ["~> 0.0"])
81
88
  s.add_dependency(%q<builtinextension>, ["~> 0.1"])
82
89
  end
83
90
  else
84
- s.add_dependency(%q<test-unit>, ["~> 3.1"])
91
+ s.add_dependency(%q<test-unit>, ["~> 3.2"])
85
92
  s.add_dependency(%q<rdoc>, ["~> 4.2"])
86
93
  s.add_dependency(%q<bundler>, ["~> 1.11"])
87
94
  s.add_dependency(%q<jeweler>, ["~> 2.0"])
88
95
  s.add_dependency(%q<simplecov>, ["~> 0.11"])
89
96
  s.add_dependency(%q<malge>, ["~> 0.0"])
90
- s.add_dependency(%q<mageo>, ["~> 0.0"])
97
+ s.add_dependency(%q<mageo>, ["~> 0.1"])
91
98
  s.add_dependency(%q<maset>, ["~> 0.0"])
92
99
  s.add_dependency(%q<builtinextension>, ["~> 0.1"])
93
100
  end
@@ -135,7 +135,7 @@ class CrystalCell::Cell
135
135
  #b_max : b 軸方向のセルの方向を整数で示したときの最大値
136
136
  #c_min : c 軸方向のセルの方向を整数で示したときの最小値
137
137
  #c_max : c 軸方向のセルの方向を整数で示したときの最大値
138
- #-1, 1, -1, 1, -1, 1 と指定すれば 3x3x3 の 27倍体積の構造になる。
138
+ #-1, 1, -1, 1, -1, 1 と指定すれば 3x3x3 の 27倍の原子数になる。
139
139
  def atoms_in_supercell( a_min, a_max, b_min, b_max, c_min, c_max )
140
140
  results = []
141
141
  @atoms.each do |atom|
@@ -291,7 +291,7 @@ class CrystalCell::Cell
291
291
  #Generate a new cell with the same lattice consants,
292
292
  #containing atoms of indicated elements.
293
293
  #Argument 'elems' must be an array of element names.
294
- #含まれる @atoms の順序は、保存される。元素ごとに並び換えたりしない。
294
+ #含まれる @atoms の順序は保存される。元素ごとに並び換えたりしない。
295
295
  #CrystalCell::Atom.element が elems の要素のどれかと完全一致しているもののみ対象となる。
296
296
  #サブクラスのインスタンスで実行した場合には、
297
297
  #サブクラスのインスタンスとして生成する。
@@ -519,6 +519,11 @@ class CrystalCell::Cell
519
519
 
520
520
  #ptg_symbol, ptg_num, trans_mat = getptg(rotations)
521
521
 
522
+ def to_povcell
523
+ #pp @axes
524
+ CrystalCell::Povray::Cell.new(@axes, @atoms)
525
+ end
526
+
522
527
  private
523
528
 
524
529
  def get_spg_dataset
@@ -530,7 +535,7 @@ class CrystalCell::Cell
530
535
  table[elem]
531
536
  end
532
537
  hall_num= 0
533
- dataset = get_dataset(axes_t, poss, types, hall_num, @symprec, @angle_tolerance)
538
+ get_dataset(axes_t, poss, types, hall_num, @symprec, @angle_tolerance)
534
539
  end
535
540
 
536
541
  #POSCAR の内容の文字列を生成。
@@ -19,39 +19,63 @@ class CrystalCell::Povray::Camera
19
19
  #@location = [ 3.0, 3.0, 3.0 ]
20
20
  #@look_at = [ 0.0, 0.0, 0.0 ]
21
21
  #@sky = [ 0.0, 0.0, 1.0 ]
22
- #@right = [ -1.00, 0.0, 0.0 ]
22
+ #@right =
23
23
  #@up = [ 0.0, 1.0, 0.0 ]
24
24
  #@angle = 68
25
25
 
26
- attr_accessor :orthographic, :location, :look_at, :sky, :right, :up, :angle
26
+ attr_accessor :camera_type, :location, :right, :up, :direction,
27
+ :sky, :angle, :look_at
27
28
 
28
- def initialize(orthographic:, location:, look_at:, sky:, right:, up:, angle:,
29
- additions: [])
30
- @orthographic = orthographic
31
- @location = location
32
- @look_at = look_at
33
- @sky = sky
34
- @right = right
35
- @up = up
36
- @angle = angle
37
- @additions = additions
29
+ # camera_type: perspectice, orthographic, etc.
30
+ # Note: default values of some setting is modified from original povray
31
+ # because of left-handed coordinate system.
32
+ # This library provide only on right-handed system in crystallography.
33
+ #
34
+ # ---------------------------------------------
35
+ # setting default_orig default_this
36
+ # camera_type perspective
37
+ # location <0,0,0>
38
+ # direction <0,0,1>
39
+ # right <1.33,0,0> [-1.33, 0.0, 0.0],
40
+ # sky <0,1,0> [ 0.0, 0.0, 1.0],
41
+ # up <0,1,0>
42
+ # look_at <0,0,1>
43
+ def initialize(camera_type: nil, # perspective
44
+ location: nil, # <0,0,0>
45
+ right: [-1.33, 0.0, 0.0],
46
+ up: nil,
47
+ direction: nil,
48
+ sky: [0.0, 0.0, 1.0],
49
+ angle: nil,
50
+ #camera_modifiers: nil,
51
+ look_at: nil
52
+ )
53
+ @camera_type = camera_type
54
+ @location = location
55
+ @right = right
56
+ @up = up
57
+ @direction = direction
58
+ @sky = sky
59
+ @angle = angle
60
+ #@camera_modifiers = camera_modifiers
61
+ @look_at = look_at
38
62
  end
39
63
 
40
64
  def dump(io)
41
65
  io.puts "camera {"
42
- io.puts " orthographic" if @orthographic
43
- io.printf(" location <%f, %f, %f >\n", *@location)
44
- io.printf(" look_at <%f, %f, %f >\n", *@look_at)
45
- io.printf(" sky <%f, %f, %f >\n", *@sky)
46
- io.printf(" right <%f, %f, %f >\n", *@right)
47
- io.printf(" up <%f, %f, %f >\n", *@up)
48
- io.printf(" angle %f\n" , @angle)
66
+ io.printf(" %s\n", @camera_type) if @camera_type
67
+ io.printf(" location <%f, %f, %f >\n", *@location) if @location
68
+ io.printf(" right <%f, %f, %f >\n", *@right) if @right
69
+ io.printf(" up <%f, %f, %f >\n", *@up) if @up
70
+ io.printf(" direction <%f, %f, %f >\n", *@direction) if @direction
71
+ io.printf(" sky <%f, %f, %f >\n", *@sky) if @sky
72
+ io.printf(" angle %f\n" , @angle) if @angle
73
+ #@camera_modifiers.each do |i|
74
+ # io.puts i
75
+ #end
76
+ io.printf(" look_at <%f, %f, %f >\n", *@look_at) if @look_at
49
77
  io.puts "}"
50
- @additions.each do |i|
51
- io.puts i
52
- end
53
78
  end
54
79
 
55
80
  end
56
81
 
57
-
@@ -3,17 +3,22 @@
3
3
  class CrystalCell::Povray::Cell < CrystalCell::Cell
4
4
  RADIUS_RATIO = 0.3
5
5
 
6
- LATTICE_RADIUS = 0.1
6
+ LATTICE_RADIUS = 0.02
7
7
  LATTICE_COLOR = [0.50, 0.50, 0.50]
8
8
  BOND_RADIUS = 0.05
9
9
  BOND_COLOR = [0.75, 0.75, 0.75]
10
10
 
11
11
  # povray 形式の文字列を返す。
12
12
  def to_pov
13
- return atoms_to_pov + bonds_to_pov + lattice_to_pov
13
+ #return atoms_to_povs + bonds_to_povs + lattice_to_povs
14
+ return atoms_to_povs + lattice_to_povs
14
15
  end
15
16
 
16
- #private
17
+ def dump(io)
18
+ self.to_pov.each do |line|
19
+ io.print line
20
+ end
21
+ end
17
22
 
18
23
  # 原子を描画するための pov 形式文字列を返す。
19
24
  # 周期境界近傍の原子が tolerance 未満ならば、反対側のセル境界にも描画する。
@@ -27,30 +32,30 @@ class CrystalCell::Povray::Cell < CrystalCell::Cell
27
32
  results
28
33
  end
29
34
 
30
- # 原子間の連結棒を描画するための pov 形式文字列を返す。
31
- # E.g.,
32
- # elem0 = 'O'
33
- # elem1 = 'Li'
34
- # min_distance = 0.0
35
- # max_distance = 1.0
36
- # 上記の指定の場合、O-O 間かつ距離が 0.0〜1.0 の原子間のみ
37
- # bond を出力する。
38
- def bonds_to_povs(elem0, elem1, min_distance, max_distance)
39
- results = []
40
- cell = self.to_pcell
41
- cell.find_bonds(elem0, elem1, min_distance, max_distance).each do |pair|
42
- cart0 = pair[0].to_v3d(self.axes)
43
- cart1 = pair[1].to_v3d(self.axes)
44
- midpoint = Mageo::Vector3D.midpoint(cart0, cart1)
45
- results << Mageo::Cylinder.new(
46
- [cart0, midpoint], BOND_RADIUS).to_pov(
47
- CrystalCell::Povray::Element.color(elem0)) + "\n"
48
- results << Mageo::Cylinder.new(
49
- [cart1, midpoint], BOND_RADIUS).to_pov(
50
- CrystalCell::Povray::Element.color(elem1)) + "\n"
51
- end
52
- results
53
- end
35
+ ## 原子間の連結棒を描画するための pov 形式文字列を返す。
36
+ ## E.g.,
37
+ ## elem0 = 'O'
38
+ ## elem1 = 'Li'
39
+ ## min_distance = 0.0
40
+ ## max_distance = 1.0
41
+ ## 上記の指定の場合、O-O 間かつ距離が 0.0〜1.0 の原子間のみ
42
+ ## bond を出力する。
43
+ #def bonds_to_povs(elem0, elem1, min_distance, max_distance)
44
+ # results = []
45
+ # cell = self.to_pcell
46
+ # cell.find_bonds(elem0, elem1, min_distance, max_distance).each do |pair|
47
+ # cart0 = pair[0].to_v3d(self.axes)
48
+ # cart1 = pair[1].to_v3d(self.axes)
49
+ # midpoint = Mageo::Vector3D.midpoint(cart0, cart1)
50
+ # results << Mageo::Cylinder.new(
51
+ # [cart0, midpoint], BOND_RADIUS).to_pov(
52
+ # CrystalCell::Povray::Element.color(elem0)) + "\n"
53
+ # results << Mageo::Cylinder.new(
54
+ # [cart1, midpoint], BOND_RADIUS).to_pov(
55
+ # CrystalCell::Povray::Element.color(elem1)) + "\n"
56
+ # end
57
+ # results
58
+ #end
54
59
 
55
60
  # 格子の棒を描画するための pov 形式文字列を返す。
56
61
  def lattice_to_povs
@@ -64,18 +69,21 @@ class CrystalCell::Povray::Cell < CrystalCell::Cell
64
69
  v111 = Vector3DInternal[ 1.0, 1.0, 1.0 ].to_v3d(self.axes)
65
70
 
66
71
  results = []
67
- results << Mageo::Cylinder.new([v000, v001], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
68
- results << Mageo::Cylinder.new([v010, v011], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
69
- results << Mageo::Cylinder.new([v100, v101], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
70
- results << Mageo::Cylinder.new([v110, v111], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
71
- results << Mageo::Cylinder.new([v000, v010], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
72
- results << Mageo::Cylinder.new([v100, v110], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
73
- results << Mageo::Cylinder.new([v001, v011], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
74
- results << Mageo::Cylinder.new([v101, v111], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
75
- results << Mageo::Cylinder.new([v000, v100], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
76
- results << Mageo::Cylinder.new([v001, v101], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
77
- results << Mageo::Cylinder.new([v010, v110], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
78
- results << Mageo::Cylinder.new([v011, v111], LATTICE_RADIUS).to_pov(LATTICE_COLOR).to_s + "\n"
72
+ cy = CrystalCell::Povray::Cylinder
73
+ r = LATTICE_RADIUS
74
+ c = LATTICE_COLOR
75
+ results << cy.new(v000, v001, r, c).to_pov.to_s + "\n"
76
+ results << cy.new(v010, v011, r, c).to_pov.to_s + "\n"
77
+ results << cy.new(v100, v101, r, c).to_pov.to_s + "\n"
78
+ results << cy.new(v110, v111, r, c).to_pov.to_s + "\n"
79
+ results << cy.new(v000, v010, r, c).to_pov.to_s + "\n"
80
+ results << cy.new(v100, v110, r, c).to_pov.to_s + "\n"
81
+ results << cy.new(v001, v011, r, c).to_pov.to_s + "\n"
82
+ results << cy.new(v101, v111, r, c).to_pov.to_s + "\n"
83
+ results << cy.new(v000, v100, r, c).to_pov.to_s + "\n"
84
+ results << cy.new(v001, v101, r, c).to_pov.to_s + "\n"
85
+ results << cy.new(v010, v110, r, c).to_pov.to_s + "\n"
86
+ results << cy.new(v011, v111, r, c).to_pov.to_s + "\n"
79
87
  results
80
88
  end
81
89
 
@@ -0,0 +1,42 @@
1
+ #! /usr/bin/env ruby
2
+ # coding: utf-8
3
+
4
+ #
5
+ #
6
+ #
7
+ class CrystalCell::Povray::Color
8
+
9
+ PI = Math::PI
10
+ #
11
+ def initialize()
12
+ end
13
+
14
+ # 色相環(color circle) 上での色を、与えられた角度に対して返す。
15
+ # 強度は [r, g, b] の配列で、0.0<=x<=1.0 の実数。
16
+ def self.circle_color(theta)
17
+ theta = theta % (2*PI); #-2*pi 〜 +2*pi の範囲に入る
18
+
19
+ r = self.trapezoidal_wave(theta, (4.0/6.0) * 2.0 * PI)
20
+ g = self.trapezoidal_wave(theta, (0.0/6.0) * 2.0 * PI)
21
+ b = self.trapezoidal_wave(theta, (2.0/6.0) * 2.0 * PI)
22
+ [r, g, b]
23
+ end
24
+
25
+ # 台形波
26
+ def self.trapezoidal_wave(theta, phase)
27
+ x = (theta - phase)/ (2.0*PI)
28
+ x = x - x.floor
29
+ if (0.0/6.0) <= x && x < (1.0/6.0)
30
+ return x * 6.0
31
+ elsif (1.0/6.0) <= x && x < (3.0/6.0)
32
+ return 1.0
33
+ elsif (3.0/6.0) <= x && x < (4.0/6.0)
34
+ return 4.0 - x * 6.0
35
+ elsif (4.0/6.0) <= x && x < (6.0/6.0)
36
+ return 0.0
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ # thetaBase: その色が上がり始める点を基準とする。R ならば 4π/3
@@ -1,12 +1,22 @@
1
1
  #! /usr/bin/env ruby # coding: utf-8
2
2
 
3
- class Mageo::Cylinder
3
+ class CrystalCell::Povray::Cylinder < Mageo::Cylinder
4
+ attr_reader :positions, :color
5
+
6
+ def initialize(position0, position1, radius, color)
7
+ super(position0, position1, radius)
8
+ @color = color
9
+ end
10
+
4
11
  # povray 形式の文字列を返す。
5
12
  # color は Float による配列。通常、0〜1の範囲。
6
- def to_pov(color)
13
+ def to_pov
7
14
  sprintf( "object { cylinder{ <% 7.4f, % 7.4f, % 7.4f>, <% 7.4f, % 7.4f, % 7.4f>, %7.4f } pigment { color rgb <%4.2f, %4.2f, %4.2f> } }",
8
- *positions[0], *positions[1], radius, *color)
15
+ *positions[0], *positions[1], radius, *color)
16
+ #*@positions[0], *@positions[1], radius, @color)
9
17
  end
10
- end
11
-
12
18
 
19
+ def dump(io)
20
+ io.puts self.to_pov
21
+ end
22
+ end
@@ -7,6 +7,10 @@ class Mageo::Sphere
7
7
  sprintf( "object { sphere{<% 7.4f, % 7.4f, % 7.4f>, %7.4f} pigment {color rgb <%4.2f, %4.2f, %4.2f>} }",
8
8
  *position, radius, *color)
9
9
  end
10
+
11
+ def dump(io)
12
+ io.puts self.to_pov
13
+ end
10
14
  end
11
15
 
12
16
 
@@ -0,0 +1,34 @@
1
+ #! /usr/bin/env ruby # coding: utf-8
2
+
3
+ class CrystalCell::Povray::Tetrahedron < Mageo::Tetrahedron
4
+
5
+ attr_accessor :color, :transmit
6
+
7
+ # color should be Array like [r, g, b]. Float from 0.0 to 1.0.
8
+ def initialize(v0, v1, v2, v3, color, transmit = nil)
9
+ super(v0, v1, v2, v3)
10
+ @color = color
11
+ @transmit = transmit
12
+ end
13
+
14
+ # povray 形式の文字列を返す。
15
+ # color は Float による配列。通常、0〜1の範囲。
16
+ def to_pov
17
+ triangles.map { |triangle| triangle.to_pov }.join("\n")
18
+ end
19
+
20
+ def dump(io)
21
+ io.puts self.to_pov
22
+ end
23
+
24
+ def triangles
25
+ results = VERTEX_INDICES_OF_TRIANGLES.map do |indices|
26
+ CrystalCell::Povray::Triangle.new( *(indices.map{|i| @vertices[i] }), @color, @transmit )
27
+ end
28
+ return results
29
+ end
30
+
31
+ private
32
+
33
+ end
34
+
@@ -1,17 +1,33 @@
1
1
  #! /usr/bin/env ruby # coding: utf-8
2
2
 
3
- class Mageo::Triangle
3
+ class CrystalCell::Povray::Triangle < Mageo::Triangle
4
+
5
+ attr_accessor :color, :transmit
6
+
7
+ def initialize(vec0, vec1, vec2, color, transmit = nil)
8
+ super(vec0, vec1, vec2)
9
+ @color = color
10
+ @transmit = transmit
11
+ end
12
+
4
13
  # povray 形式の文字列を返す。
5
14
  # color は Float による配列。通常、0〜1の範囲。
6
- def to_pov(color)
15
+ def to_pov
7
16
  v = self.vertices
8
- result = "polygon { 4, " + sprintf("<%7.4f, %7.4f, %7.4f>, ", v[0][0], v[0][1], v[0][2]) +
9
- sprintf("<%7.4f, %7.4f, %7.4f>, ", v[1][0], v[1][1], v[1][2]) +
10
- sprintf("<%7.4f, %7.4f, %7.4f>, ", v[2][0], v[2][1], v[2][2]) +
11
- sprintf("<%7.4f, %7.4f, %7.4f> " , v[0][0], v[0][1], v[0][2]) +
12
- "pigment { color rgb <1, 0, 0> } }"
17
+ result = sprintf("triangle{<%f,%f,%f>,<%f,%f,%f>,<%f,%f,%f>",
18
+ *@vertices[0], *@vertices[1], *@vertices[2])
19
+ result += sprintf(" pigment {color rgb<%f,%f,%f>", *@color)
20
+ result += sprintf(" transmit %f", @transmit) if @transmit
21
+ result += "}}"
22
+ #result = sprintf("triangle{<%f,%f,%f>,<%f,%f,%f>,<%f,%f,%f> " +
23
+ # "pigment {color rgb<%f,%f,%f>}}",
24
+ # *@vertices[0], *@vertices[1], *@vertices[2], *@color)
25
+ #
13
26
  return result
14
27
  end
15
- end
16
28
 
29
+ def dump(io)
30
+ io.puts self.to_pov
31
+ end
32
+ end
17
33