YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense alongwiththisprogram;ifnot,writetotheFreeSoftware
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
void gcalc_mul_coord(Gcalc_internal_coord *result, int result_len, const Gcalc_internal_coord *a, int a_len, const Gcalc_internal_coord *b, int b_len);
enum Gcalc_scan_events
{
scev_none= 0,
scev_point= 1, /* Just a new point in thread */
scev_thread= 2, /* Start of the new thread */
scev_two_threads= 4, /* A couple of new threads started */
scev_intersection= 8, /* Intersection happened */
scev_end= 16, /* Single thread finished */
scev_two_ends= 32, /* A couple of threads finished */
scev_single_point= 64/* Got single point */
};
class Gcalc_scan_iterator : public Gcalc_dyn_list
{ public: class point : public Gcalc_dyn_list::Item
{ public:
Gcalc_coord1 dx;
Gcalc_coord1 dy;
Gcalc_heap::Info *pi;
Gcalc_heap::Info *next_pi;
Gcalc_heap::Info *ev_pi; const Gcalc_coord1 *l_border; const Gcalc_coord1 *r_border;
point *ev_next;
Gcalc_scan_events event;
inlineconst point *c_get_next() const
{ return (const point *)next; } inlinebool is_bottom() const { return !next_pi; }
gcalc_shape_info get_shape() const { return pi->node.shape.shape; } inline point *get_next() { return (point *)next; } inlineconst point *get_next() const { return (const point *)next; } /* Compare the dx_dy parameters regarding the horiz_dir */ /* returns -1 if less, 0 if equal, 1 if bigger */ staticint cmp_dx_dy(const Gcalc_coord1 dx_a, const Gcalc_coord1 dy_a, const Gcalc_coord1 dx_b, const Gcalc_coord1 dy_b); staticint cmp_dx_dy(const Gcalc_heap::Info *p1, const Gcalc_heap::Info *p2, const Gcalc_heap::Info *p3, const Gcalc_heap::Info *p4); int cmp_dx_dy(const point *p) const;
point **next_ptr() { return (point **) &next; } #ifndef GCALC_DBUG_OFF unsignedint thread; #endif/*GCALC_DBUG_OFF*/ #ifdef GCALC_CHECK_WITH_FLOAT void calc_x(longdouble *x, longdouble y, longdouble ix) const; #endif/*GCALC_CHECK_WITH_FLOAT*/
};
/* That class introduced mostly for the 'typecontrol' reason. */ /* only difference from the point class is the get_next() function. */ class event_point : public point
{ public: inlineconst event_point *get_next() const
{ return (const event_point*) ev_next; } int simple_event() const
{ return !ev_next ? (event & (scev_point | scev_end)) :
(!ev_next->ev_next && event == scev_two_ends);
}
};
class intersection_info : public Gcalc_dyn_list::Item
{ public:
point *edge_a;
point *edge_b;
Gcalc_coord2 t_a;
Gcalc_coord2 t_b; int t_calculated;
Gcalc_coord3 x_exp; int x_calculated;
Gcalc_coord3 y_exp; int y_calculated; void calc_t()
{if (!t_calculated) do_calc_t(); } void calc_y_exp()
{ if (!y_calculated) do_calc_y(); } void calc_x_exp()
{ if (!x_calculated) do_calc_x(); }
int node_scan(); void eq_scan(); void intersection_scan(); void remove_bottom_node(); int insert_top_node(); int add_intersection(point *sp_a, point *sp_b,
Gcalc_heap::Info *pi_from); int add_eq_node(Gcalc_heap::Info *node, point *sp); int add_events_for_node(point *sp_node);
point *new_slice_point()
{
point *new_point= (point *)new_item(); return new_point;
}
intersection_info *new_intersection_info(point *a, point *b)
{
intersection_info *ii= (intersection_info *)new_item();
ii->edge_a= a;
ii->edge_b= b;
ii->t_calculated= ii->x_calculated= ii->y_calculated= 0; return ii;
} int arrange_event(int do_sorting, int n_intersections); staticdouble get_pure_double(const Gcalc_internal_coord *d, int d_len);
};
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.3Bemerkung:
(vorverarbeitet am 2026-10-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.