1 #include <../../nrnconf.h>
29 #if defined(HAVE_FENV_H) && defined(HAVE_FESETROUND)
31 static int round_mode[] = {FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD};
34 #if defined(HAVE_FENV_H) && defined(HAVE_FESETROUND)
35 int oldmode = fegetround();
37 if (oldmode == FE_TONEAREST) {
39 }
else if (oldmode == FE_TOWARDZERO) {
41 }
else if (oldmode == FE_UPWARD) {
43 }
else if (oldmode == FE_DOWNWARD) {
48 if (mode > 0 && mode < 5) {
49 nrn_assert(fesetround(round_mode[mode - 1]) == 0);
96 for (
int i = 1;
i < count; ++
i) {
106 for (
int i = 1;
i < count; ++
i) {
125 Coord dx, dy, dx2, dy2;
131 norm2 = dx2 * dx2 + dy2 * dy2;
132 norm = dx * dx + dy * dy;
133 dot = dx * dx2 + dy * dy2;
134 d = norm - dot * dot /
norm2;
136 if (d <= epsilon * epsilon) {
146 Coord dx, dy, dx2, dy2;
152 norm2 = dx2 * dx2 + dy2 * dy2;
153 norm = dx * dx + dy * dy;
154 dot = dx * dx2 + dy * dy2;
158 d = norm - dot * dot /
norm2;
167 Coord dx, dy, dx2, dy2;
172 norm2 = dx2 * dx2 + dy2 * dy2;
173 norm = dx * dx + dy * dy;
178 dot = dx * dx2 + dy * dy2;
181 }
else if (dot >
norm2) {
184 return sqrt(dx * dx + dy * dy);
186 dx = norm - dot * dot /
norm2;
201 Coord l = x1, b = y1, r = x2,
t = y2;
206 return MyMath::inside(x, y, l - epsilon, b - epsilon, r + epsilon,
t + epsilon) &&
248 }
else if ((
i%3) == 0) {
271 y1 = d*double(
int(x1/d - .5));
272 y2 = d*double(
int(x2/d + .5));
273 ntic = int((y2 - y1)/d + .5);
281 int i = int((y2 - y1) / d + .5);
287 }
else if (
i % 4 == 0) {
290 }
else if (
i % 5 == 0) {
304 int i = int(d /
e + .5);
306 y1 = 5 *
e *
ceil(x1 /
e / 5 - .01);
307 y2 = 5 *
e *
floor(x2 /
e / 5 + .01);
309 y1 =
e *
ceil(x1 /
e - .01);
312 i = int((y2 - y1) /
e + .5);
318 }
else if (
i % 4 == 0) {
321 }
else if (
i % 5 == 0) {
370 d =
sqrt(x * x + y * y);
static bool equal(float x, float y, float e)
static bool near_line(Coord x, Coord y, Coord x1, Coord y1, Coord x2, Coord y2, float epsilon)
static void round_range_down(Coord x1, Coord x2, double &y1, double &y2, int &ntic)
static bool near_line_segment(Coord x, Coord y, Coord x1, Coord y1, Coord x2, Coord y2, float epsilon)
static float distance_to_line_segment(Coord x, Coord y, Coord x1, Coord y1, Coord x2, Coord y2)
static double anint(double)
static void minmax(Coord &min, Coord &max)
static bool unit_normal(Coord x, Coord y, Coord *perp)
static void round_range(Coord x1, Coord x2, double &y1, double &y2, int &ntic)
static float max(int count, const float *)
static bool inside(Coord x, Coord min, Coord max)
static void box(Requisition &, Coord &x1, Coord &y1, Coord &x2, Coord &y2)
static float min(int count, const float *)
static double round(float &x1, float &x2, int direction, int digits)
static float norm2(Coord x, Coord y)
static float distance_to_line(Coord x, Coord y, Coord x1, Coord y1, Coord x2, Coord y2)
const Requirement & x_requirement() const
const Requirement & y_requirement() const
double chkarg(int, double low, double high)
static double inside(void *)
static Member_func members[]
static void * cons(Object *)
static void destruct(void *)
static double distance_to_line_segment(void *)
static double distance_to_line(void *)
static double feround(void *)
void class2oc(const char *, void *(*cons)(Object *), void(*destruct)(void *), Member_func *, int(*checkpoint)(void **), Member_ret_obj_func *, Member_ret_str_func *)