Commit 4bb615eb7ac9970c5056b1306622fece19d8920d
1 parent
6332d1e7
fixed generating image-stack bugs
Showing
2 changed files
with
48 additions
and
37 deletions
Show diff stats
@@ -67,7 +67,7 @@ namespace stim { | @@ -67,7 +67,7 @@ namespace stim { | ||
67 | #ifdef __CUDACC__ | 67 | #ifdef __CUDACC__ |
68 | // for sphere | 68 | // for sphere |
69 | template <typename T> | 69 | template <typename T> |
70 | - __global__ void inside_sphere(const stim::sphere<T> *V, size_t num, size_t *R, T *S, unsigned char *ptr, int x, int y, int z) { | 70 | + __global__ void inside_sphere(const stim::sphere<T> *V, size_t num, T Z,size_t *R, T *S, unsigned char *ptr, int x, int y, int z) { |
71 | 71 | ||
72 | unsigned ix = blockDim.x * blockIdx.x + threadIdx.x; | 72 | unsigned ix = blockDim.x * blockIdx.x + threadIdx.x; |
73 | unsigned iy = blockDim.y * blockIdx.y + threadIdx.y; | 73 | unsigned iy = blockDim.y * blockIdx.y + threadIdx.y; |
@@ -78,7 +78,7 @@ namespace stim { | @@ -78,7 +78,7 @@ namespace stim { | ||
78 | stim::vec3<T> world_pixel; | 78 | stim::vec3<T> world_pixel; |
79 | world_pixel[0] = (T)ix * S[1] - x; // translate origin to center of the network | 79 | world_pixel[0] = (T)ix * S[1] - x; // translate origin to center of the network |
80 | world_pixel[1] = (T)iy * S[2] - y; | 80 | world_pixel[1] = (T)iy * S[2] - y; |
81 | - world_pixel[2] = ((T)z - R[3] / 2) * S[3]; // ???center of box minus half width | 81 | + world_pixel[2] = ((T)z - Z / 2.0f) * S[3]; // ???center of box minus half width |
82 | 82 | ||
83 | float distance = FLT_MAX; | 83 | float distance = FLT_MAX; |
84 | float tmp_distance; | 84 | float tmp_distance; |
@@ -97,7 +97,7 @@ namespace stim { | @@ -97,7 +97,7 @@ namespace stim { | ||
97 | 97 | ||
98 | // for cone | 98 | // for cone |
99 | template <typename T> | 99 | template <typename T> |
100 | - __global__ void inside_cone(const stim::cone<T> *E, size_t num, size_t *R, T *S, unsigned char *ptr, int x, int y, int z) { | 100 | + __global__ void inside_cone(const stim::cone<T> *E, size_t num, T Z, size_t *R, T *S, unsigned char *ptr, int x, int y, int z) { |
101 | 101 | ||
102 | unsigned ix = blockDim.x * blockIdx.x + threadIdx.x; | 102 | unsigned ix = blockDim.x * blockIdx.x + threadIdx.x; |
103 | unsigned iy = blockDim.y * blockIdx.y + threadIdx.y; | 103 | unsigned iy = blockDim.y * blockIdx.y + threadIdx.y; |
@@ -107,7 +107,7 @@ namespace stim { | @@ -107,7 +107,7 @@ namespace stim { | ||
107 | stim::vec3<T> world_pixel; | 107 | stim::vec3<T> world_pixel; |
108 | world_pixel[0] = (T)ix * S[1] - x; | 108 | world_pixel[0] = (T)ix * S[1] - x; |
109 | world_pixel[1] = (T)iy * S[2] - y; | 109 | world_pixel[1] = (T)iy * S[2] - y; |
110 | - world_pixel[2] = ((T)z - R[3] / 2) * S[3]; | 110 | + world_pixel[2] = ((T)z - Z / 2.0f) * S[3]; |
111 | 111 | ||
112 | float distance = FLT_MAX; | 112 | float distance = FLT_MAX; |
113 | float tmp_distance; | 113 | float tmp_distance; |
@@ -133,7 +133,7 @@ namespace stim { | @@ -133,7 +133,7 @@ namespace stim { | ||
133 | 133 | ||
134 | // for source bus | 134 | // for source bus |
135 | template <typename T> | 135 | template <typename T> |
136 | - __global__ void inside_cuboid(const stim::cuboid<T> *B, size_t num, size_t *R, T *S, unsigned char *ptr, int x, int y, int z) { | 136 | + __global__ void inside_cuboid(const stim::cuboid<T> *B, size_t num, T Z, size_t *R, T *S, unsigned char *ptr, int x, int y, int z) { |
137 | 137 | ||
138 | unsigned ix = blockDim.x * blockIdx.x + threadIdx.x; | 138 | unsigned ix = blockDim.x * blockIdx.x + threadIdx.x; |
139 | unsigned iy = blockDim.y * blockIdx.y + threadIdx.y; | 139 | unsigned iy = blockDim.y * blockIdx.y + threadIdx.y; |
@@ -143,7 +143,7 @@ namespace stim { | @@ -143,7 +143,7 @@ namespace stim { | ||
143 | stim::vec3<T> world_pixel; | 143 | stim::vec3<T> world_pixel; |
144 | world_pixel[0] = (T)ix * S[1] - x; | 144 | world_pixel[0] = (T)ix * S[1] - x; |
145 | world_pixel[1] = (T)iy * S[2] - y; | 145 | world_pixel[1] = (T)iy * S[2] - y; |
146 | - world_pixel[2] = ((T)z - R[3] / 2) * S[3]; | 146 | + world_pixel[2] = ((T)z - Z / 2.0f) * S[3]; |
147 | 147 | ||
148 | for (unsigned i = 0; i < num; i++) { | 148 | for (unsigned i = 0; i < num; i++) { |
149 | bool left_outside = false; // flag indicates point is outside the left bound | 149 | bool left_outside = false; // flag indicates point is outside the left bound |
@@ -1042,8 +1042,9 @@ namespace stim { | @@ -1042,8 +1042,9 @@ namespace stim { | ||
1042 | void glSolidCuboid(GLint subdivision, bool manufacture = false, T length = 40.0f, T height = 10.0f) { | 1042 | void glSolidCuboid(GLint subdivision, bool manufacture = false, T length = 40.0f, T height = 10.0f) { |
1043 | 1043 | ||
1044 | T width; | 1044 | T width; |
1045 | - stim::vec3<T> L = bb.A; // get the bottom left corner | ||
1046 | - stim::vec3<T> U = bb.B; // get the top right corner | 1045 | + stim::gl_aaboundingbox<T> BB = (*this).boundingbox(); |
1046 | + stim::vec3<T> L = BB.A; // get the bottom left corner | ||
1047 | + stim::vec3<T> U = BB.B; // get the top right corner | ||
1047 | width = U[2] - L[2] + 10.0f; | 1048 | width = U[2] - L[2] + 10.0f; |
1048 | 1049 | ||
1049 | if (manufacture) | 1050 | if (manufacture) |
@@ -1887,8 +1888,8 @@ namespace stim { | @@ -1887,8 +1888,8 @@ namespace stim { | ||
1887 | 1888 | ||
1888 | // there are cases that the fragment can not satisfy the requirement for width | 1889 | // there are cases that the fragment can not satisfy the requirement for width |
1889 | if (width < times * radius || n == 0) { // check feasibility | 1890 | if (width < times * radius || n == 0) { // check feasibility |
1890 | - ratio = 0.0f; // load original lengths | ||
1891 | - desire_l = tmp_d; | 1891 | + ratio = 1.0f; // load original lengths |
1892 | + desire_l = tmp_d; // loading back-ups | ||
1892 | origin_l = tmp_l; | 1893 | origin_l = tmp_l; |
1893 | 1894 | ||
1894 | std::cout << "Warning: current ratio is not feasible, use full original line." << std::endl; | 1895 | std::cout << "Warning: current ratio is not feasible, use full original line." << std::endl; |
@@ -1923,11 +1924,21 @@ namespace stim { | @@ -1923,11 +1924,21 @@ namespace stim { | ||
1923 | height = (T)((desire_l - (1 + 2 * n) * origin_l) / std::pow(2 * n, 2)); | 1924 | height = (T)((desire_l - (1 + 2 * n) * origin_l) / std::pow(2 * n, 2)); |
1924 | } | 1925 | } |
1925 | 1926 | ||
1926 | - // degenerated case, compromise | 1927 | + /// degenerated case, use original extending method |
1927 | if (n == 0) { | 1928 | if (n == 0) { |
1928 | - n = 1; | ||
1929 | - width = (T)(origin_l) / (2 * n); | ||
1930 | - height = (T)((desire_l - (1 + 2 * n) * origin_l) / std::pow(2 * n, 2)); | 1929 | + height = (T)((desire_l - origin_l) / 2); |
1930 | + // "up" | ||
1931 | + tmp_v = tmp_v + stim::vec3<T>(0, coef_up * height, 0); | ||
1932 | + if (feeder == 1) | ||
1933 | + inlet[i].V.push_back(tmp_v); | ||
1934 | + else if (feeder == 0) | ||
1935 | + outlet[i].V.push_back(tmp_v); | ||
1936 | + // "left" | ||
1937 | + tmp_v = tmp_v + stim::vec3<T>(-coef_left * origin_l, 0, 0); | ||
1938 | + if (feeder == 1) | ||
1939 | + inlet[i].V.push_back(tmp_v); | ||
1940 | + else if (feeder == 0) | ||
1941 | + outlet[i].V.push_back(tmp_v); | ||
1931 | } | 1942 | } |
1932 | 1943 | ||
1933 | // cube-like structure construction | 1944 | // cube-like structure construction |
@@ -2628,7 +2639,7 @@ namespace stim { | @@ -2628,7 +2639,7 @@ namespace stim { | ||
2628 | 2639 | ||
2629 | /// make full-synthetic binary image stack | 2640 | /// make full-synthetic binary image stack |
2630 | // prepare for image stack | 2641 | // prepare for image stack |
2631 | - void preparation(T &Xl, T &Xr, T &Yt, T &Yb, T &Z, bool prototype = false, T length = 40.0f, T height = 10.0f, T radius = 5.0f) { | 2642 | + void preparation(T &Xl, T &Xr, T &Yt, T &Yb, T &Z, bool prototype = false, T length = 40.0f, T height = 10.0f, T radius = 5.0f, T scale = 1.0f) { |
2632 | 2643 | ||
2633 | T max_radius = 0.0f; | 2644 | T max_radius = 0.0f; |
2634 | T top = FLT_MIN; | 2645 | T top = FLT_MIN; |
@@ -2658,13 +2669,13 @@ namespace stim { | @@ -2658,13 +2669,13 @@ namespace stim { | ||
2658 | for (unsigned i = 0; i < num_edge; i++) { | 2669 | for (unsigned i = 0; i < num_edge; i++) { |
2659 | for (unsigned j = 0; j < E[i].size(); j++) { | 2670 | for (unsigned j = 0; j < E[i].size(); j++) { |
2660 | new_sphere.c = E[i][j]; | 2671 | new_sphere.c = E[i][j]; |
2661 | - new_sphere.r = E[i].r(j); | 2672 | + new_sphere.r = E[i].r(j) * scale; |
2662 | A.push_back(new_sphere); | 2673 | A.push_back(new_sphere); |
2663 | if (j != E[i].size() - 1) { | 2674 | if (j != E[i].size() - 1) { |
2664 | new_cone.c1 = E[i][j]; | 2675 | new_cone.c1 = E[i][j]; |
2665 | new_cone.c2 = E[i][j + 1]; | 2676 | new_cone.c2 = E[i][j + 1]; |
2666 | - new_cone.r1 = E[i].r(j); | ||
2667 | - new_cone.r2 = E[i].r(j + 1); | 2677 | + new_cone.r1 = E[i].r(j) * scale; |
2678 | + new_cone.r2 = E[i].r(j + 1) * scale; | ||
2668 | B.push_back(new_cone); | 2679 | B.push_back(new_cone); |
2669 | } | 2680 | } |
2670 | } | 2681 | } |
@@ -2675,14 +2686,14 @@ namespace stim { | @@ -2675,14 +2686,14 @@ namespace stim { | ||
2675 | for (unsigned i = 0; i < inlet.size(); i++) { | 2686 | for (unsigned i = 0; i < inlet.size(); i++) { |
2676 | for (unsigned j = 1; j < inlet[i].V.size() - 1; j++) { | 2687 | for (unsigned j = 1; j < inlet[i].V.size() - 1; j++) { |
2677 | new_sphere.c = inlet[i].V[j]; | 2688 | new_sphere.c = inlet[i].V[j]; |
2678 | - new_sphere.r = inlet[i].r; | 2689 | + new_sphere.r = inlet[i].r * scale; |
2679 | A.push_back(new_sphere); | 2690 | A.push_back(new_sphere); |
2680 | } | 2691 | } |
2681 | } | 2692 | } |
2682 | for (unsigned i = 0; i < outlet.size(); i++) { | 2693 | for (unsigned i = 0; i < outlet.size(); i++) { |
2683 | for (unsigned j = 1; j < outlet[i].V.size() - 1; j++) { | 2694 | for (unsigned j = 1; j < outlet[i].V.size() - 1; j++) { |
2684 | new_sphere.c = outlet[i].V[j]; | 2695 | new_sphere.c = outlet[i].V[j]; |
2685 | - new_sphere.r = outlet[i].r; | 2696 | + new_sphere.r = outlet[i].r * scale; |
2686 | A.push_back(new_sphere); | 2697 | A.push_back(new_sphere); |
2687 | } | 2698 | } |
2688 | } | 2699 | } |
@@ -2691,8 +2702,8 @@ namespace stim { | @@ -2691,8 +2702,8 @@ namespace stim { | ||
2691 | for (unsigned j = 0; j < inlet[i].V.size() - 1; j++) { | 2702 | for (unsigned j = 0; j < inlet[i].V.size() - 1; j++) { |
2692 | new_cone.c1 = inlet[i].V[j]; | 2703 | new_cone.c1 = inlet[i].V[j]; |
2693 | new_cone.c2 = inlet[i].V[j + 1]; | 2704 | new_cone.c2 = inlet[i].V[j + 1]; |
2694 | - new_cone.r1 = inlet[i].r; | ||
2695 | - new_cone.r2 = inlet[i].r; | 2705 | + new_cone.r1 = inlet[i].r * scale; |
2706 | + new_cone.r2 = inlet[i].r * scale; | ||
2696 | B.push_back(new_cone); | 2707 | B.push_back(new_cone); |
2697 | } | 2708 | } |
2698 | } | 2709 | } |
@@ -2700,15 +2711,15 @@ namespace stim { | @@ -2700,15 +2711,15 @@ namespace stim { | ||
2700 | for (unsigned j = 0; j < outlet[i].V.size() - 1; j++) { | 2711 | for (unsigned j = 0; j < outlet[i].V.size() - 1; j++) { |
2701 | new_cone.c1 = outlet[i].V[j]; | 2712 | new_cone.c1 = outlet[i].V[j]; |
2702 | new_cone.c2 = outlet[i].V[j + 1]; | 2713 | new_cone.c2 = outlet[i].V[j + 1]; |
2703 | - new_cone.r1 = outlet[i].r; | ||
2704 | - new_cone.r2 = outlet[i].r; | 2714 | + new_cone.r1 = outlet[i].r * scale; |
2715 | + new_cone.r2 = outlet[i].r * scale; | ||
2705 | B.push_back(new_cone); | 2716 | B.push_back(new_cone); |
2706 | } | 2717 | } |
2707 | } | 2718 | } |
2708 | 2719 | ||
2709 | // find out the image stack size | 2720 | // find out the image stack size |
2710 | - Xl = main_feeder[0][0] - length / 2; // left bound x coordinate | ||
2711 | - Xr = main_feeder[1][0] + length / 2; // right bound x coordinate | 2721 | + Xl = main_feeder[0][0] - length / 2 - 2 * radius; // left bound x coordinate |
2722 | + Xr = main_feeder[1][0] + length / 2 + 2 * radius; // right bound x coordinate | ||
2712 | 2723 | ||
2713 | for (unsigned i = 0; i < A.size(); i++) { | 2724 | for (unsigned i = 0; i < A.size(); i++) { |
2714 | if (A[i].c[1] > top) | 2725 | if (A[i].c[1] > top) |
@@ -2720,21 +2731,21 @@ namespace stim { | @@ -2720,21 +2731,21 @@ namespace stim { | ||
2720 | bb.B[2] = A[i].c[2]; | 2731 | bb.B[2] = A[i].c[2]; |
2721 | if (A[i].c[2] < bb.A[2]) | 2732 | if (A[i].c[2] < bb.A[2]) |
2722 | bb.A[2] = A[i].c[2]; | 2733 | bb.A[2] = A[i].c[2]; |
2723 | - if (A[i].r > max_radius) | ||
2724 | - max_radius = A[i].r; | 2734 | + if (A[i].r * scale > max_radius) |
2735 | + max_radius = A[i].r * scale; | ||
2725 | } | 2736 | } |
2726 | 2737 | ||
2727 | Yt = top + 2 * radius; // top bound y coordinate | 2738 | Yt = top + 2 * radius; // top bound y coordinate |
2728 | Yb = bottom - 2 * radius; // bottom bound y coordinate | 2739 | Yb = bottom - 2 * radius; // bottom bound y coordinate |
2729 | - Z = (bb.B[2] - bb.A[2] + 2 * max_radius); // bounding box width(along z-axis) | 2740 | + Z = (bb.B[2] - bb.A[2] + 4 * radius); // bounding box width(along z-axis) |
2730 | } | 2741 | } |
2731 | 2742 | ||
2732 | /// making image stack main function | 2743 | /// making image stack main function |
2733 | - void make_image_stack(stim::image_stack<unsigned char, T> &I, T dx, T dy, T dz, std::string stackdir, bool prototype = false, T radius = 5.0f) { | 2744 | + void make_image_stack(stim::image_stack<unsigned char, T> &I, T dx, T dy, T dz, std::string stackdir, bool prototype = false, T radius = 5.0f, T scale = 1.0f) { |
2734 | 2745 | ||
2735 | /// preparation for making image stack | 2746 | /// preparation for making image stack |
2736 | T X, Xl, Xr, Y, Yt, Yb, Z; | 2747 | T X, Xl, Xr, Y, Yt, Yb, Z; |
2737 | - preparation(Xl, Xr, Yt, Yb, Z, prototype); | 2748 | + preparation(Xl, Xr, Yt, Yb, Z, prototype, 40.0f, 10.0f, radius, scale); |
2738 | X = Xr - Xl; // bounding box length(along x-axis) | 2749 | X = Xr - Xl; // bounding box length(along x-axis) |
2739 | Y = Yt - Yb; // bounding box height(along y-axis) | 2750 | Y = Yt - Yb; // bounding box height(along y-axis) |
2740 | stim::vec3<T> center = bb.center(); // get the center of bounding box | 2751 | stim::vec3<T> center = bb.center(); // get the center of bounding box |
@@ -2744,7 +2755,7 @@ namespace stim { | @@ -2744,7 +2755,7 @@ namespace stim { | ||
2744 | /// make | 2755 | /// make |
2745 | size_x = (int)(X / dx + 1); // set the size of image | 2756 | size_x = (int)(X / dx + 1); // set the size of image |
2746 | size_y = (int)(Y / dy + 1); | 2757 | size_y = (int)(Y / dy + 1); |
2747 | - size_z = (int)(Z / dz + 1); | 2758 | + size_z = (int)(Z / dz + 1); // +3 in order to deal with reminder |
2748 | /// initialize image stack object | 2759 | /// initialize image stack object |
2749 | I.init(1, size_x, size_y, size_z); | 2760 | I.init(1, size_x, size_y, size_z); |
2750 | I.set_dim(dx, dy, dz); | 2761 | I.set_dim(dx, dy, dz); |
@@ -2811,11 +2822,11 @@ namespace stim { | @@ -2811,11 +2822,11 @@ namespace stim { | ||
2811 | 2822 | ||
2812 | dim3 block((unsigned)(size_x / max_thread + 1), (unsigned)(size_y / max_thread + 1)); | 2823 | dim3 block((unsigned)(size_x / max_thread + 1), (unsigned)(size_y / max_thread + 1)); |
2813 | dim3 thread((unsigned)max_thread, (unsigned)max_thread); | 2824 | dim3 thread((unsigned)max_thread, (unsigned)max_thread); |
2814 | - inside_sphere << <block, thread >> > (d_V, A.size(), d_R, d_S, d_ptr, x, y, z); | 2825 | + inside_sphere << <block, thread >> > (d_V, A.size(), Z, d_R, d_S, d_ptr, x, y, z); |
2815 | cudaDeviceSynchronize(); | 2826 | cudaDeviceSynchronize(); |
2816 | - inside_cone << <block, thread >> > (d_E, B.size(), d_R, d_S, d_ptr, x, y, z); | 2827 | + inside_cone << <block, thread >> > (d_E, B.size(), Z, d_R, d_S, d_ptr, x, y, z); |
2817 | cudaDeviceSynchronize(); | 2828 | cudaDeviceSynchronize(); |
2818 | - inside_cuboid << <block, thread >> > (d_B, CU.size(), d_R, d_S, d_ptr, x, y, z); | 2829 | + inside_cuboid << <block, thread >> > (d_B, CU.size(), Z, d_R, d_S, d_ptr, x, y, z); |
2819 | 2830 | ||
2820 | HANDLE_ERROR(cudaMemcpy(ptr, d_ptr, num * sizeof(unsigned char), cudaMemcpyDeviceToHost)); | 2831 | HANDLE_ERROR(cudaMemcpy(ptr, d_ptr, num * sizeof(unsigned char), cudaMemcpyDeviceToHost)); |
2821 | 2832 |
main.cu
@@ -833,7 +833,7 @@ void glut_wheel(int wheel, int direction, int x, int y) { | @@ -833,7 +833,7 @@ void glut_wheel(int wheel, int direction, int x, int y) { | ||
833 | GLdouble posX, posY, posZ; | 833 | GLdouble posX, posY, posZ; |
834 | window_to_world(posX, posY, posZ); // get the world coordinates | 834 | window_to_world(posX, posY, posZ); // get the world coordinates |
835 | 835 | ||
836 | - if (!to_select_pressure && (simulation || build_inlet_outlet)) { // check current pixel position only in simualtion and build_inlet_outlet modes | 836 | + if (!to_select_pressure && (simulation || build_inlet_outlet || manufacture)) { // check current pixel position only in simualtion and build_inlet_outlet modes |
837 | bool flag = flow.epsilon_vertex((float)posX, (float)posY, (float)posZ, eps, scale, pressure_index); | 837 | bool flag = flow.epsilon_vertex((float)posX, (float)posY, (float)posZ, eps, scale, pressure_index); |
838 | if (flag && simulation && !glyph_mode) { | 838 | if (flag && simulation && !glyph_mode) { |
839 | float tmp_r; | 839 | float tmp_r; |
@@ -947,7 +947,7 @@ void glut_keyboard(unsigned char key, int x, int y) { | @@ -947,7 +947,7 @@ void glut_keyboard(unsigned char key, int x, int y) { | ||
947 | case 'm': | 947 | case 'm': |
948 | if (manufacture) { | 948 | if (manufacture) { |
949 | #ifdef __CUDACC__ | 949 | #ifdef __CUDACC__ |
950 | - flow.make_image_stack(S, dx, dy, dz, stackdir, image_stack); | 950 | + flow.make_image_stack(S, dx, dy, dz, stackdir, image_stack, default_radius, scale); |
951 | 951 | ||
952 | #else | 952 | #else |
953 | std::cout << "You need to have a gpu to make image stack, sorry." << std::endl; | 953 | std::cout << "You need to have a gpu to make image stack, sorry." << std::endl; |