mirror of https://gitee.com/bigwinds/arangodb
84 lines
3.0 KiB
C++
84 lines
3.0 KiB
C++
/*
|
|
Copyright 2005-2007 Adobe Systems Incorporated
|
|
|
|
Use, modification and distribution are subject to the Boost Software License,
|
|
Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|
http://www.boost.org/LICENSE_1_0.txt).
|
|
|
|
See http://opensource.adobe.com/gil for most recent version including documentation.
|
|
*/
|
|
|
|
/*************************************************************************************************/
|
|
|
|
/// \file
|
|
/// \brief Test file for convolve_rows() and convolve_cols() in the numeric extension
|
|
/// \author Lubomir Bourdev and Hailin Jin
|
|
/// \date February 27, 2007
|
|
|
|
#include <boost/gil/image.hpp>
|
|
#include <boost/gil/typedefs.hpp>
|
|
#include <boost/gil/extension/io/jpeg_io.hpp>
|
|
|
|
using namespace boost::gil;
|
|
|
|
// Models a Unary Function
|
|
template <typename P> // Models PixelValueConcept
|
|
struct mandelbrot_fn {
|
|
typedef point2<ptrdiff_t> point_t;
|
|
|
|
typedef mandelbrot_fn const_t;
|
|
typedef P value_type;
|
|
typedef value_type reference;
|
|
typedef value_type const_reference;
|
|
typedef point_t argument_type;
|
|
typedef reference result_type;
|
|
BOOST_STATIC_CONSTANT(bool, is_mutable=false);
|
|
|
|
value_type _in_color,_out_color;
|
|
point_t _img_size;
|
|
static const int MAX_ITER=100; // max number of iterations
|
|
|
|
mandelbrot_fn() {}
|
|
mandelbrot_fn(const point_t& sz, const value_type& in_color, const value_type& out_color) : _in_color(in_color), _out_color(out_color), _img_size(sz) {}
|
|
|
|
result_type operator()(const point_t& p) const {
|
|
// normalize the coords to (-2..1, -1.5..1.5)
|
|
// (actually make y -1.0..2 so it is asymmetric, so we can verify some view factory methods)
|
|
double t=get_num_iter(point2<double>(p.x/(double)_img_size.x*3-2, p.y/(double)_img_size.y*3-1.0f));//1.5f));
|
|
t=pow(t,0.2);
|
|
|
|
value_type ret;
|
|
for (int k=0; k<num_channels<P>::value; ++k)
|
|
ret[k]=(typename channel_type<P>::type)(_in_color[k]*t + _out_color[k]*(1-t));
|
|
return ret;
|
|
}
|
|
|
|
private:
|
|
double get_num_iter(const point2<double>& p) const {
|
|
point2<double> Z(0,0);
|
|
for (int i=0; i<MAX_ITER; ++i) {
|
|
Z = point2<double>(Z.x*Z.x - Z.y*Z.y + p.x, 2*Z.x*Z.y + p.y);
|
|
if (Z.x*Z.x + Z.y*Z.y > 4)
|
|
return i/(double)MAX_ITER;
|
|
}
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
int main() {
|
|
typedef mandelbrot_fn<rgb8_pixel_t> deref_t;
|
|
typedef deref_t::point_t point_t;
|
|
typedef virtual_2d_locator<deref_t,false> locator_t;
|
|
typedef image_view<locator_t> my_virt_view_t;
|
|
|
|
boost::function_requires<PixelLocatorConcept<locator_t> >();
|
|
gil_function_requires<StepIteratorConcept<locator_t::x_iterator> >();
|
|
|
|
point_t dims(200,200);
|
|
my_virt_view_t mandel(dims, locator_t(point_t(0,0), point_t(1,1), deref_t(dims, rgb8_pixel_t(255,0,255), rgb8_pixel_t(0,255,0))));
|
|
jpeg_write_view("out-mandelbrot.jpg",mandel);
|
|
|
|
return 0;
|
|
}
|
|
|