Range
任意個の端点から構成する Range の subclass
When::Parts::GeometricComplex を構成する端点の Array
type : [[Comparable, Boolean]] Comparable - 端点 Boolean @reverse == true の場合 true - 範囲に含まない false - 範囲に含む @reverse == false の場合 true - 範囲に含む false - 範囲に含まない example [[3,true],[4,false]] は Range(3...4)に対応する
オブジェクトの生成
引数パターン 1 range : Range 引数パターン 2 point : Comparable Range (point..point) と同じ 引数パターン 3 first : Comparable last : Comparable Range (first...last) と同じ 引数パターン 4 first : Comparable duration : When::TM::Duration Range (first...(first+duration)) と同じ 引数パターン 5 other : When::Parts::GeometricComplex コピーもとの When::Parts::GeometricComplex 引数パターン 6 node : [[Comparable, Boolean]] Comparable - 端点 Boolean reverse == true の場合 true - 範囲に含まない false - 範囲に含む reverse == false の場合 true - 範囲に含む false - 範囲に含まない すべてのパターンに共通の最終引数 reverse : Boolean true - 反転する false - 反転しない(デフォルト)
# File when/parts.rb, line 1591 1591: def initialize(*args) 1592: 1593: @reverse = (args[1]==true || args[1]==false) ? args.pop : false 1594: 1595: case args[0] 1596: when GeometricComplex 1597: @node = args[0].node 1598: @reverse ^= args[0].reverse 1599: super(self.first, self.last, exclude_end?) if self.first && self.last 1600: return 1601: 1602: when Array 1603: @node = args[0] 1604: super(self.first, self.last, exclude_end?) if self.first && self.last 1605: return 1606: 1607: when Range 1608: first = [args[0].first, true] 1609: last = [args[0].last, !args[0].exclude_end?] 1610: 1611: when Comparable 1612: first, last, rest = args 1613: raise ArgumentError, "Too many argument: #{rest}" if rest 1614: first = [first, true] 1615: case last 1616: when Comparable ; last = [last, false] 1617: when When::TM::Duration ; last = [first[0] + last, false] 1618: when nil ; last = first 1619: else ; raise TypeError, "Irregal GeometricComplex Type for last element: #{last.class}" 1620: end 1621: 1622: when nil ; 1623: else ; raise TypeError, "Irregal GeometricComplex Type: #{first.class}" 1624: end 1625: 1626: first, last = last, first if (first && last && first[0] > last[0]) 1627: @node = [] 1628: @node << first if first 1629: @node << last if last 1630: super(self.first, self.last, exclude_end?) if first && last 1631: end
範囲を反転する
# File when/parts.rb, line 1448 1448: def -@ 1449: GeometricComplex.new(self, true) 1450: end
最小の端点と other を比較する
other : Comparable 比較対象 returns : Integer 比較結果を 負, 0, 正の値で返す
# File when/parts.rb, line 1460 1460: def <=>(other) 1461: first <=> other 1462: end
端点が範囲に含まれるか?
index : Integer 端点の番号(デフォルト : -1 - 最大の端点) returns : Boolean true - 含まれる false - 含まれない
# File when/parts.rb, line 1433 1433: def exclude_end?(index=1) 1434: (@node.length==0) ? nil : !@node[index][1] ^ @reverse 1435: end
最小の端点
default : 端点が-∞の場合に返すべき値(指定がなければ nil) returns : Comparable 最小の端点 含むか否かに関わらず、最小の端点を返す default が指定されているが有効な区間がない場合、nil を返す
# File when/parts.rb, line 1393 1393: def first(default=nil) 1394: return (@node.length==0) ? nil : @node[0][0] unless default # 互換性 1395: if reverse 1396: return default 1397: else 1398: (@node.length==0) ? nil : @node[0][0] 1399: end 1400: end
範囲に含まれるか?
other : Comparable 判断する Comparable returns : Boolean true - 範囲に含まれる false - 範囲に含まれない 制限事項 When::TM::TopologicalComplex どうしの包含判定は、和集合がもとの範囲と等しいか で判断している。分解能が When::Coordinates::SYSTEM でない場合、論理的には等しい ものが、内部表現が異なるために等しくないとみなされる事があり、その場合 true で あるべきものを false と誤判断する。実行速度上の制約もあり、現時点では対策を行わ ない。
# File when/parts.rb, line 1528 1528: def include?(other) 1529: if (other.kind_of?(Comparable) && !other.kind_of?(GeometricComplex)) 1530: return (_include_point?(other) != false) 1531: else 1532: other = GeometricComplex.new(other) unless other.kind_of?(GeometricComplex) 1533: return _include_range?(other) 1534: end 1535: end
最大の端点
default : 端点が+∞場合に返すべき値(指定がなければ nil) returns : Comparable 最大の端点 含むか否かに関わらず、最大の端点を返す default が指定されているが有効な区間がない場合、nil を返す
# File when/parts.rb, line 1413 1413: def last(default=nil) 1414: return (@node.length==0) ? nil : @node[1][0] unless default # 互換性 1415: if reverse 1416: return (@node.length[0]==0) ? default : @node[1][0] 1417: else 1418: return nil if (@node.length==0) 1419: return (@node.length[0]==1) ? default : @node[1][0] 1420: end 1421: end
分解能
returns : Integer 最小の端点の分解能を返す 分解能がない場合は、When::Coordinates::SYSTEM を返す
# File when/parts.rb, line 1443 1443: def precision 1444: @node[0] && @node[0][0].respond_to?(:precision) ? @node[0][0].precision : Coordinates::SYSTEM 1445: end
ISO19108 の TM オブジェクトに変換する
options : When::TM::TemporalPosition の生成を行う場合に使用する returns : When::TM::Node, When::TM::Edge or When::TM::TopologicalComplex
# File when/parts.rb, line 1495 1495: def to_tm_object(options={}) 1496: return nil unless !@reverse && @node.length>0 && @node.length[0]==0 1497: objects = [] 1498: primitives = @node.dup 1499: while (primitives) do 1500: first, last, primitives = primitives 1501: if (first[0].eql?(last[0])) 1502: objects = When::TM::Node.new(When::TM::Instant.new(When.when?(first[0],options))) 1503: else 1504: objects = When::TM::Edge.new(When::TM::Node.new(When::TM::Instant.new(When.when?(first[0],options))), 1505: When::TM::Node.new(When::TM::Instant.new(When.when?(last[0],options)))) 1506: end 1507: end 1508: return objects[0] if objects.length==1 1509: return When::TM::TopologicalComplex.new(objects) 1510: end
和集合
other : Range or When::Parts::GeometricComplex returns : When::Parts::GeometricComplex self と other の和集合を返す
# File when/parts.rb, line 1471 1471: def |(other) 1472: other = GeometricComplex.new(other) unless other.kind_of?(GeometricComplex) 1473: return self if self.reverse && self.node.length==0 1474: return other | self if !self.reverse && other.reverse 1475: copy = self.node.dup 1476: ref = other.node.dup 1477: max = _max(copy.shift.dup, ref.shift.dup) if (other.reverse) 1478: rev = max ? false : @reverse 1479: while (ref.length > 0) do 1480: first, last, *ref = ref 1481: updated = _upper(copy, first, rev) 1482: updated += _lower(copy, last, rev) if last 1483: copy = updated 1484: end 1485: copy = _lower(copy, max, true) if max 1486: return GeometricComplex.new(copy, self.reverse) 1487: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.