49{
50 uint32_t i, iter;
51 double delta;
52 double sum_curr = 0, sum_next = 0;
54 double *distances =
lwalloc(npoints *
sizeof(
double));
55
57
58 for (iter = 0; iter < max_iter; iter++)
59 {
61 double denom = 0;
62
64 for (i = 0; i < npoints; i++)
65 {
66
67 if (distances[i] > DBL_EPSILON)
68 {
69 next.
x += points[i].
x / distances[i];
70 next.
y += points[i].
y / distances[i];
71 next.
z += points[i].
z / distances[i];
72 denom += 1.0 / distances[i];
73 }
74 else
75 {
77 }
78 }
79
80 if (denom < DBL_EPSILON)
81 {
82
83 break;
84 }
85
86
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 if (hit)
106 {
107 double dx = 0, dy = 0, dz = 0;
108 double d_sqr;
110
111 for (i = 0; i < npoints; i++)
112 {
113 if (distances[i] > DBL_EPSILON)
114 {
115 dx += (points[i].
x - curr->
x) / distances[i];
116 dy += (points[i].
y - curr->
y) / distances[i];
117 dz += (points[i].
z - curr->
z) / distances[i];
118 }
119 }
120
121 d_sqr = sqrt(dx*dx + dy*dy + dz*dz);
122 if (d_sqr > DBL_EPSILON)
123 {
124 double r_inv =
FP_MAX(0, 1.0 / d_sqr);
125 next.
x = (1.0 - r_inv)*next.
x + r_inv*curr->
x;
126 next.
y = (1.0 - r_inv)*next.
y + r_inv*curr->
y;
127 next.
z = (1.0 - r_inv)*next.
z + r_inv*curr->
z;
128 }
129 }
130
131
133 delta = sum_curr - sum_next;
134 if (delta < tol)
135 {
136 break;
137 }
138 else
139 {
143 sum_curr = sum_next;
144 }
145 }
146
148 return iter;
149}
void * lwalloc(size_t size)
#define LW_TRUE
Return types for functions with status returns.