File indexing completed on 2025-08-05 08:18:08
0001
0002
0003 #ifndef G4MAIN_PHBBOX_H
0004 #define G4MAIN_PHBBOX_H
0005
0006 #include <bitset>
0007 #include <iomanip>
0008 #include <iostream>
0009
0010
0011
0012 class PHBBox
0013 {
0014 public:
0015
0016 PHBBox(const double x0, const double y0, const double x1, const double y1)
0017 : _x0(x0)
0018 , _y0(y0)
0019 , _x1(x1)
0020 , _y1(y1)
0021 {
0022 }
0023
0024
0025
0026 bool ClipLine(double& x0, double& y0, double& x1, double& y1) const
0027 {
0028 int clipCode0 = ClipCode(x0, y0);
0029 int clipCode1 = ClipCode(x1, y1);
0030
0031 while (clipCode0 || clipCode1)
0032 {
0033
0034
0035
0036 if (clipCode0 & clipCode1) return false;
0037
0038 int code = 0;
0039 if (clipCode0 > 0)
0040 code = clipCode0;
0041 else
0042 code = clipCode1;
0043
0044 double x = 0, y = 0;
0045
0046 if ((code & BOTTOM) == BOTTOM)
0047 {
0048
0049
0050 y = _y0;
0051 x = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
0052 }
0053 else if ((code & TOP) == TOP)
0054 {
0055
0056
0057 y = _y1;
0058 x = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
0059 }
0060 else if ((code & LEFT) == LEFT)
0061 {
0062
0063 x = _x0;
0064 y = y0 + (y1 - y0) * (x - x0) / (x1 - x0);
0065 }
0066 else if ((code & RIGHT) == RIGHT)
0067 {
0068
0069 x = _x1;
0070 y = y0 + (y1 - y0) * (x - x0) / (x1 - x0);
0071 }
0072
0073
0074
0075 if (code == clipCode0)
0076 {
0077
0078
0079 x0 = x;
0080 y0 = y;
0081 clipCode0 = ClipCode(x0, y0);
0082 }
0083 else
0084 {
0085
0086
0087 x1 = x;
0088 y1 = y;
0089 clipCode1 = ClipCode(x1, y1);
0090 }
0091 }
0092
0093 return true;
0094 }
0095
0096 void Print(std::ostream& os = std::cout)
0097 {
0098 os << _x0 << " " << _y0 << ", " << _x1 << " " << _y1 << std::endl;
0099 }
0100
0101 private:
0102 enum
0103 {
0104 RIGHT = 1,
0105 BOTTOM = 2,
0106 LEFT = 4,
0107 TOP = 8
0108 };
0109
0110 int ClipCode(const double x, const double y) const
0111 {
0112 int code = 0;
0113 if (x > _x1)
0114 code |= RIGHT;
0115 else if (x < _x0)
0116 code |= LEFT;
0117 if (y > _y1)
0118 code |= TOP;
0119 else if (y < _y0)
0120 code |= BOTTOM;
0121 return code;
0122 }
0123
0124 double _x0;
0125 double _y0;
0126 double _x1;
0127 double _y1;
0128 };
0129
0130 #endif