31 nec_wire(
const nec_3vector& a,
const nec_3vector& b, nec_float in_radius,
int id)
32 : x0(a), x1(b), radius(in_radius), _tag_id(
id)
36 nec_3vector parametrize(nec_float s)
const
43 nec_float distance(
const nec_3vector& a,
const nec_3vector& b)
const
45 return (a - b).norm();
48 nec_float length()
const
50 return distance(x0, x1);
58 nec_float get_radius()
const
71 nec_float epsa = b.radius / length();
72 nec_float epsb = radius / b.length();
74 std::vector<nec_wire> ret;
76 if (d2 > (radius + b.radius))
return ret;
78 if ((sa >= -epsa) && (sa <= 1.0 + epsa) && (sb >= -epsb) && (sb <= 1.0 + epsb))
80 nec_3vector a_pt = parametrize(sa);
81 nec_3vector b_pt = b.parametrize(sb);
83 if (sa > epsa) ret.push_back(
nec_wire(x0, a_pt, radius,_tag_id));
84 if (sa < 1.0 - epsa) ret.push_back(
nec_wire(a_pt, x1, radius,_tag_id));
86 if (sb > epsb) ret.push_back(
nec_wire(b.x0, b_pt, b.radius,b._tag_id));
87 if (sb < 1.0 - epsb) ret.push_back(
nec_wire(b_pt, b.x1, b.radius, b._tag_id));
109 nec_float a0x = x0(0); nec_float a0y = x0(1); nec_float a0z = x0(2);
110 nec_float a1x = x1(0); nec_float a1y = x1(1); nec_float a1z = x1(2);
112 nec_float b0x = b0(0); nec_float b0y = b0(1); nec_float b0z = b0(2);
171 (a1x-a0x)*(a1x-a0x) + (a1y-a0y)*(a1y-a0y) + (a1z-a0z)*(a1z-a0z);
173 throw nec_exception(
"nec_wire::axis_distance(): zero-length wire");
175 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)/
177 if (sa < 0) sa = 0.0;
178 if (sa > 1.0) sa = 1.0;
180 nec_3vector a_pt = parametrize(sa);
182 return distance(a_pt, b0);
189 nec_float d1 = distance(x0, b.x0);
190 nec_float d2 = distance(x0, b.x1);
191 nec_float da = std::min(d1,d2);
193 nec_float d3 = distance(x1, b.x1);
194 nec_float d4 = distance(x1, b.x0);
195 nec_float db = std::min(d3,d4);
197 if ((std::abs(da) < radius) && (std::abs(db) < radius))
239 static void int_solve(nec_3vector& a0, nec_3vector& a1,
240 nec_3vector& b0, nec_3vector& b1,
241 nec_float& distance, nec_float& sa, nec_float& sb)
243 nec_float a0x = a0(0); nec_float a0y = a0(1); nec_float a0z = a0(2);
244 nec_float b0x = b0(0); nec_float b0y = b0(1); nec_float b0z = b0(2);
245 nec_float a1x = a1(0); nec_float a1y = a1(1); nec_float a1z = a1(2);
246 nec_float b1x = b1(0); nec_float b1y = b1(1); nec_float b1z = b1(2);
248 nec_float a01x = (a0x - a1x);
249 nec_float a01y = (a0y - a1y);
250 nec_float a01z = (a0z - a1z);
252 nec_float b01x = (b0x - b1x);
253 nec_float b01y = (b0y - b1y);
254 nec_float b01z = (b0z - b1z);
256 nec_float moda = (a01x*a01x + a01y*a01y + a01z*a01z);
257 nec_float modb = (b01x*b01x + b01y*b01y + b01z*b01z);
259 nec_float tmp2 = (a01x*b01x + a01y*b01y + a01z*b01z);
261 nec_float den = (-4.0*tmp2*tmp2 + 4.0*moda*modb);
263 distance = 9.0e9; sa = 2.0; sb = 2.0;
264 if (0 == den)
return;
266 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));
268 sa = (a0x*a01x + a0y*a01y + a0z*a01z - a01x*b0x - a01y*b0y - a01z*b0z - tmp3*tmp2/den)/moda;
272 nec_float d2 = pow((a0x - b0x + sa*(a1x - a0x) - sb*(b1x - b0x)),2) +
273 pow((a0z - b0z + sa*(a1z - a0z) - sb*(b1z - b0z)),2) +
274 pow((a0y - b0y + sa*(a1y - a0y) - sb*(b1y - b0y)),2);
276 distance = std::sqrt(d2);
static void int_solve(nec_3vector &a0, nec_3vector &a1, nec_3vector &b0, nec_3vector &b1, nec_float &distance, nec_float &sa, nec_float &sb)
Definition nec_wire.h:233