//############################################################################
//
// LaserBoy !!!
//
// by James Lehman
// Extra Stimulus Inc.
// james@akrobiz.com
//
// began: October 2003
//
// Copyright 2003 to 2024 James Lehman.
// This source is distributed under the terms of the GNU General Public License.
//
// LaserBoy_real_segment.hpp is part of LaserBoy.
//
// LaserBoy is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// LaserBoy is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with LaserBoy. If not, see .
//
//############################################################################
#ifndef __LASERBOY_REAL_SEGMENT_DEFINITIONS__
#define __LASERBOY_REAL_SEGMENT_DEFINITIONS__
//############################################################################
#include "LaserBoy_utility.hpp"
#include "LaserBoy_oscillator.hpp"
#include "LaserBoy_palette.hpp"
//############################################################################
class LaserBoy_real_segment : public vector
{
public:
LaserBoy_real_segment()
: vector(),
palette_index (LASERBOY_ILDA_DEFAULT),
real_segment_error (LASERBOY_OK )
{}
//------------------------------------------------------------------------
LaserBoy_real_segment(const int& palette_index,
bool add_origin
)
: vector(),
palette_index (palette_index),
real_segment_error (LASERBOY_OK )
{
if(add_origin)
{
push_back(LaserBoy_real_vertex());
push_back(LaserBoy_real_vertex());
}
}
//------------------------------------------------------------------------
LaserBoy_real_segment(const LaserBoy_real_segment& rs)
: vector(),
palette_index (rs.palette_index),
real_segment_error (LASERBOY_OK )
{
clear();
if(rs.size() > 1)
{
reserve(rs.size());
insert(begin(), rs.begin(), rs.end());
}
}
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_real_vertex from,
LaserBoy_real_vertex to
); // 3D line function
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_real_vertex from,
LaserBoy_real_vertex to,
const u_int& max_d
); // 3D line function
//------------------------------------------------------------------------
LaserBoy_real_segment(const LaserBoy_3D_double& p,
const LaserBoy_color c
); // 3D cross function
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_frame_set& font_frames,
const u32string& character_list,
const string& text,
const double char_width,
const double mono_font_space,
const double super_diacritic_gap,
const bool bond_word = false,
const bool bond_line = false
); // mono spaced font constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_frame_set& font_frames,
const u32string& character_list,
const string& text,
const double char_width,
const double vari_font_gap,
const double vari_font_space,
const double super_diacritic_gap,
const bool bond_word = false,
const bool bond_line = false
); // variable spaced font constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(char32_t unichar); // uncicode not found frame
//------------------------------------------------------------------------
~LaserBoy_real_segment()
{}
//------------------------------------------------------------------------
protected:
LaserBoy_real_segment(const double radius,
const double rhodonea_numerator,
const double rhodonea_denominator,
const double start,
const double duration,
const double iterations
); // rhodonea
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double radius,
const double rhodonea_numerator,
const double rhodonea_denominator,
const double start,
const double duration,
const double iterations
); // oscillator_rhodonea
//------------------------------------------------------------------------
LaserBoy_real_segment(const double fixed_radius,
const double roller_radius,
const double roller_offset,
const double start,
const double duration,
const double iterations,
const char dud
); // epitrochoid epicycloid
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double fixed_radius,
const double roller_radius,
const double roller_offset,
const double start,
const double duration,
const double iterations,
const char dud
); // oscillator_epitrochoid oscillator_epicycloid
//------------------------------------------------------------------------
LaserBoy_real_segment(const double fixed_radius,
const double roller_radius,
const double roller_offset,
const double start,
const double duration,
const double iterations,
const short dud
); // hypotrochoid hypocycloid
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double fixed_radius,
const double roller_radius,
const double roller_offset,
const double start,
const double duration,
const double iterations,
const short dud
); // oscillator_hypotrochoid oscillator_hypocycloid
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO1_,
const double start,
const double duration,
const double iterations
); // oscillator constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
); // oscillator_sum constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations,
const char dud
); // oscillator_xy constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
const double start,
const double duration,
const double iterations
); // oscillator_xyz constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double start,
const double duration,
const double iterations
); // harmonograph constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO5,
LaserBoy_oscillator LBO6,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
LaserBoy_oscillator LBO5_,
LaserBoy_oscillator LBO6_,
const double start,
const double duration,
const double iterations
); // harmonograph_3D constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations,
const short dud
); // amplitude_mod constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double start,
const double duration,
const double iterations,
const char dud
); // amplitude_mod_xy constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO5,
LaserBoy_oscillator LBO6,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
LaserBoy_oscillator LBO5_,
LaserBoy_oscillator LBO6_,
const double start,
const double duration,
const double iterations,
const char dud
); // amplitude_mod_xyz constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations,
const int dud
); // frequency_mod constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double start,
const double duration,
const double iterations,
const short dud
); // frequency_mod_xy constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO5,
LaserBoy_oscillator LBO6,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
LaserBoy_oscillator LBO5_,
LaserBoy_oscillator LBO6_,
const double start,
const double duration,
const double iterations,
const short dud
); // frequency_mod_xyz constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations,
const float dud
); // phase_mod constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double start,
const double duration,
const double iterations,
const int dud
); // phase_mod_xy constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO5,
LaserBoy_oscillator LBO6,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
LaserBoy_oscillator LBO5_,
LaserBoy_oscillator LBO6_,
const double start,
const double duration,
const double iterations,
const int dud
); // phase_mod_xyz constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO1_,
const double start,
const double duration,
const double iterations,
const char dud
); // polar constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations,
const char dud1,
const char dud2
); // polar_sum constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations,
const short dud1,
const char dud2
); // polar_amplitude_mod constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations,
const int dud1,
const char dud2
); // polar_frequency_mod constructor
//------------------------------------------------------------------------
LaserBoy_real_segment(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations,
const float dud1,
const char dud2
); // polar_phase_mod constructor
//------------------------------------------------------------------------
public:
//------------------------------------------------------------------------
// named constructors
//------------------------------------------------------------------------
static LaserBoy_real_segment rhodonea(const double radius,
const double rhodonea_numerator,
const double rhodonea_denominator,
const double start,
const double duration,
const double iterations
) // uddddd
{
return LaserBoy_real_segment(radius,
rhodonea_numerator,
rhodonea_denominator,
start,
duration,
iterations
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment oscillator_rhodonea(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double radius,
const double rhodonea_numerator,
const double rhodonea_denominator,
const double start,
const double duration,
const double iterations
)
{
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
radius,
rhodonea_numerator,
rhodonea_denominator,
start,
duration,
iterations
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment epicycloid(const double fixed_radius,
const double roller_radius,
const double roller_offset,
const double start,
const double duration,
const double iterations
)
{
char _dud = 0;
return LaserBoy_real_segment(fixed_radius,
roller_radius,
roller_offset,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment oscillator_epicycloid(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double fixed_radius,
const double roller_radius,
const double roller_offset,
const double start,
const double duration,
const double iterations
)
{
char _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
fixed_radius,
roller_radius,
roller_offset,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment hypocycloid(const double fixed_radius,
const double roller_radius,
const double roller_offset,
const double start,
const double duration,
const double iterations
)
{
short _dud = 0;
return LaserBoy_real_segment(fixed_radius,
roller_radius,
roller_offset,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment oscillator_hypocycloid(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double fixed_radius,
const double roller_radius,
const double roller_offset,
const double start,
const double duration,
const double iterations
)
{
short _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
fixed_radius,
roller_radius,
roller_offset,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment oscillator(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO1_,
const double start,
const double duration,
const double iterations
)
{
return LaserBoy_real_segment(LBO1,
LBO1_,
start,
duration,
iterations
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment oscillator_sum(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
)
{
return LaserBoy_real_segment(LBO1,
LBO2,
LBO1_,
LBO2_,
start,
duration,
iterations
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment oscillator_xy(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
)
{
char _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO1_,
LBO2_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment oscillator_xyz(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
const double start,
const double duration,
const double iterations
)
{
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO1_,
LBO2_,
LBO3_,
start,
duration,
iterations
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment harmonograph(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double start,
const double duration,
const double iterations
)
{
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
start,
duration,
iterations
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment harmonograph_xyz(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO5,
LaserBoy_oscillator LBO6,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
LaserBoy_oscillator LBO5_,
LaserBoy_oscillator LBO6_,
const double start,
const double duration,
const double iterations
)
{
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO5,
LBO6,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
LBO5_,
LBO6_,
start,
duration,
iterations
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment amplitude_mod(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
)
{
short _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO1_,
LBO2_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment amplitude_mod_xy(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double start,
const double duration,
const double iterations
)
{
char _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment amplitude_mod_xyz(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO5,
LaserBoy_oscillator LBO6,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
LaserBoy_oscillator LBO5_,
LaserBoy_oscillator LBO6_,
const double start,
const double duration,
const double iterations
)
{
char _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO5,
LBO6,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
LBO5_,
LBO6_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment frequency_mod(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
)
{
int _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO1_,
LBO2_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment frequency_mod_xy(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double start,
const double duration,
const double iterations
)
{
short _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment frequency_mod_xyz(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO5,
LaserBoy_oscillator LBO6,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
LaserBoy_oscillator LBO5_,
LaserBoy_oscillator LBO6_,
const double start,
const double duration,
const double iterations
)
{
short _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO5,
LBO6,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
LBO5_,
LBO6_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment phase_mod(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
)
{
float _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO1_,
LBO2_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment phase_mod_xy(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
const double start,
const double duration,
const double iterations
)
{
int _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment phase_mod_xyz(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO3,
LaserBoy_oscillator LBO4,
LaserBoy_oscillator LBO5,
LaserBoy_oscillator LBO6,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
LaserBoy_oscillator LBO3_,
LaserBoy_oscillator LBO4_,
LaserBoy_oscillator LBO5_,
LaserBoy_oscillator LBO6_,
const double start,
const double duration,
const double iterations
)
{
int _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO3,
LBO4,
LBO5,
LBO6,
LBO1_,
LBO2_,
LBO3_,
LBO4_,
LBO5_,
LBO6_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment polar(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO1_,
const double start,
const double duration,
const double iterations
)
{
char _dud = 0;
return LaserBoy_real_segment(LBO1,
LBO1_,
start,
duration,
iterations,
_dud
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment polar_sum(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
)
{
char _dud1 = 0,
_dud2 = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO1_,
LBO2_,
start,
duration,
iterations,
_dud1,
_dud2
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment polar_amplitude_mod(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
)
{
short _dud1 = 0;
char _dud2 = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO1_,
LBO2_,
start,
duration,
iterations,
_dud1,
_dud2
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment polar_frequency_mod(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
)
{
int _dud1 = 0;
char _dud2 = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO1_,
LBO2_,
start,
duration,
iterations,
_dud1,
_dud2
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment polar_phase_mod(LaserBoy_oscillator LBO1,
LaserBoy_oscillator LBO2,
LaserBoy_oscillator LBO1_,
LaserBoy_oscillator LBO2_,
const double start,
const double duration,
const double iterations
)
{
float _dud1 = 0;
char _dud2 = 0;
return LaserBoy_real_segment(LBO1,
LBO2,
LBO1_,
LBO2_,
start,
duration,
iterations,
_dud1,
_dud2
);
}
//------------------------------------------------------------------------
static LaserBoy_real_segment unit_reference()
{
double arc_step = two_pi / 60;
LaserBoy_3D_double double_3D;
LaserBoy_real_segment rs;
rs.push_back(LaserBoy_real_vertex( 0.0, 0.0, 0.0, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
rs.push_back(LaserBoy_real_vertex( 0.0, 0.0, 0.0, 255, 255, 255, 0, 55));
rs.push_back(LaserBoy_real_vertex(-1.0, 0.0, 0.0, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
rs.push_back(LaserBoy_real_vertex( 1.0, 0.0, 0.0, 255, 255, 255, 0, 55));
rs.push_back(LaserBoy_real_vertex( 0.0, -1.0, 0.0, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
rs.push_back(LaserBoy_real_vertex( 0.0, 1.0, 0.0, 255, 255, 255, 0, 55));
rs.push_back(LaserBoy_real_vertex( 0.0, 0.0, -1.0, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
rs.push_back(LaserBoy_real_vertex( 0.0, 0.0, 1.0, 255, 255, 255, 0, 55));
double_3D.x = cos(0);
double_3D.y = sin(0);
double_3D.z = 0.0;
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), LASERBOY_BLANKING_BIT, 55));
for(int a = 1; a <= 60; a++)
{
double_3D.x = cos(a * arc_step);
double_3D.y = sin(a * arc_step);
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), 0, 55));
}
double_3D.x = cos(0);
double_3D.y = 0.0;
double_3D.z = sin(0);
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), LASERBOY_BLANKING_BIT, 55));
for(int a = 1; a <= 60; a++)
{
double_3D.x = cos(a * arc_step);
double_3D.z = sin(a * arc_step);
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), 0, 55));
}
double_3D.x = 0.0;
double_3D.y = sin(0);
double_3D.z = cos(0);
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), LASERBOY_BLANKING_BIT, 55));
for(int a = 1; a <= 60; a++)
{
double_3D.y = sin(a * arc_step);
double_3D.z = cos(a * arc_step);
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), 0, 55));
}
rs.convert_blank_to_black();
return rs;
}
//------------------------------------------------------------------------
static LaserBoy_real_segment line(LaserBoy_3D_double P0, LaserBoy_3D_double P1)
{
LaserBoy_real_segment rs;
rs.push_back(LaserBoy_real_vertex(P0.x, P0.y, P0.z, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
rs.push_back(LaserBoy_real_vertex(P1.x, P1.y, P1.z, 255, 255, 255, 0, 55));
rs.push_back(LaserBoy_real_vertex(P1.x, P1.y, P1.z, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
return rs;
}
//------------------------------------------------------------------------
static LaserBoy_real_segment rectangular_grid_xy(LaserBoy_3D_double P0,
LaserBoy_3D_double P1,
double x_units,
double y_units
)
{
LaserBoy_real_segment rs;
if(P0.x != P1.x && P0.y != P1.y && x_units != 0 && y_units != 0)
{
double i;
x_units = abs(x_units);
x_units = (P0.x < P1.x) ? (x_units) : (-x_units);
y_units = abs(y_units);
y_units = (P0.y < P1.y) ? (y_units) : (-y_units);
rs.push_back(LaserBoy_real_vertex(P0.x, P0.y, P0.z, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
for(i = P0.y; i <= P1.y; i += y_units)
{
rs.push_back(LaserBoy_real_vertex(P0.x, i, P0.z, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(P1.x, i, P0.z, 255, 255, 255, 0, 55));
}
if(i != P1.y)
{
rs.push_back(LaserBoy_real_vertex(P0.x, P1.y, P0.z, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(P1.x, P1.y, P0.z, 255, 255, 255, 0, 55));
}
rs.push_back(LaserBoy_real_vertex(P1.x, P1.y, P0.z, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
for(i = P0.x; i <= P1.x; i += x_units)
{
rs.push_back(LaserBoy_real_vertex(i, P0.y, P0.z, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(i, P1.y, P0.z, 255, 255, 255, 0, 55));
}
if(i != P1.x)
{
rs.push_back(LaserBoy_real_vertex(P1.x, P0.y, P0.z, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(P1.x, P1.y, P0.z, 255, 255, 255, 0, 55));
}
rs.push_back(LaserBoy_real_vertex(P1.x, P1.y, P0.z, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
}
return rs;
}
//------------------------------------------------------------------------
static LaserBoy_real_segment rectangular_grid_yz(LaserBoy_3D_double P0,
LaserBoy_3D_double P1,
double y_units,
double z_units
)
{
LaserBoy_real_segment rs;
if(P0.z != P1.z && P0.y != P1.y && z_units != 0 && y_units != 0)
{
double i;
y_units = abs(y_units);
y_units = (P0.y < P1.y) ? (y_units) : (-y_units);
z_units = abs(z_units);
z_units = (P0.z < P1.z) ? (z_units) : (-z_units);
rs.push_back(LaserBoy_real_vertex(P0.x, P0.y, P0.z, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
for(i = P0.y; i <= P1.y; i += y_units)
{
rs.push_back(LaserBoy_real_vertex(P0.x, i, P0.z, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(P0.x, i, P1.z, 255, 255, 255, 0, 55));
}
rs.push_back(LaserBoy_real_vertex(P0.x, i - y_units, P1.z, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
for(i = P0.z; i <= P1.z; i += z_units)
{
rs.push_back(LaserBoy_real_vertex(P0.x, P0.y, i, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(P0.x, P1.y, i, 255, 255, 255, 0, 55));
}
rs.push_back(LaserBoy_real_vertex(P0.x, P1.y, i - z_units, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
}
return rs;
}
//------------------------------------------------------------------------
static LaserBoy_real_segment rectangular_grid_xz(LaserBoy_3D_double P0,
LaserBoy_3D_double P1,
double x_units,
double z_units
)
{
LaserBoy_real_segment rs;
if(P0.x != P1.x && P0.z != P1.z && x_units != 0 && z_units != 0)
{
double i;
x_units = abs(x_units);
x_units = (P0.x < P1.x) ? (x_units) : (-x_units);
z_units = abs(z_units);
z_units = (P0.z < P1.z) ? (z_units) : (-z_units);
rs.push_back(LaserBoy_real_vertex(P0.x, P0.y, P0.z, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
for(i = P0.z; i <= P1.z; i += z_units)
{
rs.push_back(LaserBoy_real_vertex(P0.x, P0.y, i, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(P1.x, P0.y, i, 255, 255, 255, 0, 55));
}
rs.push_back(LaserBoy_real_vertex(P1.x, P0.y, i - z_units, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
for(i = P0.x; i <= P1.x; i += x_units)
{
rs.push_back(LaserBoy_real_vertex(i, P0.y, P0.z, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(i, P0.y, P1.z, 255, 255, 255, 0, 55));
}
rs.push_back(LaserBoy_real_vertex(i - x_units, P0.y, P1.z, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
}
return rs;
}
//------------------------------------------------------------------------
static LaserBoy_real_segment polar_grid_xy(LaserBoy_3D_double P0,
double radius_max,
double radii_units,
double angle_units
)
{
double i,
arc_step = two_pi / 60;
LaserBoy_3D_double double_3D;
LaserBoy_real_segment rs;
radius_max = abs(radius_max);
radii_units = abs(radii_units);
angle_units = abs(angle_units);
double_3D.z = P0.z;
for(i = radii_units; i <= radius_max; i += radii_units)
{
double_3D.x = i + P0.x;
double_3D.y = P0.y;
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), LASERBOY_BLANKING_BIT, 55));
for(int a = 1; a <= 60; a++)
{
double_3D.x = i * cos(a * arc_step) + P0.x;
double_3D.y = i * sin(a * arc_step) + P0.y;
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), 0, 55));
}
}
for(i = 0; i <= two_pi; i += angle_units)
{
rs.push_back(LaserBoy_real_vertex(P0.x, P0.y, P0.z, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(radius_max * cos(i) + P0.x, radius_max * sin(i) + P0.y, P0.z, 255, 255, 255, 0, 55));
}
rs.push_back(LaserBoy_real_vertex(radius_max, 0.0, 0.0, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
return rs;
}
//------------------------------------------------------------------------
static LaserBoy_real_segment polar_grid_xz(LaserBoy_3D_double P0,
double radius_max,
double radii_units,
double angle_units
)
{
double i,
arc_step = two_pi / 60;
LaserBoy_3D_double double_3D;
LaserBoy_real_segment rs;
radius_max = abs(radius_max);
radii_units = abs(radii_units);
angle_units = abs(angle_units);
double_3D.y = P0.y;
for(i = radii_units; i <= radius_max; i += radii_units)
{
double_3D.x = i + P0.x;
double_3D.z = P0.z;
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), LASERBOY_BLANKING_BIT, 55));
for(int a = 1; a <= 60; a++)
{
double_3D.x = i * cos(a * arc_step) + P0.x;
double_3D.z = i * sin(a * arc_step) + P0.z;
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), 0, 55));
}
}
for(i = 0; i <= two_pi; i += angle_units)
{
rs.push_back(LaserBoy_real_vertex(P0.x, P0.y, P0.z, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(radius_max * cos(i) + P0.x, P0.y, radius_max * sin(i) + P0.z, 255, 255, 255, 0, 55));
}
rs.push_back(LaserBoy_real_vertex(radius_max, 0.0, 0.0, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
return rs;
}
//------------------------------------------------------------------------
static LaserBoy_real_segment polar_grid_yz(LaserBoy_3D_double P0,
double radius_max,
double radii_units,
double angle_units
)
{
double i,
arc_step = two_pi / 60;
LaserBoy_3D_double double_3D;
LaserBoy_real_segment rs;
radius_max = abs(radius_max);
radii_units = abs(radii_units);
angle_units = abs(angle_units);
double_3D.x = P0.x;
for(i = radii_units; i <= radius_max; i += radii_units)
{
double_3D.y = i + P0.y;
double_3D.z = P0.z;
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), LASERBOY_BLANKING_BIT, 55));
for(int a = 1; a <= 60; a++)
{
double_3D.y = i * cos(a * arc_step) + P0.y;
double_3D.z = i * sin(a * arc_step) + P0.z;
rs.push_back(LaserBoy_real_vertex(double_3D, LaserBoy_color(255, 255, 255), 0, 55));
}
}
for(i = 0; i <= two_pi; i += angle_units)
{
rs.push_back(LaserBoy_real_vertex(P0.x, P0.y, P0.z, 0, 0, 0, 0, 255));
rs.push_back(LaserBoy_real_vertex(P0.x, radius_max * cos(i) + P0.y, radius_max * sin(i) + P0.z, 255, 255, 255, 0, 55));
}
rs.push_back(LaserBoy_real_vertex(0.0, radius_max, 0.0, 255, 255, 255, LASERBOY_BLANKING_BIT, 55));
return rs;
}
//------------------------------------------------------------------------
bool is_2D() const
{
if(size() > 1)
{
for(size_t i = 0; i < size(); i++)
if(at(i).z != 0.0)
return false;
}
return true;
}
//------------------------------------------------------------------------
bool is_flat_in_x() const
{
if(size() > 1)
{
double _x = first_lit_anchor().x;
for(size_t i = 1; i < size(); i++)
if(at(i).is_lit() && at(i).x != _x)
return false;
}
return true;
}
//------------------------------------------------------------------------
bool is_flat_in_y() const
{
if(size() > 1)
{
double _y = first_lit_anchor().y;
for(size_t i = 1; i < size(); i++)
if(at(i).is_lit() && at(i).y != _y)
return false;
}
return true;
}
//------------------------------------------------------------------------
bool is_flat_in_z() const
{
if(size() > 1)
{
double _z = first_lit_anchor().z;
for(size_t i = 1; i < size(); i++)
if(at(i).is_lit() && at(i).z != _z)
return false;
}
return true;
}
//------------------------------------------------------------------------
bool operator == (const LaserBoy_real_segment& rs)
{
if(palette_index != rs.palette_index)
return false;
if(size() != rs.size())
return false;
for(size_t i = 0; i < size(); i++)
if(at(i) != rs.at(i))
return false;
return true;
}
//------------------------------------------------------------------------
LaserBoy_real_segment& operator += (LaserBoy_real_segment rs)
{
if(palette_index != rs.palette_index)
{
promote_to_true_color();
rs.promote_to_true_color();
}
insert(end(), rs.begin(), rs.end());
return *this;
}
//------------------------------------------------------------------------
LaserBoy_real_segment& operator += (const LaserBoy_real_vertex& vertex)
{
push_back(vertex);
return *this;
}
//------------------------------------------------------------------------
LaserBoy_real_segment& operator += (const LaserBoy_3D_double& float_3D)
{
for(size_t i = 0; i < size(); i++)
at(i) += float_3D;
return *this;
}
//------------------------------------------------------------------------
LaserBoy_real_segment& operator -= (const LaserBoy_3D_double& float_3D)
{
for(size_t i = 0; i < size(); i++)
at(i) -= float_3D;
return *this;
}
//------------------------------------------------------------------------
LaserBoy_real_segment& operator *= (const LaserBoy_3D_double& float_3D)
{
for(size_t i = 0; i < size(); i++)
at(i) *= float_3D;
return *this;
}
//------------------------------------------------------------------------
LaserBoy_real_segment operator + (LaserBoy_real_segment rs) const
{
LaserBoy_real_segment sum(*this);
if(sum.palette_index != rs.palette_index)
{
sum.promote_to_true_color();
rs.promote_to_true_color();
}
sum.insert(sum.end(), rs.begin(), rs.end());
sum.sync_rgb_and_palette();
return sum;
}
//------------------------------------------------------------------------
LaserBoy_real_segment operator + (const LaserBoy_3D_double& float_3D) const
{
LaserBoy_real_segment rs(*this);
for(size_t i = 0; i < rs.size(); i++)
rs.at(i) += float_3D;
return rs;
}
//------------------------------------------------------------------------
LaserBoy_real_segment operator * (const LaserBoy_3D_double& float_3D) const
{
LaserBoy_real_segment rs(*this);
for(size_t i = 0; i < rs.size(); i++)
rs.at(i) *= float_3D;
return rs;
}
//------------------------------------------------------------------------
LaserBoy_real_segment& operator = (const LaserBoy_real_segment& rs)
{
palette_index = rs.palette_index;
real_segment_error = rs.real_segment_error;
clear();
reserve(rs.size());
insert(begin(), rs.begin(), rs.end());
shrink_to_fit();
return *this;
}
//------------------------------------------------------------------------
LaserBoy_real_segment sub(LaserBoy_real_segment::const_iterator begin,
LaserBoy_real_segment::const_iterator last
)
{
LaserBoy_real_segment sub(palette_index, false);
sub.insert(sub.begin(), begin, last);
return sub;
}
//------------------------------------------------------------------------
LaserBoy_real_vertex first_lit_vertex() const
{
for(size_t i = 1; i < size(); i++)
if(at(i).is_lit())
return at(i);
return LaserBoy_real_vertex(0);
}
//------------------------------------------------------------------------
int first_lit_vector_index() const
{
for(size_t i = 1; i < size(); i++)
if(at(i).is_lit())
return i;
return -1;
}
//------------------------------------------------------------------------
LaserBoy_real_vertex first_lit_anchor() const
{
for(size_t i = 1; i < size(); i++)
if(at(i).is_lit())
return at(i - 1);
return LaserBoy_real_vertex(0);
}
//------------------------------------------------------------------------
int first_lit_anchor_index() const
{
for(size_t i = 1; i < size(); i++)
if(at(i).is_lit())
return (i - 1);
return -1;
}
//------------------------------------------------------------------------
LaserBoy_real_vertex last_lit_anchor() const
{
for(size_t i = size() - 1; i > 0; i--)
if(at(i).is_lit())
return at(i - 1);
return LaserBoy_real_vertex(0);
}
//------------------------------------------------------------------------
LaserBoy_real_vertex last_lit_vector() const
{
for(size_t i = size() - 1; i > 0; i--)
if(at(i).is_lit())
return at(i);
return LaserBoy_real_vertex(0);
}
//------------------------------------------------------------------------
int last_lit_vector_index() const
{
for(size_t i = size() - 1; i > 0; i--)
if(at(i).is_lit())
return i;
return -1;
}
//------------------------------------------------------------------------
size_t number_of_lit_vectors() const
{
size_t count = 0;
for(size_t i = 1; i < size(); i++)
if(at(i).is_lit())
count++;
return count;
}
//------------------------------------------------------------------------
size_t number_of_color_vectors() const;
size_t number_of_dark_vectors () const;
//------------------------------------------------------------------------
size_t number_of_blank_vectors() const
{
size_t count = 0;
for(size_t i = 1; i < size(); i++)
if(at(i).is_blank())
count++;
return count;
}
//------------------------------------------------------------------------
size_t number_of_unique_colors() const
{
if(size() > 1)
{
size_t i,
j;
LaserBoy_palette palette;
if(first_lit_vector_index() > -1)
{
palette.push_back((LaserBoy_color)first_lit_vertex());
for(i = first_lit_vector_index() + 1; i < size(); i++)
{
for(j = 0; j < palette.number_of_colors(); j++)
{
if(palette[j] == (LaserBoy_color)at(i))
break;
}
if( j == palette.number_of_colors() // color not found
&& at(i).is_lit()
)
palette.push_back((LaserBoy_color)at(i));
}
return palette.number_of_colors();
}
}
return 0;
}
//------------------------------------------------------------------------
LaserBoy_real_segment& remove_vertex(size_t vertex_index)
{
if(size() < 3) // takes 2 vertices to make a vector!
clear();
else if(vertex_index < size())
{
size_t i;
LaserBoy_real_segment rs(palette_index, false);
rs.reserve(size());
for(i = 0; i < vertex_index; i++)
rs += at(i);
for(i = vertex_index + 1; i < size(); i++)
rs += at(i);
*this = rs;
}
return *this;
}
//------------------------------------------------------------------------
LaserBoy_real_segment& sort()
{
if(size() < 2) // takes 2 vertices to make a vector!
clear();
else
std::sort(begin(), end(), less_than);
return *this;
}
//------------------------------------------------------------------------
bool is_closed_polygon() const
{
if( (LaserBoy_3D_double)first_lit_anchor()
== (LaserBoy_3D_double)last_lit_vector()
)
return true;
return false;
}
//------------------------------------------------------------------------
u_int bmp_bpp() const
{
if(number_of_unique_colors() <= 1)
return 1;
if(number_of_unique_colors() <= 15)
return 4;
if(number_of_unique_colors() <= 255)
return 8;
return 24;
}
//------------------------------------------------------------------------
LaserBoy_3D_double dimensions (LaserBoy_3D_double& real_offset,
bool ignore_origin
) const ;
LaserBoy_3D_double segment_front () const ;
LaserBoy_3D_double segment_back () const ;
LaserBoy_3D_double segment_top () const ;
LaserBoy_3D_double segment_bottom () const ;
LaserBoy_3D_double segment_right () const ;
LaserBoy_3D_double segment_left () const ;
double max_x () const ;
double max_y () const ;
double max_z () const ;
double min_x () const ;
double min_y () const ;
double min_z () const ;
double height () const ;
double width () const ;
double depth () const ;
double max_dimension () const ;
double max_distance_from_origin () const ;
double max_distance_from_origin_xy () const ;
double max_distance_from_origin_zy () const ;
double max_distance_from_origin_xz () const ;
size_t i_max_distance_from_origin_xy () const ;
size_t i_max_distance_from_origin_zy () const ;
size_t i_max_distance_from_origin_xz () const ;
double min_distance_from_origin () const ;
double min_distance_from_origin_xy () const ;
double min_distance_from_origin_zy () const ;
double min_distance_from_origin_xz () const ;
size_t i_min_distance_from_origin_xy () const ;
size_t i_min_distance_from_origin_zy () const ;
size_t i_min_distance_from_origin_xz () const ;
bool segment_passes_through_origin (const double& granularity) const ;
LaserBoy_real_segment& reverse ();
LaserBoy_real_segment& reorder_from (size_t index);
LaserBoy_real_segment& center_x ();
LaserBoy_real_segment& center_y ();
LaserBoy_real_segment& center_z ();
LaserBoy_real_segment& center ();
void blank_all_vertices ();
void unblank_all_vertices ();
void strip_color ();
void strip_color_rgb (const LaserBoy_color& c);
void index_hues (int index_multiple, int offset);
void span_hues (double span_factor, int offset);
void flip (u_int plane);
void quarter_turn (u_int plane, u_int turns);
// void z_order_vertices (short span);
void flatten_z ();
//------------------------------------------------------------------------
double vector_angle (size_t vertex) const ;
double total_angle () const ;
double max_angle () const ;
double total_magnitude () const ;
double max_magnitude () const ;
double max_color_magnitude () const ;
double max_dark_magnitude () const ;
//------------------------------------------------------------------------
LaserBoy_real_segment& move_ (LaserBoy_3D_double displacement,
double move_acceleration
);
LaserBoy_real_segment& scale_ (LaserBoy_3D_double factor, // from
LaserBoy_3D_double factor_, // to
double scale_acceleration
);
LaserBoy_real_segment& rotate_ (LaserBoy_3D_double fulcrum, // from
LaserBoy_3D_double fulcrum_, // to
double fulcrum_acceleration,
LaserBoy_3D_double rotation,
double rotate_acceleration
);
//------------------------------------------------------------------------
LaserBoy_real_vertex interpolated_value_at (double relative_position) const;
//------------------------------------------------------------------------
LaserBoy_real_segment& add (LaserBoy_real_segment rs_displacements);
LaserBoy_real_segment& multiply (LaserBoy_real_segment rs_factors);
LaserBoy_real_segment& warp (LaserBoy_3D_double fulcrum,
LaserBoy_3D_double fulcrum_,
double fulcrum_acceleration,
LaserBoy_real_segment rs_rotations);
LaserBoy_real_segment& xyz_rgb (LaserBoy_real_segment rs_colors);
//------------------------------------------------------------------------
LaserBoy_real_segment& to_polar ();
LaserBoy_real_segment& differences ();
LaserBoy_real_segment& sums ();
LaserBoy_real_segment& to_rectangular ();
//------------------------------------------------------------------------
void rotate (LaserBoy_3D_double a);
void rotate_around_origin (LaserBoy_3D_double a);
//------------------------------------------------------------------------
LaserBoy_real_segment& rotate_on_coordinates (LaserBoy_3D_double fulcrum, // from
LaserBoy_3D_double fulcrum_, // to
double fulcrum_acceleration,
LaserBoy_3D_double rotation
);
void rotate_on_coordinates_x (LaserBoy_3D_double fulcrum,
double angle
);
void rotate_on_coordinates_y (LaserBoy_3D_double fulcrum,
double angle
);
void rotate_on_coordinates_z (LaserBoy_3D_double fulcrum,
double angle
);
//------------------------------------------------------------------------
bool find_rgb_in_palette (const LaserBoy_palette& palette);
void promote_to_true_color ();
void set_rgb_from_palette ();
void set_palette_to_332 ();
void sync_rgb_and_palette ();
void best_match_palette (int index);
void bit_reduce_to_palette ();
void best_reduce_to_palette ();
void convert_black_to_blank ();
void convert_blank_to_black ();
void impose_black_level ();
void reduce_blank_vectors ();
void reduce_lit_vectors ();
void omit_equivalent_vectors ();
LaserBoy_real_segment& move (LaserBoy_3D_double d);
//------------------------------------------------------------------------
LaserBoy_real_segment& scale_around_origin (LaserBoy_3D_double s);
LaserBoy_real_segment& scale_on_coordinates (LaserBoy_3D_double p,
LaserBoy_3D_double s
);
LaserBoy_real_segment& scale (LaserBoy_3D_double s);
//------------------------------------------------------------------------
LaserBoy_Error_Code add_lit_span_vertices ();
void add_lit_span_vertices (const u_int& max_d);
LaserBoy_Error_Code add_blank_span_vertices ();
//------------------------------------------------------------------------
LaserBoy_3D_double rectangular_center_of () const ;
LaserBoy_3D_double mean_of_coordinates () const ;
LaserBoy_3D_double centroid_of_coordinates_xy (double &area, LaserBoy_real_segment &rs) const ;
LaserBoy_3D_double centroid_of_coordinates_zy (double &area, LaserBoy_real_segment &rs) const ;
LaserBoy_3D_double centroid_of_coordinates_xz (double &area, LaserBoy_real_segment &rs) const ;
LaserBoy_3D_double centroid_of_coordinates () const ;
//------------------------------------------------------------------------
LaserBoy_real_segment polygon_outline_xy (double &area) const ;
LaserBoy_real_segment polygon_outline_zy (double &area) const ;
LaserBoy_real_segment polygon_outline_xz (double &area) const ;
//------------------------------------------------------------------------
size_t number_of_segments () const ;
//------------------------------------------------------------------------
bool find_segment_at_index (size_t index,
size_t& start,
size_t& end
) const ;
//------------------------------------------------------------------------
LaserBoy_real_segment& fracture_segments ();
LaserBoy_real_segment& bond_segments ();
LaserBoy_real_segment& conglomerate_lit_segments ();
LaserBoy_real_segment& sort_by_rotation_xy ();
LaserBoy_real_segment& sort_by_rotation_zy ();
LaserBoy_real_segment& sort_by_rotation_xz ();
//------------------------------------------------------------------------
LaserBoy_real_segment_set explode_segments () const ;
//------------------------------------------------------------------------
LaserBoy_real_segment copy_segment (size_t index) const ;
LaserBoy_3D_double rectangular_center_of_segment (size_t index) const ;
LaserBoy_3D_double mean_of_coordinates_of_segment(size_t index) const ;
LaserBoy_3D_double centroid_of_segment_xy (size_t index, double& area, LaserBoy_real_segment& rs) const ;
LaserBoy_3D_double centroid_of_segment_xz (size_t index, double& area, LaserBoy_real_segment& rs) const ;
LaserBoy_3D_double centroid_of_segment_zy (size_t index, double& area, LaserBoy_real_segment& rs) const ;
LaserBoy_3D_double centroid_of_segment (size_t index) const ;
void move_segment (size_t index, LaserBoy_3D_double f);
void center_segment_x (size_t index);
void center_segment_y (size_t index);
void center_segment_z (size_t index);
void center_segment (size_t index);
void rotate_segment (size_t index, LaserBoy_3D_double a);
void rotate_segment_around_origin (size_t index, LaserBoy_3D_double a);
void scale_segment (size_t index, LaserBoy_3D_double m);
void scale_segment_around_origin (size_t index, LaserBoy_3D_double m);
//------------------------------------------------------------------------
bool save_as_bmp (const string& file,
u_int x_res,
u_int y_res,
u_int rendered_line_width,
bool bmp_render_vectors,
bool bmp_render_vertices,
double scale = 0
) const ;
//------------------------------------------------------------------------
LaserBoy_Error_Code from_ifstream_txt (std::ifstream& in,
const u_int& group_type,
int& line_number
);
void to_ofstream_txt_color_table (std::ofstream& out);
void to_ofstream_txt (std::ofstream& out,
int frame_index
);
//------------------------------------------------------------------------
LaserBoy_Error_Code from_ifstream_dxf (std::ifstream& in);
bool save_as_dxf (const string& file,
bool save_true_color_dxf
) const;
//------------------------------------------------------------------------
void normalize (bool ignore_origin = true); // -32767 to +32767
void normalize_vectors (bool ignore_origin = true);
void normalize_vectors_with_origin (bool ignore_origin = true);
void to_unit (bool ignore_origin = true); // -1.0 to +1.0
void to_unit_with_origin (bool ignore_origin = true);
//------------------------------------------------------------------------
LaserBoy_real_segment& clip (const LaserBoy_3D_double& max,
const LaserBoy_3D_double& min,
const double& granularity
);
//------------------------------------------------------------------------
LaserBoy_real_segment& clip ();
//------------------------------------------------------------------------
LaserBoy_real_segment& clip_around_coordinate (const LaserBoy_3D_double& center,
const LaserBoy_3D_double& max,
const LaserBoy_3D_double& min,
const double& granularity
);
//------------------------------------------------------------------------
LaserBoy_real_segment& clip_around_coordinate (const LaserBoy_3D_double& center,
const double range,
const double& granularity
);
//------------------------------------------------------------------------
bool is_selected ;
int palette_index ;
LaserBoy_Error_Code real_segment_error;
//------------------------------------------------------------------------
};
//############################################################################
#endif
//############################################################################
//////////////////////////////////////////////////////////////////////////////
//############################################################################