00001
00020 #include "mfcpch.h"
00021 #include "stepblob.h"
00022
00023 ELISTIZE_S (C_BLOB)
00024
00025
00031 static void position_outline(
00032 C_OUTLINE *outline,
00033 C_OUTLINE_LIST *destlist
00034 ) {
00035 C_OUTLINE *dest_outline;
00036 C_OUTLINE_IT it = destlist;
00037
00038 C_OUTLINE_IT child_it = outline->child ();
00039
00040 if (!it.empty ()) {
00041 do {
00042 dest_outline = it.data ();
00043
00044 if (*dest_outline < *outline) {
00045
00046 dest_outline = it.extract ();
00047
00048 it.add_after_then_move (outline);
00049
00050 child_it.add_to_end (dest_outline);
00051 while (!it.at_last ()) {
00052 it.forward ();
00053
00054 dest_outline = it.data ();
00055 if (*dest_outline < *outline) {
00056
00057 dest_outline = it.extract ();
00058 child_it.add_to_end (dest_outline);
00059
00060 if (it.empty ())
00061 break;
00062 }
00063 }
00064 return;
00065 }
00066
00067 else if (*outline < *dest_outline) {
00068 position_outline (outline, dest_outline->child ());
00069
00070 return;
00071 }
00072 it.forward ();
00073 }
00074 while (!it.at_first ());
00075 }
00076 it.add_to_end (outline);
00077 }
00078
00079
00086 #ifndef GRAPHICS_DISABLED
00087 static void plot_outline_list(
00088 C_OUTLINE_LIST *list,
00089 WINDOW window,
00090 COLOUR colour,
00091 COLOUR child_colour
00092 ) {
00093 C_OUTLINE *outline;
00094 C_OUTLINE_IT it = list;
00095
00096 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00097 outline = it.data ();
00098
00099 outline->plot (window, colour);
00100 if (!outline->child ()->empty ())
00101 plot_outline_list (outline->child (), window,
00102 child_colour, child_colour);
00103 }
00104 }
00105 #endif
00106
00107
00113 static void reverse_outline_list(
00114 C_OUTLINE_LIST *list
00115 ) {
00116 C_OUTLINE *outline;
00117 C_OUTLINE_IT it = list;
00118
00119 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00120 outline = it.data ();
00121 outline->reverse ();
00122 if (!outline->child ()->empty ())
00123 reverse_outline_list (outline->child ());
00124 }
00125 }
00126
00127
00134 C_BLOB::C_BLOB(
00135 C_OUTLINE_LIST *outline_list
00136 ) {
00137 C_OUTLINE *outline;
00138 C_OUTLINE_IT it = outline_list;
00139
00140 while (!it.empty ()) {
00141 outline = it.extract ();
00142
00143 position_outline(outline, &outlines);
00144 if (!it.empty ())
00145 it.forward ();
00146 }
00147 it.set_to_list (&outlines);
00148 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00149 outline = it.data ();
00150 if (outline->turn_direction () < 0) {
00151 outline->reverse ();
00152 reverse_outline_list (outline->child ());
00153 outline->set_flag (COUT_INVERSE, TRUE);
00154 }
00155 else {
00156 outline->set_flag (COUT_INVERSE, FALSE);
00157 }
00158 }
00159 }
00160
00161
00167 BOX C_BLOB::bounding_box() {
00168 C_OUTLINE *outline;
00169 C_OUTLINE_IT it = &outlines;
00170 BOX box;
00171
00172 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00173 outline = it.data ();
00174 box += outline->bounding_box ();
00175 }
00176 return box;
00177 }
00178
00179
00183 INT32 C_BLOB::area() {
00184 C_OUTLINE *outline;
00185 C_OUTLINE_IT it = &outlines;
00186 INT32 total;
00187
00188 total = 0;
00189 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00190 outline = it.data ();
00191 total += outline->area ();
00192 }
00193 return total;
00194 }
00195
00196
00200 INT32 C_BLOB::outer_area() {
00201 C_OUTLINE *outline;
00202 C_OUTLINE_IT it = &outlines;
00203 INT32 total;
00204
00205 total = 0;
00206 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00207 outline = it.data ();
00208 total += outline->outer_area ();
00209 }
00210 return total;
00211 }
00212
00213
00219 INT32 C_BLOB::count_transitions(
00220 INT32 threshold
00221 ) {
00222 C_OUTLINE *outline;
00223 C_OUTLINE_IT it = &outlines;
00224 INT32 total;
00225
00226 total = 0;
00227 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00228 outline = it.data ();
00229 total += outline->count_transitions (threshold);
00230 }
00231 return total;
00232 }
00233
00234
00240 void C_BLOB::move(
00241 const ICOORD vec
00242 ) {
00243 C_OUTLINE_IT it(&outlines);
00244
00245 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
00246 it.data ()->move (vec);
00247 }
00248
00249
00253 #ifndef GRAPHICS_DISABLED
00254 void C_BLOB::plot(
00255 WINDOW window,
00256 COLOUR blob_colour,
00257 COLOUR child_colour
00258 ) {
00259 plot_outline_list(&outlines, window, blob_colour, child_colour);
00260 }
00261 #endif