31 : x0(a), x1(b), radius(in_radius), _tag_id(
id)
70 nec_float epsa = b.radius / length();
71 nec_float epsb = radius / b.length();
73 std::vector<nec_wire> ret;
75 if (d2 > (radius + b.radius))
return ret;
77 if ((sa >= -epsa) && (sa <= 1.0 + epsa) && (sb >= -epsb) && (sb <= 1.0 + epsb))
79 nec_3vector a_pt = parametrize(sa);
80 nec_3vector b_pt = b.parametrize(sb);
82 if (sa > epsa) ret.push_back(
nec_wire(x0, a_pt, radius,_tag_id));
83 if (sa < 1.0 - epsa) ret.push_back(
nec_wire(a_pt, x1, radius,_tag_id));
85 if (sb > epsb) ret.push_back(
nec_wire(b.x0, b_pt, b.radius,b._tag_id));
86 if (sb < 1.0 - epsb) ret.push_back(
nec_wire(b_pt, b.x1, b.radius, b._tag_id));
98 nec_float a0x = x0(0); nec_float a0y = x0(1); nec_float a0z = x0(2);
99 nec_float a1x = x1(0); nec_float a1y = x1(1); nec_float a1z = x1(2);
101 nec_float b0x = b0(0); nec_float b0y = b0(1); nec_float b0z = b0(2);
155 nec_float sa = (a1x*b0x + a1y*b0y + a1z*b0z - a0x*a1x - a0x*b0x - a0y*a1y - a0y*b0y - a0z*a1z - a0z*b0z + a0x*a0x + a0y*a0y + a0z*a0z)/
156 (-2.0*a0x*a1x - 2*a0y*a1y - 2.0*a0z*a1z + a0x*a0x + a0y*a0y + a0z*a0z + a1x*a1x + a1y*a1y + a1z*a1z);
157 if (sa < 0) sa = 0.0;
158 if (sa > 1.0) sa = 1.0;
160 nec_3vector a_pt = parametrize(sa);
162 if (distance(a_pt, b0) > radius)
return false;
221 nec_3vector& b0, nec_3vector& b1,
222 nec_float& distance, nec_float& sa, nec_float& sb)
224 nec_float a0x = a0(0); nec_float a0y = a0(1); nec_float a0z = a0(2);
225 nec_float b0x = b0(0); nec_float b0y = b0(1); nec_float b0z = b0(2);
226 nec_float a1x = a1(0); nec_float a1y = a1(1); nec_float a1z = a1(2);
227 nec_float b1x = b1(0); nec_float b1y = b1(1); nec_float b1z = b1(2);
229 nec_float a01x = (a0x - a1x);
230 nec_float a01y = (a0y - a1y);
231 nec_float a01z = (a0z - a1z);
233 nec_float b01x = (b0x - b1x);
234 nec_float b01y = (b0y - b1y);
235 nec_float b01z = (b0z - b1z);
237 nec_float moda = (a01x*a01x + a01y*a01y + a01z*a01z);
238 nec_float modb = (b01x*b01x + b01y*b01y + b01z*b01z);
240 nec_float tmp2 = (a01x*b01x + a01y*b01y + a01z*b01z);
242 nec_float den = (-4.0*tmp2*tmp2 + 4.0*moda*modb);
244 distance = 9.0e9; sa = 2.0; sb = 2.0;
245 if (0 == den)
return;
247 nec_float tmp3 = (-4.0*(a0x*a0x + a0y*a0y + a1x*b0x - a0x*(a1x + b0x) + a1y*b0y - a0y*(a1y + b0y) + a01z*(a0z - b0z))*tmp2 + 4.0*moda*((a0x - b0x)*b01x + (a0y - b0y)*b01y + (a0z - b0z)*b01z));
249 sa = (a0x*a01x + a0y*a01y + a0z*a01z - a01x*b0x - a01y*b0y - a01z*b0z - tmp3*tmp2/den)/moda;
253 nec_float d2 = pow((a0x - b0x + sa*(a1x - a0x) - sb*(b1x - b0x)),2) +
254 pow((a0z - b0z + sa*(a1z - a0z) - sb*(b1z - b0z)),2) +
255 pow((a0y - b0y + sa*(a1y - a0y) - sb*(b1y - b0y)),2);
257 distance = std::sqrt(d2);