24 #include <fvmodels/scanlines/radial.h>
25 #include <utils/system/console_colors.h>
32 namespace firevision {
57 unsigned int center_x,
58 unsigned int center_y,
59 unsigned int radius_increment,
61 unsigned int max_radius,
62 unsigned int dead_radius)
65 this->height = height;
66 this->center_x = center_x;
67 this->center_y = center_y;
68 this->radius_increment = radius_increment;
70 this->dead_radius = dead_radius;
71 this->max_radius = max_radius;
72 this->auto_max_radius = (max_radius == 0);
99 if (current_radius == 0) {
101 current_radius += radius_increment;
155 y = (int)(sqrt((
float(current_radius * current_radius) -
float(x * x))) + 0.5);
163 current_radius += radius_increment;
167 if (current_radius >= max_radius) {
179 if ((tmp_x < -(
int)center_x) || (tmp_x > (int)(width - center_x)) || (tmp_y < -(
int)center_y)
180 || (tmp_y > (
int)(height - center_y))) {
187 coord.
x = center_x + tmp_x;
188 coord.
y = center_y + tmp_y;
199 memcpy(&tmp_coord, &coord,
sizeof(
upoint_t));
213 ScanlineRadial::simpleBubbleSort(
unsigned int array[],
unsigned int num_elements)
215 bool modified =
false;
216 unsigned int end = num_elements;
221 for (
unsigned int i = 0; i < end - 1; ++i) {
222 if (array[i] < array[i + 1]) {
224 array[i] = array[i + 1];
237 current_radius = radius_increment;
238 while (current_radius < dead_radius) {
239 current_radius += radius_increment;
248 if (auto_max_radius) {
250 unsigned int dists[4];
251 dists[0] = (
unsigned int)sqrt(
float(center_x * center_x) + float(center_y * center_y));
252 dists[1] = (
unsigned int)sqrt(
float((width - center_x) * (width - center_x))
253 + float(center_y * center_y));
254 dists[2] = (
unsigned int)sqrt(
float((width - center_x) * (width - center_x))
255 + float((height - center_y) * (height - center_y)));
256 dists[3] = (
unsigned int)sqrt(
float(center_x * center_x)
257 + float((height - center_y) * (height - center_y)));
260 simpleBubbleSort(dists, 4);
261 max_radius = dists[0] - 1;
266 if (radius_increment > max_radius) {
268 radius_increment = 1;
271 if (dead_radius > max_radius) {
274 current_radius = radius_increment;
281 return "ScanlineModel::Radial";
287 return radius_increment;
299 this->center_x = center_x;
300 this->center_y = center_y;
313 this->max_radius = max_radius;
314 this->dead_radius = dead_radius;
315 this->auto_max_radius = (max_radius == 0);