int main(int argc, char *argv[]) { ListNode ln0(0); ListNode ln1(1); ListNode ln2(2); ListNode ln3(3); ListNode ln4(4); ListNode ln5(5); ListNode ln6(6); ListNode ln7(7); ListNode ln8(4); ListNode ln9(9); ListNode *head = NULL; ln2.next = &ln4; ln4.next = &ln9; ln5.next = &ln6; //ln6.next = &ln9; Solution so; head = so.addTwoNumbers(&ln2, &ln5); while (head) { std::cout << head->val << " "; head = head->next; } std::cout << std::endl; return 0; }
void LineSegment2I::TestDraw( ) { Color3B gray( 100, 100, 100 ); Color3B yellow( 255, 255, 0 ); Color3B magenta( 255, 0, 255 ); Color3B cyan( 0, 255, 255 ); int x = 60; int y = 20; int dx = 100; int dy = 80; LineSegment2I ln1( x, y, dx, dy ); int x1 = 160; int y1 = 20; int x2 = 60; int y2 = 100; LineSegment2I ln2( Point2I( x1, y1 ), Point2I( x2, y2 ) ); Rectangle oldClip = Surface::Current()->ClippingRect(); ln1.Draw( gray ); ln2.Draw( gray ); Surface::Current()->SetClippingRect( Rectangle( 100, 50, 20, 20 ) ); ln1.Draw( yellow ); ln2.Draw( yellow ); Surface::Current()->SetClippingRect( Rectangle( 60, 10, 20, 200 ) ); ln1.Draw( cyan ); ln2.Draw( cyan ); Surface::Current()->SetClippingRect( Rectangle( 140, 10, 20, 200 ) ); ln1.Draw( magenta ); ln2.Draw( magenta ); Surface::Current()->SetClippingRect( oldClip ); }
bool LineSegment2I::Test( ) { bool ok = true; cout << "Testing LineSegment2I" << endl; int x = 60; int y = 20; int dx = 100; int dy = 80; cout << "LineSegment2I( " << x << ", " << y << ", " << dx << ", " << dy << " )" << endl; LineSegment2I ln1( x, y, dx, dy ); TESTCHECK( ln1.X(), x, &ok ); TESTCHECK( ln1.Y(), y, &ok ); TESTCHECK( ln1.DX(), dx, &ok ); TESTCHECK( ln1.DY(), dy, &ok ); cout << "ln1.Endpoints()" << endl; PointPair endpoints = ln1.Endpoints(); TESTCHECK( endpoints.first.X(), x, &ok ); TESTCHECK( endpoints.first.Y(), y, &ok ); TESTCHECK( endpoints.second.X(), (x + dx), &ok ); TESTCHECK( endpoints.second.Y(), (y + dy), &ok ); TESTCHECK( ln1.LengthSquared(), 16400, &ok ); int x1 = 160; int y1 = 20; int x2 = 60; int y2 = 100; cout << "LineSegment2I( Point2I( " << x1 << ", " << y1 <<" ), " << "Point2I( " << x2 << ", " << y2 << " ) )" << endl; LineSegment2I ln2( Point2I( x1, y1 ), Point2I( x2, y2 ) ); cout << "ln2.Endpoints()" << endl; endpoints = ln2.Endpoints(); TESTCHECK( endpoints.first.X(), x2, &ok ); TESTCHECK( endpoints.first.Y(), y2, &ok ); TESTCHECK( endpoints.second.X(), x1, &ok ); TESTCHECK( endpoints.second.Y(), y1, &ok ); TESTCHECK( ln2.X(), x2, &ok ); TESTCHECK( ln2.Y(), y2, &ok ); TESTCHECK( ln2.DX(), (x1 - x2), &ok ); TESTCHECK( ln2.DY(), (y1 - y2), &ok ); TESTCHECK( ln2.LengthSquared(), 16400, &ok ); TESTCHECK( (ln1 == ln2), false, &ok ); TESTCHECK( (ln1 == ln1), true, &ok ); TESTCHECK( (ln1 != ln2), true, &ok ); if ( ok ) cout << "LineSegment2I PASSED." << endl << endl; else cout << "LineSegment2I FAILED." << endl << endl; return ok; }
vector3 midPoint() { return (ind[0] + ind[1] + ind[2]) / 3.0; line3 ln1(ind[0], ind[1] - ind[0]); line3 ln2(ind[1], ind[2] - ind[1]); line3 ln3(ln1.getPoint(0.5), ind[2] - ln1.getPoint(0.5)); line3 ln4(ln2.getPoint(0.5), ind[0] - ln2.getPoint(0.5)); vector3 mid; if (ln3.intersects(ln4, &mid)) { return mid; } else BERROR("FATAL ln3.intersects(ln4, &mid"); return ind[0]; }
/*static*/ void initialize_default_env () { if (N(default_env) != 0) return; hashmap<string,tree>& env= default_env; tree identity_m (MACRO, "x", tree (ARG, "x")); tree tabular_m (MACRO, "x", tree (TFORMAT, tree (ARG, "x"))); tree the_page (MACRO, compound ("page-nr")); tree gr_geometry (TUPLE, "geometry", "1par", "0.6par", "center"); tree gr_frame (TUPLE, "scale", "1cm", tree (TUPLE, "0.5gw", "0.5gh")); tree gr_grid (""); tree gr_edit_grid (""); tree gr_grid_aspect (TUPLE, tuple ("axes", "#808080"), tuple ("1", "#c0c0c0"), tuple ("10", "#e0e0ff")); tree gr_transf (TUPLE, tuple ("1.0", "0.0", "0.0", "0.0"), tuple ("0.0", "1.0", "0.0", "0.0"), tuple ("0.0", "0.0", "1.0", "0.0"), tuple ("0.0", "0.0", "0.0", "1.0")); env (DPI) = "600"; // resolution in dots per inch env (ZOOM_FACTOR) = "1"; // zoom factor on screen env (PREAMBLE) = "false"; // preamble mode ? env (SAVE_AUX) = "true"; // save auxiliary data on disk ? env (MODE) = "text"; // typesetting mode env (INFO_FLAG) = "minimal"; // information about labels, etc. env (WINDOW_BARS) = "auto"; // override menu/icon bar settings env (SCROLL_BARS) = "true"; // allow scroll bars around canvas? env (IDENTITY) = identity_m; // identity macro env (TABULAR) = tabular_m; // tabular macro env (THE_LABEL) = "?"; // value of the next label env (THE_TAGS) = tree(TUPLE); // current tags env (THE_MODULES) = tree(TUPLE); // necessary modules and plug-ins env (WARN_MISSING) = "true"; // warn about missing references env (GLOBAL_TITLE) = ""; // global document title env (GLOBAL_AUTHOR) = ""; // global document author env (GLOBAL_SUBJECT) = ""; // global document subject env (FONT) = "roman"; // the font name in text mode env (FONT_FAMILY) = "rm"; // the font family in text mode env (FONT_SERIES) = "medium"; // the font series in text mode env (FONT_SHAPE) = "right"; // the font shape in text mode env (FONT_SIZE) = "1"; // the font size multiplier env (FONT_BASE_SIZE) = "10"; // the font base size env (MAGNIFICATION) = "1"; // magnification (slides for instance) env (COLOR) = "black"; // the color env (OPACITY) = "100%"; // the opacity env (BG_COLOR) = "white"; // the background color env (LOCUS_COLOR) = "global"; // the color of loci env (VISITED_COLOR) = "global"; // the color of visited loci env (NO_PATTERNS) = "false"; // disable background patterns env (LANGUAGE) = "english"; // the language env (ATOM_DECORATIONS) = DATOMS; // dots, underline, hyperlinks?, etc. env (LINE_DECORATIONS) = DLINES; // boxed pars, nested envs, etc. env (PAGE_DECORATIONS) = DPAGES; // future headers, footers, etc. env (XOFF_DECORATIONS) = "0tmpt"; // hor. placement of decorations env (YOFF_DECORATIONS) = "0tmpt"; // vert. placement of decorations env (MATH_LANGUAGE) = "std-math"; // the default mathematical language env (MATH_FONT) = "roman"; // the font name in math mode env (MATH_FONT_FAMILY) = "mr"; // the font family in math mode env (MATH_FONT_SERIES) = "medium"; // the font series in math mode env (MATH_FONT_SHAPE) = "normal"; // the font shape in math mode env (MATH_LEVEL) = "0"; // the index level (0, 1 or 2) env (MATH_DISPLAY) = "false"; // true if we are in display style env (MATH_CONDENSED) = "false"; // ignore spaces between operators ? env (MATH_VPOS) = "0"; // used in fractions (-1, 0 or 1) env (MATH_NESTING_MODE)= "off"; // color nested brackets? env (MATH_NESTING_LEVEL)= "0"; // nesting level inside brackets env (PROG_LANGUAGE) = "scheme"; // the default programming language env (PROG_SCRIPTS) = "scheme"; // the scripting language env (PROG_FONT) = "roman"; // the font name in prog mode env (PROG_FONT_FAMILY) = "tt"; // the font family in prog mode env (PROG_FONT_SERIES) = "medium"; // the font series in prog mode env (PROG_FONT_SHAPE) = "right"; // the font shape in prog mode env (PROG_SESSION) = "default"; // computer algebra session name env (PAR_MODE) = "justify"; // outline method env (PAR_FLEXIBILITY) = "1000"; // threshold for switching to ragged env (PAR_HYPHEN) = "professional"; // quality of hyphenation env (PAR_SPACING) = "plain"; // spacing mode (for CJK) env (PAR_KERNING_STRETCH)= "auto"; // extra kerning around characters env (PAR_KERNING_MARGIN) = "false"; // use marginal kerning (protrusion) env (PAR_WIDTH) = "auto"; // width of paragraph env (PAR_LEFT) = "0cm"; // left indentation env (PAR_RIGHT) = "0cm"; // right indentation env (PAR_FIRST) = "1.5fn"; // extra first indentation env (PAR_NO_FIRST) = "false"; // no extra first indent. on next line env (PAR_SEP) = "0.2fn"; // extra space between paragraph lines env (PAR_HOR_SEP) = "0.5fn"; // min. hor. spc. between ink for shove env (PAR_VER_SEP) = "0.2fn"; // min. ver. spc. between ink env (PAR_LINE_SEP) = "0.025fns"; // extra (small) space between lines env (PAR_PAR_SEP) = "0.5fns"; // extra space between paragraphs env (PAR_FNOTE_SEP) = "0.2fn"; // min space between diff footnotes env (PAR_COLUMNS) = "1"; // number of columns env (PAR_COLUMNS_SEP) = "2fn"; // separation between columns env (PAGE_MEDIUM) = "papyrus"; // paper medium: paper, papyrus, auto env (PAGE_PRINTED) = "false"; // printed version? env (PAGE_TYPE) = "a4"; // paper type (-> width & height) env (PAGE_ORIENTATION) = "portrait"; // paper orientation env (PAGE_WIDTH_MARGIN) = "false"; // compute margins from par-width? env (PAGE_HEIGHT_MARGIN) = "false"; // compute margins from par-width? env (PAGE_SCREEN_MARGIN) = "true"; // special margins for screen editing? env (PAGE_BREAKING) = "professional"; // quality of page breaking env (PAGE_FLEXIBILITY) = "1"; // flexibility factor of stretch env (PAGE_NR) = "0"; // the page number env (PAGE_THE_PAGE) = the_page; // the page number as text env (PAGE_WIDTH) = "auto"; // physical width of pages env (PAGE_HEIGHT) = "auto"; // physical height of pages env (PAGE_ODD) = "auto"; // left margin on odd pages env (PAGE_EVEN) = "auto"; // left margin on even pages env (PAGE_RIGHT) = "auto"; // right margin in auto mode env (PAGE_TOP) = "auto"; // top margin env (PAGE_BOT) = "auto"; // bottom margin env (PAGE_USER_HEIGHT) = "522pt"; // height of principal text env (PAGE_ODD_SHIFT) = "0mm"; // odd page marginal shift wrt center env (PAGE_EVEN_SHIFT) = "0mm"; // even page marginal shift wrt center env (PAGE_SHRINK) = "1fn"; // emergency page length shrinking env (PAGE_EXTEND) = "0fn"; // emergency page length extension env (PAGE_HEAD_SEP) = "8mm"; // separation between header and text env (PAGE_FOOT_SEP) = "8mm"; // separation between footer and text env (PAGE_ODD_HEADER) = ""; // header on odd pages env (PAGE_ODD_FOOTER) = ""; // footer on odd pages env (PAGE_EVEN_HEADER) = ""; // header on even pages env (PAGE_EVEN_FOOTER) = ""; // footer on even pages env (PAGE_SCREEN_WIDTH) = "10cm"; // width of current window (for auto) env (PAGE_SCREEN_HEIGHT) = "10cm"; // height of current window (for auto) env (PAGE_SCREEN_LEFT) = "5mm"; // left margin for screen editing env (PAGE_SCREEN_RIGHT)= "5mm"; // right margin for screen editing env (PAGE_SCREEN_TOP) = "15mm"; // top margin for screen editing env (PAGE_SCREEN_BOT) = "15mm"; // bottom margin for screen editing env (PAGE_SHOW_HF) = "true"; // show header and footer env (PAGE_FNOTE_SEP) = "1.0fn"; // space between text & footnotes env (PAGE_FNOTE_BARLEN)= "7.5fn"; // length of footnote separating bar env (PAGE_FLOAT_SEP) = "1.5fn"; // space between text & floats env (PAGE_MNOTE_SEP) = "5mm"; // space between text & marginal notes env (PAGE_MNOTE_WIDTH) = "15mm"; // width of marginal notes env (TABLE_WIDTH) = ""; // width of table env (TABLE_HEIGHT) = ""; // height of table env (TABLE_HMODE) = "auto"; // width determination mode env (TABLE_VMODE) = "auto"; // height determination mode env (TABLE_HALIGN) = "l"; // horizontal alignment env (TABLE_VALIGN) = "f"; // vertical alignment (fraction height) env (TABLE_ROW_ORIGIN) = "0"; // row origin env (TABLE_COL_ORIGIN) = "0"; // column origin env (TABLE_LSEP) = "0fn"; // left padding around table env (TABLE_RSEP) = "0fn"; // right padding around table env (TABLE_BSEP) = "0fn"; // bottom padding around table env (TABLE_TSEP) = "0fn"; // top padding around table env (TABLE_LBORDER) = "0ln"; // left table border width env (TABLE_RBORDER) = "0ln"; // right table border width env (TABLE_BBORDER) = "0ln"; // bottom table border width env (TABLE_TBORDER) = "0ln"; // top table border width env (TABLE_HYPHEN) = "n"; // vertical hyphenation env (TABLE_MIN_ROWS) = ""; // suggested minimal number of rows env (TABLE_MIN_COLS) = ""; // suggested minimal number of columns env (TABLE_MAX_ROWS) = ""; // suggested maximal number of rows env (TABLE_MAX_COLS) = ""; // suggested maximal number of columns env (CELL_DECORATION) = ""; // decorating table of cell env (CELL_FORMAT) = TFORMAT; // format of cell env (CELL_BACKGROUND) = ""; // background color of cell env (CELL_ORIENTATION) = "portrait"; // orientation of cell env (CELL_WIDTH) = ""; // width of cell env (CELL_HEIGHT) = ""; // height of cell env (CELL_HPART) = ""; // take part of unused horizontal space env (CELL_VPART) = ""; // take part of unused vertical space env (CELL_HMODE) = "auto"; // width determination mode env (CELL_VMODE) = "auto"; // height determination mode env (CELL_HALIGN) = "l"; // horizontal alignment env (CELL_VALIGN) = "B"; // vertical alignment env (CELL_LSEP) = "0fn"; // left cell padding env (CELL_RSEP) = "0fn"; // right cell padding env (CELL_BSEP) = "0fn"; // bottom cell padding env (CELL_TSEP) = "0fn"; // top cell padding env (CELL_LBORDER) = "0ln"; // left cell border width env (CELL_RBORDER) = "0ln"; // right cell border width env (CELL_BBORDER) = "0ln"; // bottom cell border width env (CELL_TBORDER) = "0ln"; // top cell border width env (CELL_VCORRECT) = "a"; // vertical limits correction env (CELL_HYPHEN) = "n"; // horizontal hyphenation env (CELL_BLOCK) = "auto"; // cell contains block content? env (CELL_ROW_SPAN) = "1"; // row span of cell env (CELL_COL_SPAN) = "1"; // column span of cell env (CELL_ROW_NR) = "1"; // row coordinate of cell env (CELL_COL_NR) = "1"; // column coordinate of cell env (GR_GEOMETRY) = gr_geometry; // geometry of graphics env (GR_FRAME) = gr_frame; // coordinate frame for graphics env (GR_MODE) = "line"; // graphical mode env (GR_AUTO_CROP) = "false"; // auto crop graphics env (GR_CROP_PADDING) = "1spc"; // padding when auto cropping env (GR_GRID) = gr_grid; // grid for graphics env (GR_GRID_ASPECT) = gr_grid_aspect; // grid aspect env (GR_EDIT_GRID) = gr_edit_grid; // edit grid env (GR_EDIT_GRID_ASPECT) = gr_grid_aspect; // edit grid (subdivisions) env (GR_TRANSFORMATION) = gr_transf; // 3D transformation env (GR_MAGNIFY) = "default"; // magnify of new objects env (GR_OPACITY) = "default"; // opacity of new objects env (GR_COLOR) = "default"; // color of new objects env (GR_POINT_STYLE) = "default"; // point style of new objects env (GR_LINE_WIDTH) = "default"; // line width for new objects env (GR_LINE_JOIN) = "default"; // line join for new objects env (GR_LINE_CAPS) = "default"; // line caps for new objects env (GR_LINE_EFFECTS) = "default"; // line effects for new objects env (GR_DASH_STYLE) = "default"; // dash style for new objects env (GR_DASH_STYLE_UNIT) = "default"; // dash style unit for new objects env (GR_ARROW_BEGIN) = "default"; // arrow begin for new objects env (GR_ARROW_END) = "default"; // arrow end for new objects env (GR_ARROW_LENGTH) = "default"; // arrow length for new objects env (GR_ARROW_HEIGHT) = "default"; // arrow height for new objects env (GR_FILL_COLOR) = "default"; // fill color for new objects env (GR_FILL_STYLE) = "default"; // fill style for new objects env (GR_TEXT_AT_HALIGN) = "default"; // horiz. alignment for new text-ats env (GR_TEXT_AT_VALIGN) = "default"; // vert. alignment for new text-ats env (GR_TEXT_AT_MARGIN) = "default"; // margins for new text-ats env (GID) = "default"; // graphical identifier env (MAGNIFY) = "1"; // magnification for graphical objects env (POINT_STYLE) = "disk"; // point style (square, circle...) env (LINE_WIDTH) = "1ln"; // line width in graphics env (LINE_JOIN) = "normal"; // junctions in multilines env (LINE_CAPS) = "normal"; // caps at ends env (LINE_EFFECTS) = "none"; // effects to be applied on line env (DASH_STYLE) = "none"; // dash style env (DASH_STYLE_UNIT) = "5ln"; // dash style unit env (ARROW_BEGIN) = "none"; // arrow at beginning of line env (ARROW_END) = "none"; // arrow at end of line env (ARROW_LENGTH) = "5ln"; // longitudal length of arrow env (ARROW_HEIGHT) = "5ln"; // transverse height of arrow env (FILL_COLOR) = "none"; // fill color env (FILL_STYLE) = "plain"; // fill style env (TEXT_AT_HALIGN) = "left"; // horizontal text-at alignment env (TEXT_AT_VALIGN) = "base"; // vertical text-at alignment env (TEXT_AT_MARGIN) = "base"; // margin for smart guides env (SRC_STYLE) = "angular"; // style for "source" tags env (SRC_SPECIAL) = "normal"; // special treatment of certain tags env (SRC_COMPACT) = "normal"; // compact inline/multi-paragraph tags? env (SRC_CLOSE) = "compact"; // how to close long tags env (CANVAS_TYPE) = "plain"; // which kind of scrollbars env (CANVAS_COLOR) = "white"; // canvas colour env (CANVAS_HPADDING) = "0px"; // horizontal canvas padding env (CANVAS_VPADDING) = "0px"; // vertical canvas padding env (CANVAS_BAR_WIDTH) = "1em"; // width of scroll bars env (CANVAS_BAR_PADDING) = "0.25em"; // distance of scrollbars env (CANVAS_BAR_COLOR) = "grey"; // color of bar env (ORNAMENT_SHAPE) = "classic"; // shape of the ornament env (ORNAMENT_TITLE_STYLE) = "classic"; // title style env (ORNAMENT_BORDER) = "1ln"; // border width env (ORNAMENT_SWELL) = "0.5"; // border swell env (ORNAMENT_HPADDING) = "1spc"; // horizontal padding of body env (ORNAMENT_VPADDING) = "1spc"; // vertical padding of body env (ORNAMENT_COLOR) = ""; // background color env (ORNAMENT_EXTRA_COLOR) = "white"; // background color for titles env (ORNAMENT_SUNNY_COLOR) = "black"; // sunny color env (ORNAMENT_SHADOW_COLOR) = "black"; // shadow color /* hiding and showing content */ env ("shown")= identity_m; env ("ignore")= tree (MACRO, "body", tree (HIDDEN, tree (ARG, "body"))); /* linking macros */ tree src_id (ID, tree (HARD_ID, tree (ARG, "body"))); tree ref_id (ID, tree (HARD_ID, tree (ARG, "Id"))); tree dest_url (URL, tree (ARG, "destination")); tree dest_script (SCRIPT, tree (ARG, "destination"), tree (ARG, "where")); tree dest_ref (URL, tree (MERGE, "#", tree (ARG, "Id"))); tree anchor (ID, tree (MERGE, "#", tree (ARG, "Id"))); tree ln1 (LINK, "hyperlink", copy (src_id), copy (dest_url)); tree ln2 (LINK, "action", copy (src_id), copy (dest_script)); tree ln3 (LINK, "hyperlink", copy (ref_id), copy (dest_ref)); tree ln4 (LINK, "anchor", anchor); tree labflag (FLAG, tree (ARG, "Id"), "blue", "Id"); tree labtxt (SET_BINDING, tree (ARG, "Id"), tree (VALUE, THE_LABEL)); tree merged (MERGE, tree (VALUE, THE_TAGS), tuple (tree (ARG, "Id"))); tree tagflag (FLAG, tree (ARG, "Id"), "blue", "Id"); tree reftxt (GET_BINDING, tree (ARG, "Id")); tree preftxt (GET_BINDING, tree (ARG, "Id"), "1"); tree act_id (ID, tree (HARD_ID, tree (ARG, "args", "0"))); tree act_script (MAP_ARGS, "find-accessible", "script", "args", "1"); tree act_ln (LINK, "action", copy (act_id), copy (act_script)); env ("hlink")= tree (MACRO, "body", "destination", tree (LOCUS, copy (src_id), ln1, tree (ARG, "body"))); env ("action")= tree (XMACRO, "args", tree (LOCUS, copy (act_id), copy (act_ln), tree (ARG, "args", "0"))); env ("label")= tree (MACRO, "Id", tree (LOCUS, copy (ref_id), ln4, tree (CONCAT, labflag, labtxt))); env ("tag")= tree (MACRO, "Id", "body", tree (WITH, "the-tags", merged, tree (SURROUND, tagflag, "", tree (ARG, "body")))); env ("reference")= tree (MACRO, "Id", tree (LOCUS, copy (ref_id), ln3, reftxt)); env ("pageref")= tree (MACRO, "Id", tree (LOCUS, copy (ref_id), copy (ln3), preftxt)); /* further standard macros */ env ("error")= tree (MACRO, "message", tree (REWRITE_INACTIVE, tree (ARG, "message"), "error")); env ("style-only")= tree (MACRO, "body", tree (ARG, "body")); env ("style-only*")= tree (MACRO, "body", tree (ARG, "body")); env ("active")= tree (MACRO, "body", tree (ARG, "body")); env ("active*")= tree (MACRO, "body", tree (ARG, "body")); env ("inactive")= tree (MACRO, "body", tree (REWRITE_INACTIVE, tree (ARG, "body"), "once")); env ("inactive*")= tree (MACRO, "body", tree (REWRITE_INACTIVE, tree (ARG, "body"), "recurse")); env ("right-flush")= tree (MACRO, tree (HTAB, "0fn", "first")); env ("indent*")= tree (MACRO, "body", tree (WITH, PAR_LEFT, tree (PLUS, tree (VALUE, PAR_LEFT), "1.5fn"), tree (ARG, "body"))); env ("indent")= tree (MACRO, "body", tree (SURROUND, "", compound ("right-flush"), compound ("indent*", tree (ARG, "body")))); env ("math")= tree (MACRO, "body", tree (WITH, MODE, "math", tree (ARG, "body"))); env ("text")= tree (MACRO, "body", tree (WITH, MODE, "text", tree (ARG, "body"))); env ("pre-edit")= tree (MACRO, "body", tree (WITH, COLOR, "#4040c0", tree (ARG, "body"))); env ("mutator")= tree (MACRO, "body", "y", tree (ARG, "body")); /* syntactic highlighting */ env ("src-regular")= tree (MACRO, "body", tree (WITH, COLOR, "black", tree (ARG, "body"))); env ("src-macro")= tree (MACRO, "body", tree (WITH, MODE, "src", COLOR, "blue", FONT_FAMILY, "ss", tree (ARG, "body"))); env ("src-var")= tree (MACRO, "body", tree (WITH, MODE, "src", COLOR, "dark green", FONT_SHAPE, "italic", tree (ARG, "body"))); env ("src-arg")= tree (MACRO, "body", tree (WITH, MODE, "src", COLOR, "brown", FONT_SHAPE, "italic", tree (ARG, "body"))); env ("src-tt")= tree (MACRO, "body", tree (WITH, MODE, "src", COLOR, "#228", FONT_FAMILY, "tt", tree (ARG, "body"))); env ("src-numeric")= tree (MACRO, "body", tree (WITH, MODE, "src", COLOR, "#848", tree (ARG, "body"))); env ("src-textual")= tree (MACRO, "body", tree (WITH, MODE, "src", COLOR, "black", tree (ARG, "body"))); env ("src-length")= tree (MACRO, "body", tree (WITH, MODE, "src", COLOR, "#288", tree (ARG, "body"))); env ("src-unknown")= tree (MACRO, "body", tree (WITH, COLOR, "#C68", tree (ARG, "body"))); env ("src-error")= tree (MACRO, "body", tree (WITH, COLOR, "red", tree (ARG, "body"))); /* for correct importation of style files and packages */ env ("src-title")= identity_m; env ("src-style-file")= tree (MACRO, "style", "version", tree (ASSIGN, tree (MERGE, tree (ARG, "style"), "-style"), tree (ARG, "version"))); env ("src-package")= tree (MACRO, "package", "version", tree (CONCAT, tree (ASSIGN, tree (MERGE, tree (ARG, "package"), "-package"), tree (ARG, "version")), tree (ASSIGN, tree (MERGE, tree (ARG, "package"), "-dtd"), tree (ARG, "version")))); env ("src-package-dtd")= tree (MACRO, "package", "version", "drd", "drd-version", tree (CONCAT, tree (ASSIGN, tree (MERGE, tree (ARG, "package"), "-package"), tree (ARG, "version")), tree (ASSIGN, tree (MERGE, tree (ARG, "drd"), "-dtd"), tree (ARG, "drd-version")))); }
int testLine() { int numErr = 0; logMessage(_T("TESTING - class GM_3dLine ...\n\n")); // Default constructor, line must be invalid GM_3dLine ln; if (ln.isValid()) { logMessage(_T("\tERROR - Default constructor creates valid line\n")); numErr++; } else { logMessage(_T("\tOK - Default constructor creates invalid line\n")); } // Get/Set line coordinates double xStart = getRandomDouble(); double yStart = getRandomDouble(); double zStart = getRandomDouble(); double xEnd = getRandomDouble(); double yEnd = getRandomDouble(); double zEnd = getRandomDouble(); ln.begin().x(xStart); ln.begin().y(yStart); ln.begin().z(zStart); ln.end().x(xEnd); ln.end().y(yEnd); ln.end().z(zEnd); if (!ln.isValid() || ln.begin().x() != xStart || ln.begin().y() != yStart || ln.begin().z() != zStart || ln.end().x() != xEnd || ln.end().y() != yEnd || ln.end().z() != zEnd) { logMessage(_T("\tERROR - Get/Set not working\n")); numErr++; } else { logMessage(_T("\tOK - Get/Set working\n")); } // Copy constructor GM_3dLine ln1(ln); if (ln1.isValid() != ln.isValid() || ln1.begin().x() != ln.begin().x() || ln1.begin().y() != ln.begin().y() || ln1.begin().z() != ln.begin().z() || ln1.end().x() != ln.end().x() || ln1.end().y() != ln.end().y() || ln1.end().z() != ln.end().z()) { logMessage(_T("\tERROR - Copy constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Copy constructor working\n")); } // Constructor (points) GM_3dPoint startPt(getRandomDouble(), getRandomDouble(), getRandomDouble()); GM_3dPoint endPt(getRandomDouble(), getRandomDouble(), getRandomDouble()); GM_3dLine ln2(startPt, endPt); if (!ln2.isValid() || ln2.begin().x() != startPt.x() || ln2.begin().y() != startPt.y() || ln2.begin().z() != startPt.z() || ln2.end().x() != endPt.x() || ln2.end().y() != endPt.y() || ln2.end().z() != endPt.z()) { logMessage(_T("\tERROR - Points constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Points constructor working\n")); } // Constructor (coordinates) xStart = getRandomDouble(); yStart = getRandomDouble(); zStart = getRandomDouble(); xEnd = getRandomDouble(); yEnd = getRandomDouble(); zEnd = getRandomDouble(); GM_3dLine ln3(xStart, yStart, zStart, xEnd, yEnd, zEnd); if (!ln3.isValid() || ln3.begin().x() != xStart || ln3.begin().y() != yStart || ln3.begin().z() != zStart || ln3.end().x() != xEnd || ln3.end().y() != yEnd || ln3.end().z() != zEnd) { logMessage(_T("\tERROR - Coordinate constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Coordinate constructor working\n")); } // dx, dy, dz double dx = ln2.dx(); double dy = ln2.dy(); double dz = ln2.dz(); if (dx != ln2.end().x()-ln2.begin().x() || dy != ln2.end().y()-ln2.begin().y() || dz != ln2.end().z()-ln2.begin().z()) { logMessage(_T("\tERROR - dx, dy or dz not working\n")); numErr++; } else { logMessage(_T("\tOK - dx, dy or dz working\n")); } // Dot product double dotProduct = ln2 * ln3; double dxLn2 = ln2.dx(); double dyLn2 = ln2.dy(); double dzLn2 = ln2.dz(); double dxLn3 = ln3.dx(); double dyLn3 = ln3.dy(); double dzLn3 = ln3.dz(); double checkDotProduct = dxLn2*dxLn3 + dyLn2*dyLn3 + dzLn2*dzLn3; if (dotProduct != checkDotProduct) { logMessage(_T("\tERROR - Dot product not working\n")); numErr++; } else { logMessage(_T("\tOK - Dot product working\n")); } // Cross product GM_3dLine crossProdLn = ln2 ^ ln3; double checkCrossProdX = ln2.begin().x() + (dyLn2*dzLn3 - dzLn2*dyLn3); double checkCrossProdY = ln2.begin().y() + (dzLn2*dxLn3 - dxLn2*dzLn3); double checkCrossProdZ = ln2.begin().z() + (dxLn2*dyLn3 - dyLn2*dxLn3); if (!crossProdLn.isValid() || crossProdLn.end().x() != checkCrossProdX || crossProdLn.end().y() != checkCrossProdY || crossProdLn.end().z() != checkCrossProdZ) { logMessage(_T("\tERROR - Cross product not working\n")); numErr++; } else { logMessage(_T("\tOK - Cross product working\n")); } // Center GM_3dPoint ln2Center = ln2.center(); if (!ln2Center.isValid() || ln2Center.x() != ln2.begin().x() + (ln2.end().x()-ln2.begin().x())/2.0 || ln2Center.y() != ln2.begin().y() + (ln2.end().y()-ln2.begin().y())/2.0 || ln2Center.z() != ln2.begin().z() + (ln2.end().z()-ln2.begin().z())/2.0) { logMessage(_T("\tERROR - Center point computation not working\n")); numErr++; } else { logMessage(_T("\tOK - Center point computation working\n")); } // Invert GM_3dLine ln2Copy(ln2); ln2.invert(); if (!ln2Copy.isValid() || ln2Copy.begin().x() != ln2.end().x() || ln2Copy.begin().y() != ln2.end().y() || ln2Copy.begin().z() != ln2.end().z() || ln2Copy.end().x() != ln2.begin().x() || ln2Copy.end().y() != ln2.begin().y() || ln2Copy.end().z() != ln2.begin().z()) { logMessage(_T("\tERROR - Inversion not working\n")); numErr++; } else { logMessage(_T("\tOK - Inversion working\n")); } // Length double checkLen = sqrt(ln2.dx()*ln2.dx() + ln2.dy()*ln2.dy() + ln2.dz()*ln2.dz()); if (ln2.length() != checkLen) { logMessage(_T("\tERROR - Length computation not working\n")); numErr++; } else { logMessage(_T("\tOK - Length computation working\n")); } // Null check GM_3dLine nullLn(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); bool checkNull1 = nullLn.isNull(); nullLn.begin().x(10.0); bool checkNull2 = nullLn.isNull(); if (!nullLn.isValid() || !checkNull1 || checkNull2) { logMessage(_T("\tERROR - Null line check not working\n")); numErr++; } else { logMessage(_T("\tOK - Null line check working\n")); } // Vertical line check double xCoord = getRandomDouble(); double yCoord = getRandomDouble(); GM_3dLine vertLn(xCoord, yCoord, getRandomDouble(), xCoord, yCoord, getRandomDouble()); bool checkVert1 = vertLn.isVertical(); vertLn.begin().x(vertLn.begin().x() + 10.0); bool checkVert2 = vertLn.isVertical(); if (!vertLn.isValid() || !checkVert1 || checkVert2) { logMessage(_T("\tERROR - Vertical line check not working\n")); numErr++; } else { logMessage(_T("\tOK - Vertical line check working\n")); } // Horizontal line check double zCoord = getRandomDouble(); GM_3dLine horLn(getRandomDouble(), getRandomDouble(), zCoord, getRandomDouble(), getRandomDouble(), zCoord); bool checkHor1 = horLn.isHorizontal(); horLn.begin().z(horLn.begin().z() + 10.0); bool checkHor2 = horLn.isHorizontal(); if (!horLn.isValid() || !checkHor1 || checkVert2) { logMessage(_T("\tERROR - Horizontal line check not working\n")); numErr++; } else { logMessage(_T("\tOK - Horizontal line check working\n")); } // Z min/max double minZ = ln2.minZ(); double maxZ = ln2.maxZ(); double checkMin = ln2.begin().z() < ln2.end().z() ? ln2.begin().z() : ln2.end().z(); double checkMax = ln2.begin().z() > ln2.end().z() ? ln2.begin().z() : ln2.end().z(); if (minZ != checkMin || maxZ != checkMax) { logMessage(_T("\tERROR - min/max Z not working\n")); numErr++; } else { logMessage(_T("\tOK - min/max Z working\n")); } // Point on line at Z double sec = getRandom01Double(); double dX = ln2.dx(); double dY = ln2.dy(); double dZ = ln2.dz(); double xCheck = ln2.begin().x() + (sec * dX); double yCheck = ln2.begin().y() + (sec * dY); double zCheck = ln2.begin().z() + (sec * dZ); GM_3dPoint pointAtZ = ln2.pointAtZ(zCheck); if (!pointAtZ.isValid() || fabs(pointAtZ.x()-xCheck) > GM_NULL_TOLERANCE || fabs(pointAtZ.y()-yCheck) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Point on line at Z not working\n")); numErr++; } else { logMessage(_T("\tOK - Point on line at Z working\n")); } // Nomal vector on XY GM_3dVector normalVectorR = ln2.normalXYVector(true); GM_3dVector normalVectorL = ln2.normalXYVector(false); GM_3dVector ln2Dir(ln2); double dotPR = normalVectorR * ln2Dir; double dotPL = normalVectorL * ln2Dir; bool RSide = ln2Dir.isAtLeftOnXY(normalVectorR); bool LSide = ln2Dir.isAtLeftOnXY(normalVectorL); if (!normalVectorR.isValid() || !normalVectorL.isValid() || fabs(dotPR) > GM_NULL_TOLERANCE || fabs(dotPL) > GM_NULL_TOLERANCE || !RSide || LSide) { logMessage(_T("\tERROR - XY normal vector computation not working\n")); numErr++; } else { logMessage(_T("\tOK - XY normal vector computation working\n")); } // Point from section double section = getRandom01Double(); GM_3dPoint sectionPoint = ln2.pointFromSection(section); double ln2Len = ln2.length(); double pointSectionLen = ln2.begin().distFrom(sectionPoint); if (fabs((pointSectionLen / ln2Len) - section) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Point from section not working\n")); numErr++; } else { logMessage(_T("\tOK - Point from section working\n")); } // Section from point double checkSection = ln2.sectionFromPoint(sectionPoint); if (fabs(checkSection - section) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Section from point not working\n")); numErr++; } else { logMessage(_T("\tOK - Section from point working\n")); } // Point distance ln2Dir.normalize(); GM_3dVector ln2NormDir(ln2Dir); section = getRandom01Double(); sectionPoint = ln2.pointFromSection(section); if (fabs(ln2Dir.x()) > GM_NULL_TOLERANCE) { ln2NormDir.x(getRandomDouble()); ln2NormDir.y(getRandomDouble()); ln2NormDir.z(getRandomDouble()); ln2NormDir.normalize(); ln2NormDir.x(-(ln2Dir.y()*ln2NormDir.y() + ln2Dir.z()*ln2NormDir.z()) / ln2Dir.x()); } else if (fabs(ln2Dir.y()) > GM_NULL_TOLERANCE) { ln2NormDir.x(getRandomDouble()); ln2NormDir.y(getRandomDouble()); ln2NormDir.z(getRandomDouble()); ln2NormDir.normalize(); ln2NormDir.y(-(ln2Dir.x()*ln2NormDir.x() + ln2Dir.z()*ln2NormDir.z()) / ln2Dir.y()); } else if (fabs(ln2Dir.z()) > GM_NULL_TOLERANCE) { ln2NormDir.x(getRandomDouble()); ln2NormDir.y(getRandomDouble()); ln2NormDir.z(getRandomDouble()); ln2NormDir.normalize(); ln2NormDir.z(-(ln2Dir.x()*ln2NormDir.x() + ln2Dir.y()*ln2NormDir.y()) / ln2Dir.z()); } else { ln2NormDir.invalidate(); } double dist = 0.0; double checkDist = 0.0; GM_3dPoint pointOnLine; if (ln2NormDir.isValid()) { ln2NormDir.normalize(); double dotProd = ln2NormDir * ln2Dir; dist = fabs(getRandomDouble()); GM_3dPoint externPoint(sectionPoint); externPoint = (GM_3dVector)externPoint + (ln2NormDir * dist); checkDist = ln2.pointDistance(externPoint, pointOnLine); } if (!pointOnLine.isValid() || fabs(dist - checkDist) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Point distance not working\n")); numErr++; } else { logMessage(_T("\tOK - Point distance working\n")); } return numErr; }