Как я могу включить все возможные варианты? - PullRequest
0 голосов
/ 04 декабря 2010

Этот код принимает 3array (положение) и проверяет, находится ли он в некоторой области модели или нет.Проблема в методе PbSheild, хотя я не могу понять, почему.Этот код будет работать как есть (ну, он не будет работать как есть, вот в чем дело).

class Geometry                    

$polyCylRad = 2.5                       
$polyCylFr = 15                         
$polyCylB = -2.0                          
$borPolyBoxL = 9.0 / 2
$pbCylRad = 3.0 
$pbBoxL = 10.0 / 2
$cdBoxL = 9.5 / 2
$xSquared = Float
$ySquared = Float
$zSquared = Float
$modX = Float
$modY = Float
$modZ =Float
$position = Array.new


def checkMaterial(params)

  $position = params
  $xSquared = $position[0] ** 2
  $ySquared = $position[1] ** 2
  $zSquared = $position[2] ** 2
  $modX = Math.sqrt($xSquared)
  $modY = Math.sqrt($ySquared)
  $modZ = Math.sqrt($zSquared)

  puts "polyCyl: " + self.polyCylinder.to_s
  puts "borpoly: " + self.borPolyBox.to_s
  puts "Cd: " + self.CdShield.to_s
  puts "Pb Cylinder: " + self.PbCylinder.to_s
  puts "Pb: " + self.PbShield.to_s
  puts "FreeSpace: " + self.FreeSpace.to_s

  material
end

def polyCylinder
  Math.sqrt($ySquared + $zSquared) <= $polyCylRad && $position[0] >= $polyCylB && $position[0] <= $polyCylFr
end

def borPolyBox
  !polyCylinder && ($modX <= $borPolyBoxL || $modY <= $borPolyBoxL || $modZ <= borPolyBoxL) && !($modX > $borPolyBoxL || $modY > $borPolyBoxL || $modZ > borPolyBoxL)
end

def CdShield
  !polyCylinder && !borPolyBox && ($modX <= $cdBoxL || $modY <= $cdBoxL || $modZ <= $cdBoxL) &&  !($modX > $cdBoxL || $modY > $cdBoxL || $modZ > $cdBoxL)
end

def PbCylinder
  !polyCylinder && $position[0] >= $cdBoxL && $position[0]  <= $polyCylFr && Math.sqrt($ySquared + zSquared) <= $pbCylRad
end 

def PbShield
  !polyCylinder && !borPolyBox && !CdShield && !PbCylinder && ($modX <= $pbBoxL || $modY <= $pbBoxL || $modZ <= $pbBoxL) && !($modX > $pbBoxL || $modY > $pbBoxL || $modZ > $pbBoxL)                                                  
end

def FreeSpace
  !polyCylinder && !borPolyBox && !CdShield && !PbShield && !PbCylinder
end

def material
  [
  [:polyCylinder, 'poly'],
  [:borPolyBox, 'borPoly'],
  [:CdShield, 'Cd'],
  [:PbCylinder, 'Pb'],
  [:PbShield, 'Pb'],
  [:FreeSpace, 'air']
  ].each do |method, name|
  return name if send(method)
              end
  false
end

end

$bob = Geometry.new
posVect = Array.new
posVect << 0 << 0 << 0
$bob.checkMaterial(posVect)

while posVect[0]  < 25 do

$bob.checkMaterial(posVect)
puts "Xpos: " + posVect[0].to_s
puts "Ypos: " + posVect[1].to_s
puts "Zpos: " + posVect[2].to_s
puts "polyCyl: " + $bob.polyCylinder.to_s
puts "borpoly: " + $bob.borPolyBox.to_s
puts "Cd: " + $bob.CdShield.to_s
puts "Pb: " + $bob.PbShield.to_s
puts "FreeSpace: " + $bob.FreeSpace.to_s
puts ""

posVect[0] += 1

end

Если вы думаете, что это выглядит подозрительно, как будто это связано с моим кодом C ++, вы правы, пишу дваструктурно разные монте-карло в Ruby и C ++ (изучение Ruby и углубление знаний C ++ одновременно).

Спасибо!

1 Ответ

0 голосов
/ 05 декабря 2010

Я бы переписал это полностью.У вас есть пара проблем, которые вы хотите решить.Во-первых, вы хотите определить регион и посмотреть, находится ли точка в этом регионе.Вероятно, это должен быть один модуль с методом определения регионов и методом размещения точки в определенной области.При желании вы можете определить регионы в самом модуле или определить их на лету, в зависимости от того, что вам нужно.Это дало бы вам возможность передать имя или определение региона и точку одному методу и узнать, находится ли точка в этой области.Это было бы намного проще проверить.

Во-вторых, вы хотите определить значение материала: true или false, для каждого материала.Вы могли бы рассмотреть использование заявления случая для этого.Вы пишете метод, который возвращает значения для теста вашего региона (например: poly,: box, что угодно), а затем используете его в качестве теста для вашего оператора case:

   case whatever(point)
   when (:foo)
     set some values
   when (:bar)
     set some other values
   end

Если вы устанавливаете значение по умолчанию для каждого материалазначение в false (хороший план), тогда вам нужно будет только обновить истины, и будет легко, основываясь на возвращаемом значении вашего метода проверки региона, определить, какие значения должны быть истинными или могут быть истинными.

Разрыв кода таким или иным способом, значительно упростит тестирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...