summaryrefslogtreecommitdiff
path: root/engines/kokompe/kokompe/engine/space_interval.cpp
blob: 9856358d8b28ba160511d0a2bf21ff6f9562736a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102


//#include <stdfx.h>

#include <iostream>
using namespace std;


#include "space_interval.h"

// An interval of 3D real space


// Empty interval constructor
space_interval_t::space_interval_t() {
  interval_t i;
  i.set_real_number(0.0);
  X = i;
  Y = i;
  Z = i;
}

// Constructor from intervals
space_interval_t::space_interval_t(interval_t& X_interval, interval_t& Y_interval, interval_t& Z_interval) {
  X = X_interval;
  Y = Y_interval;
  Z = Z_interval;
}

void space_interval_t::set(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) {
	X.set_real_interval(xmin, xmax);
	Y.set_real_interval(ymin, ymax);
	Z.set_real_interval(zmin, zmax);
}



ostream& operator<<(ostream&s, const space_interval_t &si) {
  return( s << "{ X:" << si.X <<" Y:" << si.Y << " Z:" << si.Z <<" }");   
}

// Split a space interval into one of the eight orthants
void space_interval_t::split(int i) {
  X.split(i & 0x1);
  Y.split(i & 0x2);
  Z.split(i & 0x4);
}

// get the zone where a particular point resides
int space_interval_t::get_zone(float x, float y, float z) {
  int result = 0;
  
  if (x > X.get_center())
    result |= 0x1;
  if (y > Y.get_center())
    result |= 0x2;
  if (z > Z.get_center())
    result |= 0x4;
  return(result);
}

void space_interval_t::set_point(float x, float y, float z) {
  X.set_real_number(x);
  Y.set_real_number(y);
  Z.set_real_number(z);
}



// See if two space intervals overlap
int space_interval_t::overlaps(const space_interval_t &b) const {
  return(X.overlaps(b.X) && Y.overlaps(b.Y) && Z.overlaps(b.Z));
}

int space_interval_t::is_on(float x, float y, float z) {
	return(X.is_on(x) && Y.is_on(y) && Z.is_on(z));
}

// Get interval
interval_t space_interval_t::get_var_value(int i) {
  switch (i) {
  case 0:
    return(X);
    break;
  case 1:
    return(Y);
    break;
  case 2:
    return(Z);
    break;
  }
  return(X);    /// Hack to satsify compiler.
}

void space_interval_t::get_corners(vector_t *lower, vector_t *upper) {
	lower->x = X.get_lower();
	lower->y = Y.get_lower();
	lower->z = Z.get_lower();
	upper->x = X.get_upper();
	upper->y = Y.get_upper();
	upper->z = Z.get_upper();
}