From: Dimitrios Eftaxiopoulos Date: Sun, 10 Aug 2014 20:21:00 +0000 (+0300) Subject: Imported Upstream version 2.3 X-Git-Tag: archive/raspbian/2.5-2+rpi1^2~26^2~12 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7dcdf2ec6e23faf605926edaa1d2977c6741d95d;p=mathgl.git Imported Upstream version 2.3 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ae50a5..e465bad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,9 +8,9 @@ if(NOT CMAKE_BUILD_TYPE) endif(NOT CMAKE_BUILD_TYPE) set(CMAKE_VERBOSE_MAKEFILE ON) -set(MathGL_VERSION_MAJOR 2) -set(MathGL_VERSION_MINOR 2.2) -set(MathGL_SOVERSION 7.2.0) +#set(MathGL_VERSION_MAJOR 2) +#set(MathGL_VERSION_MINOR 2.2) +set(MathGL_SOVERSION 7.3.0) MACRO(MGL_DEPENDENT_OPTION option doc default depends1 force1 depends2 force2) @@ -59,7 +59,6 @@ include(CMakeDependentOption) set(MGL_LIB_INSTALL_DIR "lib" CACHE STRING "Set library install directory") option(enable-double "Enable double precision in MathGL library" ON) -option(enable-simple "Slightly increase drawing speed but disable mglDataA class") option(enable-mpi "Enable mpi") option(enable-opengl "Enable OpenGL support" ON) option(enable-all-docs "Enable all documentation building") @@ -67,6 +66,7 @@ option(enable-all-docs "Enable all documentation building") option(enable-all "Enable all core features") option(enable-all-widgets "Enable all Widgets") option(enable-all-swig "Enable all SWIG based interfaces") +option(enable-rvalue "Enable move constructor support (need C++11)" OFF) option(enable-pthread "Enable POSIX threads support" OFF) option(enable-openmp "Enable OpenMP support" ON) option(enable-lgpl "Enable only LGPL part of MathGL") @@ -96,6 +96,12 @@ CMAKE_DEPENDENT_OPTION(enable-qt4 "Enable Qt4 widget" OFF "NOT enable-all-widget CMAKE_DEPENDENT_OPTION(enable-qt5 "Enable Qt5 widget" OFF "NOT enable-all-widgets" ON) CMAKE_DEPENDENT_OPTION(enable-qt5asqt "Set Qt5 as default libmgl-qt" ON "enable-qt5" OFF) +if(UNIX AND enable-rvalue) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") +endif(UNIX AND enable-rvalue) + +# MSVC does not require any special flags + if(enable-qt4 OR enable-qt5) set(enable-qt ON) endif(enable-qt4 OR enable-qt5) @@ -148,6 +154,45 @@ if(HAVE_MEMRCHR) ADD_DEFINITIONS("-DHAVE_MEMRCHR") endif(HAVE_MEMRCHR) +include(CheckCXXSourceCompiles) +CHECK_CXX_SOURCE_COMPILES( +"#include +#include +int main(int argc, char *args[]) +{std::complex c(2.0, 1.0); +double _Complex *a = reinterpret_cast(&c); +std::complex b(*a);return 0;}" MGL_HAVE_C99_COMPLEX) +if(NOT MGL_HAVE_C99_COMPLEX) + set(MGL_HAVE_C99_COMPLEX 0) +endif(NOT MGL_HAVE_C99_COMPLEX) +CHECK_CXX_SOURCE_COMPILES( +"#include +int main(){double a=NAN, b=INFINITY;return 0;}" MGL_HAVE_NAN_INF) +if(NOT MGL_HAVE_NAN_INF) + set(MGL_HAVE_NAN_INF 0) +endif(NOT MGL_HAVE_NAN_INF) +CHECK_CXX_SOURCE_COMPILES( +"int __attribute__((pure)) test1() {return 0;} +int __attribute__((const)) test2(int x) {return x*x;} +int main(int argc, char* argv[]) {return 0;}" MGL_HAVE_ATTRIBUTE) +if(NOT MGL_HAVE_ATTRIBUTE) + set(MGL_HAVE_ATTRIBUTE 0) +endif(NOT MGL_HAVE_ATTRIBUTE) +CHECK_CXX_SOURCE_COMPILES( +"#define mgl_isnum(a) ({typeof (a) _a = (a); _a==_a;}) +int main(){bool a=mgl_isnum(1);return 0;}" MGL_HAVE_TYPEOF) +if(NOT MGL_HAVE_TYPEOF) + set(MGL_HAVE_TYPEOF 0) +endif(NOT MGL_HAVE_TYPEOF) + +#unset(MGL_HAVE_C99_COMPLEX) +CHECK_CXX_SOURCE_COMPILES( +"struct test { test() {} test(test&& a){} }; +int main() { test t; return 0; }" MGL_HAVE_RVAL) +if(NOT MGL_HAVE_RVAL) + set(MGL_HAVE_RVAL 0) +endif(NOT MGL_HAVE_RVAL) + if(enable-double) set(MGL_USE_DOUBLE 1) else(enable-double) @@ -158,13 +203,6 @@ if(enable-qt4 OR enable-qt5) set(MGL_HAVE_QT 1) endif(enable-qt4 OR enable-qt5) -if(enable-simple) - set(MGL_NO_DATA_A 1) -message(STATUS "Class mglDataA is switched off.") -else(enable-simple) - set(MGL_NO_DATA_A 0) -endif(enable-simple) - if(enable-openmp) find_package(OpenMP) if(OPENMP_FOUND) @@ -357,66 +395,6 @@ else(enable-wx) set(MGL_HAVE_WX 0) endif(enable-wx) -if(enable-python) - set(MGL_HAVE_SWIG 1) - set(MGL_HAVE_PYTHON 1) - set(Python_ADDITIONAL_VERSIONS 2.7) - FIND_PACKAGE(PythonInterp) - if(NOT PYTHONINTERP_FOUND) - message(SEND_ERROR "Couldn't find python interpreter.") - endif(NOT PYTHONINTERP_FOUND) - FIND_PACKAGE(PythonLibs) - if(NOT PYTHONLIBS_FOUND) - message(SEND_ERROR "Couldn't find python development libraries.") - endif(NOT PYTHONLIBS_FOUND) - execute_process( - COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print numpy.get_include()" - OUTPUT_VARIABLE NUMPY_INCLUDE_PATH - RESULT_VARIABLE NUMPY_ERR - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(NOT NUMPY_INCLUDE_PATH) - message(SEND_ERROR "Couldn't find numpy.") - endif(NOT NUMPY_INCLUDE_PATH) -else(enable-python) - set(MGL_HAVE_PYTHON 0) -endif(enable-python) - -if(enable-lua) - set(MGL_HAVE_SWIG 1) - set(MGL_HAVE_LUA 1) - INCLUDE(FindLua51) - if(NOT LUA51_FOUND) - message(SEND_ERROR "Couldn't find Lua 5.1 library.") - endif(NOT LUA51_FOUND) -else(enable-lua) - set(MGL_HAVE_LUA 0) -endif(enable-lua) - - -if(enable-octave) - set(MGL_HAVE_SWIG 1) - set(MGL_HAVE_OCTAVE 1) - find_program(oct_prog octave-config) - if(NOT oct_prog) - message(SEND_ERROR "Couldn't find octave-config needed for octave interfaces compiling.") - endif(NOT oct_prog) - find_program(oct_exec octave) - if(NOT oct_exec) - message(SEND_ERROR "Couldn't find octave needed for octave interfaces compiling.") - endif(NOT oct_exec) - find_program(oct_mk mkoctfile) - if(NOT oct_mk) - message(SEND_ERROR "Couldn't find mkoctfile needed for octave interfaces compiling.") - endif(NOT oct_mk) - find_program(oct_tar tar) - if(NOT oct_tar) - message(SEND_ERROR "Couldn't find tar needed for octave interfaces creation.") - endif(NOT oct_tar) -else(enable-octave) - set(MGL_HAVE_OCTAVE 0) -endif(enable-octave) - if(enable-doc-info) set(MGL_HAVE_DOC_INFO 1) find_program(findmi makeinfo) @@ -457,7 +435,6 @@ else(enable-doc-html) set(MGL_HAVE_DOC_HTML 0) endif(enable-doc-html) - if(enable-doc-site) set(MGL_HAVE_DOC_SITE 1) else(enable-doc-site) @@ -499,14 +476,6 @@ else(enable-doc-prc) set(MGL_HAVE_DOC_PRC 0) endif(enable-doc-prc) -if(MGL_HAVE_SWIG) - FIND_PACKAGE(SWIG) - if(NOT SWIG_FOUND) - message(SEND_ERROR "Couldn't find swig needed for interfaces compiling.") - endif(NOT SWIG_FOUND) - INCLUDE(${SWIG_USE_FILE}) -endif(MGL_HAVE_SWIG) - if(UNIX) add_definitions(-DNO_COLOR_ARRAY) endif(UNIX) @@ -521,8 +490,12 @@ add_subdirectory( include ) if(NOT enable-lgpl) add_subdirectory( udav ) add_subdirectory( json ) - add_subdirectory( lang ) - add_subdirectory( utils ) + if(enable-python OR enable-lua OR enable-octave) + add_subdirectory( lang ) + endif(enable-python OR enable-lua OR enable-octave) + if(NOT MSVC AND NOT BORLAND) + add_subdirectory( utils ) + endif(NOT MSVC AND NOT BORLAND) # add_subdirectory( mgllab ) endif(NOT enable-lgpl) diff --git a/ChangeLog.txt b/ChangeLog.txt index fd83c6e..7b56ef2 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,58 @@ +2.3 Released 7 August 2014 + +* Add background image, which allow in particular semi-transparent background color. Correspondingly add function Rasterize() for saving current image as background, and function LoadBackground() for loading background image from PNG or JPEG file. +* Add primitives to draw polygon and angle arc. +* Allow arbitrary factor for axis ticks (like, gr->SetTicks('x',M_PI,0,NAN,"\\pi");). +* Add function AddTick() for adding manual tick to existed ones. +* Add new styles and symbols: + - arrow style 'X'; + - color gradient (color scheme) of glyphs in text; + - manual dash style, like "{df090}"; + - manual mask style, like "{s00ff00182424f800}"; + - Add styles 'fFE0123456789+-' for printing numbers in functions Axis(), Colorbar(), Table() and Label(); + - style '!' to disable ticks tuning in Axis() and Colorbar(); + - special symbol '\b' which will be ignored at printing; + - calligraphic TeX symbols, like \calB, \calE, \calF, \calH, \calI, \calL, \calM, \calR, \ell, \scrg, \scro. + +* Add ODE solving functions for textual formulas +* Add function for global cubic spline interpolation, and function to refill using global spline. +* Add functions "random(dat)" and "gamma_inc(a,x)" to the list of known functions for formula parsing +* Add 'inf' variable to the MGL and formula parsing +* Allow reading JPEG files for mglData::Import(). +* Function mgl_data_subdata_ext() handle NULL argument(s). Add variants of SubData() with 1 and 2 arguments. +* Warning messages and information are printed to stderr until call of mgl_suppress_warn(true) will disable it. +* Add function mgl_check_version() and MGL command 'version' to check if MathGL version is valid. +* Add move constructor(s) if compiler support C++11 rvalues. + +* Changes in algorithms: + - Greatly increase speed of formula parsing (i.e. of functions mglData::Modify(), mglData::Fill() and similar), and speeding up many other places; + - Improve algorithm for contours drawing and filling, taking special attention to quasi-random data. + - Spline() now use 5-th order polynomials to keep continuity of 2nd derivative too. + - Add function attributes 'pure' or 'const', which potentially can speed up drawing. + - Use spline instead of linear interpolation in functions Flow() and Pipe(). + - Adjust columnplot and gridplot positions for non-zero distance between the inplots. + - Improve colorbar labels drawing at SetRotatedText(false) + - Choose new scales for perspective. + - Allow 'negative' angles for text rotation + - Use new s-hull version for triangulation. +* Make function mgl_get_curvs() to be exported. This function is used internally to connect line segments to a set of curves (in particular, for contour lines). +* Add ViewAsRotate() function which handle arguments of View() by the same way as Rotate() function, i.e View(tetx,tetz,tety) <=> ViewAsRotate(-tetz,-tetx,-tety) +* Function mglWindow::Adjust() for Quality&4==0 now show image in widgets even if draw function is absent (i.e. =NULL). + +* improvements in UDAV: + - Rearrange tool buttons; + - Add features for manual dashing and manual mask in Style dialog; + - Add dialog for new dialog for new inplots (including subplot, multiplot, columnplot, stickplot, gridplot); + - Add option to use dots plot at image refreshing (for faster rotation etc); + - Add new primitives (arc,polygon,rotated text) as mouse handled ones; + - Add close button to data tabs; + - Add button to stop script drawing and stop() slot for QMathGL; + - Allow to delete/hide/unhide selected plot; + - Allow to move selected plot between inplots; + - Improve NewCommand dialog -- now it replace the script command if user change arguments only; + - MGL commands 'perspective' and 'fog' now work correctly in UDAV; + - Update UDAV icons to use Oxygen ones. + 2.2.2.1 Released 19 March 2014 * Compatibility changes for MS VisualStudio 2010 and early. diff --git a/FindMathGL2.cmake b/FindMathGL2.cmake new file mode 100644 index 0000000..43b8640 --- /dev/null +++ b/FindMathGL2.cmake @@ -0,0 +1,113 @@ +# - FindMathGL2.cmake +# This module can be used to find MathGL v.2.* and several of its optional components. +# +# You can specify one or more component as you call this find module. +# Possible components are: FLTK, GLUT, Qt, WX. +# +# The following variables will be defined for your use: +# +# MATHGL2_FOUND = MathGL v.2 and all specified components found +# MATHGL2_INCLUDE_DIRS = The MathGL v.2 include directories +# MATHGL2_LIBRARIES = The libraries to link against to use MathGL v.2 +# and all specified components +# MATHGL2_VERSION_STRING = A human-readable version of the MathGL v.2 (e.g. 2.1) +# MATHGL2_XXX_FOUND = Component XXX found (replace XXX with uppercased +# component name -- for example, QT or FLTK) +# +# The minimum required version and needed components can be specified using +# the standard find_package()-syntax, here are some examples: +# find_package(MathGL 2.1 Qt REQUIRED) - 2.1 + Qt interface, required +# find_package(MathGL 2.1 REQUIRED) - 2.1 (no interfaces), required +# find_package(MathGL 2.0 Qt WX) - 2.0 + Qt and WX interfaces, optional +# find_package(MathGL 2.1) - 2.1 (no interfaces), optional +# +# Typical usage could be something like this: +# find_package(MathGL 2.1 GLUT REQUIRED) +# include_directories(${MATHGL2_INCLUDE_DIRS}) +# add_executable(myexe main.cpp) +# target_link_libraries(myexe ${MATHGL2_LIBRARIES}) +# + +#============================================================================= +# Copyright (c) 2011 Denis Pesotsky , 2014 Alexey Balakin +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file COPYING-CMAKE-MODULES for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= + +FIND_PATH(MATHGL2_INCLUDE_DIR + NAMES mgl2/mgl.h + DOC "The MathGL2 v.2.* include directory") +FIND_LIBRARY(MATHGL2_LIBRARY + NAMES mgl + PATHS ${MATHGL2_LIBRARY_DIR} + DOC "The MathGL v.2.* include directory") + +GET_FILENAME_COMPONENT(MATHGL2_LIBRARY_DIR ${MATHGL2_LIBRARY} PATH) + +SET(MATHGL2_LIBRARIES ${MATHGL2_LIBRARY}) +SET(MATHGL2_INCLUDE_DIRS ${MATHGL2_INCLUDE_DIR}) + +IF(MATHGL2_INCLUDE_DIR) + SET(_CONFIG_FILE_PATH "${MATHGL2_INCLUDE_DIR}/mgl2/define.h") + SET(_VERSION_ERR "Cannot determine MathGL v.2.* version") + IF(EXISTS "${_CONFIG_FILE_PATH}") + FILE(STRINGS "${_CONFIG_FILE_PATH}" + MATHGL2_VERSION_STRING REGEX "^#define MGL_VER2.*$") + IF(MATHGL2_VERSION_STRING) + STRING(REGEX + REPLACE "#define MGL_VER2" "" + MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING}) + STRING(REGEX + REPLACE "//.*" "" + MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING}) + STRING(STRIP ${MATHGL2_VERSION_STRING} MATHGL2_VERSION_STRING) + SET(MATHGL2_VERSION_STRING 2.${MATHGL2_VERSION_STRING}) +# MESSAGE(STATUS "Find MathGL version -- ${MATHGL2_VERSION_STRING}") + ELSE() + MESSAGE(FATAL_ERROR "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error") + ENDIF() + ELSE() + MESSAGE(FATAL_ERROR "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found") + ENDIF() +ENDIF() + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(MathGL2 + REQUIRED_VARS MATHGL2_LIBRARY MATHGL2_INCLUDE_DIR + VERSION_VAR MATHGL2_VERSION_STRING) + +FOREACH(_Component ${MathGL2_FIND_COMPONENTS}) + STRING(TOLOWER ${_Component} _component) + STRING(TOUPPER ${_Component} _COMPONENT) + + SET(MathGL2_${_Component}_FIND_REQUIRED ${MathGL2_FIND_REQUIRED}) + SET(MathGL2_${_Component}_FIND_QUIETLY true) + + FIND_PATH(MATHGL2_${_COMPONENT}_INCLUDE_DIR + NAMES mgl2/${_component}.h + PATHS ${MATHGL2_INCLUDE_DIR} NO_DEFAULT_PATH) + FIND_LIBRARY(MATHGL2_${_COMPONENT}_LIBRARY + NAMES mgl-${_component} + PATHS ${MATHGL2_LIBRARY_DIR} NO_DEFAULT_PATH) + + FIND_PACKAGE_HANDLE_STANDARD_ARGS(MathGL2_${_Component} DEFAULT_MSG + MATHGL2_${_COMPONENT}_LIBRARY + MATHGL2_${_COMPONENT}_INCLUDE_DIR) + + IF(MATHGL2_${_COMPONENT}_FOUND) + SET(MATHGL2_LIBRARIES + ${MATHGL2_LIBRARIES} ${MATHGL2_${_COMPONENT}_LIBRARY}) + SET(MATHGL2_INCLUDE_DIRS + ${MATHGL2_INCLUDE_DIRS} ${MATHGL2_${_COMPONENT}_INCLUDE_DIR}) + ENDIF() + + MARK_AS_ADVANCED(MATHGL2_${_COMPONENT}_INCLUDE_DIR + MATHGL2_${_COMPONENT}_LIBRARY) +ENDFOREACH() + +MARK_AS_ADVANCED(MATHGL2_INCLUDE_DIR MATHGL2_LIBRARY) diff --git a/INSTALL b/INSTALL index c999c40..9b5bef2 100644 --- a/INSTALL +++ b/INSTALL @@ -2,9 +2,9 @@ Installation is simple. Just execute: cmake . cmake . make -make install +sudo make install -Sometimes you also need to update yours library list. To do that just execute: -ldconfig +Sometimes you also need to execute: +sudo ldconfig See MathGL documentation for more details. diff --git a/examples/fltk_example.cpp b/examples/fltk_example.cpp index 52cce1d..646373a 100644 --- a/examples/fltk_example.cpp +++ b/examples/fltk_example.cpp @@ -94,13 +94,17 @@ int main(int argc,char **argv) else printf("You may specify argument '1', '2', '3' or 'd' for viewing examples of 1d, 2d, 3d or dual plotting\n"); switch(key) { - case '1': gr = new mglFLTK(sample_1,"1D plots"); break; - case '2': gr = new mglFLTK(sample_2,"2D plots"); break; - case '3': gr = new mglFLTK(sample_3,"3D plots"); break; - case 'd': gr = new mglFLTK(sample_d,"Dual plots"); break; - case 't': gr = new mglFLTK(test_wnd,"Testing"); break; - default: gr = new mglFLTK(sample,"Drop and waves"); break; + case '0': gr = new mglFLTK((mglDraw *)NULL,"1D plots"); break; + case '1': gr = new mglFLTK(sample_1,"1D plots"); break; + case '2': gr = new mglFLTK(sample_2,"2D plots"); break; + case '3': gr = new mglFLTK(sample_3,"3D plots"); break; + case 'd': gr = new mglFLTK(sample_d,"Dual plots");break; + case 't': gr = new mglFLTK(test_wnd,"Testing"); break; + default: gr = new mglFLTK(sample,"Drop and waves"); break; } + if(key=='0') + { gr->Rotate(40,60); gr->Box(); gr->Light(true); gr->FSurf("sin(4*pi*x*y)"); gr->Update(); } gr->Run(); return 0; } #endif +//----------------------------------------------------------------------------- diff --git a/examples/full_test.cpp b/examples/full_test.cpp index 594a9dd..b15981e 100644 --- a/examples/full_test.cpp +++ b/examples/full_test.cpp @@ -23,7 +23,7 @@ #if !defined(_MSC_VER) && !defined(__BORLANDC__) #include #endif -#include + #include "mgl2/mgl.h" #include "mgl2/eval.h" //----------------------------------------------------------------------------- @@ -38,7 +38,7 @@ struct mglSample /// Structure for list of samples extern mglSample samp[]; extern const char *mmgl_dat_prepare; //----------------------------------------------------------------------------- -int mgl_cmd_smp(const void *a, const void *b) +int MGL_LOCAL_PURE mgl_cmd_smp(const void *a, const void *b) { const mglSample *aa = (const mglSample *)a; const mglSample *bb = (const mglSample *)b; @@ -62,53 +62,13 @@ void mgls_prepare2v(mglData *a, mglData *b); void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez); //----------------------------------------------------------------------------- void save(mglGraph *gr,const char *name,const char *suf); -void smgl_stfa(mglGraph *gr); // STFA sample -void smgl_text(mglGraph *gr); // text drawing -void smgl_surf(mglGraph *gr); -#include -#include void test(mglGraph *gr) { - union {unsigned long b;double d;float f;} t; t.b=0; - t.d = NAN; printf("NANd: %g --> %lx\t",t.d,t.b); t.b=0; - t.f = NAN; printf("NANf: %g --> %lx\n",t.f,t.b); t.b=0; - - t.d = INFINITY; printf("INFd: %g --> %lx\t",t.d,t.b); t.b=0; - t.f = INFINITY; printf("INFf: %g --> %lx\n",t.f,t.b); t.b=0; - -const unsigned long mgl_nan[2] = {0x7fffffffffffffff, 0x7fffffff}; -#define NANd (*(double*)mgl_nan) -#define NANf (*(float*)(mgl_nan+1)) - t.d = NANd; printf("NANd: %g --> %lx\t",t.d,t.b); t.b=0; - t.f = NANf; printf("NANf: %g --> %lx\n",t.f,t.b); t.b=0; - - -const unsigned long mgl_inf[2] = {0x7ff0000000000000, 0x7f800000}; -#define INFd (*(double*)mgl_inf) -#define INFf (*(float*)(mgl_inf+1)) - t.d = INFd; printf("INFd: %g --> %lx\t",t.d,t.b); t.b=0; - t.f = INFf; printf("INFf: %g --> %lx\n",t.f,t.b); t.b=0; - - return; - - mglData y(50); - y.Modify("sin(10*x) + 10"); - gr->SetRange('y', y); - gr->Box(); - gr->Axis(); - gr->Plot(y); - y.Save("test.dat"); - return; - - + gr->Rotate(40,60); gr->Fog(1); gr->Box(); return; mglParse par; - setlocale(LC_CTYPE, ""); - par.Execute(gr,"new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'\n\ - new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)'\n\ - new z 50 40 '0.8*cos(pi*(y+1)/2)'\nlight on\n\ - title 'parametric form':rotate 50 60:box\n\ - surf x y z ''\nwrite '1.tex'"); -// par.Execute(gr,"light on:addlegend 'r' 'r':legend"); + par.Execute(gr,"subplot 1 1 0:#rotate 40 60\nperspective 0.9:box:axis\n"); +// par.Execute(gr,"subplot 1 1 0:#rotate 40 60\nperspective 1.22:box:axis\n"); + return; } //----------------------------------------------------------------------------- #if !defined(_MSC_VER) && !defined(__BORLANDC__) @@ -143,6 +103,7 @@ static struct option longopts[] = { "test", no_argument, &dotest, 1 }, { "font", no_argument, &dotest, 2 }, { "time", no_argument, &dotest, 3 }, + { "fexport",no_argument, &dotest, 4 }, { "thread", required_argument, NULL, 't' }, { "verbose",no_argument, &verbose, 1 }, { "width", required_argument, NULL, 'w' }, @@ -182,6 +143,7 @@ void usage() "--time - measure execution time for all samples\n" "--font - write current font as C++ file\n" "--quality=val - use specified quality for plot(s)\n" + "--fexport - test most of output formats\n" ); } #endif @@ -252,8 +214,166 @@ void save(mglGraph *gr,const char *name,const char *suf="") } } //----------------------------------------------------------------------------- +void smgl_fexport(mglGraph *gr) // test file export +{ + gr->SubPlot(3,2,0); + double d,x1,x2,x0,y=0.95; + d=0.3, x0=0.2, x1=0.5, x2=0.6; + gr->Line(mglPoint(x0,1-0*d),mglPoint(x1,1-0*d),"k-"); gr->Puts(mglPoint(x2,y-0*d),"Solid '-'",":rL"); + gr->Line(mglPoint(x0,1-1*d),mglPoint(x1,1-1*d),"k|"); gr->Puts(mglPoint(x2,y-1*d),"Long Dash '|'",":rL"); + gr->Line(mglPoint(x0,1-2*d),mglPoint(x1,1-2*d),"k;"); gr->Puts(mglPoint(x2,y-2*d),"Dash ';'",":rL"); + gr->Line(mglPoint(x0,1-3*d),mglPoint(x1,1-3*d),"k="); gr->Puts(mglPoint(x2,y-3*d),"Small dash '='",":rL"); + gr->Line(mglPoint(x0,1-4*d),mglPoint(x1,1-4*d),"kj"); gr->Puts(mglPoint(x2,y-4*d),"Dash-dot 'j'",":rL"); + gr->Line(mglPoint(x0,1-5*d),mglPoint(x1,1-5*d),"ki"); gr->Puts(mglPoint(x2,y-5*d),"Small dash-dot 'i'",":rL"); + gr->Line(mglPoint(x0,1-6*d),mglPoint(x1,1-6*d),"k:"); gr->Puts(mglPoint(x2,y-6*d),"Dots ':'",":rL"); + gr->Line(mglPoint(x0,1-7*d),mglPoint(x1,1-7*d),"k "); gr->Puts(mglPoint(x2,y-7*d),"None ' '",":rL"); + + d=0.25; x1=-1; x0=-0.8; y = -0.05; + gr->Mark(mglPoint(x1,5*d),"k."); gr->Puts(mglPoint(x0,y+5*d),"'.'",":rL"); + gr->Mark(mglPoint(x1,4*d),"k+"); gr->Puts(mglPoint(x0,y+4*d),"'+'",":rL"); + gr->Mark(mglPoint(x1,3*d),"kx"); gr->Puts(mglPoint(x0,y+3*d),"'x'",":rL"); + gr->Mark(mglPoint(x1,2*d),"k*"); gr->Puts(mglPoint(x0,y+2*d),"'*'",":rL"); + gr->Mark(mglPoint(x1,d),"ks"); gr->Puts(mglPoint(x0,y+d),"'s'",":rL"); + gr->Mark(mglPoint(x1,0),"kd"); gr->Puts(mglPoint(x0,y),"'d'",":rL"); + gr->Mark(mglPoint(x1,-d,0),"ko"); gr->Puts(mglPoint(x0,y-d),"'o'",":rL"); + gr->Mark(mglPoint(x1,-2*d,0),"k^"); gr->Puts(mglPoint(x0,y-2*d),"'\\^'",":rL"); + gr->Mark(mglPoint(x1,-3*d,0),"kv"); gr->Puts(mglPoint(x0,y-3*d),"'v'",":rL"); + gr->Mark(mglPoint(x1,-4*d,0),"k<"); gr->Puts(mglPoint(x0,y-4*d),"'<'",":rL"); + gr->Mark(mglPoint(x1,-5*d,0),"k>"); gr->Puts(mglPoint(x0,y-5*d),"'>'",":rL"); + + d=0.25; x1=-0.5; x0=-0.3; y = -0.05; + gr->Mark(mglPoint(x1,5*d),"k#."); gr->Puts(mglPoint(x0,y+5*d),"'\\#.'",":rL"); + gr->Mark(mglPoint(x1,4*d),"k#+"); gr->Puts(mglPoint(x0,y+4*d),"'\\#+'",":rL"); + gr->Mark(mglPoint(x1,3*d),"k#x"); gr->Puts(mglPoint(x0,y+3*d),"'\\#x'",":rL"); + gr->Mark(mglPoint(x1,2*d),"k#*"); gr->Puts(mglPoint(x0,y+2*d),"'\\#*'",":rL"); + gr->Mark(mglPoint(x1,d),"k#s"); gr->Puts(mglPoint(x0,y+d),"'\\#s'",":rL"); + gr->Mark(mglPoint(x1,0),"k#d"); gr->Puts(mglPoint(x0,y),"'\\#d'",":rL"); + gr->Mark(mglPoint(x1,-d,0),"k#o"); gr->Puts(mglPoint(x0,y-d),"'\\#o'",":rL"); + gr->Mark(mglPoint(x1,-2*d,0),"k#^"); gr->Puts(mglPoint(x0,y-2*d),"'\\#\\^'",":rL"); + gr->Mark(mglPoint(x1,-3*d,0),"k#v"); gr->Puts(mglPoint(x0,y-3*d),"'\\#v'",":rL"); + gr->Mark(mglPoint(x1,-4*d,0),"k#<"); gr->Puts(mglPoint(x0,y-4*d),"'\\#<'",":rL"); + gr->Mark(mglPoint(x1,-5*d,0),"k#>"); gr->Puts(mglPoint(x0,y-5*d),"'\\#>'",":rL"); + + gr->SubPlot(3,2,1); + double a=0.1,b=0.4,c=0.5; + gr->Line(mglPoint(a,1),mglPoint(b,1),"k-A"); gr->Puts(mglPoint(c,1),"Style 'A' or 'A\\_'",":rL"); + gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"k-V"); gr->Puts(mglPoint(c,0.8),"Style 'V' or 'V\\_'",":rL"); + gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"k-K"); gr->Puts(mglPoint(c,0.6),"Style 'K' or 'K\\_'",":rL"); + gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"k-I"); gr->Puts(mglPoint(c,0.4),"Style 'I' or 'I\\_'",":rL"); + gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"k-D"); gr->Puts(mglPoint(c,0.2),"Style 'D' or 'D\\_'",":rL"); + gr->Line(mglPoint(a,0),mglPoint(b,0),"k-S"); gr->Puts(mglPoint(c,0),"Style 'S' or 'S\\_'",":rL"); + gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"k-O"); gr->Puts(mglPoint(c,-0.2),"Style 'O' or 'O\\_'",":rL"); + gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"k-T"); gr->Puts(mglPoint(c,-0.4),"Style 'T' or 'T\\_'",":rL"); + gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-_"); gr->Puts(mglPoint(c,-0.6),"Style '\\_' or none",":rL"); + gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-AS"); gr->Puts(mglPoint(c,-0.8),"Style 'AS'",":rL"); + gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-_A"); gr->Puts(mglPoint(c,-1),"Style '\\_A'",":rL"); + + a=-1; b=-0.7; c=-0.6; + gr->Line(mglPoint(a,1),mglPoint(b,1),"kAA"); gr->Puts(mglPoint(c,1),"Style 'AA'",":rL"); + gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"kVV"); gr->Puts(mglPoint(c,0.8),"Style 'VV'",":rL"); + gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"kKK"); gr->Puts(mglPoint(c,0.6),"Style 'KK'",":rL"); + gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"kII"); gr->Puts(mglPoint(c,0.4),"Style 'II'",":rL"); + gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"kDD"); gr->Puts(mglPoint(c,0.2),"Style 'DD'",":rL"); + gr->Line(mglPoint(a,0),mglPoint(b,0),"kSS"); gr->Puts(mglPoint(c,0),"Style 'SS'",":rL"); + gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"kOO"); gr->Puts(mglPoint(c,-0.2),"Style 'OO'",":rL"); + gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"kTT"); gr->Puts(mglPoint(c,-0.4),"Style 'TT'",":rL"); + gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-__"); gr->Puts(mglPoint(c,-0.6),"Style '\\_\\_'",":rL"); + gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-VA"); gr->Puts(mglPoint(c,-0.8),"Style 'VA'",":rL"); + gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-AV"); gr->Puts(mglPoint(c,-1),"Style 'AV'",":rL"); + + gr->SubPlot(3,2,2); + //#LENUQ + gr->FaceZ(mglPoint(-1, -1), 0.4, 0.3, "L#"); gr->Puts(mglPoint(-0.8,-0.9), "L", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.6,-1), 0.4, 0.3, "E#"); gr->Puts(mglPoint(-0.4,-0.9), "E", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.2,-1), 0.4, 0.3, "N#"); gr->Puts(mglPoint(0, -0.9), "N", "w:C", -1.4); + gr->FaceZ(mglPoint(0.2, -1), 0.4, 0.3, "U#"); gr->Puts(mglPoint(0.4,-0.9), "U", "w:C", -1.4); + gr->FaceZ(mglPoint(0.6, -1), 0.4, 0.3, "Q#"); gr->Puts(mglPoint(0.8,-0.9), "Q", "w:C", -1.4); + //#lenuq + gr->FaceZ(mglPoint(-1, -0.7), 0.4, 0.3, "l#"); gr->Puts(mglPoint(-0.8,-0.6), "l", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.6,-0.7), 0.4, 0.3, "e#"); gr->Puts(mglPoint(-0.4,-0.6), "e", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.2,-0.7), 0.4, 0.3, "n#"); gr->Puts(mglPoint(0, -0.6), "n", "k:C", -1.4); + gr->FaceZ(mglPoint(0.2, -0.7), 0.4, 0.3, "u#"); gr->Puts(mglPoint(0.4,-0.6), "u", "k:C", -1.4); + gr->FaceZ(mglPoint(0.6, -0.7), 0.4, 0.3, "q#"); gr->Puts(mglPoint(0.8,-0.6), "q", "k:C", -1.4); + //#CMYkP + gr->FaceZ(mglPoint(-1, -0.4), 0.4, 0.3, "C#"); gr->Puts(mglPoint(-0.8,-0.3), "C", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.6,-0.4), 0.4, 0.3, "M#"); gr->Puts(mglPoint(-0.4,-0.3), "M", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.2,-0.4), 0.4, 0.3, "Y#"); gr->Puts(mglPoint(0, -0.3), "Y", "w:C", -1.4); + gr->FaceZ(mglPoint(0.2, -0.4), 0.4, 0.3, "k#"); gr->Puts(mglPoint(0.4,-0.3), "k", "w:C", -1.4); + gr->FaceZ(mglPoint(0.6, -0.4), 0.4, 0.3, "P#"); gr->Puts(mglPoint(0.8,-0.3), "P", "w:C", -1.4); + //#cmywp + gr->FaceZ(mglPoint(-1, -0.1), 0.4, 0.3, "c#"); gr->Puts(mglPoint(-0.8, 0), "c", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.6,-0.1), 0.4, 0.3, "m#"); gr->Puts(mglPoint(-0.4, 0), "m", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.2,-0.1), 0.4, 0.3, "y#"); gr->Puts(mglPoint(0, 0), "y", "k:C", -1.4); + gr->FaceZ(mglPoint(0.2, -0.1), 0.4, 0.3, "w#"); gr->Puts(mglPoint(0.4, 0), "w", "k:C", -1.4); + gr->FaceZ(mglPoint(0.6, -0.1), 0.4, 0.3, "p#"); gr->Puts(mglPoint(0.8, 0), "p", "k:C", -1.4); + //#BGRHW + gr->FaceZ(mglPoint(-1, 0.2), 0.4, 0.3, "B#"); gr->Puts(mglPoint(-0.8, 0.3), "B", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.6,0.2), 0.4, 0.3, "G#"); gr->Puts(mglPoint(-0.4, 0.3), "G", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.2,0.2), 0.4, 0.3, "R#"); gr->Puts(mglPoint(0, 0.3), "R", "w:C", -1.4); + gr->FaceZ(mglPoint(0.2, 0.2), 0.4, 0.3, "H#"); gr->Puts(mglPoint(0.4, 0.3), "H", "w:C", -1.4); + gr->FaceZ(mglPoint(0.6, 0.2), 0.4, 0.3, "W#"); gr->Puts(mglPoint(0.8, 0.3), "W", "w:C", -1.4); + //#bgrhw + gr->FaceZ(mglPoint(-1, 0.5), 0.4, 0.3, "b#"); gr->Puts(mglPoint(-0.8, 0.6), "b", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.6,0.5), 0.4, 0.3, "g#"); gr->Puts(mglPoint(-0.4, 0.6), "g", "k:C", -1.4); + gr->FaceZ(mglPoint(-0.2,0.5), 0.4, 0.3, "r#"); gr->Puts(mglPoint(0, 0.6), "r", "k:C", -1.4); + gr->FaceZ(mglPoint(0.2, 0.5), 0.4, 0.3, "h#"); gr->Puts(mglPoint(0.4, 0.6), "h", "k:C", -1.4); + gr->FaceZ(mglPoint(0.6, 0.5), 0.4, 0.3, "w#"); gr->Puts(mglPoint(0.8, 0.6), "w", "k:C", -1.4); + //#brighted + gr->FaceZ(mglPoint(-1, 0.8), 0.4, 0.3, "{r1}#"); gr->Puts(mglPoint(-0.8, 0.9), "\\{r1\\}", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.6,0.8), 0.4, 0.3, "{r3}#"); gr->Puts(mglPoint(-0.4, 0.9), "\\{r3\\}", "w:C", -1.4); + gr->FaceZ(mglPoint(-0.2,0.8), 0.4, 0.3, "{r5}#"); gr->Puts(mglPoint(0, 0.9), "\\{r5\\}", "k:C", -1.4); + gr->FaceZ(mglPoint(0.2, 0.8), 0.4, 0.3, "{r7}#"); gr->Puts(mglPoint(0.4, 0.9), "\\{r7\\}", "k:C", -1.4); + gr->FaceZ(mglPoint(0.6, 0.8), 0.4, 0.3, "{r9}#"); gr->Puts(mglPoint(0.8, 0.9), "\\{r9\\}", "k:C", -1.4); + // HEX + gr->FaceZ(mglPoint(-1, -1.3), 1, 0.3, "{xff9966}#"); gr->Puts(mglPoint(-0.5,-1.2), "\\{xff9966\\}", "k:C", -1.4); + gr->FaceZ(mglPoint(0, -1.3), 1, 0.3, "{x83CAFF}#"); gr->Puts(mglPoint( 0.5,-1.2), "\\{x83CAFF\\}", "k:C", -1.4); + + gr->SubPlot(3,2,3); + char stl[3]="r1", txt[4]="'1'"; + for(int i=0;i<10;i++) + { + txt[1]=stl[1]='0'+i; + gr->Line(mglPoint(-1,0.2*i-1),mglPoint(1,0.2*i-1),stl); + gr->Puts(mglPoint(1.05,0.2*i-1),txt,":L"); + } + + gr->SubPlot(3,2,4); gr->Title("TriPlot sample"); gr->Rotate(50,60); + double t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3}; + double xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1}; + mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt); + gr->TriPlot(tt,uu,vv,ww,"b"); + gr->TriPlot(tt,uu,vv,ww,"k#"); + + gr->SubPlot(3,2,5); + mglData r(4); r.Fill(1,4); + gr->SetRanges(1,4,1,4); gr->Axis(); + gr->Mark(r,r,"s"); + gr->Plot(r,"b"); + + gr->WriteJPEG("fexport.jpg"); +// gr->WritePNG("fexport.png"); + gr->WriteBMP("fexport.bmp"); + gr->WriteTGA("fexport.tga"); + gr->WriteEPS("fexport.eps"); + gr->WriteSVG("fexport.svg"); + gr->WriteGIF("fexport.gif"); + + gr->WriteXYZ("fexport.xyz"); + gr->WriteSTL("fexport.stl"); + gr->WriteOFF("fexport.off"); + gr->WriteTEX("fexport.tex"); + gr->WriteOBJ("fexport.obj"); + gr->WritePRC("fexport.prc"); + gr->WriteJSON("fexport.json"); + + gr->ExportMGLD("fexport.mgld"); + gr->Clf(); + gr->ImportMGLD("fexport.mgld"); +} +//----------------------------------------------------------------------------- int main(int argc,char **argv) { + mgl_suppress_warn(true); const char *suf = ""; char name[256]="", *tmp; int ch; @@ -298,6 +418,7 @@ int main(int argc,char **argv) mgl_set_test_mode(true); test(gr); time(&en); printf("time is %g sec\n",difftime(en,st)); gr->WritePNG("test.png","",false); + gr->WriteSVG("test.svg"); gr->WriteEPS("test.eps"); printf("Messages:%s\n",gr->Message()); printf("Global:%s\n",mglGlobalMess.c_str()); @@ -306,6 +427,8 @@ int main(int argc,char **argv) else if(dotest==2) { mgl_create_cpp_font(gr->Self(), L"!-~,¡-ÿ,̀-̏,Α-ω,ϑ,ϕ,ϖ,ϰ,ϱ,ϵ,А-я,ℏ,ℑ,ℓ,ℜ,←-↙,∀-∯,≠-≯,⟂"); delete gr; return 0; } + else if(dotest==4) + { smgl_fexport(gr); delete gr; return 0; } else if(dotest==3) { int qual[7]={0,1,2,4,5,6,8}; diff --git a/examples/glut_example.cpp b/examples/glut_example.cpp index 4018362..077c480 100644 --- a/examples/glut_example.cpp +++ b/examples/glut_example.cpp @@ -78,15 +78,14 @@ int main(int argc,char **argv) char key = 0; if(argc>1) key = argv[1][0]!='-' ? argv[1][0] : argv[1][1]; else printf("You may specify argument '1', '2', '3' or 'd' for viewing examples of 1d, 2d, 3d or dual plotting\n"); - mglGLUT *gr; switch(key) { - case '1': gr = new mglGLUT(sample_1, "1D plots"); break; - case '2': gr = new mglGLUT(sample_2, "2D plots"); break; - case '3': gr = new mglGLUT(sample_3, "3D plots"); break; - case 'd': gr = new mglGLUT(sample_d, "Dual plots"); break; - case 't': gr = new mglGLUT(test_wnd, "Testing"); break; - default: gr = new mglGLUT(sample, "Example of molecules"); break; + case '1': new mglGLUT(sample_1, "1D plots"); break; + case '2': new mglGLUT(sample_2, "2D plots"); break; + case '3': new mglGLUT(sample_3, "3D plots"); break; + case 'd': new mglGLUT(sample_d, "Dual plots"); break; + case 't': new mglGLUT(test_wnd, "Testing"); break; + default: new mglGLUT(sample, "Example of molecules"); break; } return 0; } diff --git a/examples/mpi_test.cpp b/examples/mpi_test.cpp index 7d32780..74865f7 100644 --- a/examples/mpi_test.cpp +++ b/examples/mpi_test.cpp @@ -1,7 +1,6 @@ #include #include #include -#define MCW MPI_COMM_WORLD int main(int argc, char *argv[]) { diff --git a/examples/qt_example.cpp b/examples/qt_example.cpp index 54cfbcf..58a7f9c 100644 --- a/examples/qt_example.cpp +++ b/examples/qt_example.cpp @@ -109,6 +109,7 @@ int main(int argc,char **argv) else printf("You may specify argument '1', '2', '3' or 'd' for viewing examples of 1d, 2d, 3d or dual plotting\n"); switch(key) { + case '0': gr = new mglQT((mglDraw *)NULL,"1D plots"); break; case '1': gr = new mglQT(sample_1,"1D plots"); break; case '2': gr = new mglQT(sample_2,"2D plots"); break; case '3': gr = new mglQT(sample_3,"3D plots"); break; @@ -116,6 +117,8 @@ int main(int argc,char **argv) case 't': gr = new mglQT(test_wnd,"Testing"); break; default: gr = new mglQT(sample,"Drop and waves"); break; } + if(key=='0') + { gr->Rotate(40,60); gr->Box(); gr->Light(true); gr->FSurf("sin(4*pi*x*y)"); gr->Update(); } gr->Run(); return 0; } #endif diff --git a/examples/samples.cpp b/examples/samples.cpp index e3f4048..c3a939b 100644 --- a/examples/samples.cpp +++ b/examples/samples.cpp @@ -54,176 +54,97 @@ define $1 pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5)\n\ define $2 pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5)\n\ new ex 10 10 10 '0.2*x/$1-0.2*x/$2'\n\ new ey 10 10 10 '0.2*y/$1-0.2*y/$2'\n\ -new ez 10 10 10 '0.2*(z-0.3)/$1-0.2*(z+0.3)/$2'\nreturn\n"; +new ez 10 10 10 '0.2*(z-0.3)/$1-0.2*(z+0.3)/$2'\nreturn"; //----------------------------------------------------------------------------- // Sample functions (v.2.*) //----------------------------------------------------------------------------- -const char *mmgl_fexport=""; -#define splot1(b) {(b).Norm(-1,1,true);gr->Rotate(70,60);gr->Box();gr->Surf3(b);} -void smgl_fexport(mglGraph *gr) // test file export -{ - gr->SubPlot(3,2,0); - double d,x1,x2,x0,y=0.95; - d=0.3, x0=0.2, x1=0.5, x2=0.6; - gr->Line(mglPoint(x0,1-0*d),mglPoint(x1,1-0*d),"k-"); gr->Puts(mglPoint(x2,y-0*d),"Solid '-'",":rL"); - gr->Line(mglPoint(x0,1-1*d),mglPoint(x1,1-1*d),"k|"); gr->Puts(mglPoint(x2,y-1*d),"Long Dash '|'",":rL"); - gr->Line(mglPoint(x0,1-2*d),mglPoint(x1,1-2*d),"k;"); gr->Puts(mglPoint(x2,y-2*d),"Dash ';'",":rL"); - gr->Line(mglPoint(x0,1-3*d),mglPoint(x1,1-3*d),"k="); gr->Puts(mglPoint(x2,y-3*d),"Small dash '='",":rL"); - gr->Line(mglPoint(x0,1-4*d),mglPoint(x1,1-4*d),"kj"); gr->Puts(mglPoint(x2,y-4*d),"Dash-dot 'j'",":rL"); - gr->Line(mglPoint(x0,1-5*d),mglPoint(x1,1-5*d),"ki"); gr->Puts(mglPoint(x2,y-5*d),"Small dash-dot 'i'",":rL"); - gr->Line(mglPoint(x0,1-6*d),mglPoint(x1,1-6*d),"k:"); gr->Puts(mglPoint(x2,y-6*d),"Dots ':'",":rL"); - gr->Line(mglPoint(x0,1-7*d),mglPoint(x1,1-7*d),"k "); gr->Puts(mglPoint(x2,y-7*d),"None ' '",":rL"); - - d=0.25; x1=-1; x0=-0.8; y = -0.05; - gr->Mark(mglPoint(x1,5*d),"k."); gr->Puts(mglPoint(x0,y+5*d),"'.'",":rL"); - gr->Mark(mglPoint(x1,4*d),"k+"); gr->Puts(mglPoint(x0,y+4*d),"'+'",":rL"); - gr->Mark(mglPoint(x1,3*d),"kx"); gr->Puts(mglPoint(x0,y+3*d),"'x'",":rL"); - gr->Mark(mglPoint(x1,2*d),"k*"); gr->Puts(mglPoint(x0,y+2*d),"'*'",":rL"); - gr->Mark(mglPoint(x1,d),"ks"); gr->Puts(mglPoint(x0,y+d),"'s'",":rL"); - gr->Mark(mglPoint(x1,0),"kd"); gr->Puts(mglPoint(x0,y),"'d'",":rL"); - gr->Mark(mglPoint(x1,-d,0),"ko"); gr->Puts(mglPoint(x0,y-d),"'o'",":rL"); - gr->Mark(mglPoint(x1,-2*d,0),"k^"); gr->Puts(mglPoint(x0,y-2*d),"'\\^'",":rL"); - gr->Mark(mglPoint(x1,-3*d,0),"kv"); gr->Puts(mglPoint(x0,y-3*d),"'v'",":rL"); - gr->Mark(mglPoint(x1,-4*d,0),"k<"); gr->Puts(mglPoint(x0,y-4*d),"'<'",":rL"); - gr->Mark(mglPoint(x1,-5*d,0),"k>"); gr->Puts(mglPoint(x0,y-5*d),"'>'",":rL"); - - d=0.25; x1=-0.5; x0=-0.3; y = -0.05; - gr->Mark(mglPoint(x1,5*d),"k#."); gr->Puts(mglPoint(x0,y+5*d),"'\\#.'",":rL"); - gr->Mark(mglPoint(x1,4*d),"k#+"); gr->Puts(mglPoint(x0,y+4*d),"'\\#+'",":rL"); - gr->Mark(mglPoint(x1,3*d),"k#x"); gr->Puts(mglPoint(x0,y+3*d),"'\\#x'",":rL"); - gr->Mark(mglPoint(x1,2*d),"k#*"); gr->Puts(mglPoint(x0,y+2*d),"'\\#*'",":rL"); - gr->Mark(mglPoint(x1,d),"k#s"); gr->Puts(mglPoint(x0,y+d),"'\\#s'",":rL"); - gr->Mark(mglPoint(x1,0),"k#d"); gr->Puts(mglPoint(x0,y),"'\\#d'",":rL"); - gr->Mark(mglPoint(x1,-d,0),"k#o"); gr->Puts(mglPoint(x0,y-d),"'\\#o'",":rL"); - gr->Mark(mglPoint(x1,-2*d,0),"k#^"); gr->Puts(mglPoint(x0,y-2*d),"'\\#\\^'",":rL"); - gr->Mark(mglPoint(x1,-3*d,0),"k#v"); gr->Puts(mglPoint(x0,y-3*d),"'\\#v'",":rL"); - gr->Mark(mglPoint(x1,-4*d,0),"k#<"); gr->Puts(mglPoint(x0,y-4*d),"'\\#<'",":rL"); - gr->Mark(mglPoint(x1,-5*d,0),"k#>"); gr->Puts(mglPoint(x0,y-5*d),"'\\#>'",":rL"); - - gr->SubPlot(3,2,1); - double a=0.1,b=0.4,c=0.5; - gr->Line(mglPoint(a,1),mglPoint(b,1),"k-A"); gr->Puts(mglPoint(c,1),"Style 'A' or 'A\\_'",":rL"); - gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"k-V"); gr->Puts(mglPoint(c,0.8),"Style 'V' or 'V\\_'",":rL"); - gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"k-K"); gr->Puts(mglPoint(c,0.6),"Style 'K' or 'K\\_'",":rL"); - gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"k-I"); gr->Puts(mglPoint(c,0.4),"Style 'I' or 'I\\_'",":rL"); - gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"k-D"); gr->Puts(mglPoint(c,0.2),"Style 'D' or 'D\\_'",":rL"); - gr->Line(mglPoint(a,0),mglPoint(b,0),"k-S"); gr->Puts(mglPoint(c,0),"Style 'S' or 'S\\_'",":rL"); - gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"k-O"); gr->Puts(mglPoint(c,-0.2),"Style 'O' or 'O\\_'",":rL"); - gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"k-T"); gr->Puts(mglPoint(c,-0.4),"Style 'T' or 'T\\_'",":rL"); - gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-_"); gr->Puts(mglPoint(c,-0.6),"Style '\\_' or none",":rL"); - gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-AS"); gr->Puts(mglPoint(c,-0.8),"Style 'AS'",":rL"); - gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-_A"); gr->Puts(mglPoint(c,-1),"Style '\\_A'",":rL"); - - a=-1; b=-0.7; c=-0.6; - gr->Line(mglPoint(a,1),mglPoint(b,1),"kAA"); gr->Puts(mglPoint(c,1),"Style 'AA'",":rL"); - gr->Line(mglPoint(a,0.8),mglPoint(b,0.8),"kVV"); gr->Puts(mglPoint(c,0.8),"Style 'VV'",":rL"); - gr->Line(mglPoint(a,0.6),mglPoint(b,0.6),"kKK"); gr->Puts(mglPoint(c,0.6),"Style 'KK'",":rL"); - gr->Line(mglPoint(a,0.4),mglPoint(b,0.4),"kII"); gr->Puts(mglPoint(c,0.4),"Style 'II'",":rL"); - gr->Line(mglPoint(a,0.2),mglPoint(b,0.2),"kDD"); gr->Puts(mglPoint(c,0.2),"Style 'DD'",":rL"); - gr->Line(mglPoint(a,0),mglPoint(b,0),"kSS"); gr->Puts(mglPoint(c,0),"Style 'SS'",":rL"); - gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"kOO"); gr->Puts(mglPoint(c,-0.2),"Style 'OO'",":rL"); - gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"kTT"); gr->Puts(mglPoint(c,-0.4),"Style 'TT'",":rL"); - gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-__"); gr->Puts(mglPoint(c,-0.6),"Style '\\_\\_'",":rL"); - gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-VA"); gr->Puts(mglPoint(c,-0.8),"Style 'VA'",":rL"); - gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-AV"); gr->Puts(mglPoint(c,-1),"Style 'AV'",":rL"); - - gr->SubPlot(3,2,2); - //#LENUQ - gr->FaceZ(mglPoint(-1, -1), 0.4, 0.3, "L#"); gr->Puts(mglPoint(-0.8,-0.9), "L", "w:C", -1.4); - gr->FaceZ(mglPoint(-0.6,-1), 0.4, 0.3, "E#"); gr->Puts(mglPoint(-0.4,-0.9), "E", "w:C", -1.4); - gr->FaceZ(mglPoint(-0.2,-1), 0.4, 0.3, "N#"); gr->Puts(mglPoint(0, -0.9), "N", "w:C", -1.4); - gr->FaceZ(mglPoint(0.2, -1), 0.4, 0.3, "U#"); gr->Puts(mglPoint(0.4,-0.9), "U", "w:C", -1.4); - gr->FaceZ(mglPoint(0.6, -1), 0.4, 0.3, "Q#"); gr->Puts(mglPoint(0.8,-0.9), "Q", "w:C", -1.4); - //#lenuq - gr->FaceZ(mglPoint(-1, -0.7), 0.4, 0.3, "l#"); gr->Puts(mglPoint(-0.8,-0.6), "l", "k:C", -1.4); - gr->FaceZ(mglPoint(-0.6,-0.7), 0.4, 0.3, "e#"); gr->Puts(mglPoint(-0.4,-0.6), "e", "k:C", -1.4); - gr->FaceZ(mglPoint(-0.2,-0.7), 0.4, 0.3, "n#"); gr->Puts(mglPoint(0, -0.6), "n", "k:C", -1.4); - gr->FaceZ(mglPoint(0.2, -0.7), 0.4, 0.3, "u#"); gr->Puts(mglPoint(0.4,-0.6), "u", "k:C", -1.4); - gr->FaceZ(mglPoint(0.6, -0.7), 0.4, 0.3, "q#"); gr->Puts(mglPoint(0.8,-0.6), "q", "k:C", -1.4); - //#CMYkP - gr->FaceZ(mglPoint(-1, -0.4), 0.4, 0.3, "C#"); gr->Puts(mglPoint(-0.8,-0.3), "C", "w:C", -1.4); - gr->FaceZ(mglPoint(-0.6,-0.4), 0.4, 0.3, "M#"); gr->Puts(mglPoint(-0.4,-0.3), "M", "w:C", -1.4); - gr->FaceZ(mglPoint(-0.2,-0.4), 0.4, 0.3, "Y#"); gr->Puts(mglPoint(0, -0.3), "Y", "w:C", -1.4); - gr->FaceZ(mglPoint(0.2, -0.4), 0.4, 0.3, "k#"); gr->Puts(mglPoint(0.4,-0.3), "k", "w:C", -1.4); - gr->FaceZ(mglPoint(0.6, -0.4), 0.4, 0.3, "P#"); gr->Puts(mglPoint(0.8,-0.3), "P", "w:C", -1.4); - //#cmywp - gr->FaceZ(mglPoint(-1, -0.1), 0.4, 0.3, "c#"); gr->Puts(mglPoint(-0.8, 0), "c", "k:C", -1.4); - gr->FaceZ(mglPoint(-0.6,-0.1), 0.4, 0.3, "m#"); gr->Puts(mglPoint(-0.4, 0), "m", "k:C", -1.4); - gr->FaceZ(mglPoint(-0.2,-0.1), 0.4, 0.3, "y#"); gr->Puts(mglPoint(0, 0), "y", "k:C", -1.4); - gr->FaceZ(mglPoint(0.2, -0.1), 0.4, 0.3, "w#"); gr->Puts(mglPoint(0.4, 0), "w", "k:C", -1.4); - gr->FaceZ(mglPoint(0.6, -0.1), 0.4, 0.3, "p#"); gr->Puts(mglPoint(0.8, 0), "p", "k:C", -1.4); - //#BGRHW - gr->FaceZ(mglPoint(-1, 0.2), 0.4, 0.3, "B#"); gr->Puts(mglPoint(-0.8, 0.3), "B", "w:C", -1.4); - gr->FaceZ(mglPoint(-0.6,0.2), 0.4, 0.3, "G#"); gr->Puts(mglPoint(-0.4, 0.3), "G", "w:C", -1.4); - gr->FaceZ(mglPoint(-0.2,0.2), 0.4, 0.3, "R#"); gr->Puts(mglPoint(0, 0.3), "R", "w:C", -1.4); - gr->FaceZ(mglPoint(0.2, 0.2), 0.4, 0.3, "H#"); gr->Puts(mglPoint(0.4, 0.3), "H", "w:C", -1.4); - gr->FaceZ(mglPoint(0.6, 0.2), 0.4, 0.3, "W#"); gr->Puts(mglPoint(0.8, 0.3), "W", "w:C", -1.4); - //#bgrhw - gr->FaceZ(mglPoint(-1, 0.5), 0.4, 0.3, "b#"); gr->Puts(mglPoint(-0.8, 0.6), "b", "k:C", -1.4); - gr->FaceZ(mglPoint(-0.6,0.5), 0.4, 0.3, "g#"); gr->Puts(mglPoint(-0.4, 0.6), "g", "k:C", -1.4); - gr->FaceZ(mglPoint(-0.2,0.5), 0.4, 0.3, "r#"); gr->Puts(mglPoint(0, 0.6), "r", "k:C", -1.4); - gr->FaceZ(mglPoint(0.2, 0.5), 0.4, 0.3, "h#"); gr->Puts(mglPoint(0.4, 0.6), "h", "k:C", -1.4); - gr->FaceZ(mglPoint(0.6, 0.5), 0.4, 0.3, "w#"); gr->Puts(mglPoint(0.8, 0.6), "w", "k:C", -1.4); - //#brighted - gr->FaceZ(mglPoint(-1, 0.8), 0.4, 0.3, "{r1}#"); gr->Puts(mglPoint(-0.8, 0.9), "\\{r1\\}", "w:C", -1.4); - gr->FaceZ(mglPoint(-0.6,0.8), 0.4, 0.3, "{r3}#"); gr->Puts(mglPoint(-0.4, 0.9), "\\{r3\\}", "w:C", -1.4); - gr->FaceZ(mglPoint(-0.2,0.8), 0.4, 0.3, "{r5}#"); gr->Puts(mglPoint(0, 0.9), "\\{r5\\}", "k:C", -1.4); - gr->FaceZ(mglPoint(0.2, 0.8), 0.4, 0.3, "{r7}#"); gr->Puts(mglPoint(0.4, 0.9), "\\{r7\\}", "k:C", -1.4); - gr->FaceZ(mglPoint(0.6, 0.8), 0.4, 0.3, "{r9}#"); gr->Puts(mglPoint(0.8, 0.9), "\\{r9\\}", "k:C", -1.4); - // HEX - gr->FaceZ(mglPoint(-1, -1.3), 1, 0.3, "{xff9966}#"); gr->Puts(mglPoint(-0.5,-1.2), "\\{xff9966\\}", "k:C", -1.4); - gr->FaceZ(mglPoint(0, -1.3), 1, 0.3, "{x83CAFF}#"); gr->Puts(mglPoint( 0.5,-1.2), "\\{x83CAFF\\}", "k:C", -1.4); - - gr->SubPlot(3,2,3); - char stl[3]="r1", txt[4]="'1'"; - for(int i=0;i<10;i++) - { - txt[1]=stl[1]='0'+i; - gr->Line(mglPoint(-1,0.2*i-1),mglPoint(1,0.2*i-1),stl); - gr->Puts(mglPoint(1.05,0.2*i-1),txt,":L"); - } - - gr->SubPlot(3,2,4); gr->Title("TriPlot sample"); gr->Rotate(50,60); - double t[] = {0,1,2, 0,1,3, 0,2,3, 1,2,3}; - double xt[] = {-1,1,0,0}, yt[] = {-1,-1,1,0}, zt[] = {-1,-1,-1,1}; - mglData tt(4,3,t), uu(4,xt), vv(4,yt), ww(4,zt); - gr->TriPlot(tt,uu,vv,ww,"b"); - gr->TriPlot(tt,uu,vv,ww,"k#"); - - gr->SubPlot(3,2,5); - mglData r(4); r.Fill(1,4); - gr->SetRanges(1,4,1,4); gr->Axis(); - gr->Mark(r,r,"s"); - gr->Plot(r,"b"); - - gr->WriteJPEG("fexport.jpg"); - gr->WritePNG("fexport.png"); - gr->WriteBMP("fexport.bmp"); - gr->WriteTGA("fexport.tga"); - gr->WriteEPS("fexport.eps"); - gr->WriteSVG("fexport.svg"); - gr->WriteGIF("fexport.gif"); - - gr->WriteXYZ("fexport.xyz"); - gr->WriteSTL("fexport.stl"); - gr->WriteOFF("fexport.off"); - gr->WriteTEX("fexport.tex"); - gr->WriteOBJ("fexport.obj"); - gr->WritePRC("fexport.prc"); -} -//----------------------------------------------------------------------------- -const char *mmgl_refill="new x 10 '0.5+rnd':cumsum x 'x':norm x -1 1\n" -"copy y sin(pi*x)/2\nsubplot 1 1 0 '<_':title 'Refill sample'\nbox:axis:plot x y 'o '\n" -"new r 100:refill r x y\nplot r 'r'\nfplot 'sin(pi*x)/2' 'B:'"; +const char *mmgl_refill="new x 10 '0.5+rnd':cumsum x 'x':norm x -1 1\ncopy y sin(pi*x)/1.5\n" +"subplot 2 2 0 '<_':title 'Refill sample'\nbox:axis:plot x y 'o ':fplot 'sin(pi*x)/1.5' 'B:'\n" +"new r 100:refill r x y:plot r 'r'\n\n" +"subplot 2 2 1 '<_':title 'Global spline'\nbox:axis:plot x y 'o ':fplot 'sin(pi*x)/1.5' 'B:'\n" +"new r 100:gspline r x y:plot r 'r'\n\nnew y 10 '0.5+rnd':cumsum y 'x':norm y -1 1\n" +"copy xx x:extend xx 10\ncopy yy y:extend yy 10:transpose yy\ncopy z sin(pi*xx*yy)/1.5\n" +"alpha on:light on\n" +"subplot 2 2 2:title '2d regular':rotate 40 60\nbox:axis:mesh xx yy z 'k'\n" +"new rr 100 100:refill rr x y z:surf rr\n\n" +"new xx 10 10 '(x+1)/2*cos(y*pi/2-1)':new yy 10 10 '(x+1)/2*sin(y*pi/2-1)'\ncopy z sin(pi*xx*yy)/1.5\n" +"subplot 2 2 3:title '2d non-regular':rotate 40 60\nbox:axis:plot xx yy z 'ko '\n" +"new rr 100 100:refill rr xx yy z:surf rr"; void smgl_refill(mglGraph *gr) { mglData x(10), y(10), r(100); x.Modify("0.5+rnd"); x.CumSum("x"); x.Norm(-1,1); - y.Modify("sin(pi*v)/2",x); - if(big!=3) { gr->SubPlot(1,1,0,"<_"); gr->Title("Refill sample"); } + y.Modify("sin(pi*v)/1.5",x); + if(big!=3) { gr->SubPlot(2,2,0,"<_"); gr->Title("Refill sample"); } gr->Axis(); gr->Box(); gr->Plot(x,y,"o "); gr->Refill(r,x,y); // or you can use r.Refill(x,y,-1,1); - gr->Plot(r,"r"); gr->FPlot("sin(pi*x)/2","B:"); + gr->Plot(r,"r"); gr->FPlot("sin(pi*x)/1.5","B:"); + if(big==3) return; + gr->SubPlot(2,2,1,"<_"); gr->Title("Global spline"); + gr->Axis(); gr->Box(); gr->Plot(x,y,"o "); + r.RefillGS(x,y,-1,1); gr->Plot(r,"r"); + gr->FPlot("sin(pi*x)/1.5","B:"); + + gr->Alpha(true); gr->Light(true); + mglData z(10,10), xx(10,10), yy(10,10), rr(100,100); + y.Modify("0.5+rnd"); y.CumSum("x"); y.Norm(-1,1); + for(int i=0;i<10;i++) for(int j=0;j<10;j++) + z.a[i+10*j] = sin(M_PI*x.a[i]*y.a[j])/1.5; + gr->SubPlot(2,2,2); gr->Title("2d regular"); gr->Rotate(40,60); + gr->Axis(); gr->Box(); gr->Mesh(x,y,z,"k"); + gr->Refill(rr,x,y,z); gr->Surf(rr); + + gr->Fill(xx,"(x+1)/2*cos(y*pi/2-1)"); + gr->Fill(yy,"(x+1)/2*sin(y*pi/2-1)"); + for(int i=0;i<10*10;i++) + z.a[i] = sin(M_PI*xx.a[i]*yy.a[i])/1.5; + gr->SubPlot(2,2,3); gr->Title("2d non-regular"); gr->Rotate(40,60); + gr->Axis(); gr->Box(); gr->Plot(xx,yy,z,"ko "); + gr->Refill(rr,xx,yy,z); gr->Surf(rr); +} +//----------------------------------------------------------------------------- +const char *mmgl_indirect="subplot 1 1 0 '':title 'SubData vs Evaluate'\n" +"new in 9 'x^3/1.1':plot in 'ko ':box\nnew arg 99 '4*x+4'\n" +"evaluate e in arg:plot e 'b.'; legend 'Evaluate'\n" +"subdata s in arg:plot s 'r.';legend 'SubData'\nlegend 2"; +void smgl_indirect(mglGraph *gr) +{ + gr->SubPlot(1,1,0,""); gr->Title("SubData vs Evaluate"); + mglData in(9), arg(99), e, s; + gr->Fill(in,"x^3/1.1"); gr->Fill(arg,"4*x+4"); + gr->Plot(in,"ko "); gr->Box(); + e = in.Evaluate(arg); gr->Plot(e,"b.","legend 'Evaluate'"); + s = in.SubData(arg); gr->Plot(s,"r.","legend 'SubData'"); + gr->Legend(2); +} +//----------------------------------------------------------------------------- +const char *mmgl_ode="subplot 2 2 0 '<_':title 'Cont':box\naxis:xlabel 'x':ylabel '\\dot{x}'\n" +"new f 100 100 'y^2+2*x^3-x^2-0.5':cont f\n\n" +"subplot 2 2 1 '<_':title 'Flow':box\naxis:xlabel 'x':ylabel '\\dot{x}'\n" +"new fx 100 100 'x-3*x^2'\nnew fy 100 100 'y'\nflow fy fx 'v';value 7\n\n" +"subplot 2 2 2 '<_':title 'ODE':box\naxis:xlabel 'x':ylabel '\\dot{x}'\n" +"for $x -1 1 0.1\n ode r 'y;x-3*x^2' 'xy' [$x,0]\n plot r(0) r(1)\n" +" ode r '-y;-x+3*x^2' 'xy' [$x,0]\n plot r(0) r(1)\nnext"; +void smgl_ode(mglGraph *gr) +{ + gr->SubPlot(2,2,0,"<_"); gr->Title("Cont"); gr->Box(); + gr->Axis(); gr->Label('x',"x"); gr->Label('y',"\\dot{x}"); + mglData f(100,100); gr->Fill(f,"y^2+2*x^3-x^2-0.5"); + gr->Cont(f); + gr->SubPlot(2,2,1,"<_"); gr->Title("Flow"); gr->Box(); + gr->Axis(); gr->Label('x',"x"); gr->Label('y',"\\dot{x}"); + mglData fx(100,100), fy(100,100); gr->Fill(fx,"x-3*x^2"); gr->Fill(fy,"y"); + gr->Flow(fy,fx,"v","value 7"); + gr->SubPlot(2,2,2,"<_"); gr->Title("ODE"); gr->Box(); + gr->Axis(); gr->Label('x',"x"); gr->Label('y',"\\dot{x}"); + for(double x=-1;x<1;x+=0.1) + { + mglData in(2), r; in.a[0]=x; + r = mglODE("y;x-3*x^2","xy",in); + gr->Plot(r.SubData(0), r.SubData(1)); + r = mglODE("-y;-x+3*x^2","xy",in); + gr->Plot(r.SubData(0), r.SubData(1)); + } } //----------------------------------------------------------------------------- const char *mmgl_correl="new a 100 'exp(-10*x^2)'\n" @@ -232,7 +153,7 @@ const char *mmgl_correl="new a 100 'exp(-10*x^2)'\n" "plot a:plot b:box:axis\n" "correl r a b 'x'\nnorm r 0 1:swap r 'x' # make it human readable\n" "subplot 1 2 1 '_':title 'Correlation of a and b'\n" -"plot r 'r':axis:box\nline 0.5 0 0.5 1 'B|'\n"; +"plot r 'r':axis:box\nline 0.5 0 0.5 1 'B|'"; void smgl_correl(mglGraph *gr) { mglData a(100),b(100); @@ -268,7 +189,7 @@ const char *mmgl_mask="new a 10 10 'x'\n" "subplot 5 4 17 '':title '\"*\" mask':dens a '3*'\n" "subplot 5 4 18 '':title '\"^\" mask':dens a '3^'\n" "subplot 5 4 19 '':title 'manual mask'\n" -"mask '+' 'ff00182424f80000':dens a '3+'"; +"mask '+' 'ff00182424f800':dens a '3+'"; void smgl_mask(mglGraph *gr) { mglData a(10,10); a.Fill(-1,1); @@ -328,27 +249,28 @@ const char *mmgl_data1="new a 40 50 60 'exp(-x^2-4*y^2-16*z^2)'\n" "mirror b 'z':subplot 5 3 14:call 'splot'\n" "stop\nfunc splot 0\n" "title 'max=',b.max:norm b -1 1 on:rotate 70 60:box:surf3 b\n" -"return\n"; -#define splot1(b) {(b).Norm(-1,1,true);gr->Rotate(70,60);gr->Box();gr->Surf3(b);} +"return"; +inline void splot1(mglGraph *gr, mglData &b) +{b.Norm(-1,1,true);gr->Rotate(70,60);gr->Box();gr->Surf3(b);} void smgl_data1(mglGraph *gr) // basic data operations { mglData a(40,50,60),b; gr->Fill(a,"exp(-x^2-4*y^2-16*z^2)"); gr->Light(true); gr->Alpha(true); - b.Set(a); b.Diff("x"); gr->SubPlot(5,3,0); splot1(b); - b.Set(a); b.Diff2("x"); gr->SubPlot(5,3,1); splot1(b); - b.Set(a); b.CumSum("x"); gr->SubPlot(5,3,2); splot1(b); - b.Set(a); b.Integral("x");gr->SubPlot(5,3,3); splot1(b); - b.Mirror("x"); gr->SubPlot(5,3,4); splot1(b); - b.Set(a); b.Diff("y"); gr->SubPlot(5,3,5); splot1(b); - b.Set(a); b.Diff2("y"); gr->SubPlot(5,3,6); splot1(b); - b.Set(a); b.CumSum("y"); gr->SubPlot(5,3,7); splot1(b); - b.Set(a); b.Integral("y");gr->SubPlot(5,3,8); splot1(b); - b.Mirror("y"); gr->SubPlot(5,3,9); splot1(b); - b.Set(a); b.Diff("z"); gr->SubPlot(5,3,10);splot1(b); - b.Set(a); b.Diff2("z"); gr->SubPlot(5,3,11);splot1(b); - b.Set(a); b.CumSum("z"); gr->SubPlot(5,3,12);splot1(b); - b.Set(a); b.Integral("z");gr->SubPlot(5,3,13);splot1(b); - b.Mirror("z"); gr->SubPlot(5,3,14);splot1(b); + b.Set(a); b.Diff("x"); gr->SubPlot(5,3,0); splot1(gr,b); + b.Set(a); b.Diff2("x"); gr->SubPlot(5,3,1); splot1(gr,b); + b.Set(a); b.CumSum("x"); gr->SubPlot(5,3,2); splot1(gr,b); + b.Set(a); b.Integral("x");gr->SubPlot(5,3,3); splot1(gr,b); + b.Mirror("x"); gr->SubPlot(5,3,4); splot1(gr,b); + b.Set(a); b.Diff("y"); gr->SubPlot(5,3,5); splot1(gr,b); + b.Set(a); b.Diff2("y"); gr->SubPlot(5,3,6); splot1(gr,b); + b.Set(a); b.CumSum("y"); gr->SubPlot(5,3,7); splot1(gr,b); + b.Set(a); b.Integral("y");gr->SubPlot(5,3,8); splot1(gr,b); + b.Mirror("y"); gr->SubPlot(5,3,9); splot1(gr,b); + b.Set(a); b.Diff("z"); gr->SubPlot(5,3,10);splot1(gr,b); + b.Set(a); b.Diff2("z"); gr->SubPlot(5,3,11);splot1(gr,b); + b.Set(a); b.CumSum("z"); gr->SubPlot(5,3,12);splot1(gr,b); + b.Set(a); b.Integral("z");gr->SubPlot(5,3,13);splot1(gr,b); + b.Mirror("z"); gr->SubPlot(5,3,14);splot1(gr,b); } //----------------------------------------------------------------------------- const char *mmgl_data2="new a 40 50 60 'exp(-x^2-4*y^2-16*z^2)'\n" @@ -370,27 +292,28 @@ const char *mmgl_data2="new a 40 50 60 'exp(-x^2-4*y^2-16*z^2)'\n" "copy b a:smooth b 'z':subplot 5 3 14:call 'splot'\n" "stop\nfunc splot 0\n" "title 'max=',b.max:norm b -1 1 on:rotate 70 60:box\n" -"surf3 b 0.5:surf3 b -0.5\nreturn\n"; -#define splot2(b) {(b).Norm(-1,1,true);gr->Rotate(70,60);gr->Box();gr->Surf3(0.5,b);gr->Surf3(-0.5,b);} +"surf3 b 0.5:surf3 b -0.5\nreturn"; +inline void splot2(mglGraph *gr, mglData &b) +{b.Norm(-1,1,true);gr->Rotate(70,60);gr->Box();gr->Surf3(0.5,b);gr->Surf3(-0.5,b);} void smgl_data2(mglGraph *gr) // data transforms { mglData a(40,50,60),b; gr->Fill(a,"exp(-x^2-4*y^2-16*z^2)"); gr->Light(true); gr->Alpha(true); - b.Set(a); b.SinFFT("x"); gr->SubPlot(5,3,0); splot2(b); - b.Set(a); b.CosFFT("x"); gr->SubPlot(5,3,1); splot2(b); - b.Set(a); b.Hankel("x"); gr->SubPlot(5,3,2); splot2(b); - b.Set(a); b.Swap("x"); gr->SubPlot(5,3,3); splot2(b); - b.Set(a); b.Smooth("x"); gr->SubPlot(5,3,4); splot2(b); - b.Set(a); b.SinFFT("y"); gr->SubPlot(5,3,5); splot2(b); - b.Set(a); b.CosFFT("y"); gr->SubPlot(5,3,6); splot2(b); - b.Set(a); b.Hankel("y"); gr->SubPlot(5,3,7); splot2(b); - b.Set(a); b.Swap("y"); gr->SubPlot(5,3,8); splot2(b); - b.Set(a); b.Smooth("y"); gr->SubPlot(5,3,9); splot2(b); - b.Set(a); b.SinFFT("z"); gr->SubPlot(5,3,10);splot2(b); - b.Set(a); b.CosFFT("z"); gr->SubPlot(5,3,11);splot2(b); - b.Set(a); b.Hankel("z"); gr->SubPlot(5,3,12);splot2(b); - b.Set(a); b.Swap("z"); gr->SubPlot(5,3,13);splot2(b); - b.Set(a); b.Smooth("z"); gr->SubPlot(5,3,14);splot2(b); + b.Set(a); b.SinFFT("x"); gr->SubPlot(5,3,0); splot2(gr,b); + b.Set(a); b.CosFFT("x"); gr->SubPlot(5,3,1); splot2(gr,b); + b.Set(a); b.Hankel("x"); gr->SubPlot(5,3,2); splot2(gr,b); + b.Set(a); b.Swap("x"); gr->SubPlot(5,3,3); splot2(gr,b); + b.Set(a); b.Smooth("x"); gr->SubPlot(5,3,4); splot2(gr,b); + b.Set(a); b.SinFFT("y"); gr->SubPlot(5,3,5); splot2(gr,b); + b.Set(a); b.CosFFT("y"); gr->SubPlot(5,3,6); splot2(gr,b); + b.Set(a); b.Hankel("y"); gr->SubPlot(5,3,7); splot2(gr,b); + b.Set(a); b.Swap("y"); gr->SubPlot(5,3,8); splot2(gr,b); + b.Set(a); b.Smooth("y"); gr->SubPlot(5,3,9); splot2(gr,b); + b.Set(a); b.SinFFT("z"); gr->SubPlot(5,3,10);splot2(gr,b); + b.Set(a); b.CosFFT("z"); gr->SubPlot(5,3,11);splot2(gr,b); + b.Set(a); b.Hankel("z"); gr->SubPlot(5,3,12);splot2(gr,b); + b.Set(a); b.Swap("z"); gr->SubPlot(5,3,13);splot2(gr,b); + b.Set(a); b.Smooth("z"); gr->SubPlot(5,3,14);splot2(gr,b); } //----------------------------------------------------------------------------- const char *mmgl_param1="new x 100 'sin(pi*x)'\nnew y 100 'cos(pi*x)'\n" @@ -406,7 +329,7 @@ const char *mmgl_param1="new x 100 'sin(pi*x)'\nnew y 100 'cos(pi*x)'\n" "subplot 4 3 8:box:error x y z/10 c/10\n" "subplot 4 3 9:rotate 40 60:box:step x y z\n" "subplot 4 3 10:rotate 40 60:box:torus x z 'z';light on\n" -"subplot 4 3 11:rotate 40 60:box:label x y z '%z'\n"; +"subplot 4 3 11:rotate 40 60:box:label x y z '%z'"; void smgl_param1(mglGraph *gr) // 1d parametric plots { mglData x(100), y(100), z(100), c(100); @@ -446,7 +369,7 @@ const char *mmgl_param2="new x 100 100 'sin(pi*(x+y)/2)*cos(pi*y/2)'\n" "subplot 4 4 12:rotate 40 60:box:belt x y z '';meshnum 10;light on\n" "subplot 4 4 13:rotate 40 60:box:boxs x y z '';meshnum 10;light on\n" "subplot 4 4 14:rotate 40 60:box:boxs x y z '#';meshnum 10;light on\n" -"subplot 4 4 15:rotate 40 60:box:boxs x y z '@';meshnum 10;light on\n"; +"subplot 4 4 15:rotate 40 60:box:boxs x y z '@';meshnum 10;light on"; void smgl_param2(mglGraph *gr) // 2d parametric plots { mglData x(100,100), y(100,100), z(100,100), c(100,100); @@ -487,7 +410,7 @@ const char *mmgl_param3="new x 50 50 50 '(x+2)/3*sin(pi*y/2)'\n" "subplot 4 3 7:rotate 40 60:box:dots x y z c;meshnum 15\n" "subplot 4 3 8:rotate 40 60:box:densx c '' 0:densy c '' 0:densz c '' 0\n" "subplot 4 3 9:rotate 40 60:box:contx c '' 0:conty c '' 0:contz c '' 0\n" -"subplot 4 3 10:rotate 40 60:box:contfx c '' 0:contfy c '' 0:contfz c '' 0\n"; +"subplot 4 3 10:rotate 40 60:box:contfx c '' 0:contfy c '' 0:contfz c '' 0"; void smgl_param3(mglGraph *gr) // 3d parametric plots { mglData x(50,50,50), y(50,50,50), z(50,50,50), c(50,50,50), d(50,50,50); @@ -523,7 +446,7 @@ const char *mmgl_paramv="new x 20 20 20 '(x+2)/3*sin(pi*y/2)'\n" "vect3 x y z ex ey ez:vect3 x y z ex ey ez 'x':vect3 x y z ex ey ez 'z'\n" "grid3 x y z z '{r9}':grid3 x y z z '{g9}x':grid3 x y z z '{b9}z'\n" "subplot 3 3 6:rotate 40 60:box:flow x y z ex ey ez\n" -"subplot 3 3 7:rotate 40 60:box:pipe x y z ex ey ez\n"; +"subplot 3 3 7:rotate 40 60:box:pipe x y z ex ey ez"; void smgl_paramv(mglGraph *gr) // parametric plots for vector field { mglData x(20,20,20), y(20,20,20), z(20,20,20), ex(20,20,20), ey(20,20,20), ez(20,20,20); @@ -559,7 +482,7 @@ const char *mmgl_solve="zrange 0 1\nnew x 20 30 '(x+2)/3*cos(pi*y)'\n" "axis:box:xlabel 'i':ylabel 'j':grid2 z 'h'\n\n" "plot u v 'k2o':line 0.4 0.5 0.8 0.5 'kA'\n" "plot v1 u1 'b2^':line 0.5 0.15 0.5 0.3 'bA'\n" -"plot v1 u2 'r2v':line 0.5 0.7 0.5 0.85 'rA'\n"; +"plot v1 u2 'r2v':line 0.5 0.7 0.5 0.85 'rA'"; void smgl_solve(mglGraph *gr) // solve and evaluate { gr->SetRange('z',0,1); @@ -603,7 +526,7 @@ void smgl_solve(mglGraph *gr) // solve and evaluate const char *mmgl_triangulation="new x 100 '2*rnd-1':new y 100 '2*rnd-1':copy z x^2-y^2\n" "new g 30 30:triangulate d x y\n" "title 'Triangulation'\nrotate 50 60:box:light on\n" -"triplot d x y z:triplot d x y z '#k'\ndatagrid g x y z:mesh g 'm'\n"; +"triplot d x y z:triplot d x y z '#k'\ndatagrid g x y z:mesh g 'm'"; void smgl_triangulation(mglGraph *gr) // surface triangulation { mglData x(100), y(100), z(100); @@ -620,7 +543,7 @@ void smgl_triangulation(mglGraph *gr) // surface triangulation const char *mmgl_alpha="call 'prepare2d'\nsubplot 2 2 0:title 'default':rotate 50 60:box\nsurf a\n" "subplot 2 2 1:title 'light on':rotate 50 60:box\nlight on:surf a\n" "subplot 2 2 3:title 'light on; alpha on':rotate 50 60:box\nalpha on:surf a\n" -"subplot 2 2 2:title 'alpha on':rotate 50 60:box\nlight off:surf a\n"; +"subplot 2 2 2:title 'alpha on':rotate 50 60:box\nlight off:surf a"; void smgl_alpha(mglGraph *gr) // alpha and lighting { mglData a; mgls_prepare2d(&a); @@ -637,39 +560,39 @@ void smgl_alpha(mglGraph *gr) // alpha and lighting const char *mmgl_schemes="call 'sch' 0 'kw'\ncall 'sch' 1 'wk'\ncall 'sch' 2 'kHCcw'\ncall 'sch' 3 'kBbcw'\n" "call 'sch' 4 'kRryw'\ncall 'sch' 5 'kGgew'\ncall 'sch' 6 'BbwrR'\ncall 'sch' 7 'BbwgG'\n" "call 'sch' 8 'GgwmM'\ncall 'sch' 9 'UuwqR'\ncall 'sch' 10 'QqwcC'\ncall 'sch' 11 'CcwyY'\n" -"call 'sch' 12 'bcwyr'\ncall 'sch' 13 'bwr'\ncall 'sch' 14 'BbcyrR'\ncall 'sch' 15 'UbcyqR'\n" -"call 'sch' 16 'BbcwyrR'\ncall 'sch' 17 'bgr'\ncall 'sch' 18 'BbcyrR|'\ncall 'sch' 19 'b\\{g,0.3\\}r'\n" +"call 'sch' 12 'bcwyr'\ncall 'sch' 13 'bwr'\ncall 'sch' 14 'wUrqy'\ncall 'sch' 15 'UbcyqR'\n" +"call 'sch' 16 'BbcyrR'\ncall 'sch' 17 'bgr'\ncall 'sch' 18 'BbcyrR|'\ncall 'sch' 19 'b{g,0.3}r'\n" "stop\nfunc 'sch' 2\nsubplot 2 10 $1 '<>_^' 0.2 0:fsurf 'x' $2\n" -"text 0.07+0.5*mod($1,2) 0.92-0.1*int($1/2) $2 'A'\nreturn\n"; +"text 0.07+0.5*mod($1,2) 0.92-0.1*int($1/2) $2 'A'\nreturn"; void smgl_schemes(mglGraph *gr) // Color table { mglData a(256,2); a.Fill(-1,1); - gr->SubPlot(2,10,0,NULL,0.2); gr->Dens(a,"kw"); gr->Puts(0.07, 0.92, "'kw'", "A"); - gr->SubPlot(2,10,1,NULL,0.2); gr->Dens(a,"wk"); gr->Puts(0.57, 0.92, "'wk'", "A"); - gr->SubPlot(2,10,2,NULL,0.2); gr->Dens(a,"kHCcw"); gr->Puts(0.07, 0.82, "'kHCcw'", "A"); - gr->SubPlot(2,10,3,NULL,0.2); gr->Dens(a,"kBbcw"); gr->Puts(0.57, 0.82, "'kBbcw'", "A"); - gr->SubPlot(2,10,4,NULL,0.2); gr->Dens(a,"kRryw"); gr->Puts(0.07, 0.72, "'kRryw'", "A"); - gr->SubPlot(2,10,5,NULL,0.2); gr->Dens(a,"kGgew"); gr->Puts(0.57, 0.72, "'kGgew'", "A"); - gr->SubPlot(2,10,6,NULL,0.2); gr->Dens(a,"BbwrR"); gr->Puts(0.07, 0.62, "'BbwrR'", "A"); - gr->SubPlot(2,10,7,NULL,0.2); gr->Dens(a,"BbwgG"); gr->Puts(0.57, 0.62, "'BbwgG'", "A"); - gr->SubPlot(2,10,8,NULL,0.2); gr->Dens(a,"GgwmM"); gr->Puts(0.07, 0.52, "'GgwmM'", "A"); - gr->SubPlot(2,10,9,NULL,0.2); gr->Dens(a,"UuwqR"); gr->Puts(0.57, 0.52, "'UuwqR'", "A"); - gr->SubPlot(2,10,10,NULL,0.2); gr->Dens(a,"QqwcC"); gr->Puts(0.07, 0.42, "'QqwcC'", "A"); - gr->SubPlot(2,10,11,NULL,0.2); gr->Dens(a,"CcwyY"); gr->Puts(0.57, 0.42, "'CcwyY'", "A"); - gr->SubPlot(2,10,12,NULL,0.2); gr->Dens(a,"bcwyr"); gr->Puts(0.07, 0.32, "'bcwyr'", "A"); - gr->SubPlot(2,10,13,NULL,0.2); gr->Dens(a,"bwr"); gr->Puts(0.57, 0.32, "'bwr'", "A"); - gr->SubPlot(2,10,14,NULL,0.2); gr->Dens(a,"BbcyrR"); gr->Puts(0.07, 0.22, "'BbcyrR'", "A"); - gr->SubPlot(2,10,15,NULL,0.2); gr->Dens(a,"UbcyqR"); gr->Puts(0.57, 0.22, "'UbcyqR'", "A"); - gr->SubPlot(2,10,16,NULL,0.2); gr->Dens(a,"BbcwyrR"); gr->Puts(0.07, 0.12, "'BbcwyrR'", "A"); - gr->SubPlot(2,10,17,NULL,0.2); gr->Dens(a,"bgr"); gr->Puts(0.57, 0.12, "'bgr'", "A"); - gr->SubPlot(2,10,18,NULL,0.2); gr->Dens(a,"BbcyrR|"); gr->Puts(0.07, 0.02, "'BbcyrR|'", "A"); - gr->SubPlot(2,10,19,NULL,0.2); gr->Dens(a,"b{g,0.3}r"); gr->Puts(0.57, 0.02, "'b\\{g,0.3\\}r'", "A"); + gr->SubPlot(2,10,0,NULL,0.2); gr->Dens(a,"kw"); gr->Puts(0.07, 0.92, "kw", "A"); + gr->SubPlot(2,10,1,NULL,0.2); gr->Dens(a,"wk"); gr->Puts(0.57, 0.92, "wk", "A"); + gr->SubPlot(2,10,2,NULL,0.2); gr->Dens(a,"kHCcw"); gr->Puts(0.07, 0.82, "kHCcw", "A"); + gr->SubPlot(2,10,3,NULL,0.2); gr->Dens(a,"kBbcw"); gr->Puts(0.57, 0.82, "kBbcw", "A"); + gr->SubPlot(2,10,4,NULL,0.2); gr->Dens(a,"kRryw"); gr->Puts(0.07, 0.72, "kRryw", "A"); + gr->SubPlot(2,10,5,NULL,0.2); gr->Dens(a,"kGgew"); gr->Puts(0.57, 0.72, "kGgew", "A"); + gr->SubPlot(2,10,6,NULL,0.2); gr->Dens(a,"BbwrR"); gr->Puts(0.07, 0.62, "BbwrR", "A"); + gr->SubPlot(2,10,7,NULL,0.2); gr->Dens(a,"BbwgG"); gr->Puts(0.57, 0.62, "BbwgG", "A"); + gr->SubPlot(2,10,8,NULL,0.2); gr->Dens(a,"GgwmM"); gr->Puts(0.07, 0.52, "GgwmM", "A"); + gr->SubPlot(2,10,9,NULL,0.2); gr->Dens(a,"UuwqR"); gr->Puts(0.57, 0.52, "UuwqR", "A"); + gr->SubPlot(2,10,10,NULL,0.2); gr->Dens(a,"QqwcC"); gr->Puts(0.07, 0.42, "QqwcC", "A"); + gr->SubPlot(2,10,11,NULL,0.2); gr->Dens(a,"CcwyY"); gr->Puts(0.57, 0.42, "CcwyY", "A"); + gr->SubPlot(2,10,12,NULL,0.2); gr->Dens(a,"bcwyr"); gr->Puts(0.07, 0.32, "bcwyr", "A"); + gr->SubPlot(2,10,13,NULL,0.2); gr->Dens(a,"bwr"); gr->Puts(0.57, 0.32, "bwr", "A"); + gr->SubPlot(2,10,14,NULL,0.2); gr->Dens(a,"wUrqy"); gr->Puts(0.07, 0.22, "wUrqy", "A"); + gr->SubPlot(2,10,15,NULL,0.2); gr->Dens(a,"UbcyqR"); gr->Puts(0.57, 0.22, "UbcyqR", "A"); + gr->SubPlot(2,10,16,NULL,0.2); gr->Dens(a,"BbcyrR"); gr->Puts(0.07, 0.12, "BbcyrR", "A"); + gr->SubPlot(2,10,17,NULL,0.2); gr->Dens(a,"bgr"); gr->Puts(0.57, 0.12, "bgr", "A"); + gr->SubPlot(2,10,18,NULL,0.2); gr->Dens(a,"BbcyrR|"); gr->Puts(0.07, 0.02, "BbcyrR|", "A"); + gr->SubPlot(2,10,19,NULL,0.2); gr->Dens(a,"b{g,0.3}r"); gr->Puts(0.57, 0.02, "b\\{g,0.3\\}r", "A"); } //----------------------------------------------------------------------------- const char *mmgl_curvcoor="origin -1 1 -1\nsubplot 2 2 0:title 'Cartesian':rotate 50 60:fplot '2*t-1' '0.5' '0' '2r':axis:grid\n" "axis 'y*sin(pi*x)' 'y*cos(pi*x)' '':subplot 2 2 1:title 'Cylindrical':rotate 50 60:fplot '2*t-1' '0.5' '0' '2r':axis:grid\n" "axis '2*y*x' 'y*y - x*x' '':subplot 2 2 2:title 'Parabolic':rotate 50 60:fplot '2*t-1' '0.5' '0' '2r':axis:grid\n" -"axis 'y*sin(pi*x)' 'y*cos(pi*x)' 'x+z':subplot 2 2 3:title 'Spiral':rotate 50 60:fplot '2*t-1' '0.5' '0' '2r':axis:grid\n"; +"axis 'y*sin(pi*x)' 'y*cos(pi*x)' 'x+z':subplot 2 2 3:title 'Spiral':rotate 50 60:fplot '2*t-1' '0.5' '0' '2r':axis:grid"; void smgl_curvcoor(mglGraph *gr) // curvilinear coordinates { gr->SetOrigin(-1,1,-1); @@ -699,16 +622,17 @@ const char *mmgl_style=""; void smgl_style(mglGraph *gr) // pen styles { gr->SubPlot(2,2,0); - double d,x1,x2,x0,y=0.95; + double d,x1,x2,x0,y=1.1, y1=1.15; d=0.3, x0=0.2, x1=0.5, x2=0.6; - gr->Line(mglPoint(x0,1-0*d),mglPoint(x1,1-0*d),"k-"); gr->Puts(mglPoint(x2,y-0*d),"Solid '-'",":rL"); - gr->Line(mglPoint(x0,1-1*d),mglPoint(x1,1-1*d),"k|"); gr->Puts(mglPoint(x2,y-1*d),"Long Dash '|'",":rL"); - gr->Line(mglPoint(x0,1-2*d),mglPoint(x1,1-2*d),"k;"); gr->Puts(mglPoint(x2,y-2*d),"Dash ';'",":rL"); - gr->Line(mglPoint(x0,1-3*d),mglPoint(x1,1-3*d),"k="); gr->Puts(mglPoint(x2,y-3*d),"Small dash '='",":rL"); - gr->Line(mglPoint(x0,1-4*d),mglPoint(x1,1-4*d),"kj"); gr->Puts(mglPoint(x2,y-4*d),"Dash-dot 'j'",":rL"); - gr->Line(mglPoint(x0,1-5*d),mglPoint(x1,1-5*d),"ki"); gr->Puts(mglPoint(x2,y-5*d),"Small dash-dot 'i'",":rL"); - gr->Line(mglPoint(x0,1-6*d),mglPoint(x1,1-6*d),"k:"); gr->Puts(mglPoint(x2,y-6*d),"Dots ':'",":rL"); - gr->Line(mglPoint(x0,1-7*d),mglPoint(x1,1-7*d),"k "); gr->Puts(mglPoint(x2,y-7*d),"None ' '",":rL"); + gr->Line(mglPoint(x0,y1-0*d),mglPoint(x1,y1-0*d),"k-"); gr->Puts(mglPoint(x2,y-0*d),"Solid '-'",":rL"); + gr->Line(mglPoint(x0,y1-1*d),mglPoint(x1,y1-1*d),"k|"); gr->Puts(mglPoint(x2,y-1*d),"Long Dash '|'",":rL"); + gr->Line(mglPoint(x0,y1-2*d),mglPoint(x1,y1-2*d),"k;"); gr->Puts(mglPoint(x2,y-2*d),"Dash ';'",":rL"); + gr->Line(mglPoint(x0,y1-3*d),mglPoint(x1,y1-3*d),"k="); gr->Puts(mglPoint(x2,y-3*d),"Small dash '='",":rL"); + gr->Line(mglPoint(x0,y1-4*d),mglPoint(x1,y1-4*d),"kj"); gr->Puts(mglPoint(x2,y-4*d),"Dash-dot 'j'",":rL"); + gr->Line(mglPoint(x0,y1-5*d),mglPoint(x1,y1-5*d),"ki"); gr->Puts(mglPoint(x2,y-5*d),"Small dash-dot 'i'",":rL"); + gr->Line(mglPoint(x0,y1-6*d),mglPoint(x1,y1-6*d),"k:"); gr->Puts(mglPoint(x2,y-6*d),"Dots ':'",":rL"); + gr->Line(mglPoint(x0,y1-7*d),mglPoint(x1,y1-7*d),"k "); gr->Puts(mglPoint(x2,y-7*d),"None ' '",":rL"); + gr->Line(mglPoint(x0,y1-8*d),mglPoint(x1,y1-8*d),"k{df090}"); gr->Puts(mglPoint(x2,y-8*d),"Manual '{df090}'",":rL"); d=0.25; x1=-1; x0=-0.8; y = -0.05; gr->Mark(mglPoint(x1,5*d),"k."); gr->Puts(mglPoint(x0,y+5*d),"'.'",":rL"); @@ -746,9 +670,10 @@ void smgl_style(mglGraph *gr) // pen styles gr->Line(mglPoint(a,0),mglPoint(b,0),"k-S"); gr->Puts(mglPoint(c,0),"Style 'S' or 'S\\_'",":rL"); gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"k-O"); gr->Puts(mglPoint(c,-0.2),"Style 'O' or 'O\\_'",":rL"); gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"k-T"); gr->Puts(mglPoint(c,-0.4),"Style 'T' or 'T\\_'",":rL"); - gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-_"); gr->Puts(mglPoint(c,-0.6),"Style '\\_' or none",":rL"); - gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-AS"); gr->Puts(mglPoint(c,-0.8),"Style 'AS'",":rL"); - gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-_A"); gr->Puts(mglPoint(c,-1),"Style '\\_A'",":rL"); + gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-X"); gr->Puts(mglPoint(c,-0.6),"Style 'X' or 'X\\_'",":rL"); + gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-_"); gr->Puts(mglPoint(c,-0.8),"Style '\\_' or none",":rL"); + gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-AS"); gr->Puts(mglPoint(c,-1),"Style 'AS'",":rL"); + gr->Line(mglPoint(a,-1.2),mglPoint(b,-1.2),"k-_A"); gr->Puts(mglPoint(c,-1.2),"Style '\\_A'",":rL"); a=-1; b=-0.7; c=-0.6; gr->Line(mglPoint(a,1),mglPoint(b,1),"kAA"); gr->Puts(mglPoint(c,1),"Style 'AA'",":rL"); @@ -759,9 +684,10 @@ void smgl_style(mglGraph *gr) // pen styles gr->Line(mglPoint(a,0),mglPoint(b,0),"kSS"); gr->Puts(mglPoint(c,0),"Style 'SS'",":rL"); gr->Line(mglPoint(a,-0.2),mglPoint(b,-0.2),"kOO"); gr->Puts(mglPoint(c,-0.2),"Style 'OO'",":rL"); gr->Line(mglPoint(a,-0.4),mglPoint(b,-0.4),"kTT"); gr->Puts(mglPoint(c,-0.4),"Style 'TT'",":rL"); - gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"k-__"); gr->Puts(mglPoint(c,-0.6),"Style '\\_\\_'",":rL"); - gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-VA"); gr->Puts(mglPoint(c,-0.8),"Style 'VA'",":rL"); - gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-AV"); gr->Puts(mglPoint(c,-1),"Style 'AV'",":rL"); + gr->Line(mglPoint(a,-0.6),mglPoint(b,-0.6),"kXX"); gr->Puts(mglPoint(c,-0.6),"Style 'XX'",":rL"); + gr->Line(mglPoint(a,-0.8),mglPoint(b,-0.8),"k-__"); gr->Puts(mglPoint(c,-0.8),"Style '\\_\\_'",":rL"); + gr->Line(mglPoint(a,-1),mglPoint(b,-1),"k-VA"); gr->Puts(mglPoint(c,-1),"Style 'VA'",":rL"); + gr->Line(mglPoint(a,-1.2),mglPoint(b,-1.2),"k-AV"); gr->Puts(mglPoint(c,-1.2),"Style 'AV'",":rL"); gr->SubPlot(2,2,2); //#LENUQ @@ -827,10 +753,11 @@ const char *mmgl_text="call 'prepare1d'\nsubplot 2 2 0 ''\ntext 0 1 'Text can be "text 0 -0.6 'Easy to change indexes ^{up} _{down} @{center}'\n" "text 0 -1 'It parse TeX: \\int \\alpha \\cdot \\\n\\sqrt3{sin(\\pi x)^2 + \\gamma_{i_k}} dx'\n" "subplot 2 2 1 ''\n text 0 0.5 '\\sqrt{\\frac{\\alpha^{\\gamma^2}+\\overset 1{\\big\\infty}}{\\sqrt3{2+b}}}' '@' -2\n" -"text 0 -0.5 'Text can be printed\\n{}on several lines'\n" +"text 0 -0.3 'Text can be printed\\n{}on several lines'\n" +"text 0 -0.7 'or with color gradient' 'BbcyrR'\n" "subplot 2 2 2 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k'\ntext y 'Another string drawn above a curve' 'Tr'\n" "subplot 2 2 3 '':line -1 -1 1 -1 'rA':text 0 -1 1 -1 'Horizontal'\n" -"line -1 -1 1 1 'rA':text 0 0 1 1 'At angle' '@'\nline -1 -1 -1 1 'rA':text -1 0 -1 1 'Vertical'\n"; +"line -1 -1 1 1 'rA':text 0 0 1 1 'At angle' '@'\nline -1 -1 -1 1 'rA':text -1 0 -1 1 'Vertical'"; void smgl_text(mglGraph *gr) // text drawing { if(big!=3) gr->SubPlot(2,2,0,""); @@ -847,13 +774,14 @@ void smgl_text(mglGraph *gr) // text drawing gr->SubPlot(2,2,1,""); gr->Puts(mglPoint(0,0.5), "\\sqrt{\\frac{\\alpha^{\\gamma^2}+\\overset 1{\\big\\infty}}{\\sqrt3{2+b}}}", "@", -2); - gr->Puts(mglPoint(0,-0.5),"Text can be printed\non several lines"); + gr->Puts(mglPoint(0,-0.3),"Text can be printed\non several lines"); + gr->Puts(mglPoint(0,-0.7),"or with col\bor gradient","BbcyrR"); gr->SubPlot(2,2,2,""); mglData y; mgls_prepare1d(&y); gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Text(y,"This is very very long string drawn along a curve","k"); - gr->Text(y,"Another string drawn above a curve","Tr"); + gr->Text(y,"Another string drawn under a curve","Tr"); gr->SubPlot(2,2,3,""); gr->Line(mglPoint(-1,-1),mglPoint(1,-1),"rA"); gr->Puts(mglPoint(0,-1),mglPoint(1,-1),"Horizontal"); @@ -862,33 +790,33 @@ void smgl_text(mglGraph *gr) // text drawing } //----------------------------------------------------------------------------- const char *mmgl_text2="call 'prepare1d'\n" -"subplot 1 3 0 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k'\ntext y 'Another string drawn above a curve' 'Tr'\n" -"subplot 1 3 1 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k:C'\ntext y 'Another string drawn above a curve' 'Tr:C'\n" -"subplot 1 3 2 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k:R'\ntext y 'Another string drawn above a curve' 'Tr:R'\n"; +"subplot 1 3 0 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k'\ntext y 'Another string drawn under a curve' 'Tr'\n" +"subplot 1 3 1 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k:C'\ntext y 'Another string drawn under a curve' 'Tr:C'\n" +"subplot 1 3 2 '':box:plot y(:,0)\ntext y 'This is very very long string drawn along a curve' 'k:R'\ntext y 'Another string drawn under a curve' 'Tr:R'"; void smgl_text2(mglGraph *gr) // text drawing { mglData y; mgls_prepare1d(&y); if(big!=3) gr->SubPlot(1,3,0,""); gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Text(y,"This is very very long string drawn along a curve","k"); - gr->Text(y,"Another string drawn above a curve","Tr"); + gr->Text(y,"Another string drawn under a curve","Tr"); if(big==3) return; gr->SubPlot(1,3,1,""); gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Text(y,"This is very very long string drawn along a curve","k:C"); - gr->Text(y,"Another string drawn above a curve","Tr:C"); + gr->Text(y,"Another string drawn under a curve","Tr:C"); gr->SubPlot(1,3,2,""); gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Text(y,"This is very very long string drawn along a curve","k:R"); - gr->Text(y,"Another string drawn above a curve","Tr:R"); + gr->Text(y,"Another string drawn under a curve","Tr:R"); } //----------------------------------------------------------------------------- const char *mmgl_fonts="define d 0.25\nloadfont 'STIX':text 0 1.1 'default font (STIX)'\nloadfont 'adventor':text 0 1.1-d 'adventor font'\n" "loadfont 'bonum':text 0 1.1-2*d 'bonum font'\nloadfont 'chorus':text 0 1.1-3*d 'chorus font'\nloadfont 'cursor':text 0 1.1-4*d 'cursor font'\n" "loadfont 'heros':text 0 1.1-5*d 'heros font'\nloadfont 'heroscn':text 0 1.1-6*d 'heroscn font'\nloadfont 'pagella':text 0 1.1-7*d 'pagella font'\n" -"loadfont 'schola':text 0 1.1-8*d 'schola font'\nloadfont 'termes':text 0 1.1-9*d 'termes font'\nloadfont ''\n"; +"loadfont 'schola':text 0 1.1-8*d 'schola font'\nloadfont 'termes':text 0 1.1-9*d 'termes font'\nloadfont ''"; void smgl_fonts(mglGraph *gr) // font typefaces { double h=1.1, d=0.25; @@ -909,7 +837,7 @@ const char *mmgl_bars="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 "subplot 3 2 0 '':title 'Bars plot (default)':box:bars ys\nsubplot 3 2 1 '':title '2 colors':box:bars ys 'cbgGyr'\n" "subplot 3 2 4 '':title '\"\\#\" style':box:bars ys '#'\n" "new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 3 2 5:title '3d variant':rotate 50 60:box:bars xc yc z 'r'\n" -"ranges -1 1 -3 3:subplot 3 2 2 '':title '\"a\" style':box:bars ys 'a'\nsubplot 3 2 3 '':title '\"f\" style':box:bars ys 'f'\n"; +"ranges -1 1 -3 3:subplot 3 2 2 '':title '\"a\" style':box:bars ys 'a'\nsubplot 3 2 3 '':title '\"f\" style':box:bars ys 'f'"; void smgl_bars(mglGraph *gr) { mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); @@ -930,7 +858,7 @@ void smgl_bars(mglGraph *gr) //----------------------------------------------------------------------------- const char *mmgl_barh="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd':origin 0 0 0\n" "subplot 2 2 0 '':title 'Barh plot (default)':box:barh ys\nsubplot 2 2 1 '':title '2 colors':box:barh ys 'cbgGyr'\n" -"ranges -3 3 -1 1:subplot 2 2 2 '':title '\"a\" style':box:barh ys 'a'\nsubplot 2 2 3 '': title '\"f\" style':box:barh ys 'f'\n"; +"ranges -3 3 -1 1:subplot 2 2 2 '':title '\"a\" style':box:barh ys 'a'\nsubplot 2 2 3 '': title '\"f\" style':box:barh ys 'f'"; void smgl_barh(mglGraph *gr) { mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); @@ -947,7 +875,7 @@ void smgl_barh(mglGraph *gr) const char *mmgl_area="call 'prepare1d'\norigin 0 0 0\nsubplot 2 2 0 '':title 'Area plot (default)':box:area y\n" "subplot 2 2 1 '':title '2 colors':box:area y 'cbgGyr'\nsubplot 2 2 2 '':title '\"!\" style':box:area y '!'\n" "new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 3:title '3d variant':rotate 50 60:box\n" -"area xc yc z 'r'\narea xc -yc z 'b#'\n"; +"area xc yc z 'r'\narea xc -yc z 'b#'"; void smgl_area(mglGraph *gr) { mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); @@ -965,7 +893,7 @@ void smgl_area(mglGraph *gr) //----------------------------------------------------------------------------- const char *mmgl_plot="call 'prepare1d'\nsubplot 2 2 0 '':title 'Plot plot (default)':box:plot y\n" "subplot 2 2 2 '':title ''!' style; 'rgb' palette':box:plot y 'o!rgb'\nsubplot 2 2 3 '':title 'just markers':box:plot y ' +'\n" -"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:plot xc yc z 'rs'\n"; +"new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:plot xc yc z 'rs'"; void smgl_plot(mglGraph *gr) { mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); @@ -983,7 +911,7 @@ void smgl_plot(mglGraph *gr) const char *mmgl_tens="call 'prepare1d'\nsubplot 2 2 0 '':title 'Tens plot (default)':box:tens y(:,0) y(:,1)\n" "subplot 2 2 2 '':title '\" \" style':box:tens y(:,0) y(:,1) 'o '\n" "new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\n" -"subplot 2 2 1:title '3d variant':rotate 50 60:box:tens xc yc z z 's'\n"; +"subplot 2 2 1:title '3d variant':rotate 50 60:box:tens xc yc z z 's'"; void smgl_tens(mglGraph *gr) { mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); @@ -1001,7 +929,7 @@ const char *mmgl_region="call 'prepare1d'\ncopy y1 y(:,1):copy y2 y(:,2)\n" "subplot 2 2 0 '':title 'Region plot (default)':box:region y1 y2:plot y1 'k2':plot y2 'k2'\n" "subplot 2 2 1 '':title '2 colors':box:region y1 y2 'yr':plot y1 'k2':plot y2 'k2'\n" "subplot 2 2 2 '':title '\"!\" style':box:region y1 y2 '!':plot y1 'k2':plot y2 'k2'\n" -"subplot 2 2 3 '':title '\"i\" style':box:region y1 y2 'ir':plot y1 'k2':plot y2 'k2'\n"; +"subplot 2 2 3 '':title '\"i\" style':box:region y1 y2 'ir':plot y1 'k2':plot y2 'k2'"; void smgl_region(mglGraph *gr) { mglData y; mgls_prepare1d(&y); @@ -1016,7 +944,7 @@ void smgl_region(mglGraph *gr) //----------------------------------------------------------------------------- const char *mmgl_stem="call 'prepare1d'\norigin 0 0 0:subplot 2 2 0 '':title 'Stem plot (default)':box:stem y\n" "new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:stem xc yc z 'rx'\n" -"subplot 2 2 2 '':title '\"!\" style':box:stem y 'o!rgb'\n"; +"subplot 2 2 2 '':title '\"!\" style':box:stem y 'o!rgb'"; void smgl_stem(mglGraph *gr) { mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); @@ -1032,7 +960,7 @@ void smgl_stem(mglGraph *gr) //----------------------------------------------------------------------------- const char *mmgl_step="call 'prepare1d'\norigin 0 0 0:subplot 2 2 0 '':title 'Step plot (default)':box:step y\n" "new yc 30 'sin(pi*x)':new xc 30 'cos(pi*x)':new z 30 'x'\nsubplot 2 2 1:title '3d variant':rotate 50 60:box:step xc yc z 'r'\n" -"subplot 2 2 2 '':title '\"!\" style':box:step y 's!rgb'\n"; +"subplot 2 2 2 '':title '\"!\" style':box:step y 's!rgb'"; void smgl_step(mglGraph *gr) { mglData y; mgls_prepare1d(&y); gr->SetOrigin(0,0,0); @@ -1046,7 +974,7 @@ void smgl_step(mglGraph *gr) gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Step(y,"s!rgb"); } //----------------------------------------------------------------------------- -const char *mmgl_boxplot="new a 10 7 '(2*rnd-1)^3/2'\nsubplot 1 1 0 '':title 'Boxplot plot':box:boxplot a\n"; +const char *mmgl_boxplot="new a 10 7 '(2*rnd-1)^3/2'\nsubplot 1 1 0 '':title 'Boxplot plot':box:boxplot a"; void smgl_boxplot(mglGraph *gr) // flow threads and density plot { mglData a(10,7); a.Modify("(2*rnd-1)^3/2"); @@ -1056,7 +984,7 @@ void smgl_boxplot(mglGraph *gr) // flow threads and density plot //----------------------------------------------------------------------------- const char *mmgl_ohlc="new o 10 '0.5*sin(pi*x)'\nnew c 10 '0.5*sin(pi*(x+2/9))'\n" "new l 10 '0.3*rnd-0.8'\nnew h 10 '0.3*rnd+0.5'\n" -"subplot 1 1 0 '':title 'OHLC plot':box:ohlc o h l c\n"; +"subplot 1 1 0 '':title 'OHLC plot':box:ohlc o h l c"; void smgl_ohlc(mglGraph *gr) // flow threads and density plot { mglData o(10), h(10), l(10), c(10); @@ -1124,7 +1052,7 @@ const char *mmgl_molecule="alpha on:light on\n" "sphere 0 0 0 0.25 'b':drop 0 0 0 0.33 0.57 0 0.32 'n' 1 2\n" "sphere 0.33 0.57 0 0.25 'g':drop 0 0 0 0.33 -0.57 0 0.32 'n' 1 2\n" "sphere 0.33 -0.57 0 0.25 'g':drop 0 0 0 -0.65 0 0 0.32 'n' 1 2\n" -"sphere -0.65 0 0 0.25 'g'\n"; +"sphere -0.65 0 0 0.25 'g'"; void smgl_molecule(mglGraph *gr) // example of moleculas { gr->VertexColor(false); gr->Compression(false); // per-vertex colors and compression are detrimental to transparency @@ -1200,7 +1128,7 @@ const char *mmgl_error2="new x0 10 'rnd':new ex 10 '0.1'\nnew y0 10 'rnd':new ey "subplot 4 3 8 '':box:error x0 y0 ex ey 'o@'\n" "subplot 4 3 9 '':box:error x0 y0 ex ey '#o@'; alpha 0.5\n" "subplot 4 3 10 '':box:error x0 y0 ex ey '#.@'\n" -"subplot 4 3 11 '':box:error x0 y0 ex ey; alpha 0.5\n"; +"subplot 4 3 11 '':box:error x0 y0 ex ey; alpha 0.5"; void smgl_error2(mglGraph *gr) { mglData x0(10), y0(10), ex(10), ey(10); @@ -1228,15 +1156,14 @@ const char *mmgl_error="call 'prepare1d'\nnew y 50 '0.7*sin(pi*x-pi) + 0.5*cos(3 "subplot 2 2 1 '':title '\"!\" style; no e_x':box:plot y:error x0 y0 ey 'o!rgb'\n" "subplot 2 2 2 '':title '\"\\@\" style':alpha on:box:plot y:error x0 y0 ex ey '@'; alpha 0.5\n" "subplot 2 2 3:title '3d variant':rotate 50 60:axis\n" -"for $1 0 9\n\terrbox 2*rnd-1 2*rnd-1 2*rnd-1 0.2 0.2 0.2 'bo'\nnext\n"; +"for $1 0 9\n\terrbox 2*rnd-1 2*rnd-1 2*rnd-1 0.2 0.2 0.2 'bo'\nnext"; void smgl_error(mglGraph *gr) { mglData y; mgls_prepare1d(&y); mglData x0(10), y0(10), ex0(10), ey0(10); - double x; for(int i=0;i<10;i++) { - x = i/9.; + double x = i/9.; x0.a[i] = 2*x-1 + 0.1*mgl_rnd()-0.05; y0.a[i] = 0.7*sin(2*M_PI*x)+0.5*cos(3*M_PI*x)+0.2*sin(M_PI*x)+0.2*mgl_rnd()-0.1; ey0.a[i]=0.2; ex0.a[i]=0.1; @@ -1260,7 +1187,7 @@ const char *mmgl_chart="new ch 7 2 'rnd+0.1':light on\n" "subplot 2 2 2:title 'Pie chart; \" \" color':rotate 50 60:\n" "axis '(y+1)/2*cos(pi*x)' '(y+1)/2*sin(pi*x)' '':box:chart ch 'bgr cmy#'\n" "subplot 2 2 3:title 'Ring chart; \" \" color':rotate 50 60:\n" -"axis '(y+2)/3*cos(pi*x)' '(y+2)/3*sin(pi*x)' '':box:chart ch 'bgr cmy#'\n"; +"axis '(y+2)/3*cos(pi*x)' '(y+2)/3*sin(pi*x)' '':box:chart ch 'bgr cmy#'"; void smgl_chart(mglGraph *gr) { mglData ch(7,2); for(int i=0;i<7*2;i++) ch.a[i]=mgl_rnd()+0.1; @@ -1277,7 +1204,7 @@ void smgl_chart(mglGraph *gr) gr->Rotate(50,60); gr->Box(); gr->Chart(ch,"bgr cmy#"); } //----------------------------------------------------------------------------- -const char *mmgl_mark="call 'prepare1d'\nsubplot 1 1 0 '':title 'Mark plot (default)':box:mark y y1 's'\n"; +const char *mmgl_mark="call 'prepare1d'\nsubplot 1 1 0 '':title 'Mark plot (default)':box:mark y y1 's'"; void smgl_mark(mglGraph *gr) { mglData y,y1; mgls_prepare1d(&y,&y1); @@ -1286,7 +1213,7 @@ void smgl_mark(mglGraph *gr) } //----------------------------------------------------------------------------- const char *mmgl_radar="new yr 10 3 '0.4*sin(pi*(x+1.5+y/2)+0.1*rnd)'\n" -"subplot 1 1 0 '':title 'Radar plot (with grid, \"\\#\")':radar yr '#'\n"; +"subplot 1 1 0 '':title 'Radar plot (with grid, \"\\#\")':radar yr '#'"; void smgl_radar(mglGraph *gr) { mglData yr(10,3); yr.Modify("0.4*sin(pi*(2*x+y))+0.1*rnd"); @@ -1294,8 +1221,8 @@ void smgl_radar(mglGraph *gr) gr->Radar(yr,"#"); } //----------------------------------------------------------------------------- -const char *mmgl_candle="new y 30 'sin(pi*x/2)^2':copy y1 y/2:copy y2 (y+1)/2\n" -"subplot 1 1 0 '':title 'Candle plot (default)'\nyrange 0 1:box:candle y y1 y2\n"; +const char *mmgl_candle="new y 30 'sin(pi*x/2)^2'\n" +"subplot 1 1 0 '':title 'Candle plot (default)'\nyrange 0 1:box\ncandle y y/2 (y+1)/2"; void smgl_candle(mglGraph *gr) { mglData y(30); gr->Fill(y,"sin(pi*x/2)^2"); @@ -1305,7 +1232,7 @@ void smgl_candle(mglGraph *gr) gr->SetRange('y',0,1); gr->Box(); gr->Candle(y,y1,y2); } //----------------------------------------------------------------------------- -const char *mmgl_textmark="call 'prepare1d'\nsubplot 1 1 0 '':title 'TextMark plot (default)':box:textmark y y1 '\\gamma' 'r'\n"; +const char *mmgl_textmark="call 'prepare1d'\nsubplot 1 1 0 '':title 'TextMark plot (default)':box:textmark y y1 '\\gamma' 'r'"; void smgl_textmark(mglGraph *gr) { mglData y,y1; mgls_prepare1d(&y,&y1); @@ -1318,7 +1245,7 @@ const char *mmgl_tube="call 'prepare1d'\nlight on\n" "subplot 2 2 0 '':title 'Tube plot (default)':box:tube y 0.05\n" "subplot 2 2 1 '':title 'variable radius':box:tube y y1\n" "subplot 2 2 2 '':title '\"\\#\" style':box:tube y 0.05 '#'\n" -"subplot 2 2 3:title '3d variant':rotate 50 60:box:tube xc yc z y2 'r'\n"; +"subplot 2 2 3:title '3d variant':rotate 50 60:box:tube xc yc z y2 'r'"; void smgl_tube(mglGraph *gr) { mglData y,y1,y2; mgls_prepare1d(&y,&y1,&y2); y1/=20; @@ -1339,7 +1266,7 @@ const char *mmgl_tape="call 'prepare1d'\nnew yc 50 'sin(pi*x)':new xc 50 'cos(pi "subplot 2 2 2:title '3d variant, x only':rotate 50 60\n" "box:plot xc yc z 'k':tape xc yc z 'xr':tape xc yc z 'xr#'\n" "subplot 2 2 3:title '3d variant, z only':rotate 50 60\n" -"box:plot xc yc z 'k':tape xc yc z 'zg':tape xc yc z 'zg#'\n"; +"box:plot xc yc z 'k':tape xc yc z 'zg':tape xc yc z 'zg#'"; void smgl_tape(mglGraph *gr) { mglData y; mgls_prepare1d(&y); @@ -1357,7 +1284,7 @@ void smgl_tape(mglGraph *gr) gr->Box(); gr->Plot(xc,yc,z,"k"); gr->Tape(xc,yc,z,"zg"); gr->Tape(xc,yc,z,"zg#"); } //----------------------------------------------------------------------------- -const char *mmgl_fog="call 'prepare2d'\ntitle 'Fog sample':rotate 50 60:light on:fog 1\nbox:surf a:cont a 'y'\n"; +const char *mmgl_fog="call 'prepare2d'\ntitle 'Fog sample':rotate 50 60:light on:fog 1\nbox:surf a:cont a 'y'"; void smgl_fog(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -1369,7 +1296,7 @@ void smgl_fog(mglGraph *gr) const char *mmgl_map="new a 50 40 'x':new b 50 40 'y':zrange -2 2:text 0 0 '\\to'\n" "subplot 2 1 0:text 0 1.1 '\\{x, y\\}' '' -2:box:map a b 'brgk'\n" "subplot 2 1 1:text 0 1.1 '\\{\\frac{x^3+y^3}{2}, \\frac{x-y}{2}\\}' '' -2\n" -"box:fill a '(x^3+y^3)/2':fill b '(x-y)/2':map a b 'brgk'\n"; +"box:fill a '(x^3+y^3)/2':fill b '(x-y)/2':map a b 'brgk'"; void smgl_map(mglGraph *gr) // example of mapping { mglData a(50, 40), b(50, 40); @@ -1391,7 +1318,7 @@ void smgl_map(mglGraph *gr) // example of mapping const char *mmgl_stfa="new a 2000:new b 2000\nfill a 'cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+\\\n" "cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)'\n" "subplot 1 2 0 '<_':title 'Initial signal':plot a:axis:xlabel '\\i t'\n" -"subplot 1 2 1 '<_':title 'STFA plot':stfa a b 64:axis:ylabel '\\omega' 0:xlabel '\\i t'\n"; +"subplot 1 2 1 '<_':title 'STFA plot':stfa a b 64:axis:ylabel '\\omega' 0:xlabel '\\i t'"; void smgl_stfa(mglGraph *gr) // STFA sample { mglData a(2000), b(2000); @@ -1462,7 +1389,7 @@ void smgl_conta(mglGraph *gr) } //----------------------------------------------------------------------------- const char *mmgl_contfa="call 'prepare3d'\ntitle 'Cont3 sample':rotate 50 60:box:light on\n" -"contf3 c 'x':contf3 c:contf3 c 'z'\ncont3 c 'xk':cont3 c 'k':cont3 c 'zk'\n"; +"contf3 c 'x':contf3 c:contf3 c 'z'\ncont3 c 'xk':cont3 c 'k':cont3 c 'zk'"; void smgl_contfa(mglGraph *gr) { mglData c; mgls_prepare3d(&c); @@ -1516,7 +1443,7 @@ void smgl_contf_xyz(mglGraph *gr) const char *mmgl_cloud="call 'prepare3d'\nsubplot 2 2 0:title 'Cloud plot':rotate 50 60:alpha on:box:cloud c 'wyrRk'\n" "subplot 2 2 1:title '\"i\" style':rotate 50 60:box:cloud c 'iwyrRk'\n" "subplot 2 2 2:title '\".\" style':rotate 50 60:box:cloud c '.wyrRk'\n" -"subplot 2 2 3:title 'meshnum 10':rotate 50 60:box:cloud c 'wyrRk'; meshnum 10\n"; +"subplot 2 2 3:title 'meshnum 10':rotate 50 60:box:cloud c 'wyrRk'; meshnum 10"; void smgl_cloud(mglGraph *gr) { mglData c; mgls_prepare3d(&c); @@ -1535,7 +1462,7 @@ void smgl_cloud(mglGraph *gr) const char *mmgl_cont="call 'prepare2d'\nlist v -0.5 -0.15 0 0.15 0.5\nsubplot 2 2 0:title 'Cont plot (default)':rotate 50 60:box:cont a\n" "subplot 2 2 1:title 'manual levels':rotate 50 60:box:cont v a\n" "subplot 2 2 2:title '\"\\_\" style':rotate 50 60:box:cont a '_'\n" -"subplot 2 2 3 '':title '\"t\" style':box:cont a 't'\n"; +"subplot 2 2 3 '':title '\"t\" style':box:cont a 't'"; void smgl_cont(mglGraph *gr) { mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5; v.a[1]=-0.15; v.a[2]=0; v.a[3]=0.15; v.a[4]=0.5; @@ -1555,7 +1482,7 @@ const char *mmgl_contf="call 'prepare2d'\nlist v -0.5 -0.15 0 0.15 0.5\n" "subplot 2 2 0:title 'ContF plot (default)':rotate 50 60:box:contf a\n" "subplot 2 2 1:title 'manual levels':rotate 50 60:box:contf v a\n" "subplot 2 2 2:title '\"\\_\" style':rotate 50 60:box:contf a '_'\n" -"subplot 2 2 3:title 'several slices':rotate 50 60:box:contf a1\n"; +"subplot 2 2 3:title 'several slices':rotate 50 60:box:contf a1"; void smgl_contf(mglGraph *gr) { mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5; @@ -1578,7 +1505,7 @@ const char *mmgl_contd="call 'prepare2d'\nlist v -0.5 -0.15 0 0.15 0.5\n" "subplot 2 2 0:title 'ContD plot (default)':rotate 50 60:box:contd a\n" "subplot 2 2 1:title 'manual levels':rotate 50 60:box:contd v a\n" "subplot 2 2 2:title '\"\\_\" style':rotate 50 60:box:contd a '_'\n" -"subplot 2 2 3:title 'several slices':rotate 50 60:box:contd a1\n"; +"subplot 2 2 3:title 'several slices':rotate 50 60:box:contd a1"; void smgl_contd(mglGraph *gr) { mglData a,v(5),a1(30,40,3); mgls_prepare2d(&a); v.a[0]=-0.5; @@ -1600,7 +1527,7 @@ const char *mmgl_contv="call 'prepare2d'\nlist v -0.5 -0.15 0 0.15 0.5\n" "subplot 2 2 0:title 'ContV plot (default)':rotate 50 60:box:contv a\n" "subplot 2 2 1:title 'manual levels':rotate 50 60:box:contv v a\n" "subplot 2 2 2:title '\"\\_\" style':rotate 50 60:box:contv a '_'\n" -"subplot 2 2 3:title 'ContV and ContF':rotate 50 60:light on:box\ncontv a:contf a:cont a 'k'\n"; +"subplot 2 2 3:title 'ContV and ContF':rotate 50 60:light on:box\ncontv a:contf a:cont a 'k'"; void smgl_contv(mglGraph *gr) { mglData a,v(5); mgls_prepare2d(&a); v.a[0]=-0.5; @@ -1620,7 +1547,7 @@ void smgl_contv(mglGraph *gr) const char *mmgl_torus="call 'prepare1d'\nsubplot 2 2 0:title 'Torus plot (default)':light on:rotate 50 60:box:torus y1 y2\n" "subplot 2 2 1:title '\"x\" style':light on:rotate 50 60:box:torus y1 y2 'x'\n" "subplot 2 2 2:title '\"z\" style':light on:rotate 50 60:box:torus y1 y2 'z'\n" -"subplot 2 2 3:title '\"\\#\" style':light on:rotate 50 60:box:torus y1 y2 '#'\n"; +"subplot 2 2 3:title '\"\\#\" style':light on:rotate 50 60:box:torus y1 y2 '#'"; void smgl_torus(mglGraph *gr) { mglData y1,y2; mgls_prepare1d(0,&y1,&y2); @@ -1635,7 +1562,7 @@ void smgl_torus(mglGraph *gr) const char *mmgl_axial="call 'prepare2d'\nsubplot 2 2 0:title 'Axial plot (default)':light on:alpha on:rotate 50 60:box:axial a\n" "subplot 2 2 1:title '\"x\" style;\".\" style':light on:rotate 50 60:box:axial a 'x.'\n" "subplot 2 2 2:title '\"z\" style':light on:rotate 50 60:box:axial a 'z'\n" -"subplot 2 2 3:title '\"\\#\" style':light on:rotate 50 60:box:axial a '#'\n"; +"subplot 2 2 3:title '\"\\#\" style':light on:rotate 50 60:box:axial a '#'"; void smgl_axial(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -1648,7 +1575,7 @@ void smgl_axial(mglGraph *gr) } //----------------------------------------------------------------------------- const char *mmgl_several_light="call 'prepare2d'\ntitle 'Several light sources':rotate 50 60:light on\n" -"light 1 0 1 0 'c':light 2 1 0 0 'y':light 3 0 -1 0 'm'\nbox:surf a 'h'\n"; +"light 1 0 1 0 'c':light 2 1 0 0 'y':light 3 0 -1 0 'm'\nbox:surf a 'h'"; void smgl_several_light(mglGraph *gr) // several light sources { mglData a; mgls_prepare2d(&a); @@ -1666,7 +1593,7 @@ const char *mmgl_light="light on:quality 6\ncall 'prepare2d'\n" "line 1 0 1 -1 -1 0 'BAO'\n\n" "diffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0\n" "subplot 2 2 3:title 'diffusive only':rotate 50 60:box:surf a\n" -"line 1 0 1 -1 -1 0 'BAO'\n"; +"line 1 0 1 -1 -1 0 'BAO'"; void smgl_light(mglGraph *gr) // local light sources { mglData a; mgls_prepare2d(&a); @@ -1692,7 +1619,7 @@ void smgl_light(mglGraph *gr) // local light sources const char *mmgl_surf3="call 'prepare3d'\nlight on:alpha on\n" "subplot 2 2 0:title 'Surf3 plot (default)'\nrotate 50 60:box:surf3 c\n" "subplot 2 2 1:title '\"\\#\" style'\nrotate 50 60:box:surf3 c '#'\n" -"subplot 2 2 2:title '\".\" style'\nrotate 50 60:box:surf3 c '.'\n"; +"subplot 2 2 2:title '\".\" style'\nrotate 50 60:box:surf3 c '.'"; void smgl_surf3(mglGraph *gr) { mglData c; mgls_prepare3d(&c); @@ -1744,7 +1671,7 @@ void smgl_cut(mglGraph *gr) // cutting gr->Box(); gr->Surf3(c); gr->CutOff(""); // switch it off } //----------------------------------------------------------------------------- -const char *mmgl_traj="call 'prepare1d'\nsubplot 1 1 0 '':title 'Traj plot':box:plot x1 y:traj x1 y y1 y2\n"; +const char *mmgl_traj="call 'prepare1d'\nsubplot 1 1 0 '':title 'Traj plot':box:plot x1 y:traj x1 y y1 y2"; void smgl_traj(mglGraph *gr) { mglData x,y,y1,y2; mgls_prepare1d(&y,&y1,&y2,&x); @@ -1752,7 +1679,7 @@ void smgl_traj(mglGraph *gr) gr->Box(); gr->Plot(x,y); gr->Traj(x,y,y1,y2); } //----------------------------------------------------------------------------- -const char *mmgl_mesh="call 'prepare2d'\ntitle 'Mesh plot':rotate 50 60:box:mesh a\n"; +const char *mmgl_mesh="call 'prepare2d'\ntitle 'Mesh plot':rotate 50 60:box:mesh a"; void smgl_mesh(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -1760,7 +1687,7 @@ void smgl_mesh(mglGraph *gr) gr->Rotate(50,60); gr->Box(); gr->Mesh(a); } //----------------------------------------------------------------------------- -const char *mmgl_fall="call 'prepare2d'\ntitle 'Fall plot':rotate 50 60:box:fall a\n"; +const char *mmgl_fall="call 'prepare2d'\ntitle 'Fall plot':rotate 50 60:box:fall a"; void smgl_fall(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -1772,7 +1699,7 @@ const char *mmgl_surf="call 'prepare2d'\nsubplot 2 2 0:title 'Surf plot (default "subplot 2 2 1:title '\"\\#\" style; meshnum 10':rotate 50 60:box:surf a '#'; meshnum 10\n" "subplot 2 2 2:title '\".\" style':rotate 50 60:box:surf a '.'\n" "new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)'\nnew y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)'\nnew z 50 40 '0.8*cos(pi*(y+1)/2)'\n" -"subplot 2 2 3:title 'parametric form':rotate 50 60:box:surf x y z 'BbwrR'\n"; +"subplot 2 2 3:title 'parametric form':rotate 50 60:box:surf x y z 'BbwrR'"; void smgl_surf(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -1814,7 +1741,7 @@ void smgl_parser(mglGraph *gr) // example of MGL parsing delete parser; } //----------------------------------------------------------------------------- -const char *mmgl_belt="call 'prepare2d'\ntitle 'Belt plot':rotate 50 60:box:belt a\n"; +const char *mmgl_belt="call 'prepare2d'\ntitle 'Belt plot':rotate 50 60:box:belt a"; void smgl_belt(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -1826,7 +1753,7 @@ const char *mmgl_dens="call 'prepare2d'\nnew a1 30 40 3 '0.6*sin(2*pi*x+pi*(z+1) "subplot 2 2 0 '':title 'Dens plot (default)':box:dens a\n" "subplot 2 2 1:title '3d variant':rotate 50 60:box:dens a\n" "subplot 2 2 2 '':title '\"\\#\" style; meshnum 10':box:dens a '#'; meshnum 10\n" -"subplot 2 2 3:title 'several slices':rotate 50 60:box:dens a1\n"; +"subplot 2 2 3:title 'several slices':rotate 50 60:box:dens a1"; void smgl_dens(mglGraph *gr) { mglData a,a1(30,40,3); mgls_prepare2d(&a); @@ -1842,7 +1769,7 @@ void smgl_dens(mglGraph *gr) gr->Rotate(50,60); gr->Box(); gr->Dens(a1); } //----------------------------------------------------------------------------- -const char *mmgl_surfc="call 'prepare2d'\ntitle 'SurfC plot':rotate 50 60:light on:box:surfc a b\n"; +const char *mmgl_surfc="call 'prepare2d'\ntitle 'SurfC plot':rotate 50 60:light on:box:surfc a b"; void smgl_surfc(mglGraph *gr) { mglData a,b; mgls_prepare2d(&a,&b); @@ -1850,7 +1777,7 @@ void smgl_surfc(mglGraph *gr) gr->Light(true); gr->Box(); gr->SurfC(a,b); } //----------------------------------------------------------------------------- -const char *mmgl_surfa="call 'prepare2d'\ntitle 'SurfA plot':rotate 50 60:light on:alpha on:box:surfa a b\n"; +const char *mmgl_surfa="call 'prepare2d'\ntitle 'SurfA plot':rotate 50 60:light on:alpha on:box:surfa a b"; void smgl_surfa(mglGraph *gr) { mglData a,b; mgls_prepare2d(&a,&b); @@ -1858,7 +1785,7 @@ void smgl_surfa(mglGraph *gr) gr->Alpha(true); gr->Light(true); gr->Box(); gr->SurfA(a,b); } //----------------------------------------------------------------------------- -const char *mmgl_tile="call 'prepare2d'\ntitle 'Tile plot':rotate 50 60:box:tile a\n"; +const char *mmgl_tile="call 'prepare2d'\ntitle 'Tile plot':rotate 50 60:box:tile a"; void smgl_tile(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -1866,7 +1793,7 @@ void smgl_tile(mglGraph *gr) gr->Rotate(40,60); gr->Box(); gr->Tile(a); } //----------------------------------------------------------------------------- -const char *mmgl_tiles="call 'prepare2d'\nsubplot 1 1 0 '':title 'Tiles plot':box:tiles a b\n"; +const char *mmgl_tiles="call 'prepare2d'\nsubplot 1 1 0 '':title 'Tiles plot':box:tiles a b"; void smgl_tiles(mglGraph *gr) { mglData a,b; mgls_prepare2d(&a,&b); @@ -1877,7 +1804,7 @@ void smgl_tiles(mglGraph *gr) const char *mmgl_boxs="call 'prepare2d'\norigin 0 0 0\nsubplot 2 2 0:title 'Boxs plot (default)':rotate 40 60:light on:box:boxs a\n" "subplot 2 2 1:title '\"\\@\" style':rotate 50 60:box:boxs a '@'\n" "subplot 2 2 2:title '\"\\#\" style':rotate 50 60:box:boxs a '#'\n" -"subplot 2 2 3:title 'compare with Tile':rotate 50 60:box:tile a\n"; +"subplot 2 2 3:title 'compare with Tile':rotate 50 60:box:tile a"; void smgl_boxs(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -1895,9 +1822,9 @@ void smgl_boxs(mglGraph *gr) //----------------------------------------------------------------------------- const char *mmgl_fit="new rnd 100 '0.4*rnd+0.1+sin(2*pi*x)'\nnew in 100 '0.3+sin(2*pi*x)'\n" "list ini 1 1 3:fit res rnd 'a+b*sin(c*x)' 'abc' ini\n" -"title 'Fitting sample':yrange -2 2:box:axis:plot rnd '. '\n" +"title 'Fitting sample':yrange -2 2:box:axis:plot rnd 'k. '\n" "plot res 'r':plot in 'b'\ntext -0.9 -1.3 'fitted:' 'r:L'\n" -"putsfit 0 -1.8 'y = ' 'r':text 0 2.2 'initial: y = 0.3+sin(2\\pi x)' 'b'\n"; +"putsfit 0 -1.8 'y = ' 'r':text 0 2.2 'initial: y = 0.3+sin(2\\pi x)' 'b'"; void smgl_fit(mglGraph *gr) // nonlinear fitting { mglData rnd(100), in(100), res; @@ -1907,7 +1834,7 @@ void smgl_fit(mglGraph *gr) // nonlinear fitting mglData Ini(3,ini); res = gr->Fit(rnd, "a+b*sin(c*x)", "abc", Ini); if(big!=3) gr->Title("Fitting sample"); - gr->SetRange('y',-2,2); gr->Box(); gr->Plot(rnd, ". "); + gr->SetRange('y',-2,2); gr->Box(); gr->Plot(rnd, "k. "); gr->Axis(); gr->Plot(res, "r"); gr->Plot(in, "b"); gr->Puts(mglPoint(-0.9, -1.3), "fitted:", "r:L"); gr->PutsFit(mglPoint(0, -1.8), "y = ", "r"); @@ -1919,7 +1846,7 @@ const char *mmgl_vecta="call 'prepare3v'\nsubplot 2 1 0:title 'Vect3 sample':rot "origin 0 0 0:box:axis '_xyz'\nvect3 ex ey ez 'x':vect3 ex ey ez:vect3 ex ey ez 'z'\n" "subplot 2 1 1:title '\"f\" style':rotate 50 60\n" "origin 0 0 0:box:axis '_xyz'\nvect3 ex ey ez 'fx':vect3 ex ey ez 'f':vect3 ex ey ez 'fz'\n" -"grid3 ex 'Wx':grid3 ex 'W':grid3 ex 'Wz'\n"; +"grid3 ex 'Wx':grid3 ex 'W':grid3 ex 'Wz'"; void smgl_vecta(mglGraph *gr) { mglData ex,ey,ez; mgls_prepare3v(&ex,&ey,&ez); @@ -1938,7 +1865,7 @@ const char *mmgl_vect="call 'prepare2v'\ncall 'prepare3v'\nsubplot 3 2 0 '':titl "subplot 3 2 2 '':title '\"f\" style':box:vect a b 'f'\n" "subplot 3 2 3 '':title '\">\" style':box:vect a b '>'\n" "subplot 3 2 4 '':title '\"<\" style':box:vect a b '<'\n" -"subplot 3 2 5:title '3d variant':rotate 50 60:box:vect ex ey ez\n"; +"subplot 3 2 5:title '3d variant':rotate 50 60:box:vect ex ey ez"; void smgl_vect(mglGraph *gr) { mglData a,b; mgls_prepare2v(&a,&b); @@ -1957,7 +1884,7 @@ void smgl_vect(mglGraph *gr) const char *mmgl_flow="call 'prepare2v'\ncall 'prepare3v'\nsubplot 2 2 0 '':title 'Flow plot (default)':box:flow a b\n" "subplot 2 2 1 '':title '\"v\" style':box:flow a b 'v'\n" "subplot 2 2 2 '':title 'from edges only':box:flow a b '#'\n" -"subplot 2 2 3:title '3d variant':rotate 50 60:box:flow ex ey ez\n"; +"subplot 2 2 3:title '3d variant':rotate 50 60:box:flow ex ey ez"; void smgl_flow(mglGraph *gr) { mglData a,b; mgls_prepare2v(&a,&b); @@ -1974,7 +1901,7 @@ void smgl_flow(mglGraph *gr) const char *mmgl_pipe="call 'prepare2v'\ncall 'prepare3v'\nsubplot 2 2 0 '':title 'Pipe plot (default)':light on:box:pipe a b\n" "subplot 2 2 1 '':title '\"i\" style':box:pipe a b 'i'\n" "subplot 2 2 2 '':title 'from edges only':box:pipe a b '#'\n" -"subplot 2 2 3:title '3d variant':rotate 50 60:box:pipe ex ey ez '' 0.1\n"; +"subplot 2 2 3:title '3d variant':rotate 50 60:box:pipe ex ey ez '' 0.1"; void smgl_pipe(mglGraph *gr) { mglData a,b; mgls_prepare2v(&a,&b); @@ -1988,7 +1915,7 @@ void smgl_pipe(mglGraph *gr) gr->Box(); gr->Pipe(ex,ey,ez,"",0.1); } //----------------------------------------------------------------------------- -const char *mmgl_dew="call 'prepare2v'\nsubplot 1 1 0 '':title 'Dew plot':light on:box:dew a b\n"; +const char *mmgl_dew="call 'prepare2v'\nsubplot 1 1 0 '':title 'Dew plot':light on:box:dew a b"; void smgl_dew(mglGraph *gr) { mglData a,b; mgls_prepare2v(&a,&b); @@ -1996,7 +1923,7 @@ void smgl_dew(mglGraph *gr) gr->Box(); gr->Light(true); gr->Dew(a,b); } //----------------------------------------------------------------------------- -const char *mmgl_grad="call 'prepare2d'\nsubplot 1 1 0 '':title 'Grad plot':box:grad a:dens a '{u8}w{q8}'\n"; +const char *mmgl_grad="call 'prepare2d'\nsubplot 1 1 0 '':title 'Grad plot':box:grad a:dens a '{u8}w{q8}'"; void smgl_grad(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -2010,7 +1937,7 @@ const char *mmgl_cones="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd'\nlight on "subplot 3 2 2:title '\"\\#\" style':rotate 50 60:box:cones ys '#'\n" "subplot 3 2 3:title '\"a\" style':rotate 50 60:zrange -2 2:box:cones ys 'a'\n" "subplot 3 2 4:title '\"t\" style':rotate 50 60:box:cones ys 't'\n" -"subplot 3 2 5:title '\"4\" style':rotate 50 60:box:cones ys '4'\n"; +"subplot 3 2 5:title '\"4\" style':rotate 50 60:box:cones ys '4'"; void smgl_cones(mglGraph *gr) { mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); @@ -2033,7 +1960,7 @@ void smgl_cones(mglGraph *gr) //----------------------------------------------------------------------------- const char *mmgl_aspect="subplot 2 2 0:box:text -1 1.1 'Just box' ':L'\ninplot 0.2 0.5 0.7 1 off:box:text 0 1.2 'InPlot example'\n" "subplot 2 2 1:title 'Rotate only':rotate 50 60:box\nsubplot 2 2 2:title 'Rotate and Aspect':rotate 50 60:aspect 1 1 2:box\n" -"subplot 2 2 3:title 'Aspect in other direction':rotate 50 60:aspect 1 2 2:box\n"; +"subplot 2 2 3:title 'Aspect in other direction':rotate 50 60:aspect 1 2 2:box"; void smgl_aspect(mglGraph *gr) // transformation { gr->SubPlot(2,2,0); gr->Box(); @@ -2055,7 +1982,7 @@ const char *mmgl_inplot="subplot 3 2 0:title 'StickPlot'\nstickplot 3 0 20 30:bo "subplot 3 2 4 '':title 'GridPlot'\ngridplot 2 2 0:box 'r':text 0 0 '0' 'r'\n" "gridplot 2 2 1:box 'g':text 0 0 '1' 'g'\ngridplot 2 2 2:box 'b':text 0 0 '2' 'b'\n" "gridplot 2 2 3:box 'm':text 0 0 '3' 'm'\nsubplot 3 2 5 '':title 'InPlot':box\n" -"inplot 0.4 1 0.6 1 on:box 'r'\nmultiplot 3 2 1 2 1 '':title 'MultiPlot':box\n"; +"inplot 0.4 1 0.6 1 on:box 'r'\nmultiplot 3 2 1 2 1 '':title 'MultiPlot':box"; void smgl_inplot(mglGraph *gr) { gr->SubPlot(3,2,0); gr->Title("StickPlot"); @@ -2081,7 +2008,7 @@ const char *mmgl_combined="call 'prepare2v'\ncall 'prepare3d'\nnew v 10:fill v - "subplot 2 2 1 '':title 'Flow + Dens':light off:box:flow a b 'br':dens d\n" "subplot 2 2 2:title 'Mesh + Cont':rotate 50 60:box:mesh a:cont a '_'\n" "subplot 2 2 3:title 'Surf3 + ContF3':rotate 50 60:light on\n" -"box:contf3 v c 'z' 0:contf3 v c 'x':contf3 v c\ncut 0 -1 -1 1 0 1.1\ncontf3 v c 'z' c.nz-1:surf3 c -0.5\n"; +"box:contf3 v c 'z' 0:contf3 v c 'x':contf3 v c\ncut 0 -1 -1 1 0 1.1\ncontf3 v c 'z' c.nz-1:surf3 c -0.5"; void smgl_combined(mglGraph *gr) // flow threads and density plot { mglData a,b,d; mgls_prepare2v(&a,&b); d = a; @@ -2109,7 +2036,7 @@ const char *mmgl_axis="subplot 2 2 0:title 'Axis origin, Grid':origin 0 0:axis:g "inplot 0.5 1 0.5 1 on:ranges 0 10 0 2:axis\nfplot 'sqrt(x/2)':xlabel 'W' 1:ylabel 'U' 1\n" "inplot 0 0.5 0.5 1 on:ranges 1 0 0 2:axis 'x':fplot 'sqrt(x)+x^3':xlabel '\\tau' 1\n" "inplot 0.5 1 0 0.5 on:ranges 0 10 4 0:axis 'y':fplot 'x/4':ylabel 'L' -1\n" -"inplot 0 0.5 0 0.5 on:ranges 1 0 4 0:fplot '4*x^2'\n"; +"inplot 0 0.5 0 0.5 on:ranges 1 0 4 0:fplot '4*x^2'"; void smgl_axis(mglGraph *gr) { gr->SubPlot(2,2,0); gr->Title("Axis origin, Grid"); gr->SetOrigin(0,0); @@ -2136,38 +2063,54 @@ void smgl_axis(mglGraph *gr) gr->InPlot(0,0.5,0,0.5); gr->SetRanges(1,0,4,0); gr->FPlot("4*x^2"); } //----------------------------------------------------------------------------- -const char *mmgl_ticks="subplot 3 2 0:title 'Usual axis':axis\n" -"subplot 3 2 1:title 'Too big/small range':ranges -1000 1000 0 0.001:axis\n" -"subplot 3 2 3:title 'Too narrow range':ranges 100 100.1 10 10.01:axis\n" -"subplot 3 2 4:title 'Disable ticks tuning':tuneticks off:axis\n" -"subplot 3 2 2:title 'Manual ticks':ranges -pi pi 0 2:\n" -"xtick -pi '\\pi' -pi/2 '-\\pi/2' 0 '0' 0.886 'x^*' pi/2 '\\pi/2' pi 'pi'\n" -"# or you can use:\n#list v -pi -pi/2 0 0.886 pi/2 pi:xtick v '-\\pi\\n-\\pi/2\\n{}0\\n{}x^*\\n\\pi/2\\n\\pi'\n" -"axis:grid:fplot '2*cos(x^2)^2' 'r2'\n" -"subplot 3 2 5:title 'Time ticks':xrange 0 3e5:ticktime 'x':axis\n"; +const char *mmgl_ticks="subplot 3 3 0:title 'Usual axis'\naxis\n\n" +"subplot 3 3 1:title 'Too big/small range'\nranges -1000 1000 0 0.001:axis\n\n" +"subplot 3 3 2:title 'LaTeX-like labels'\naxis 'F!'\n\n" +"subplot 3 3 3:title 'Too narrow range'\nranges 100 100.1 10 10.01:axis\n\n" +"subplot 3 3 4:title 'No tuning, manual \"+\"'\naxis '+!'\n" +"# for version <2.3 you can use\n#tuneticks off:axis\n\n" +"subplot 3 3 5:title 'Template for ticks'\nxtick 'xxx:%g':ytick 'y:%g'\naxis\n\n" +"xtick '':ytick '' # switch it off for other plots\n\n" +"subplot 3 3 6:title 'No tuning, higher precision'\naxis '!4'\n\n" +"subplot 3 3 7:title 'Manual ticks'\nranges -pi pi 0 2\n" +"xtick pi 3 '\\pi'\nxtick 0.886 'x^*' on # note this will disable subticks drawing\n" +"# or you can use\n#xtick -pi '\\pi' -pi/2 '-\\pi/2' 0 '0' 0.886 'x^*' pi/2 '\\pi/2' pi 'pi'\n" +"# or you can use\n#list v -pi -pi/2 0 0.886 pi/2 pi:xtick v '-\\pi\\n-\\pi/2\\n{}0\\n{}x^*\\n\\pi/2\\n\\pi'\n" +"axis:grid:fplot '2*cos(x^2)^2' 'r2'\n\n" +"subplot 3 3 8:title 'Time ticks'\nxrange 0 3e5:ticktime 'x':axis"; void smgl_ticks(mglGraph *gr) { - gr->SubPlot(3,2,0); gr->Title("Usual axis"); gr->Axis(); - gr->SubPlot(3,2,1); gr->Title("Too big/small range"); + gr->SubPlot(3,3,0); gr->Title("Usual axis"); gr->Axis(); + gr->SubPlot(3,3,1); gr->Title("Too big/small range"); gr->SetRanges(-1000,1000,0,0.001); gr->Axis(); - gr->SubPlot(3,2,3); gr->Title("Too narrow range"); + gr->SubPlot(3,3,2); gr->Title("LaTeX-like labels"); + gr->Axis("F!"); + gr->SubPlot(3,3,3); gr->Title("Too narrow range"); gr->SetRanges(100,100.1,10,10.01); gr->Axis(); - gr->SubPlot(3,2,4); gr->Title("Disable ticks tuning"); - gr->SetTuneTicks(0); gr->Axis(); - - gr->SubPlot(3,2,2); gr->Title("Manual ticks"); gr->SetRanges(-M_PI,M_PI, 0, 2); - double val[]={-M_PI, -M_PI/2, 0, 0.886, M_PI/2, M_PI}; - gr->SetTicksVal('x', mglData(6,val), "-\\pi\n-\\pi/2\n0\nx^*\n\\pi/2\n\\pi"); + gr->SubPlot(3,3,4); gr->Title("No tuning, manual '+'"); + // for version<2.3 you need first call gr->SetTuneTicks(0); + gr->Axis("+!"); + gr->SubPlot(3,3,5); gr->Title("Template for ticks"); + gr->SetTickTempl('x',"xxx:%g"); gr->SetTickTempl('y',"y:%g"); + gr->Axis(); + // now switch it off for other plots + gr->SetTickTempl('x',""); gr->SetTickTempl('y',""); + gr->SubPlot(3,3,6); gr->Title("No tuning, higher precision"); + gr->Axis("!4"); + gr->SubPlot(3,3,7); gr->Title("Manual ticks"); gr->SetRanges(-M_PI,M_PI, 0, 2); + gr->SetTicks('x',M_PI,0,0,"\\pi"); gr->AddTick('x',0.886,"x^*"); + // alternatively you can use following lines + //double val[]={-M_PI, -M_PI/2, 0, 0.886, M_PI/2, M_PI}; + //gr->SetTicksVal('x', mglData(6,val), "-\\pi\n-\\pi/2\n0\nx^*\n\\pi/2\n\\pi"); gr->Axis(); gr->Grid(); gr->FPlot("2*cos(x^2)^2", "r2"); - - gr->SubPlot(3,2,5); gr->Title("Time ticks"); gr->SetRange('x',0,3e5); + gr->SubPlot(3,3,8); gr->Title("Time ticks"); gr->SetRange('x',0,3e5); gr->SetTicksTime('x',0); gr->Axis(); } //----------------------------------------------------------------------------- const char *mmgl_box="subplot 2 2 0:title 'Box (default)':rotate 50 60:box\n" "subplot 2 2 1:title 'colored':rotate 50 60:box 'r'\n" "subplot 2 2 2:title 'with faces':rotate 50 60:box '@'\n" -"subplot 2 2 3:title 'both':rotate 50 60:box '@cm'\n"; +"subplot 2 2 3:title 'both':rotate 50 60:box '@cm'"; void smgl_box(mglGraph *gr) { gr->SubPlot(2,2,0); gr->Title("Box (default)"); gr->Rotate(50,60); gr->Box(); @@ -2179,17 +2122,17 @@ void smgl_box(mglGraph *gr) const char *mmgl_loglog="subplot 2 2 0 '<_':title 'Semi-log axis':ranges 0.01 100 -1 1:axis 'lg(x)' '' ''\n" "axis:grid 'xy' 'g':fplot 'sin(1/x)':xlabel 'x' 0:ylabel 'y = sin 1/x' 0\n" "subplot 2 2 1 '<_':title 'Log-log axis':ranges 0.01 100 0.1 100:axis 'lg(x)' 'lg(y)' ''\n" -"axis:fplot 'sqrt(1+x^2)':xlabel 'x' 0:ylabel 'y = \\sqrt{1+x^2}' 0\n" +"axis:grid '!' 'h=':grid:fplot 'sqrt(1+x^2)'\nxlabel 'x' 0:ylabel 'y = \\sqrt{1+x^2}' 0\n" "subplot 2 2 2 '<_':title 'Minus-log axis':ranges -100 -0.01 -100 -0.1:axis '-lg(-x)' '-lg(-y)' ''\n" "axis:fplot '-sqrt(1+x^2)':xlabel 'x' 0:ylabel 'y = -\\sqrt{1+x^2}' 0\n" "subplot 2 2 3 '<_':title 'Log-ticks':ranges 0.01 100 0 100:axis 'sqrt(x)' '' ''\n" -"axis:fplot 'x':xlabel 'x' 1:ylabel 'y = x' 0\n"; +"axis:fplot 'x':xlabel 'x' 1:ylabel 'y = x' 0"; void smgl_loglog(mglGraph *gr) // log-log axis { gr->SubPlot(2,2,0,"<_"); gr->Title("Semi-log axis"); gr->SetRanges(0.01,100,-1,1); gr->SetFunc("lg(x)",""); gr->Axis(); gr->Grid("xy","g"); gr->FPlot("sin(1/x)"); gr->Label('x',"x",0); gr->Label('y', "y = sin 1/x",0); gr->SubPlot(2,2,1,"<_"); gr->Title("Log-log axis"); gr->SetRanges(0.01,100,0.1,100); gr->SetFunc("lg(x)","lg(y)"); - gr->Axis(); gr->FPlot("sqrt(1+x^2)"); gr->Label('x',"x",0); gr->Label('y', "y = \\sqrt{1+x^2}",0); + gr->Axis(); gr->Grid("!","h="); gr->Grid(); gr->FPlot("sqrt(1+x^2)"); gr->Label('x',"x",0); gr->Label('y', "y = \\sqrt{1+x^2}",0); gr->SubPlot(2,2,2,"<_"); gr->Title("Minus-log axis"); gr->SetRanges(-100,-0.01,-100,-0.1); gr->SetFunc("-lg(-x)","-lg(-y)"); gr->Axis(); gr->FPlot("-sqrt(1+x^2)"); gr->Label('x',"x",0); gr->Label('y', "y = -\\sqrt{1+x^2}",0); gr->SubPlot(2,2,3,"<_"); gr->Title("Log-ticks"); gr->SetRanges(0.1,100,0,100); gr->SetFunc("sqrt(x)",""); @@ -2197,7 +2140,7 @@ void smgl_loglog(mglGraph *gr) // log-log axis } //----------------------------------------------------------------------------- const char *mmgl_venn="list x -0.3 0 0.3:list y 0.3 -0.3 0.3:list e 0.7 0.7 0.7\n" -"subplot 1 1 0:title 'Venn-like diagram'\ntransptype 1:alpha on:error x y e e '!rgb@#o'"; +"subplot 1 1 0:title 'Venn-like diagram'\ntransptype 1:alpha on:error x y e e '!rgb@#o';alpha 0.1"; void smgl_venn(mglGraph *gr) { double xx[3]={-0.3,0,0.3}, yy[3]={0.3,-0.3,0.3}, ee[3]={0.7,0.7,0.7}; @@ -2206,7 +2149,7 @@ void smgl_venn(mglGraph *gr) gr->SetTranspType(1); gr->Alpha(true); gr->Error(x,y,e,e,"!rgb@#o","alpha 0.1"); } //----------------------------------------------------------------------------- -const char *mmgl_stereo="call 'prepare2d'\nlight on\nsubplot 2 1 0:rotate 50 60+1:box:surf a\nsubplot 2 1 1:rotate 50 60-1:box:surf a\n"; +const char *mmgl_stereo="call 'prepare2d'\nlight on\nsubplot 2 1 0:rotate 50 60+1:box:surf a\nsubplot 2 1 1:rotate 50 60-1:box:surf a"; void smgl_stereo(mglGraph *gr) { mglData a; mgls_prepare2d(&a); @@ -2220,7 +2163,7 @@ void smgl_stereo(mglGraph *gr) const char *mmgl_hist="new x 10000 '2*rnd-1':new y 10000 '2*rnd-1':copy z exp(-6*(x^2+y^2))\n" "hist xx x z:norm xx 0 1:hist yy y z:norm yy 0 1\nmultiplot 3 3 3 2 2 '':ranges -1 1 -1 1 0 1:box:dots x y z 'wyrRk'\n" "multiplot 3 3 0 2 1 '':ranges -1 1 0 1:box:bars xx\nmultiplot 3 3 5 1 2 '':ranges 0 1 -1 1:box:barh yy\n" -"subplot 3 3 2:text 0.5 0.5 'Hist and\\n{}MultiPlot\\n{}sample' 'a' -3\n"; +"subplot 3 3 2:text 0.5 0.5 'Hist and\\n{}MultiPlot\\n{}sample' 'a' -3"; void smgl_hist(mglGraph *gr) { mglData x(10000), y(10000), z(10000); gr->Fill(x,"2*rnd-1"); gr->Fill(y,"2*rnd-1"); gr->Fill(z,"exp(-6*(v^2+w^2))",x,y); @@ -2250,7 +2193,7 @@ const char *mmgl_primitives="subplot 2 2 0 '':title 'Line, Curve, Rhomb, Ellipse "text -0.9 -1.1 'asp=0.33':drop -0.9 -0.7 0 1 0.5 'b' 0 0.33\n" "text -0.3 -1.1 'asp=0.67':drop -0.3 -0.7 0 1 0.5 'b' 0 0.67\n" "text 0.3 -1.1 'asp=1':drop 0.3 -0.7 0 1 0.5 'b' 0 1\n" -"text 0.9 -1.1 'asp=1.5':drop 0.9 -0.7 0 1 0.5 'b' 0 1.5\n"; +"text 0.9 -1.1 'asp=1.5':drop 0.9 -0.7 0 1 0.5 'b' 0 1.5"; void smgl_primitives(mglGraph *gr) // flag # { gr->SubPlot(2,2,0,""); gr->Title("Line, Curve, Rhomb, Ellipse","",-1.5); @@ -2303,7 +2246,7 @@ const char *mmgl_table="new ys 10 3 '0.8*sin(pi*(x+y/4+1.25))+0.2*rnd'\n" "subplot 2 2 1:title 'no borders, colored'\ntable ys 'y_1\\n{}y_2\\n{}y_3' 'r|'\n\n" "subplot 2 2 2:title 'no font decrease'\ntable ys 'y_1\\n{}y_2\\n{}y_3' '#'\n\n" "subplot 2 2 3:title 'manual width and position':box\n" -"table 0.5 0.95 ys 'y_1\\n{}y_2\\n{}y_3' '#';value 0.7\n"; +"table 0.5 0.95 ys 'y_1\\n{}y_2\\n{}y_3' '#';value 0.7"; void smgl_table(mglGraph *gr) { mglData ys(10,3); ys.Modify("0.8*sin(pi*(2*x+y/2))+0.2*rnd"); @@ -2319,7 +2262,7 @@ void smgl_table(mglGraph *gr) } //----------------------------------------------------------------------------- const char *mmgl_label="new ys 10 '0.2*rnd-0.8*sin(pi*x)'\n" -"subplot 1 1 0 '':title 'Label plot':box:plot ys ' *':label ys 'y=%y'\n"; +"subplot 1 1 0 '':title 'Label plot':box:plot ys ' *':label ys 'y=%y'"; void smgl_label(mglGraph *gr) { mglData ys(10); ys.Modify("0.8*sin(pi*2*x)+0.2*rnd"); @@ -2336,7 +2279,7 @@ const char *mmgl_colorbar="call 'prepare2d'\nnew v 9 'x'\nsubplot 2 2 0:title 'C "subplot 2 2 3:title '':text -0.5 1.55 'Color positions' ':C' -2\n" "colorbar 'bwr>' 0.25 0:text -0.9 1.2 'Default'\n" "colorbar 'b{w,0.3}r>' 0.5 0:text -0.1 1.2 'Manual'\ncrange 0.01 1e3\n" -"colorbar '>' 0.75 0:text 0.65 1.2 'Normal scale':colorbar '>':text 1.35 1.2 'Log scale'\n"; +"colorbar '>' 0.75 0:text 0.65 1.2 'Normal scale':colorbar '>':text 1.35 1.2 'Log scale'"; void smgl_colorbar(mglGraph *gr) { gr->SubPlot(2,2,0); gr->Title("Colorbar out of box"); gr->Box(); @@ -2367,7 +2310,7 @@ const char *mmgl_legend="addlegend 'sin(\\pi {x^2})' 'b':addlegend 'sin(\\pi x)' "subplot 2 2 2 '':title 'coloring':box:legend 0 'r#':legend 1 'Wb#':legend 2 'ygr#'\n" "subplot 2 2 3 '':title 'manual position':box\n" "legend 0.5 1:text 0.5 0.55 'at x=0.5, y=1' 'a'\n" -"legend 1 '#-':text 0.75 0.25 'Horizontal legend' 'a'\n"; +"legend 1 '#-':text 0.75 0.25 'Horizontal legend' 'a'"; void smgl_legend(mglGraph *gr) { gr->AddLegend("sin(\\pi {x^2})","b"); @@ -2393,7 +2336,7 @@ const char *mmgl_dat_diff="ranges 0 1 0 1 0 1:new a 30 40 'x*y'\n" "subplot 2 2 0:title 'a(x,y)':rotate 60 40:surf a:box\n" "subplot 2 2 1:title 'da/dx':rotate 60 40:diff a 'x':surf a:box\n" "subplot 2 2 2:title '\\int da/dx dxdy':rotate 60 40:integrate a 'xy':surf a:box\n" -"subplot 2 2 3:title '\\int {d^2}a/dxdy dx':rotate 60 40:diff2 a 'y':surf a:box\n"; +"subplot 2 2 3:title '\\int {d^2}a/dxdy dx':rotate 60 40:diff2 a 'y':surf a:box"; void smgl_dat_diff(mglGraph *gr) // differentiate { gr->SetRanges(0,1,0,1,0,1); @@ -2416,7 +2359,7 @@ const char *mmgl_dat_extra="subplot 2 2 0 '':title 'Envelop sample':new d1 1000 "subplot 2 2 2:title 'Sew sample':rotate 50 60:light on:alpha on\nnew d2 100 100 'mod((y^2-(1-x)^2)/2,0.1)'\n" "box:surf d2 'b':sew d2 'xy' 0.1:surf d2 'r'\n" "subplot 2 2 3:title 'Resize sample (interpolation)'\nnew x0 10 'rnd':new v0 10 'rnd'\n" -"resize x1 x0 100:resize v1 v0 100\nplot x0 v0 'b+ ':plot x1 v1 'r-':label x0 v0 '%n'\n"; +"resize x1 x0 100:resize v1 v0 100\nplot x0 v0 'b+ ':plot x1 v1 'r-':label x0 v0 '%n'"; void smgl_dat_extra(mglGraph *gr) // differentiate { gr->SubPlot(2,2,0,""); gr->Title("Envelop sample"); @@ -2463,7 +2406,7 @@ const char *mmgl_ternary="ranges 0 1 0 1 0 1\nnew x 50 '0.25*(1+cos(2*pi*x))'\n" "subplot 2 2 2:title 'Quaternary axis 3D':rotate 50 60:ternary 2\nbox:axis:grid 'xyz' 'B;'\n" "plot x y z 'r2':surf a '#'\nxlabel 'B':ylabel 'C':tlabel 'A':zlabel 'D'\n\n" "subplot 2 2 3:title 'Ternary axis 3D':rotate 50 60:ternary 1\nbox:axis:grid 'xyz' 'B;'\n" -"plot x y z 'r2':surf a '#'\nxlabel 'B':ylabel 'C':tlabel 'A':zlabel 'Z'\n"; +"plot x y z 'r2':surf a '#'\nxlabel 'B':ylabel 'C':tlabel 'A':zlabel 'Z'"; void smgl_ternary(mglGraph *gr) // flag # { gr->SetRanges(0,1,0,1,0,1); @@ -2508,7 +2451,7 @@ const char *mmgl_projection="ranges 0 1 0 1 0 1\nnew x 50 '0.25*(1+cos(2*pi*x))' "new y 50 '0.25*(1+sin(2*pi*x))'\nnew z 50 'x'\nnew a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)'\n" "new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx\nlight on\n\n" "title 'Projection sample':ternary 4:rotate 50 60\nbox:axis:grid\n" -"plot x y z 'r2':surf a '#'\nxlabel 'X':ylabel 'Y':zlabel 'Z'\n"; +"plot x y z 'r2':surf a '#'\nxlabel 'X':ylabel 'Y':zlabel 'Z'"; void smgl_projection(mglGraph *gr) // flag # { gr->SetRanges(0,1,0,1,0,1); @@ -2531,7 +2474,7 @@ const char *mmgl_projection5="ranges 0 1 0 1 0 1\nnew x 50 '0.25*(1+cos(2*pi*x)) "new y 50 '0.25*(1+sin(2*pi*x))'\nnew z 50 'x'\nnew a 20 30 '30*x*y*(1-x-y)^2*(x+y<1)'\n" "new rx 10 'rnd':new ry 10:fill ry '(1-v)*rnd' rx\nlight on\n\n" "title 'Projection sample (ternary)':ternary 5:rotate 50 60\nbox:axis:grid\n" -"plot x y z 'r2':surf a '#'\nxlabel 'X':ylabel 'Y':zlabel 'Z'\n"; +"plot x y z 'r2':surf a '#'\nxlabel 'X':ylabel 'Y':zlabel 'Z'"; void smgl_projection5(mglGraph *gr) // flag # { gr->SetRanges(0,1,0,1,0,1); @@ -2561,7 +2504,7 @@ const char *mmgl_triplot="list q 0 1 2 3 | 4 5 6 7 | 0 2 4 6 | 1 3 5 7 | 0 4 1 5 "subplot 2 2 1:title 'TriPlot sample':rotate 50 60\n" "triplot t xt yt zt 'b'\ntriplot t xt yt zt '#k'\n" "subplot 2 2 3:title 'TriPlot coloring':rotate 50 60\n" -"triplot t xt yt zt yt 'cb'\ntriplot t xt yt zt '#k'\ntricont t xt yt zt 'B'\n"; +"triplot t xt yt zt yt 'cb'\ntriplot t xt yt zt '#k'\ntricont t xt yt zt 'B'"; void smgl_triplot(mglGraph *gr) { double q[] = {0,1,2,3, 4,5,6,7, 0,2,4,6, 1,3,5,7, 0,4,1,5, 2,6,3,7}; @@ -2587,22 +2530,31 @@ void smgl_triplot(mglGraph *gr) gr->TriCont(tt,uu,vv,ww,"B"); } //----------------------------------------------------------------------------- -const char *mmgl_dots="new t 1000 'pi*(rnd-0.5)':new f 1000 '2*pi*rnd'\n" -"copy x 0.9*cos(t)*cos(f):copy y 0.9*cos(t)*sin(f):copy z 0.6*sin(t)\n" -"title 'Dots sample':rotate 50 60\nbox:dots x y z\n"; +const char *mmgl_dots="new t 2000 'pi*(rnd-0.5)':new f 2000 '2*pi*rnd'\n" +"copy x 0.9*cos(t)*cos(f):copy y 0.9*cos(t)*sin(f):copy z 0.6*sin(t):copy c cos(2*t)\n" +"subplot 2 2 0:title 'Dots sample':rotate 50 60\nbox:dots x y z\nalpha on\n" +"subplot 2 2 1:title 'add transparency':rotate 50 60\nbox:dots x y z c\n" +"subplot 2 2 2:title 'add colorings':rotate 50 60\nbox:dots x y z x c\n" +"subplot 2 2 3:title 'Only coloring':rotate 50 60\nbox:tens x y z x ' .'"; void smgl_dots(mglGraph *gr) { int i, n=1000; - mglData x(n),y(n),z(n); + mglData x(n),y(n),z(n),c(n); for(i=0;iTitle("Dots sample"); + if(big!=3) { gr->SubPlot(2,2,0); gr->Title("Dots sample"); } gr->Rotate(50,60); gr->Box(); gr->Dots(x,y,z); + if(big==3) return; + gr->Alpha(true); + gr->SubPlot(2,2,1); gr->Title("add transparency"); gr->Rotate(50,60); gr->Box(); gr->Dots(x,y,z,c); + gr->SubPlot(2,2,2); gr->Title("add coloring"); gr->Rotate(50,60); gr->Box(); gr->Dots(x,y,z,x,c); + gr->SubPlot(2,2,3); gr->Title("Only coloring"); gr->Rotate(50,60); gr->Box(); gr->Tens(x,y,z,x," ."); } //----------------------------------------------------------------------------- /*void smgl_surf3_rgbd(mglGraph *gr) @@ -2621,7 +2573,7 @@ const char *mmgl_mirror="new a 31 41 '-pi*x*exp(-(y+1)^2-4*x^2)'\n" "surf a 'r';yrange 0 1; alpha 0.7:surf a 'b';yrange 0 -1; alpha 0.3\n" "subplot 2 2 3 '<_':title 'Option \"legend\"'\n" "fplot 'x^3' 'r'; legend 'y = x^3':fplot 'cos(pi*x)' 'b'; legend 'y = cos \\pi x'\n" -"box:axis:legend 2\n"; +"box:axis:legend 2"; void smgl_mirror(mglGraph *gr) // flag # { mglData a(31,41); @@ -2686,13 +2638,13 @@ mglSample samp[] = { {"error2", smgl_error2, mmgl_error2}, {"export", smgl_export, mmgl_export}, {"fall", smgl_fall, mmgl_fall}, - {"fexport", smgl_fexport, mmgl_fexport}, {"fit", smgl_fit, mmgl_fit}, {"flow", smgl_flow, mmgl_flow}, {"fog", smgl_fog, mmgl_fog}, {"fonts", smgl_fonts, mmgl_fonts}, {"grad", smgl_grad, mmgl_grad}, {"hist", smgl_hist, mmgl_hist}, + {"indirect",smgl_indirect,mmgl_indirect}, {"inplot", smgl_inplot, mmgl_inplot}, {"label", smgl_label, mmgl_label}, {"legend", smgl_legend, mmgl_legend }, @@ -2704,6 +2656,7 @@ mglSample samp[] = { {"mesh", smgl_mesh, mmgl_mesh}, {"mirror", smgl_mirror, mmgl_mirror }, {"molecule", smgl_molecule, mmgl_molecule }, + {"ode", smgl_ode, mmgl_ode}, {"ohlc", smgl_ohlc, mmgl_ohlc}, {"param1", smgl_param1, mmgl_param1}, {"param2", smgl_param2, mmgl_param2}, diff --git a/examples/wnd_samples.cpp b/examples/wnd_samples.cpp index 2839a9b..a2a69d1 100644 --- a/examples/wnd_samples.cpp +++ b/examples/wnd_samples.cpp @@ -431,7 +431,6 @@ void mgls_prepare1d(mglData *y, mglData *y1, mglData *y2, mglData *x1, mglData * if(y) y->Create(n,3); if(x1) x1->Create(n); if(x2) x2->Create(n); if(y1) y1->Create(n); if(y2) y2->Create(n); -#pragma omp parallel for for(long i=0;iCreate(n,m); if(b) b->Create(n,m); if(v) { v->Create(9); v->Fill(-1,1); } -#pragma omp parallel for collapse(2) for(long j=0;jCreate(n,m,l); if(b) b->Create(n,m,l); -#pragma omp parallel for collapse(3) for(long k=0;kCreate(n,m); if(b) b->Create(n,m); -#pragma omp parallel for collapse(2) for(long j=0;jCreate(n,n,n); ey->Create(n,n,n); ez->Create(n,n,n); -#pragma omp parallel for collapse(3) for(long k=0;ka[i0]=3*z; ey->a[i0]=1; ez->a[i0]=-3*x;*/ - double r1 = pow(x*x+y*y+(z-0.3)*(z-0.3)+0.03,1.5); - double r2 = pow(x*x+y*y+(z+0.3)*(z+0.3)+0.03,1.5); + double r1 = pow(x*x+y*y+(z-z0)*(z-z0)+0.03,1.5); + double r2 = pow(x*x+y*y+(z+z0)*(z+z0)+0.03,1.5); ex->a[i0]=0.2*x/r1 - 0.2*x/r2; ey->a[i0]=0.2*y/r1 - 0.2*y/r2; - ez->a[i0]=0.2*(z-0.3)/r1 - 0.2*(z+0.3)/r2; + ez->a[i0]=0.2*(z-z0)/r1 - 0.2*(z+z0)/r2; } } //----------------------------------------------------------------------------- diff --git a/include/config.h.in b/include/config.h.in index f5171a5..e048547 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -2,21 +2,30 @@ #define _MGL_CONFIG_H_ #define MGL_USE_DOUBLE ${MGL_USE_DOUBLE} -#define MGL_NO_DATA_A ${MGL_NO_DATA_A} #if defined(_MSC_VER) || defined(__BORLANDC__) +#define MGL_SYS_NAN 0 +#define MGL_HAVE_TYPEOF 0 #define MGL_HAVE_PTHREAD 0 +#define MGL_HAVE_ATTRIBUTE 0 +#define MGL_HAVE_C99_COMPLEX 0 #else +#define MGL_HAVE_TYPEOF ${MGL_HAVE_TYPEOF} +#define MGL_SYS_NAN ${MGL_HAVE_NAN_INF} #define MGL_HAVE_PTHREAD ${MGL_HAVE_PTHREAD} +#define MGL_HAVE_ATTRIBUTE ${MGL_HAVE_ATTRIBUTE} +#define MGL_HAVE_C99_COMPLEX ${MGL_HAVE_C99_COMPLEX} #endif + +#define MGL_HAVE_RVAL ${MGL_HAVE_RVAL} #define MGL_HAVE_ZLIB ${MGL_HAVE_ZLIB} -#define MGL_HAVE_PNG ${MGL_HAVE_PNG} -#define MGL_HAVE_GSL ${MGL_HAVE_GSL} +#define MGL_HAVE_PNG ${MGL_HAVE_PNG} +#define MGL_HAVE_GSL ${MGL_HAVE_GSL} #define MGL_HAVE_OPENGL ${MGL_HAVE_OPENGL} -#define MGL_HAVE_OMP ${MGL_HAVE_OMP} +#define MGL_HAVE_OMP ${MGL_HAVE_OMP} #define MGL_HAVE_JPEG ${MGL_HAVE_JPEG} -#define MGL_HAVE_GIF ${MGL_HAVE_GIF} -#define MGL_HAVE_PDF ${MGL_HAVE_PDF} +#define MGL_HAVE_GIF ${MGL_HAVE_GIF} +#define MGL_HAVE_PDF ${MGL_HAVE_PDF} #define MGL_HAVE_HDF4 ${MGL_HAVE_HDF4} #define MGL_HAVE_HDF5 ${MGL_HAVE_HDF5} #define MGL_FONT_PATH "${MGL_FONT_PATH}" diff --git a/include/mgl2/abstract.h b/include/mgl2/abstract.h index 90d8808..e9342a4 100644 --- a/include/mgl2/abstract.h +++ b/include/mgl2/abstract.h @@ -25,9 +25,11 @@ #ifdef __cplusplus #include #include "mgl2/type.h" +#define MGL_TO_WCS(str,code) if(str && *str){size_t s=mbstowcs(0,str,0); wchar_t *wcs=new wchar_t[s+1]; mbstowcs(wcs,str,s); wcs[s]=0; code; delete []wcs;}else{const wchar_t *wcs=L""; code;} //----------------------------------------------------------------------------- class mglBase; class mglData; +class mglDataA; class mglDataC; class mglParser; class mglFormula; @@ -39,12 +41,76 @@ typedef mglDataC* HADT; typedef mglParser* HMPR; typedef mglFormula* HMEX; typedef mglFormulaC* HAEX; -//----------------------------------------------------------------------------- -#if MGL_NO_DATA_A -#define mglDataA mglData -typedef const mglData* HCDT; -#include "mgl2/data.h" -#else +typedef const mglDataA* HCDT; +#ifdef __cplusplus +extern "C" { +#endif +/// Set name for data variable (can be used in mgl_formula_calc() or in MGL scripts) +void MGL_EXPORT mgl_data_set_name(mglDataA *dat, const char *name); +void MGL_EXPORT mgl_data_set_name_(uintptr_t *dat, const char *name,int); +void MGL_EXPORT mgl_data_set_name_w(mglDataA *dat, const wchar_t *name); +/// Set callback function which is called at deleting variable +void MGL_EXPORT mgl_data_set_func(mglDataA *dat, void (*func)(void *), void *par); + +/// Save whole data array (for ns=-1) or only ns-th slice to text file +void MGL_EXPORT mgl_data_save(HCDT dat, const char *fname,long ns); +void MGL_EXPORT mgl_data_save_(uintptr_t *dat, const char *fname,int *ns,int); +/// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme +void MGL_EXPORT mgl_data_export(HCDT dat, const char *fname, const char *scheme,mreal v1,mreal v2,long ns); +void MGL_EXPORT mgl_data_export_(uintptr_t *dat, const char *fname, const char *scheme,mreal *v1,mreal *v2,int *ns,int,int); +/// Save data to HDF file +void MGL_EXPORT mgl_data_save_hdf(HCDT d,const char *fname,const char *data,int rewrite); +void MGL_EXPORT mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n); +/// Get information about the data (sizes and momentum) to string +MGL_EXPORT const char *mgl_data_info(HCDT dat); +int MGL_EXPORT mgl_data_info_(uintptr_t *dat, char *out, int len); +/// Put HDF data names into buf as '\t' separated. +int MGL_EXPORT mgl_datas_hdf(const char *fname, char *buf, long size); +int MGL_EXPORT mgl_datas_hdf_(const char *fname, char *buf, int l, int size); + +/// Get maximal value of the data +mreal MGL_EXPORT mgl_data_max(HCDT dat); +mreal MGL_EXPORT mgl_data_max_(uintptr_t *dat); +/// Get maximal value of the data which is less than 0 +mreal MGL_EXPORT mgl_data_neg_max(HCDT dat); +mreal MGL_EXPORT mgl_data_neg_max_(uintptr_t *dat); +/// Get minimal value of the data +mreal MGL_EXPORT mgl_data_min(HCDT dat); +mreal MGL_EXPORT mgl_data_min_(uintptr_t *dat); +/// Get minimal value of the data which is larger than 0 +mreal MGL_EXPORT mgl_data_pos_min(HCDT dat); +mreal MGL_EXPORT mgl_data_pos_min_(uintptr_t *dat); +/// Find position (after specified in i,j,k) of first nonzero value of formula +mreal MGL_EXPORT mgl_data_first(HCDT dat, const char *cond, long *i, long *j, long *k); +mreal MGL_EXPORT mgl_data_first_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); +/// Find position (before specified in i,j,k) of last nonzero value of formula +mreal MGL_EXPORT mgl_data_last(HCDT dat, const char *cond, long *i, long *j, long *k); +mreal MGL_EXPORT mgl_data_last_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); +/// Find position of first in direction 'dir' nonzero value of formula +long MGL_EXPORT mgl_data_find(HCDT dat, const char *cond, char dir, long i, long j, long k); +int MGL_EXPORT mgl_data_find_(uintptr_t *dat, const char *cond, char *dir, int *i, int *j, int *k, int,int); +/// Find if any nonzero value of formula +int MGL_EXPORT mgl_data_find_any(HCDT dat, const char *cond); +int MGL_EXPORT mgl_data_find_any_(uintptr_t *dat, const char *cond, int); +/// Get maximal value of the data and its position +mreal MGL_EXPORT mgl_data_max_int(HCDT dat, long *i, long *j, long *k); +mreal MGL_EXPORT mgl_data_max_int_(uintptr_t *dat, int *i, int *j, int *k); +/// Get maximal value of the data and its approximated position +mreal MGL_EXPORT mgl_data_max_real(HCDT dat, mreal *x, mreal *y, mreal *z); +mreal MGL_EXPORT mgl_data_max_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z); +/// Get minimal value of the data and its position +mreal MGL_EXPORT mgl_data_min_int(HCDT dat, long *i, long *j, long *k); +mreal MGL_EXPORT mgl_data_min_int_(uintptr_t *dat, int *i, int *j, int *k); +/// Get minimal value of the data and its approximated position +mreal MGL_EXPORT mgl_data_min_real(HCDT dat, mreal *x, mreal *y, mreal *z); +mreal MGL_EXPORT mgl_data_min_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z); +/// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis +mreal MGL_EXPORT mgl_data_momentum_val(HCDT d, char dir, mreal *m, mreal *w, mreal *s, mreal *k); +mreal MGL_EXPORT mgl_data_momentum_val_(uintptr_t *dat, char *dir, mreal *m, mreal *w, mreal *s, mreal *k,int); + +#ifdef __cplusplus +} +#endif //----------------------------------------------------------------------------- /// Callback function for asking user a question. Result shouldn't exceed 1024. extern MGL_EXPORT void (*mgl_ask_func)(const wchar_t *quest, wchar_t *res); @@ -53,24 +119,85 @@ extern MGL_EXPORT void (*mgl_ask_func)(const wchar_t *quest, wchar_t *res); class MGL_EXPORT mglDataA { public: - virtual ~mglDataA() {} + std::wstring s; ///< Data name + bool temp; ///< This is temporary variable + void (*func)(void *); ///< Callback function for destroying + void *o; ///< Pointer to external object + + mglDataA() { temp=false; func=0; o=0; } + virtual ~mglDataA() { if(func) func(o); } + virtual void set_v(mreal val, long i,long j=0,long k=0) {} virtual mreal v(long i,long j=0,long k=0) const = 0; virtual mreal vthr(long i) const = 0; virtual long GetNx() const = 0; virtual long GetNy() const = 0; virtual long GetNz() const = 0; inline long GetNN() const { return GetNx()*GetNy()*GetNz(); } - virtual mreal Maximal() const = 0; - virtual mreal Minimal() const = 0; virtual mreal dvx(long i,long j=0,long k=0) const = 0; // { return i>0 ? (i0 ? (j0 ? (kjdD*^" correspondingly -extern uint64_t mgl_mask_val[16]; -#define MGL_MASK_ID "-+=;oOsS~<>jdD*^" -#define MGL_SOLID_MASK 0xffffffffffffffff -//----------------------------------------------------------------------------- #else +#define mglDataA void typedef void *HMGL; typedef void *HMDT; typedef void *HADT; @@ -96,7 +219,7 @@ typedef void *HMPR; typedef const void *HCDT; #endif -#if MGL_SRC +#ifdef MGL_SRC #define _Da_(d) (*((const mglDataA *)(d))) #define _DA_(a) ((const mglDataA *)*(a)) #define _GR_ ((mglBase *)(*gr)) diff --git a/include/mgl2/addon.h b/include/mgl2/addon.h index aeed679..b083469 100644 --- a/include/mgl2/addon.h +++ b/include/mgl2/addon.h @@ -40,16 +40,16 @@ void MGL_EXPORT mgl_fft_freq(double *freq,long nn); /// Remove double spaces from the string void MGL_EXPORT mgl_strcls(char *str); /// Get position of substring or return -1 if not found -int MGL_EXPORT mgl_strpos(const char *str,char *fnd); +int MGL_EXPORT_PURE mgl_strpos(const char *str,char *fnd); /// Get position of symbol or return -1 if not found -int MGL_EXPORT mgl_chrpos(const char *str,char fnd); +int MGL_EXPORT_PURE mgl_chrpos(const char *str,char fnd); /// Get uncommented string from file (NOTE: it is not thread safe!!!) MGL_EXPORT char *mgl_fgetstr(FILE *fp); /// Get parameters from uncommented strings of file (NOTE: it is not thread safe!!!) void MGL_EXPORT mgl_fgetpar(FILE *fp, const char *str, ...); /// Check if symbol denote true -int MGL_EXPORT mgl_istrue(char ch); +int MGL_EXPORT_CONST mgl_istrue(char ch); /// Print test message void MGL_EXPORT mgl_test(const char *str, ...); /// Print info message diff --git a/include/mgl2/base.h b/include/mgl2/base.h index 452e2c8..b3779ee 100644 --- a/include/mgl2/base.h +++ b/include/mgl2/base.h @@ -28,12 +28,10 @@ #if MGL_HAVE_PTHREAD #include -#define MGL_PUSH(a,v,m) {pthread_mutex_lock(&m); a.push_back(v); pthread_mutex_unlock(&m);} +#define MGL_PUSH(a,v,m) {pthread_mutex_lock(&m); a.push_back(v); pthread_mutex_unlock(&m);} #else -#define MGL_PUSH(a,v,m) a.push_back(v); +#define MGL_PUSH(a,v,m) a.push_back(v); #endif - -#define MGL_TO_WCS(str,code) if(str){size_t s=mbstowcs(0,str,0); wchar_t *wcs=new wchar_t[s+1]; mbstowcs(wcs,str,s); wcs[s]=0; code; delete []wcs;} //----------------------------------------------------------------------------- inline mreal mgl_d(mreal v,mreal v1,mreal v2) { return v2!=v1?(v-v1)/(v2-v1):NAN; } //----------------------------------------------------------------------------- @@ -41,6 +39,79 @@ mglPoint GetX(HCDT x, int i, int j, int k=0); mglPoint GetY(HCDT y, int i, int j, int k=0); mglPoint GetZ(HCDT z, int i, int j, int k=0); //----------------------------------------------------------------------------- +/// Class for replacement of std::vector +// NOTE memcpy is used --> no memory allocation in T +template class mglStack +{ + T** dat; + size_t pb; ///< size of buffer (real size is 2^pb == 1< &st) + { + np=st.np; dat = (T**)malloc(np*sizeof(T*)); + pb=st.pb; m=n=0; reserve(st.n); + for(size_t i=0;i(m<>pb); + if(num>np) + { dat = (T**)realloc(dat, num*sizeof(T*)); np=num; } + for(size_t i=m;i>pb; return dat[d][i-(d<>pb; return dat[d][i-(d<=(m<>pb; + dat[d][n-(d< &operator=(const mglStack &st) + { + pb=st.pb; clear(); reserve(st.n); + for(size_t i=0;i(const mglPrim &a,const mglPrim &b); @@ -90,7 +170,12 @@ struct MGL_EXPORT mglGroup std::vector p; ///< list of primitives (not filled!!!) int Id; ///< Current list of primitives std::string Lbl; ///< Group label - mglGroup(const char *lbl="", int id=0) { Lbl=lbl; Id=id; } + mglGroup(const char *lbl="", int id=0) : Id(id), Lbl(lbl) {} + mglGroup(const mglGroup &aa) : p(aa.p),Id(aa.Id),Lbl(aa.Lbl) {} +#if MGL_HAVE_RVAL + mglGroup(mglGroup &&aa) : p(aa.p),Id(aa.Id),Lbl(aa.Lbl) {} +#endif + inline const mglGroup &operator=(const mglGroup &aa) { Lbl = aa.Lbl; Id = aa.Id; p = aa.p; return aa; } }; //----------------------------------------------------------------------------- /// Structure for text label @@ -99,8 +184,13 @@ struct MGL_EXPORT mglText std::wstring text; std::string stl; mreal val; - mglText(const wchar_t *txt=L"", const char *fnt="", mreal v=0) { text=txt; stl=fnt; val=v; } - mglText(const std::wstring &txt, mreal v=0) { text=txt; val=v; } + mglText(const wchar_t *txt=L"", const char *fnt="", mreal v=0) : text(txt), stl(fnt), val(v) {} + mglText(const std::wstring &txt, mreal v=0): text(txt), val(v) {} + mglText(const mglText &aa) : text(aa.text),stl(aa.stl),val(aa.val) {} +#if MGL_HAVE_RVAL + mglText(mglText &&aa) : text(aa.text),stl(aa.stl),val(aa.val) {} +#endif + const mglText&operator=(const mglText &aa) { text=aa.text; stl=aa.stl; val=aa.val; return aa; } }; //----------------------------------------------------------------------------- /// Structure for internal point representation @@ -112,24 +202,21 @@ struct MGL_EXPORT mglPnt // NOTE: use float for reducing memory size float u,v,w; // normales float r,g,b,a; // RGBA color short sub; // subplot id and rotation information (later will be in subplot) - mglPnt() { xx=yy=zz=x=y=z=c=t=ta=u=v=w=r=g=b=a=sub=0; } + mglPnt(float X=0, float Y=0, float Z=0, float U=0, float V=0, float W=0, float R=0, float G=0, float B=0, float A=0):xx(X),yy(Y),zz(Z),x(X),y(Y),z(Z),c(0),t(0),ta(0),u(U),v(V),w(W),r(R),g(G),b(B),a(A),sub(0) {} + mglPnt(const mglPnt &aa) : xx(aa.xx),yy(aa.yy),zz(aa.zz), x(aa.x),y(aa.y),z(aa.z), c(aa.c),t(aa.t),ta(aa.ta), u(aa.u),v(aa.v),w(aa.w), r(aa.r),g(aa.g),b(aa.b),a(aa.a), sub(aa.sub) {} +#if MGL_HAVE_RVAL + mglPnt(mglPnt &&aa) : xx(aa.xx),yy(aa.yy),zz(aa.zz), x(aa.x),y(aa.y),z(aa.z), c(aa.c),t(aa.t),ta(aa.ta), u(aa.u),v(aa.v),w(aa.w), r(aa.r),g(aa.g),b(aa.b),a(aa.a), sub(aa.sub) {} +#endif + inline const mglPnt&operator=(const mglPnt &aa) { memcpy(this,&aa,sizeof(mglPnt)); return aa; } }; inline mglPnt operator+(const mglPnt &a, const mglPnt &b) -{ mglPnt c=a; - c.x+=b.x; c.y+=b.y; c.z+=b.z; c.u+=b.u; c.v+=b.v; c.w+=b.w; - c.r+=b.r; c.g+=b.g; c.b+=b.b; c.a+=b.a; return c; } +{ return mglPnt(a.x+b.x,a.y+b.y,a.z+b.z, a.u+b.u,a.v+b.v,a.w+b.w, a.r+b.r,a.g+b.g,a.b+b.b,a.a+b.a); } inline mglPnt operator-(const mglPnt &a, const mglPnt &b) -{ mglPnt c=a; - c.x-=b.x; c.y-=b.y; c.z-=b.z; c.u-=b.u; c.v-=b.v; c.w-=b.w; - c.r-=b.r; c.g-=b.g; c.b-=b.b; c.a-=b.a; return c; } +{ return mglPnt(a.x-b.x,a.y-b.y,a.z-b.z, a.u-b.u,a.v-b.v,a.w-b.w, a.r-b.r,a.g-b.g,a.b-b.b,a.a-b.a); } inline mglPnt operator*(const mglPnt &a, float b) -{ mglPnt c=a; - c.x*=b; c.y*=b; c.z*=b; c.u*=b; c.v*=b; c.w*=b; - c.r*=b; c.g*=b; c.b*=b; c.a*=b; return c; } +{ return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b); } inline mglPnt operator*(float b, const mglPnt &a) -{ mglPnt c=a; - c.x*=b; c.y*=b; c.z*=b; c.u*=b; c.v*=b; c.w*=b; - c.r*=b; c.g*=b; c.b*=b; c.a*=b; return c; } +{ return mglPnt(a.x*b,a.y*b,a.z*b, a.u*b,a.v*b,a.w*b, a.r*b,a.g*b,a.b*b,a.a*b); } //----------------------------------------------------------------------------- /// Structure for glyph representation struct MGL_EXPORT mglGlyph @@ -137,16 +224,20 @@ struct MGL_EXPORT mglGlyph long nt, nl; ///< number of triangles and lines short *trig, *line; ///< vertexes of triangles and lines - mglGlyph() { nl=nt=0; trig=line=0; } - mglGlyph(const mglGlyph &a) { nl=nt=0; trig=line=0; *this=a; } - mglGlyph(long Nt, long Nl) { nl=nt=0; trig=line=0; Create(Nt,Nl); } + mglGlyph():nt(0),nl(0),trig(0),line(0) {} + mglGlyph(const mglGlyph &a):nt(0),nl(0),trig(0),line(0) { *this=a; } + mglGlyph(long Nt, long Nl):nt(0),nl(0),trig(0),line(0) { Create(Nt,Nl); } +#if MGL_HAVE_RVAL + mglGlyph(mglGlyph &&aa) : nt(aa.nt),nl(aa.nl),trig(aa.trig), line(aa.line) { aa.trig=aa.line=0; } +#endif ~mglGlyph() { if(trig) delete []trig; if(line) delete []line; } void Create(long Nt, long Nl); - bool operator==(const mglGlyph &g); - inline mglGlyph &operator=(const mglGlyph &a) + bool operator==(const mglGlyph &g) MGL_FUNC_PURE; + inline bool operator!=(const mglGlyph &g) { return !(*this==g); } + inline const mglGlyph &operator=(const mglGlyph &a) { Create(a.nt, a.nl); memcpy(trig, a.trig, 6*nt*sizeof(short)); - memcpy(line, a.line, 2*nl*sizeof(short)); return *this; } + memcpy(line, a.line, 2*nl*sizeof(short)); return a; } }; //----------------------------------------------------------------------------- #define MGL_TEXTURE_COLOURS 512 @@ -160,19 +251,29 @@ struct MGL_EXPORT mglTexture int Smooth; ///< Type of texture (smoothing and so on) mreal Alpha; ///< Transparency - mglTexture() { n=Smooth=0; Alpha=1; } - mglTexture(const char *cols, int smooth=0,mreal alpha=1) - { n=0; Set(cols,smooth,alpha); } + mglTexture():n(0),Smooth(0),Alpha(1) {} + mglTexture(const char *cols, int smooth=0,mreal alpha=1):n(0) + { Set(cols,smooth,alpha); } + mglTexture(const mglTexture &aa) : n(aa.n),Smooth(aa.Smooth),Alpha(aa.Alpha) + { memcpy(col,aa.col,MGL_TEXTURE_COLOURS*sizeof(mglColor)); memcpy(Sch,aa.Sch,260); } +#if MGL_HAVE_RVAL + mglTexture(mglTexture &&aa) : n(aa.n),Smooth(aa.Smooth),Alpha(aa.Alpha) + { memcpy(col,aa.col,MGL_TEXTURE_COLOURS*sizeof(mglColor)); memcpy(Sch,aa.Sch,260); } +#endif void Clear() { n=0; } void Set(const char *cols, int smooth=0,mreal alpha=1); void Set(HCDT val, const char *cols); void GetC(mreal u,mreal v,mglPnt &p) const; - mglColor GetC(mreal u,mreal v=0) const; + mglColor GetC(mreal u,mreal v=0) const MGL_FUNC_PURE; inline bool IsSame(const mglTexture &t) const { return n==t.n && !memcmp(col,t.col,MGL_TEXTURE_COLOURS*sizeof(mglColor)); } void GetRGBA(unsigned char *f) const; void GetRGBAPRC(unsigned char *f) const; void GetRGBAOBJ(unsigned char *f) const; // Export repeating border colors, since OBJ by default wraps textures and we need an extra boundary to work around implementation quirks + inline const mglTexture &operator=(const mglTexture &aa) + { n=aa.n; Smooth=aa.Smooth; Alpha=aa.Alpha; + memcpy(col,aa.col,MGL_TEXTURE_COLOURS*sizeof(mglColor)); + memcpy(Sch,aa.Sch,260); return aa; } }; //----------------------------------------------------------------------------- const mglColor NC(-1,-1,-1); @@ -195,15 +296,14 @@ public: mglBase(); virtual ~mglBase(); - bool Stop; ///< Flag that execution should be terminated. mglPoint Min; ///< Lower edge of bounding box for graphics. mglPoint Max; ///< Upper edge of bounding box for graphics. mreal ZMin; ///< Adjusted minimal z-value 1D plots std::string Mess; ///< Buffer for receiving messages int ObjId; ///< object id for mglPrim int HighId; ///< object id to be highlited - std::vector Grp; ///< List of groups with names -- need for export - std::vector Act; ///< Position of active points + mglStack Grp; ///< List of groups with names -- need for export + mglStack Act; ///< Position of active points std::string PlotId; ///< Id of plot for saving filename (in GLUT window for example) mreal CDef; ///< Default (current) color in texture @@ -329,13 +429,13 @@ public: /// Set default font size inline void SetFontSize(mreal val) { FontSize=val>0 ? val:-FontSize*val; } inline mreal GetFontSize() const { return FontSize; } - mreal TextWidth(const char *text, const char *font, mreal size) const; - mreal TextWidth(const wchar_t *text, const char *font, mreal size) const; - mreal TextHeight(const char *font, mreal size) const; + mreal TextWidth(const char *text, const char *font, mreal size) const MGL_FUNC_PURE; + mreal TextWidth(const wchar_t *text, const char *font, mreal size) const MGL_FUNC_PURE; + mreal TextHeight(const char *font, mreal size) const MGL_FUNC_PURE; inline mreal FontFactor() const { return font_factor; } - virtual mreal GetRatio() const; - virtual int GetWidth() const; - virtual int GetHeight() const; + virtual mreal GetRatio() const MGL_FUNC_CONST; + virtual int GetWidth() const MGL_FUNC_CONST; + virtual int GetHeight() const MGL_FUNC_CONST; /// Set to use or not text rotation inline void SetRotatedText(bool val) { set(val,MGL_ENABLE_RTEXT); } @@ -388,7 +488,11 @@ public: inline long GetGlfNum() const { return Glf.size(); } inline const mglPnt &GetPnt(long i) const { return Pnt[i]; } inline long GetPntNum() const { return Pnt.size(); } - inline mglPrim &GetPrm(long i) { return Prm[i]; } +// inline mglPrim &GetPrm(long i) { return Prm[i]; } + inline mglPrim &GetPrm(long i, bool sort=true) + { return (sort && PrmInd) ? Prm[PrmInd[i]]:Prm[i]; } + inline const mglPrim &GetPrm(long i, bool sort=true) const + { return (sort && PrmInd) ? Prm[PrmInd[i]]:Prm[i]; } inline long GetPrmNum() const { return Prm.size(); } inline const mglText &GetPtx(long i) const { return Ptx[i]; } inline long GetPtxNum() const { return Ptx.size(); } @@ -405,7 +509,7 @@ public: inline mreal GetC(long s,mreal z,bool scale = true) const { return s+(scale?GetA(z):(z>0?z/MGL_FEPSILON:0)); } /// Get alpha value depending on single variable a - mreal GetA(mreal a) const; + mreal GetA(mreal a) const MGL_FUNC_PURE; /// Set pen/palette char SetPenPal(const char *stl, long *id=0, bool pal=true); /// Add texture (like color scheme) and return the position of first color @@ -431,9 +535,19 @@ public: inline mreal mark_size() { return MarkSize*font_factor; } // inline char last_color() { return last_style[1]; } inline const char *last_line() { return last_style; } - void resort(); ///< Resort primitives in creation order (need for export in 3D formats) + int PrmCmp(long i, long j) const MGL_FUNC_PURE; // compare 2 primitives with indexes i,j + /// Check if plot termination is asked + bool NeedStop() { if(event_cb) event_cb(event_par); return Stop; } + /// Ask to stop drawing + void AskStop(bool stop=true) { Stop = stop; } + /// Set callback function for event processing + void SetEventFunc(void (*func)(void *), void *par) { event_cb=func; event_par=par; } protected: + bool Stop; ///< Flag that execution should be terminated. + void (*event_cb)(void *); ///< Function to be called for event processing + void *event_par; ///< Parameter for event processing function + mglPoint OMin; ///< Lower edge for original axis (before scaling) mglPoint OMax; ///< Upper edge for original axis (before scaling) mglPoint AMin; ///< Lower edge for axis scaling @@ -442,16 +556,20 @@ protected: mglPoint FMax; ///< Actual upper edge after transformation formulas. mglPoint Org; ///< Center of axis cross section. int WarnCode; ///< Warning code - std::vector Pnt; ///< Internal points - std::vector Prm; ///< Primitives (lines, triangles and so on) -- need for export - std::vector Sub; ///< InPlot regions {n1=x1,n2=x2,n3=y1,n4=y2,id} + long *PrmInd; ///< Indexes of sorted primitives + mglStack Pnt; ///< Internal points + mglStack Prm; ///< Primitives (lines, triangles and so on) -- need for export + mglStack Sub; ///< InPlot regions {n1=x1,n2=x2,n3=y1,n4=y2,id} std::vector Ptx; ///< Text labels for mglPrim std::vector Leg; ///< Text labels for legend std::vector Glf; ///< Glyphs data - std::vector Txt; ///< Pointer to textures + mglStack Txt; ///< Pointer to textures #if MGL_HAVE_PTHREAD pthread_mutex_t mutexPnt, mutexTxt, mutexLeg, mutexGlf, mutexAct, mutexDrw; - pthread_mutex_t mutexSub, mutexPrm, mutexPtx, mutexStk, mutexGrp; + pthread_mutex_t mutexSub, mutexPrm, mutexPtx, mutexStk, mutexGrp, mutexClf; +#endif +#if MGL_HAVE_OMP + omp_lock_t lockClf; #endif int TernAxis; ///< Flag that Ternary axis is used @@ -462,6 +580,7 @@ protected: mreal AmbBr; ///< Default ambient light brightness mreal DifBr; ///< Default diffusive light brightness + mreal persp; ///< Original value for perspective mglMatrix Bp; ///< Transformation matrix for View() and Zoom() mglMatrix B; ///< Transformation matrix mglMatrix B1; ///< Transformation matrix for colorbar @@ -482,10 +601,11 @@ protected: mreal ArrowSize; ///< The size of arrows. char last_style[64];///< Last pen style mreal font_factor; ///< Font scaling factor - + long dr_x, dr_y, dr_p; ///< default drawing region for quality&4 mode virtual void LightScale(const mglMatrix *M)=0; ///< Scale positions of light sources + void ClearPrmInd(); // block for SaveState() mglPoint MinS; ///< Saved lower edge of bounding box for graphics. @@ -505,6 +625,8 @@ protected: int DefMaskAn; ///< Default mask rotation angle in degrees private: + mglBase(const mglBase &){} // copying is not allowed + const mglBase &operator=(const mglBase &t){return t;} // copying is not allowed mglPoint CutMin; ///< Lower edge of bounding box for cut off. mglPoint CutMax; ///< Upper edge of bounding box for cut off. @@ -521,7 +643,9 @@ bool MGL_EXPORT mgl_check_dim2(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const ch bool MGL_EXPORT mgl_check_dim3(HMGL gr, bool both, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *name); bool MGL_EXPORT mgl_check_vec3(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *name); bool MGL_EXPORT mgl_check_trig(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, int d=3); +bool MGL_EXPORT mgl_isnboth(HCDT x, HCDT y, HCDT z, HCDT a); bool MGL_EXPORT mgl_isboth(HCDT x, HCDT y, HCDT z, HCDT a); +inline bool mgl_islog(mreal a,mreal b) { return (a>0 && b>10*a) || (b<0 && a<10*b); } //----------------------------------------------------------------------------- #endif #endif diff --git a/include/mgl2/base_cf.h b/include/mgl2/base_cf.h index 76d5276..bc850ea 100644 --- a/include/mgl2/base_cf.h +++ b/include/mgl2/base_cf.h @@ -25,24 +25,41 @@ extern "C" { #endif +/// Check if MathGL version is valid +int MGL_EXPORT mgl_check_version(const char *ver); +int MGL_EXPORT mgl_check_version_(const char *ver, int); +/// Suppress printing warnings to stderr +void MGL_EXPORT mgl_suppress_warn(int on); +void MGL_EXPORT mgl_suppress_warn_(int *on); /// Get last warning code -int MGL_EXPORT mgl_get_warn(HMGL gr); -int MGL_EXPORT mgl_get_warn_(uintptr_t *gr); +int MGL_EXPORT_PURE mgl_get_warn(HMGL gr); +int MGL_EXPORT_PURE mgl_get_warn_(uintptr_t *gr); /// Set warning code ant fill message void MGL_EXPORT mgl_set_warn(HMGL gr, int code, const char *text); void MGL_EXPORT mgl_set_warn_(uintptr_t *gr, int *code, const char *text,int); /// Set buffer for warning messages -MGL_EXPORT const char *mgl_get_mess(HMGL gr); +MGL_EXPORT_PURE const char *mgl_get_mess(HMGL gr); +int MGL_EXPORT mgl_get_mess_(uintptr_t *gr, char *out, int len); /// Set name of plot for saving filename void MGL_EXPORT mgl_set_plotid(HMGL gr, const char *id); void MGL_EXPORT mgl_set_plotid_(uintptr_t *gr, const char *id,int); /// Get name of plot for saving filename -MGL_EXPORT const char *mgl_get_plotid(HMGL gr); +MGL_EXPORT_PURE const char *mgl_get_plotid(HMGL gr); +int MGL_EXPORT mgl_get_plotid_(uintptr_t *gr, char *out, int len); + +/// Ask to stop drawing +void MGL_EXPORT mgl_ask_stop(HMGL gr, int stop); +void MGL_EXPORT mgl_ask_stop_(uintptr_t *gr, int *stop); +/// Check if plot termination is asked +int MGL_EXPORT mgl_need_stop(HMGL gr); +int MGL_EXPORT mgl_need_stop_(uintptr_t *gr); +/// Set callback function for event processing +void MGL_EXPORT mgl_set_event_func(HMGL gr, void (*func)(void *), void *par); /// Get plot quality -int MGL_EXPORT mgl_get_quality(HMGL gr); -int MGL_EXPORT mgl_get_quality_(uintptr_t *gr); +int MGL_EXPORT_PURE mgl_get_quality(HMGL gr); +int MGL_EXPORT_PURE mgl_get_quality_(uintptr_t *gr); /// Set plot quality void MGL_EXPORT mgl_set_quality(HMGL gr, int qual); void MGL_EXPORT mgl_set_quality_(uintptr_t *gr, int *qual); @@ -50,18 +67,18 @@ void MGL_EXPORT mgl_set_quality_(uintptr_t *gr, int *qual); void MGL_EXPORT mgl_set_draw_reg(HMGL gr, long nx, long ny, long m); void MGL_EXPORT mgl_set_draw_reg_(uintptr_t *gr, int *nx, int *ny, int *m); -/// Is frames -int MGL_EXPORT mgl_is_frames(HMGL gr); +/// Check if support of frames is enabled (i.e. MGL_VECT_FRAME is set and Quality&MGL_DRAW_LMEM==0) +int MGL_EXPORT_PURE mgl_is_frames(HMGL gr); /// Get bit-value flag of HMGL state (for advanced users only) -int MGL_EXPORT mgl_get_flag(HMGL gr, uint32_t flag); -int MGL_EXPORT mgl_get_flag_(uintptr_t *gr, unsigned long *flag); +int MGL_EXPORT_PURE mgl_get_flag(HMGL gr, uint32_t flag); +int MGL_EXPORT_PURE mgl_get_flag_(uintptr_t *gr, unsigned long *flag); /// Set bit-value flag of HMGL state (for advanced users only) void MGL_EXPORT mgl_set_flag(HMGL gr, int val, uint32_t flag); void MGL_EXPORT mgl_set_flag_(uintptr_t *gr, int *val, unsigned long *flag); /// Change counter of HMGL uses (for advanced users only). Non-zero counter prevent automatic object removing. long MGL_EXPORT mgl_use_graph(HMGL gr, int inc); long MGL_EXPORT mgl_use_graph_(uintptr_t *gr, int *inc); -void MGL_EXPORT mgl_set_rdc_acc(HMGL gr, int reduce); // TODO +void MGL_EXPORT mgl_set_rdc_acc(HMGL gr, int reduce); void MGL_EXPORT mgl_set_rdc_acc_(uintptr_t *gr, int *reduce); /// Start group of objects diff --git a/include/mgl2/canvas.h b/include/mgl2/canvas.h index 8a1c084..48d9064 100644 --- a/include/mgl2/canvas.h +++ b/include/mgl2/canvas.h @@ -26,28 +26,32 @@ struct GifFileType; /// Structure for drawing axis and ticks struct MGL_EXPORT mglAxis { - mglAxis() { dv=ds=d=v0=v1=v2=o=sh=0; ns=f=ch=0; pos = 't'; inv=false; } - mglAxis(const mglAxis &aa) - { dv=aa.dv; ds=aa.ds; d=aa.d; dir=aa.dir; sh=aa.sh; - v0=aa.v0; v1=aa.v1; v2=aa.v2; o=aa.o; pos=aa.pos; - a = aa.a; b = aa.b; org=aa.org; txt=aa.txt; inv=aa.inv; - ns=aa.ns; f=aa.f; ch=aa.ch; t=aa.t; } + mglAxis() : dv(0),ds(0),d(0),ns(0), v0(0),v1(0),v2(0),o(NAN), f(0), ch(0), pos('t'),sh(0),inv(false) {} + mglAxis(const mglAxis &aa) : dv(aa.dv),ds(aa.ds),d(aa.d),ns(aa.ns), t(aa.t),fact(aa.fact),stl(aa.stl), dir(aa.dir),a(aa.a),b(aa.b),org(aa.org), v0(aa.v0),v1(aa.v1),v2(aa.v2),o(aa.o), f(aa.f),txt(aa.txt), ch(aa.ch), pos(aa.pos),sh(aa.sh),inv(aa.inv) {} +#if MGL_HAVE_RVAL + mglAxis(mglAxis &&aa) : dv(aa.dv),ds(aa.ds),d(aa.d),ns(aa.ns), t(aa.t),fact(aa.fact),stl(aa.stl), dir(aa.dir),a(aa.a),b(aa.b),org(aa.org), v0(aa.v0),v1(aa.v1),v2(aa.v2),o(aa.o), f(aa.f),txt(aa.txt), ch(aa.ch), pos(aa.pos),sh(aa.sh),inv(aa.inv) {} +#endif inline void AddLabel(const wchar_t *lbl, mreal v) { txt.push_back(mglText(lbl,"",v)); } inline void AddLabel(const std::wstring &lbl, mreal v) { txt.push_back(mglText(lbl,v)); } + inline void Clear() + { dv=ds=d=v0=v1=v2=sh=0; o=NAN; ns=f=0; pos = 't'; inv=false; + fact.clear(); stl.clear(); t.clear(); txt.clear(); } - mreal dv,ds; ///< Actual step for ticks and subticks. - mreal d; ///< Step for axis ticks (if positive) or its number (if negative). + mreal dv,ds; ///< Actual step for ticks and subticks. + mreal d; ///< Step for axis ticks (if positive) or its number (if negative). int ns; ///< Number of axis subticks. std::wstring t; ///< Tick template (set "" to use default one ("%.2g" in simplest case)) + std::wstring fact; ///< Factor which should be placed after number (like L"\pi") + std::string stl; ///< Tick styles (default is ""=>"3m") mglPoint dir; ///< Axis direction mglPoint a,b; ///< Directions of over axis mglPoint org; mreal v0; ///< Center of axis cross section mreal v1; ///< Minimal axis range. mreal v2; ///< Maximal axis range. - mreal o; ///< Point of starting ticks numbering (if NAN then Org is used). + mreal o; ///< Point of starting ticks numbering (if NAN then Org is used). int f; ///< Flag 0x1 - time, 0x2 - manual, 0x4 - fixed dv std::vector txt; ///< Axis labels char ch; ///< Character of axis (like 'x','y','z','c') @@ -59,7 +63,11 @@ struct MGL_EXPORT mglAxis /// Structure for light source struct MGL_EXPORT mglLight { - mglLight() { n=false; a=b=0; } + mglLight():n(false),a(0),b(0) {} + mglLight(const mglLight &aa) : n(aa.n),d(aa.d),r(aa.r),q(aa.q),p(aa.p),a(aa.a),b(aa.b),c(aa.c) {} +#if MGL_HAVE_RVAL + mglLight(mglLight &&aa) : n(aa.n),d(aa.d),r(aa.r),q(aa.q),p(aa.p),a(aa.a),b(aa.b),c(aa.c) {} +#endif bool n; ///< Availability of light sources mglPoint d; ///< Direction of light sources mglPoint r; ///< Position of light sources (NAN for infinity) @@ -74,6 +82,13 @@ class mglCanvas; /// Structure for light source struct MGL_EXPORT mglDrawReg { + mglDrawReg() {} + mglDrawReg(const mglDrawReg &aa) : PDef(aa.PDef),angle(aa.angle),ObjId(aa.ObjId),PenWidth(aa.PenWidth),pPos(aa.pPos) ,x1(aa.x1),x2(aa.x2),y1(aa.y1),y2(aa.y2) {} +#if MGL_HAVE_RVAL + mglDrawReg(mglDrawReg &&aa) : PDef(aa.PDef),angle(aa.angle),ObjId(aa.ObjId),PenWidth(aa.PenWidth),pPos(aa.pPos) ,x1(aa.x1),x2(aa.x2),y1(aa.y1),y2(aa.y2) {} +#endif + inline const mglDrawReg &operator=(const mglDrawReg &aa) + { memcpy(this,&aa,sizeof(mglDrawReg)); return aa; } union { uint64_t PDef; @@ -89,11 +104,18 @@ struct MGL_EXPORT mglDrawReg /// Structure contains everything for drawing struct MGL_EXPORT mglDrawDat { - std::vector Pnt; ///< Internal points - std::vector Prm; ///< Primitives (lines, triangles and so on) -- need for export + mglDrawDat() {} + mglDrawDat(const mglDrawDat &aa) : Pnt(aa.Pnt),Prm(aa.Prm),Ptx(aa.Ptx),Glf(aa.Glf),Txt(aa.Txt) {} +#if MGL_HAVE_RVAL + mglDrawDat(mglDrawDat &&aa) : Pnt(aa.Pnt),Prm(aa.Prm),Ptx(aa.Ptx),Glf(aa.Glf),Txt(aa.Txt) {} +#endif + inline const mglDrawDat&operator=(const mglDrawDat &aa) + { Pnt=aa.Pnt; Prm=aa.Prm; Ptx=aa.Ptx; Glf=aa.Glf; Txt=aa.Txt; return aa; } + mglStack Pnt; ///< Internal points + mglStack Prm; ///< Primitives (lines, triangles and so on) -- need for export std::vector Ptx; ///< Text labels for mglPrim std::vector Glf; ///< Glyphs data - std::vector Txt; ///< Pointer to textures + mglStack Txt; ///< Pointer to textures }; //----------------------------------------------------------------------------- union mglRGBA { uint32_t c; unsigned char r[4]; }; @@ -133,6 +155,7 @@ using mglBase::Light; inline void Pop() { B = stack.back(); stack.pop_back(); } /// Clear up the frame virtual void Clf(mglColor back=NC); + virtual void Clf(const char *col); /// Put further plotting in cell of stick rotated on angles tet, phi void StickPlot(int num, int i, mreal tet, mreal phi); @@ -149,18 +172,21 @@ using mglBase::Light; /// Rotate a further plotting. void Rotate(mreal TetX,mreal TetZ,mreal TetY=0); /// Rotate a further plotting around vector {x,y,z}. - void RotateN(mreal Tet,mreal x,mreal y,mreal z) ; - /// Set perspective (in range [0,1)) for plot. Set to zero for switching off. - void Perspective(mreal a) { Bp.pf = fabs(a); } + void RotateN(mreal Tet,mreal x,mreal y,mreal z); + /// Set perspective (in range [0,1)) for plot. Set to zero for switching off. Return the current perspective. + void Perspective(mreal a, bool req=true) + { if(req) persp = Bp.pf = a; else Bp.pf = persp?persp:fabs(a); } /// Set size of frame in pixels. Normally this function is called internaly. - virtual void SetSize(int w,int h); + virtual void SetSize(int w,int h,bool clf=true); /// Get ratio (mreal width)/(mreal height). - mreal GetRatio() const; + mreal GetRatio() const MGL_FUNC_PURE; /// Get bitmap data prepared for saving to file virtual unsigned char **GetRGBLines(long &w, long &h, unsigned char *&f, bool alpha=false); /// Get RGB bitmap of current state image. virtual const unsigned char *GetBits(); + /// Get RGBA bitmap of background image. + const unsigned char *GetBackground() { return GB; }; /// Get RGBA bitmap of current state image. const unsigned char *GetRGBA() { Finish(); return G4; } /// Get width of the image @@ -170,11 +196,18 @@ using mglBase::Light; /// Combine plots from 2 canvases. Result will be saved into this. void Combine(const mglCanvas *gr); + /// Rasterize current plot and set it as background image + void Rasterize(); + /// Load image for background from file + void LoadBackground(const char *fname, double alpha=1); + /// Fill background image by specified color + void FillBackground(const mglColor &cc); + inline mreal GetDelay() const { return Delay; } inline void SetDelay(mreal d) { Delay=d; } /// Calculate 3D coordinate {x,y,z} for screen point {xs,ys} - mglPoint CalcXYZ(int xs, int ys, bool real=false) const; + mglPoint CalcXYZ(int xs, int ys, bool real=false) const MGL_FUNC_PURE; /// Calculate screen point {xs,ys} for 3D coordinate {x,y,z} void CalcScr(mglPoint p, int *xs, int *ys) const; mglPoint CalcScr(mglPoint p) const; @@ -183,7 +216,7 @@ using mglBase::Light; /// Get object id inline int GetObjId(long xs,long ys) const { return OI[xs+Width*ys]; } /// Get subplot id - int GetSplId(long xs,long ys) const; + int GetSplId(long xs,long ys) const MGL_FUNC_PURE; /// Check if there is active point or primitive (n=-1) int IsActive(int xs, int ys,int &n); @@ -203,6 +236,8 @@ using mglBase::Light; virtual void SetFrame(long i); /// Add drawing data from i-th frame to the current drawing void ShowFrame(long i); + /// Clear list of primitives for current drawing + void ClearFrame(); /// Start write frames to cinema using GIF format void StartGIF(const char *fname, int ms=100); @@ -237,15 +272,19 @@ using mglBase::Light; void SetTicksVal(char dir, const wchar_t *lbl, bool add=false); void SetTicksVal(char dir, HCDT v, const wchar_t *lbl, bool add=false); void SetTicksVal(char dir, HCDT v, const wchar_t **lbl, bool add=false); + /// Add manual tick at given position. Use "" to disable this feature. + void AddTick(char dir, double val, const char *lbl); + void AddTick(char dir, double val, const wchar_t *lbl); + /// Set templates for ticks void SetTickTempl(char dir, const wchar_t *t); void SetTickTempl(char dir, const char *t); /// Set time templates for ticks void SetTickTime(char dir, mreal d=0, const char *t=""); /// Set the ticks parameters - void SetTicks(char dir, mreal d=0, int ns=0, mreal org=NAN); + void SetTicks(char dir, mreal d=0, int ns=0, mreal org=NAN, const wchar_t *lbl=0); /// Auto adjust ticks - void AdjustTicks(const char *dir="xyzc", bool force=false); + void AdjustTicks(const char *dir="xyzc", bool force=false, std::string stl=""); /// Tune ticks inline void SetTuneTicks(int tune, mreal pos=1.15) { TuneTicks = tune; FactorPos = pos; } @@ -305,14 +344,15 @@ using mglBase::Light; void pnt_fast(long x,long y,mreal z,const unsigned char c[4], int obj_id); /// preparing primitives for 2d export or bitmap drawing (0 default, 1 for 2d vector, 2 for 3d vector) void PreparePrim(int fast); - inline uint32_t GetPntCol(long i) { return pnt_col[i]; } - inline uint32_t GetPrmCol(long i) { return prm_col[i]; } + inline uint32_t GetPntCol(long i) const { return pnt_col[i]; } + inline uint32_t GetPrmCol(long i, bool sort=true) const { return GetColor(GetPrm(i, sort)); } protected: mreal Delay; ///< Delay for animation in seconds // NOTE: Z should be float for reducing space and for compatibility reasons unsigned char *G4; ///< Final picture in RGBA format. Prepared in Finish(). unsigned char *G; ///< Final picture in RGB format. Prepared in Finish(). + unsigned char *GB; ///< Background picture in RGBA format. std::vector DrwDat; ///< Set of ALL drawing data for each frames int LegendMarks; ///< Number of marks in the Legend @@ -344,7 +384,7 @@ protected: /// Draw axis void DrawAxis(mglAxis &aa, bool text=true, char arr=0,const char *stl="",const char *opt=""); /// Draw axis grid lines - void DrawGrid(mglAxis &aa); + void DrawGrid(mglAxis &aa, bool at_tick=false); /// Update axis ranges inline void UpdateAxis() { ax.v0=Org.x; ay.v0=Org.y; az.v0=Org.z; ac.v0=Org.c; @@ -359,11 +399,11 @@ protected: /// Push drawing data (for frames only). NOTE: can be VERY large long PushDrwDat(); /// Retur color for primitive depending lighting - uint32_t GetColor(const mglPrim &p); + uint32_t GetColor(const mglPrim &p) const MGL_FUNC_PURE; - mreal GetOrgX(char dir, bool inv=false) const; ///< Get Org.x (parse NAN value) - mreal GetOrgY(char dir, bool inv=false) const; ///< Get Org.y (parse NAN value) - mreal GetOrgZ(char dir, bool inv=false) const; ///< Get Org.z (parse NAN value) + mreal GetOrgX(char dir, bool inv=false) const MGL_FUNC_PURE; ///< Get Org.x (parse NAN value) + mreal GetOrgY(char dir, bool inv=false) const MGL_FUNC_PURE; ///< Get Org.y (parse NAN value) + mreal GetOrgZ(char dir, bool inv=false) const MGL_FUNC_PURE; ///< Get Org.z (parse NAN value) void mark_plot(long p, char type, mreal size=1); void arrow_plot(long p1, long p2, char st); @@ -386,11 +426,10 @@ protected: bool IsSame(const mglPrim &pr,mreal wp,mglColor cp,int st); // restore normalized coordinates from screen ones - mglPoint RestorePnt(mglPoint ps, bool norm=false) const; + mglPoint RestorePnt(mglPoint ps, bool norm=false) const MGL_FUNC_PURE; // functions for multi-threading void pxl_pntcol(long id, long n, const void *); - void pxl_prmcol(long id, long n, const void *); void pxl_combine(long id, long n, const void *); void pxl_memcpy(long id, long n, const void *); void pxl_backgr(long id, long n, const void *); @@ -405,7 +444,10 @@ protected: void PutDrawReg(mglDrawReg *d, const mglCanvas *gr); private: - std::vector pnt_col, prm_col; + mglCanvas(const mglCanvas &){} // copying is not allowed + const mglCanvas &operator=(const mglCanvas &t){return t;} // copying is not allowed + + uint32_t *pnt_col; // mreal _tetx,_tety,_tetz; // extra angles std::vector stack; ///< stack for transformation matrices GifFileType *gif; @@ -422,11 +464,11 @@ private: char GetLabelPos(mreal c, long kk, mglAxis &aa); /// Draw tick void tick_draw(mglPoint o, mglPoint d1, mglPoint d2, int f); - mreal FindOptOrg(char dir, int ind) const; + mreal FindOptOrg(char dir, int ind) const MGL_FUNC_PURE; /// Transform mreal color and alpha to bits format - unsigned char* col2int(const mglPnt &p, unsigned char *r, int obj_id); + unsigned char* col2int(const mglPnt &p, unsigned char *r, int obj_id) const; /// Combine colors in 2 plane. - void combine(unsigned char *c1, const unsigned char *c2); + void combine(unsigned char *c1, const unsigned char *c2) const; /// Fast drawing of line between 2 points void fast_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *d); diff --git a/include/mgl2/canvas_cf.h b/include/mgl2/canvas_cf.h index de04e43..071f0fb 100644 --- a/include/mgl2/canvas_cf.h +++ b/include/mgl2/canvas_cf.h @@ -43,6 +43,9 @@ void MGL_EXPORT mgl_combine_gr_(uintptr_t *gr, uintptr_t *gr2); /// Force preparing the image. It can be useful for OpenGL mode mostly. void MGL_EXPORT mgl_finish(HMGL gr); void MGL_EXPORT mgl_finish_(uintptr_t *gr); +/// Force preparing the image and save result into background one. +void MGL_EXPORT mgl_rasterize(HMGL gr); +void MGL_EXPORT mgl_rasterize_(uintptr_t *gr); /// Set tick length void MGL_EXPORT mgl_set_tick_len(HMGL gr, double len, double stt); @@ -54,18 +57,30 @@ void MGL_EXPORT mgl_set_axis_stl_(uintptr_t *gr, const char *stl, const char *tc /// Auto adjust ticks void MGL_EXPORT mgl_adjust_ticks(HMGL gr, const char *dir); void MGL_EXPORT mgl_adjust_ticks_(uintptr_t *gr, const char *dir, int); +/// Auto adjust ticks and set ticks format ("+E0123456789-fF") +void MGL_EXPORT mgl_adjust_ticks_ext(HMGL gr, const char *dir, const char *stl); +void MGL_EXPORT mgl_adjust_ticks_ext_(uintptr_t *gr, const char *dir, const char *stl, int, int); /// Set the ticks parameters void MGL_EXPORT mgl_set_ticks(HMGL gr, char dir, double d, int ns, double org); void MGL_EXPORT mgl_set_ticks_(uintptr_t *gr, char *dir, mreal *d, int *ns, mreal *org, int); -/// Set ticks text (\n separated). Use "" to disable this feature. +/// Set the ticks parameters and specify ticks factor string +void MGL_EXPORT mgl_set_ticks_fact(HMGL gr, char dir, double d, int ns, double org, const char *fact); +void MGL_EXPORT mgl_set_ticks_factw(HMGL gr, char dir, double d, int ns, double org, const wchar_t *fact); +void MGL_EXPORT mgl_set_ticks_fact_(uintptr_t *gr, char *dir, double *d, int *ns, double *org, const char *fact,int,int); + +/// Set manual ticks text (\n separated). Use "" to disable this feature. void MGL_EXPORT mgl_set_ticks_str(HMGL gr, char dir, const char *lbl, int add); void MGL_EXPORT mgl_set_ticks_str_(uintptr_t *gr, const char *dir, const char *lbl, int *add,int,int); void MGL_EXPORT mgl_set_ticks_wcs(HMGL gr, char dir, const wchar_t *lbl, int add); -/// Set ticks position and text (\n separated). Use "" to disable this feature. +/// Set manual ticks position and text (\n separated). Use "" to disable this feature. void MGL_EXPORT mgl_set_ticks_val(HMGL gr, char dir, HCDT val, const char *lbl, int add); void MGL_EXPORT mgl_set_ticks_val_(uintptr_t *gr, const char *dir, uintptr_t *val, const char *lbl, int *add,int,int); void MGL_EXPORT mgl_set_ticks_valw(HMGL gr, char dir, HCDT val, const wchar_t *lbl, int add); -/// Tune ticks +/// Add manual tick at given position. Use "" to disable this feature. +void MGL_EXPORT mgl_add_tick(HMGL gr, char dir, double val, const char *lbl); +void MGL_EXPORT mgl_add_tick_(uintptr_t *gr, const char *dir, mreal *val, const char *lbl,int,int); +void MGL_EXPORT mgl_add_tickw(HMGL gr, char dir, double val, const wchar_t *lbl); +/// Tune ticks void MGL_EXPORT mgl_tune_ticks(HMGL gr, int tune, double fact_pos); void MGL_EXPORT mgl_tune_ticks_(uintptr_t *gr, int *tune, mreal *fact_pos); /// Set templates for ticks @@ -213,12 +228,15 @@ MGL_EXPORT const unsigned char *mgl_get_rgb_(uintptr_t *gr); /// Get RGBA values of current bitmap MGL_EXPORT const unsigned char *mgl_get_rgba(HMGL gr); MGL_EXPORT const unsigned char *mgl_get_rgba_(uintptr_t *gr); +/// Get RGB values of current bitmap +MGL_EXPORT const unsigned char *mgl_get_background(HMGL gr); +MGL_EXPORT const unsigned char *mgl_get_background_(uintptr_t *gr); /// Set object/subplot id void MGL_EXPORT mgl_set_obj_id(HMGL gr, int id); void MGL_EXPORT mgl_set_obj_id_(uintptr_t *gr, int *id); /// Get object id -int MGL_EXPORT mgl_get_obj_id(HMGL gr, int x, int y); -int MGL_EXPORT mgl_get_obj_id_(uintptr_t *gr, int *x, int *y); +int MGL_EXPORT_PURE mgl_get_obj_id(HMGL gr, int x, int y); +int MGL_EXPORT_PURE mgl_get_obj_id_(uintptr_t *gr, int *x, int *y); /// Get subplot id int MGL_EXPORT mgl_get_spl_id(HMGL gr, int x, int y); int MGL_EXPORT mgl_get_spl_id_(uintptr_t *gr, int *x, int *y); @@ -235,8 +253,8 @@ void MGL_EXPORT mgl_calc_xyz_(uintptr_t *gr, int *xs, int *ys, mreal *x, mreal * void MGL_EXPORT mgl_calc_scr(HMGL gr, double x, double y, double z, int *xs, int *ys); void MGL_EXPORT mgl_calc_scr_(uintptr_t *gr, mreal *x, mreal *y, mreal *z, int *xs, int *ys); /// Check if {xs,ys} is close to active point with accuracy d, and return its position or -1 -long MGL_EXPORT mgl_is_active(HMGL gr, int xs, int ys, int d); -long MGL_EXPORT mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d); +long MGL_EXPORT_PURE mgl_is_active(HMGL gr, int xs, int ys, int d); +long MGL_EXPORT_PURE mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d); /// Create new frame. int MGL_EXPORT mgl_new_frame(HMGL gr); @@ -262,6 +280,9 @@ void MGL_EXPORT mgl_show_frame_(uintptr_t *gr, int *i); /// Delete primitives for i-th frame (work if MGL_VECT_FRAME is set on) void MGL_EXPORT mgl_del_frame(HMGL gr, int i); void MGL_EXPORT mgl_del_frame_(uintptr_t *gr, int *i); +/// Clear list of primitives for current drawing +void MGL_EXPORT mgl_clear_frame(HMGL gr); +void MGL_EXPORT mgl_clear_frame_(uintptr_t *gr); /// Set the transparency type (0 - usual, 1 - glass, 2 - lamp) void MGL_EXPORT mgl_set_transp_type(HMGL gr, int kind); @@ -299,12 +320,21 @@ void MGL_EXPORT mgl_mat_push_(uintptr_t *gr); /// Clear up the frame void MGL_EXPORT mgl_clf(HMGL gr); void MGL_EXPORT mgl_clf_(uintptr_t *gr); +/// Clear up the frame but keep fog settings +void MGL_EXPORT mgl_clf_nfog(HMGL gr); +void MGL_EXPORT mgl_clf_nfog_(uintptr_t *gr); /// Clear up the frame and fill background by specified color void MGL_EXPORT mgl_clf_rgb(HMGL gr, double r, double g, double b); void MGL_EXPORT mgl_clf_rgb_(uintptr_t *gr, mreal *r, mreal *g, mreal *b); /// Clear up the frame and fill background by specified color void MGL_EXPORT mgl_clf_chr(HMGL gr, char col); void MGL_EXPORT mgl_clf_chr_(uintptr_t *gr, const char *col, int); +/// Clear up the frame and fill background by specified color with manual transparency +void MGL_EXPORT mgl_clf_str(HMGL gr, const char *col); +void MGL_EXPORT mgl_clf_str_(uintptr_t *gr, const char *col, int); +/// Load background image +void MGL_EXPORT mgl_load_background(HMGL gr, const char *fname, double alpha); +void MGL_EXPORT mgl_load_background_(uintptr_t *gr, const char *fname, mreal *alpha, int); /// Put further plotting in some region of whole frame. void MGL_EXPORT mgl_subplot(HMGL gr, int nx,int ny,int m,const char *style); @@ -349,7 +379,10 @@ void MGL_EXPORT mgl_rotate_vector(HMGL gr, double Tet,double x,double y,double z void MGL_EXPORT mgl_rotate_vector_(uintptr_t *gr, mreal *Tet, mreal *x, mreal *y, mreal *z); /// Set perspective (in range [0,1)) for plot. Set to zero for switching off. void MGL_EXPORT mgl_perspective(HMGL gr, double val); -void MGL_EXPORT mgl_perspective_(uintptr_t *gr, double val); +void MGL_EXPORT mgl_perspective_(uintptr_t *gr, mreal *val); +/// Ask to set perspective (in range [0,1)) for plot. Set to zero for switching off. +void MGL_EXPORT mgl_ask_perspective(HMGL gr, double val); +void MGL_EXPORT mgl_ask_perspective_(uintptr_t *gr, mreal *val); /// Set angle of view independently from Rotate(). void MGL_EXPORT mgl_view(HMGL gr, double TetX,double TetZ,double TetY); void MGL_EXPORT mgl_view_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY); @@ -358,7 +391,9 @@ void MGL_EXPORT mgl_zoom(HMGL gr, double x1, double y1, double x2, double y2); void MGL_EXPORT mgl_zoom_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *x2, mreal *y2); //----------------------------------------------------------------------------- +#if MGL_HAVE_PTHREAD void MGL_EXPORT mgl_draw_thr(void *); +#endif /// Callback function for mouse click void MGL_EXPORT mgl_set_click_func(HMGL gr, void (*func)(void *p)); @@ -366,8 +401,8 @@ void MGL_EXPORT mgl_set_click_func(HMGL gr, void (*func)(void *p)); void MGL_EXPORT mgl_wnd_set_delay(HMGL gr, double dt); void MGL_EXPORT mgl_wnd_set_delay_(uintptr_t *gr, mreal *dt); /// Get delay for animation in seconds -double MGL_EXPORT mgl_wnd_get_delay(HMGL gr); -double MGL_EXPORT mgl_wnd_get_delay_(uintptr_t *gr); +double MGL_EXPORT_PURE mgl_wnd_get_delay(HMGL gr); +double MGL_EXPORT_PURE mgl_wnd_get_delay_(uintptr_t *gr); /// Set window properties void MGL_EXPORT mgl_setup_window(HMGL gr, int clf_upd, int showpos); void MGL_EXPORT mgl_setup_window_(uintptr_t *gr, int *clf_upd, int *showpos); @@ -429,9 +464,16 @@ uintptr_t MGL_EXPORT mgl_parser_add_var_(uintptr_t* p, const char *name, int); HMDT MGL_EXPORT mgl_parser_add_varw(HMPR p, const wchar_t *name); /// Find variable with given name or return NULL if no one /// NOTE !!! You must not delete obtained data arrays !!! -HMDT MGL_EXPORT mgl_parser_find_var(HMPR p, const char *name); -uintptr_t MGL_EXPORT mgl_parser_find_var_(uintptr_t* p, const char *name, int); -HMDT MGL_EXPORT mgl_parser_find_varw(HMPR p, const wchar_t *name); +MGL_EXPORT_PURE mglDataA *mgl_parser_find_var(HMPR p, const char *name); +uintptr_t MGL_EXPORT_PURE mgl_parser_find_var_(uintptr_t* p, const char *name, int); +MGL_EXPORT_PURE mglDataA *mgl_parser_find_varw(HMPR p, const wchar_t *name); +/// Get variable with given id +/// NOTE !!! You must not delete obtained data arrays !!! +MGL_EXPORT_PURE mglDataA *mgl_parser_get_var(HMPR p, unsigned long id); +uintptr_t MGL_EXPORT_PURE mgl_parser_get_var_(uintptr_t* p, unsigned long *id); +/// Get number of variables +long MGL_EXPORT_PURE mgl_parser_num_var(HMPR p); +long MGL_EXPORT_PURE mgl_parser_num_var_(uintptr_t* p); /// Delete variable with name void MGL_EXPORT mgl_parser_del_var(HMPR p, const char *name); @@ -469,16 +511,16 @@ void MGL_EXPORT mgl_parser_stop_(uintptr_t* p); /// 3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program /// 8 - 1d plot, 9 - 2d plot, 10 - 3d plot, 11 - dd plot, 12 - vector plot /// 13 - axis, 14 - primitives, 15 - axis setup, 16 - text/legend, 17 - data transform -int MGL_EXPORT mgl_parser_cmd_type(HMPR pr, const char *name); -int MGL_EXPORT mgl_parser_cmd_type_(uintptr_t* p, const char *name, int); +int MGL_EXPORT_PURE mgl_parser_cmd_type(HMPR pr, const char *name); +int MGL_EXPORT_PURE mgl_parser_cmd_type_(uintptr_t* p, const char *name, int); /// Return description of MGL command -MGL_EXPORT const char *mgl_parser_cmd_desc(HMPR pr, const char *name); +MGL_EXPORT_PURE const char *mgl_parser_cmd_desc(HMPR pr, const char *name); /// Return string of command format (command name and its argument[s]) -MGL_EXPORT const char *mgl_parser_cmd_frmt(HMPR pr, const char *name); +MGL_EXPORT_PURE const char *mgl_parser_cmd_frmt(HMPR pr, const char *name); /// Get name of command with nmber n -MGL_EXPORT const char *mgl_parser_cmd_name(HMPR pr, long id); +MGL_EXPORT_PURE const char *mgl_parser_cmd_name(HMPR pr, long id); /// Get number of defined commands -long MGL_EXPORT mgl_parser_cmd_num(HMPR pr); +long MGL_EXPORT_PURE mgl_parser_cmd_num(HMPR pr); /// Return result of formula evaluation HMDT MGL_EXPORT mgl_parser_calc(HMPR pr, const char *formula); diff --git a/include/mgl2/canvas_wnd.h b/include/mgl2/canvas_wnd.h index 6000a35..cadfba5 100644 --- a/include/mgl2/canvas_wnd.h +++ b/include/mgl2/canvas_wnd.h @@ -33,7 +33,7 @@ public: mglCanvasWnd(); virtual ~mglCanvasWnd(); - void SetSize(int w,int h); + void SetSize(int w,int h,bool clf=true); void EndFrame(); void SetFrame(long i); void DelFrame(long i); @@ -45,7 +45,8 @@ public: inline mglPoint GetMousePos() const { return LastMousePos;} inline void SetMousePos(mglPoint p) { LastMousePos=p; } inline void Setup(bool clf_upd=true, bool showpos=false) - { set(showpos,MGL_SHOW_POS); set(clf_upd,MGL_CLF_ON_UPD); } + { set(showpos,MGL_SHOW_POS); set(clf_upd,MGL_CLF_ON_UPD); + if(!clf_upd) ResetFrames(); } virtual void ToggleAlpha()=0; ///< Switch on/off transparency (do not overwrite user settings) virtual void ToggleLight()=0; ///< Switch on/off lighting (do not overwrite user settings) diff --git a/include/mgl2/data.h b/include/mgl2/data.h index 81aec44..afa1545 100644 --- a/include/mgl2/data.h +++ b/include/mgl2/data.h @@ -28,14 +28,10 @@ #include //----------------------------------------------------------------------------- /// Class for working with data array -#if MGL_NO_DATA_A -class MGL_EXPORT mglData -#else class MGL_EXPORT mglData : public mglDataA -#endif { public: - +using mglDataA::Momentum; long nx; ///< number of points in 1st dimensions ('x' dimension) long ny; ///< number of points in 2nd dimensions ('y' dimension) long nz; ///< number of points in 3d dimensions ('z' dimension) @@ -44,34 +40,43 @@ public: bool link; ///< use external data (i.e. don't free it) /// Initiate by other mglData variable - inline mglData(const mglData &d) { a=0; mgl_data_set(this,&d); } // NOTE: must be constructor for mglData& to exclude copy one - inline mglData(const mglDataA *d) { a=0; mgl_data_set(this, d); } - inline mglData(bool, mglData *d) // NOTE: Variable d will be deleted!!! + mglData(const mglData &d) { a=0; mgl_data_set(this,&d); } // NOTE: must be constructor for mglData& to exclude copy one +#if MGL_HAVE_RVAL + mglData(mglData &&d):nx(d.nx),ny(d.ny),nz(d.nz),a(d.a),id(d.id),link(d.link) + { s=d.s; temp=d.temp; func=d.func; o=d.o; d.a=0; d.func=0; } +#endif + mglData(const mglDataA *d) + { a=0; if(d) mgl_data_set(this, d); else mgl_data_create(this,1,1,1); } + mglData(bool, mglData *d) // NOTE: Variable d will be deleted!!! { if(d) { nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=0; + temp=d->temp; func=d->func; o=d->o; s=d->s; id=d->id; link=d->link; delete d; } else { a=0; Create(1); } } /// Initiate by flat array - inline mglData(int size, const float *d) { a=0; Set(d,size); } - inline mglData(int rows, int cols, const float *d) { a=0; Set(d,cols,rows); } - inline mglData(int size, const double *d) { a=0; Set(d,size); } - inline mglData(int rows, int cols, const double *d) { a=0; Set(d,cols,rows); } - inline mglData(const double *d, int size) { a=0; Set(d,size); } - inline mglData(const double *d, int rows, int cols) { a=0; Set(d,cols,rows); } + mglData(int size, const float *d) { a=0; Set(d,size); } + mglData(int rows, int cols, const float *d) { a=0; Set(d,cols,rows); } + mglData(int size, const double *d) { a=0; Set(d,size); } + mglData(int rows, int cols, const double *d) { a=0; Set(d,cols,rows); } + mglData(const double *d, int size) { a=0; Set(d,size); } + mglData(const double *d, int rows, int cols) { a=0; Set(d,cols,rows); } + mglData(const float *d, int size) { a=0; Set(d,size); } + mglData(const float *d, int rows, int cols) { a=0; Set(d,cols,rows); } /// Read data from file - inline mglData(const char *fname) { a=0; Read(fname); } + mglData(const char *fname) { a=0; Read(fname); } /// Allocate the memory for data array and initialize it zero - inline mglData(long xx=1,long yy=1,long zz=1) { a=0; Create(xx,yy,zz); } + mglData(long xx=1,long yy=1,long zz=1) { a=0; Create(xx,yy,zz); } /// Delete the array virtual ~mglData() { if(!link && a) delete []a; } - inline mreal GetVal(long i, long j=0, long k=0) + + inline mreal GetVal(long i, long j=0, long k=0) const { return mgl_data_get_value(this,i,j,k);} inline void SetVal(mreal f, long i, long j=0, long k=0) { mgl_data_set_value(this,f,i,j,k); } /// Get sizes - inline long GetNx() const { return nx; } - inline long GetNy() const { return ny; } - inline long GetNz() const { return nz; } + long GetNx() const { return nx; } + long GetNy() const { return ny; } + long GetNz() const { return nz; } /// Link external data array (don't delete it at exit) inline void Link(mreal *A, long NX, long NY=1, long NZ=1) @@ -158,15 +163,18 @@ public: inline void Modify(const char *eq,const mglDataA &vdat) { mgl_data_modify_vw(this,eq,&vdat,0); } /// Modify the data by specified formula assuming x,y,z in range [r1,r2] - inline void Fill(mglBase *gr, const char *eq, const char *opt="") + inline void Fill(HMGL gr, const char *eq, const char *opt="") { mgl_data_fill_eq(gr,this,eq,0,0,opt); } - inline void Fill(mglBase *gr, const char *eq, const mglDataA &vdat, const char *opt="") + inline void Fill(HMGL gr, const char *eq, const mglDataA &vdat, const char *opt="") { mgl_data_fill_eq(gr,this,eq,&vdat,0,opt); } - inline void Fill(mglBase *gr, const char *eq, const mglDataA &vdat, const mglDataA &wdat,const char *opt="") + inline void Fill(HMGL gr, const char *eq, const mglDataA &vdat, const mglDataA &wdat,const char *opt="") { mgl_data_fill_eq(gr,this,eq,&vdat,&wdat,opt); } /// Equidistantly fill the data to range [x1,x2] in direction dir inline void Fill(mreal x1,mreal x2=NaN,char dir='x') - { return mgl_data_fill(this,x1,x2,dir); } + { mgl_data_fill(this,x1,x2,dir); } + /// Fill the data by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in range [p1,p2] using global spline + inline void RefillGS(const mglDataA &xdat, const mglDataA &vdat, mreal x1, mreal x2,long sl=-1) + { mgl_data_refill_gs(this,&xdat,&vdat,x1,x2,sl); } /// Fill the data by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in range [p1,p2] inline void Refill(const mglDataA &xdat, const mglDataA &vdat, mreal x1, mreal x2,long sl=-1) { mgl_data_refill_x(this,&xdat,&vdat,x1,x2,sl); } @@ -177,14 +185,14 @@ public: inline void Refill(const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, mglPoint p1, mglPoint p2) { mgl_data_refill_xyz(this,&xdat,&ydat,&zdat,&vdat,p1.x,p2.x,p1.y,p2.y,p1.z,p2.z); } /// Fill the data by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range of gr - inline void Refill(mglBase *gr, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="") + inline void Refill(HMGL gr, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="") { mgl_data_refill_gr(gr,this,&xdat,0,0,&vdat,sl,opt); } - inline void Refill(mglBase *gr, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="") + inline void Refill(HMGL gr, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="") { mgl_data_refill_gr(gr,this,&xdat,&ydat,0,&vdat,sl,opt); } - inline void Refill(mglBase *gr, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="") + inline void Refill(HMGL gr, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="") { mgl_data_refill_gr(gr,this,&xdat,&ydat,&zdat,&vdat,-1,opt); } /// Set the data by triangulated surface values assuming x,y,z in axis range of gr - inline void Grid(mglBase *gr, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *opt="") + inline void Grid(HMGL gr, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *opt="") { mgl_data_grid(gr,this,&x,&y,&z,opt); } /// Set the data by triangulated surface values assuming x,y,z in range [p1, p2] inline void Grid(const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, mglPoint p1, mglPoint p2) @@ -207,12 +215,6 @@ public: /// Read data from text file with specifeid size inline bool Read(const char *fname,long mx,long my=1,long mz=1) { return mgl_data_read_dim(this,fname,mx,my,mz); } - /// Save whole data array (for ns=-1) or only ns-th slice to text file - inline void Save(const char *fname,long ns=-1) const - { mgl_data_save(this,fname,ns); } - /// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme - inline void Export(const char *fname,const char *scheme,mreal v1=0,mreal v2=0,long ns=-1) const - { mgl_data_export(this,fname,scheme,v1,v2,ns); } /// Import data array from PNG file according color scheme inline void Import(const char *fname,const char *scheme,mreal v1=0,mreal v2=1) { mgl_data_import(this,fname,scheme,v1,v2); } @@ -228,12 +230,6 @@ public: /// Read data array from HDF file (parse HDF4 and HDF5 files) inline int ReadHDF(const char *fname,const char *data) { return mgl_data_read_hdf(this,fname,data); } - /// Save data to HDF file - inline void SaveHDF(const char *fname,const char *data,bool rewrite=false) const - { mgl_data_save_hdf(this,fname,data,rewrite); } - /// Put HDF data names into buf as '\t' separated. - inline static int DatasHDF(const char *fname, char *buf, long size) - { return mgl_datas_hdf(fname,buf,size); } /// Get column (or slice) of the data filled by formulas of named columns inline mglData Column(const char *eq) const @@ -246,6 +242,10 @@ public: { return mglData(true,mgl_data_subdata(this,xx,yy,zz)); } inline mglData SubData(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) const { return mglData(true,mgl_data_subdata_ext(this,&xx,&yy,&zz)); } + inline mglData SubData(const mglDataA &xx, const mglDataA &yy) const + { return mglData(true,mgl_data_subdata_ext(this,&xx,&yy,0)); } + inline mglData SubData(const mglDataA &xx) const + { return mglData(true,mgl_data_subdata_ext(this,&xx,0,0)); } /// Get trace of the data array inline mglData Trace() const { return mglData(true,mgl_data_trace(this)); } @@ -337,6 +337,15 @@ public: inline void FillSample(const char *how) { mgl_data_fill_sample(this,how); } + /// Return an approximated x-value (root) when dat(x) = val + inline mreal Solve(mreal val, bool use_spline=true, long i0=0) const + { return mgl_data_solve_1d(this, val, use_spline, i0); } + /// Return an approximated value (root) when dat(x) = val + inline mglData Solve(mreal val, char dir, bool norm=true) const + { return mglData(true,mgl_data_solve(this, val, dir, 0, norm)); } + inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const + { return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); } + /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] inline mreal Spline(mreal x,mreal y=0,mreal z=0) const { return mgl_data_spline(this, x,y,z); } @@ -349,14 +358,6 @@ public: /// Interpolate by line the data to given point x,\a y,\a z which normalized in range [0, 1] inline mreal Linear1(mreal x,mreal y=0,mreal z=0) const { return mgl_data_linear(this,x*(nx-1),y*(ny-1),z*(nz-1)); } - /// Return an approximated x-value (root) when dat(x) = val - inline mreal Solve(mreal val, bool use_spline=true, long i0=0) const - { return mgl_data_solve_1d(this, val, use_spline, i0); } - /// Return an approximated value (root) when dat(x) = val - inline mglData Solve(mreal val, char dir, bool norm=true) const - { return mglData(true,mgl_data_solve(this, val, dir, 0, norm)); } - inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const - { return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); } /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] inline mreal Spline(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const @@ -373,55 +374,13 @@ public: { mreal res=mgl_data_linear_ext(this,x*(nx-1),y*(ny-1),z*(nz-1), &(dif.x),&(dif.y), &(dif.z)); dif.x*=nx>1?nx-1:1; dif.y*=ny>1?ny-1:1; dif.z*=nz>1?nz-1:1; return res; } - /// Get information about the data (sizes and momentum) to string - inline const char *PrintInfo() const { return mgl_data_info(this); } - /// Print information about the data (sizes and momentum) to FILE (for example, stdout) - inline void PrintInfo(FILE *fp) const - { if(fp) { fprintf(fp,"%s",mgl_data_info(this)); fflush(fp); } } - /// Get maximal value of the data - inline mreal Maximal() const { return mgl_data_max(this); } - /// Get minimal value of the data - inline mreal Minimal() const { return mgl_data_min(this); } - /// Get maximal value of the data which is less than 0 - inline mreal MaximalNeg() const { return mgl_data_neg_max(this); } - /// Get minimal value of the data which is larger than 0 - inline mreal MinimalPos() const { return mgl_data_pos_min(this); } - /// Get maximal value of the data and its position - inline mreal Maximal(long &i,long &j,long &k) const - { return mgl_data_max_int(this,&i,&j,&k); } - /// Get minimal value of the data and its position - inline mreal Minimal(long &i,long &j,long &k) const - { return mgl_data_min_int(this,&i,&j,&k); } - /// Get maximal value of the data and its approximated position - inline mreal Maximal(mreal &x,mreal &y,mreal &z) const - { return mgl_data_max_real(this,&x,&y,&z); } - /// Get minimal value of the data and its approximated position - inline mreal Minimal(mreal &x,mreal &y,mreal &z) const - { return mgl_data_min_real(this,&x,&y,&z); } - /// Get "energy" and find first (median) and second (width) momenta of data - inline mreal Momentum(char dir,mreal &m,mreal &w) const - { return mgl_data_momentum_val(this,dir,&m,&w,0,0); } - /// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis - inline mreal Momentum(char dir,mreal &m,mreal &w,mreal &s,mreal &k) const - { return mgl_data_momentum_val(this,dir,&m,&w,&s,&k); } - /// Find position (after specified in i,j,k) of first nonzero value of formula - inline mreal Find(const char *cond, long &i, long &j, long &k) const - { return mgl_data_first(this,cond,&i,&j,&k); } - /// Find position (before specified in i,j,k) of last nonzero value of formula - inline mreal Last(const char *cond, long &i, long &j, long &k) const - { return mgl_data_last(this,cond,&i,&j,&k); } - /// Find position of first in direction 'dir' nonzero value of formula - inline long Find(const char *cond, char dir, long i=0, long j=0, long k=0) const - { return mgl_data_find(this,cond,dir,i,j,k); } - /// Find if any nonzero value of formula - inline bool FindAny(const char *cond) const - { return mgl_data_find_any(this,cond); } - /// Copy data from other mglData variable - inline mglData &operator=(const mglData &d) - { if(this!=&d) Set(d.a,d.nx,d.ny,d.nz); return *this; } + inline const mglDataA &operator=(const mglDataA &d) + { if(this!=&d) mgl_data_set(this,&d); return d; } + inline const mglData &operator=(const mglData &d) + { if(this!=&d) mgl_data_set(this,&d); return d; } inline mreal operator=(mreal val) - { for(long i=0;i=nx || j>=ny || k>=nz) printf("Wrong index in mglData"); - return a[i+nx*(j+ny*k)]; } + /// Get the value in given cell of the data with border checking + mreal v(long i,long j=0,long k=0) const { return mgl_data_get_value(this,i,j,k); } + /// Set the value in given cell of the data + void set_v(mreal val, long i,long j=0,long k=0) { mgl_data_set_value(this,val,i,j,k); } #endif - inline mreal vthr(long i) const { return a[i]; } + mreal vthr(long i) const { return a[i]; } // add for speeding up !!! - inline mreal dvx(long i,long j=0,long k=0) const + mreal dvx(long i,long j=0,long k=0) const { register long i0=i+nx*(j+ny*k); return i>0? (i0? (j0? (k(const mglDataA &b, const mglDataA &d) { return b.Minimal()>d.Minimal(); } -#endif //----------------------------------------------------------------------------- -#ifndef SWIG -mreal mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z); -mreal mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx=0, mreal *dy=0, mreal *dz=0); +mreal MGL_EXPORT_PURE mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z); +mreal MGL_EXPORT_PURE mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx=0, mreal *dy=0, mreal *dz=0); +mreal MGL_EXPORT_PURE mglSpline3s(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z); #endif //----------------------------------------------------------------------------- /// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for amplitude and phase @@ -518,7 +477,7 @@ inline mglData mglSTFA(const mglDataA &re, const mglDataA &im, long dn, char dir { return mglData(true, mgl_data_stfa(&re,&im,dn,dir)); } //----------------------------------------------------------------------------- /// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini -inline mglData mglPDE(mglBase *gr, const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, mreal dz=0.1, mreal k0=100,const char *opt="") +inline mglData mglPDE(HMGL gr, const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, mreal dz=0.1, mreal k0=100,const char *opt="") { return mglData(true, mgl_pde_solve(gr,ham, &ini_re, &ini_im, dz, k0,opt)); } /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) inline mglData mglQO2d(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mreal r=1, mreal k0=100) @@ -533,6 +492,9 @@ inline mglData mglQO3d(const char *ham, const mglDataA &ini_re, const mglDataA & /// Finds ray with starting point r0, p0 (and prepares ray data for mglQO2d) inline mglData mglRay(const char *ham, mglPoint r0, mglPoint p0, mreal dt=0.1, mreal tmax=10) { return mglData(true, mgl_ray_trace(ham, r0.x, r0.y, r0.z, p0.x, p0.y, p0.z, dt, tmax)); } +/// Saves result of ODE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini +inline mglData mglODE(const char *df, const char *var, const mglDataA &ini, mreal dt=0.1, mreal tmax=10) +{ return mglData(true, mgl_ode_solve_str(df,var, &ini, dt, tmax)); } /// Calculate Jacobian determinant for D{x(u,v), y(u,v)} = dx/du*dy/dv-dx/dv*dy/du inline mglData mglJacobian(const mglDataA &x, const mglDataA &y) { return mglData(true, mgl_jacobian_2d(&x, &y)); } @@ -545,12 +507,34 @@ inline mglData mglTriangulation(const mglDataA &x, const mglDataA &y, const mglD inline mglData mglTriangulation(const mglDataA &x, const mglDataA &y) { return mglData(true,mgl_triangulation_2d(&x,&y)); } //----------------------------------------------------------------------------- -/// Wrapper class expression evaluating +/// Get sub-array of the data with given fixed indexes +inline mglData mglSubData(const mglDataA &dat, long xx, long yy=-1, long zz=-1) +{ return mglData(true,mgl_data_subdata(&dat,xx,yy,zz)); } +inline mglData mglSubData(const mglDataA &dat, const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) +{ return mglData(true,mgl_data_subdata_ext(&dat,&xx,&yy,&zz)); } +inline mglData mglSubData(const mglDataA &dat, const mglDataA &xx, const mglDataA &yy) +{ return mglData(true,mgl_data_subdata_ext(&dat,&xx,&yy,0)); } +inline mglData mglSubData(const mglDataA &dat, const mglDataA &xx) +{ return mglData(true,mgl_data_subdata_ext(&dat,&xx,0,0)); } +//----------------------------------------------------------------------------- +/// Prepare coefficients for global spline interpolation +inline mglData mglGSplineInit(const mglDataA &xdat, const mglDataA &ydat) +{ return mglData(true,mgl_gspline_init(&xdat, &ydat)); } +/// Evaluate global spline (and its derivatives d1, d2 if not NULL) using prepared coefficients \a coef +inline mreal mglGSpline(const mglDataA &coef, mreal dx, mreal *d1=0, mreal *d2=0) +{ return mgl_gspline(&coef, dx, d1,d2); } +//----------------------------------------------------------------------------- +/// Wrapper class for expression evaluating class MGL_EXPORT mglExpr { HMEX ex; + mglExpr(const mglExpr &){} // copying is not allowed + const mglExpr &operator=(const mglExpr &t){return t;} // copying is not allowed public: mglExpr(const char *expr) { ex = mgl_create_expr(expr); } +#if MGL_HAVE_RVAL + mglExpr(mglExpr &&d):ex(d.ex) { d.ex=0; } +#endif ~mglExpr() { mgl_delete_expr(ex); } /// Return value of expression for given x,y,z variables inline double Eval(double x, double y=0, double z=0) @@ -568,57 +552,324 @@ public: #endif }; //----------------------------------------------------------------------------- -#ifndef SWIG -/// Structure for handling named mglData (used by mglParse class). -class MGL_EXPORT mglVar : public mglData +/// Class which present variable as data array +class MGL_EXPORT mglDataV : public mglDataA { + long nx; ///< number of points in 1st dimensions ('x' dimension) + long ny; ///< number of points in 2nd dimensions ('y' dimension) + long nz; ///< number of points in 3d dimensions ('z' dimension) + mreal di, dj, dk, a0; public: - std::wstring s; ///< Data name - void *o; ///< Pointer to external object - mglVar *next; ///< Pointer to next instance in list - mglVar *prev; ///< Pointer to previous instance in list - bool temp; ///< This is temporary variable - void (*func)(void *); ///< Callback function for destroying - - mglVar(std::wstring name=L""):mglData() - { o=0; next=prev=0; func=0; temp=false; s=name; } - mglVar(mglVar **head, std::wstring name=L""):mglData() - { o=0; next=*head; prev=0; *head=this; func=0; temp=false; s=name; } - mglVar(mglVar **head, const mglData &dat, std::wstring name):mglData(dat) - { o=0; next=*head; prev=0; *head=this; func=0; temp=false; s=name; } - mglVar(mglVar **head, HCDT dat, std::wstring name):mglData(dat) - { o=0; next=*head; prev=0; *head=this; func=0; temp=false; s=name; } - mglVar(mglVar *v, std::wstring name, bool link=true):mglData() // NOTE: use carefully due to Link()! - { if(!v) throw mglWarnZero; - if(link) Link(*v); else Set(*v); - o=0; temp=false; s=name; func = v->func; - prev = v; next = v->next; v->next = this; - if(next) next->prev = this; } - virtual ~mglVar() + mglDataV(long xx=1,long yy=1,long zz=1,mreal x1=0,mreal x2=NaN,char dir='x'):nx(xx),ny(yy),nz(zz) + { Fill(x1,x2,dir); } + mglDataV(const mglDataV &d):nx(d.nx),ny(d.ny),nz(d.nz),di(d.di),dj(d.dj),dk(d.dk),a0(d.a0) {} +#if MGL_HAVE_RVAL + mglDataV(mglDataV &&d):nx(d.nx),ny(d.ny),nz(d.nz),di(d.di),dj(d.dj),dk(d.dk),a0(d.a0) + { s=d.s; temp=d.temp; func=d.func; o=d.o; d.func=0; } +#endif + virtual ~mglDataV() {} + + /// Get sizes + long GetNx() const { return nx; } + long GetNy() const { return ny; } + long GetNz() const { return nz; } + + /// Create or recreate the array with specified size and fill it by zero + inline void Create(long mx,long my=1,long mz=1) + { di=mx>1?di*(nx-1)/(mx-1):0; dj=my>1?dj*(ny-1)/(my-1):0; + dk=mz>1?dk*(nz-1)/(mz-1):0; nx=mx; ny=my; nz=mz; } + /// For going throw all elements + inline void All() { di=dj=dk=1; a0=0; } + /// Equidistantly fill the data to range [x1,x2] in direction dir + inline void Fill(mreal x1,mreal x2=NaN,char dir='x') { - if(func) func(o); - if(prev) prev->next = next; - if(next) next->prev = prev; + di=dj=dk=0; a0=x1; + if(mgl_isnum(x2)) + { + if(dir=='x' && nx>1) di=(x2-x1)/(nx-1); + if(dir=='y' && ny>1) dj=(x2-x1)/(ny-1); + if(dir=='z' && nz>1) dk=(x2-x1)/(nz-1); + } } - /// Make copy which link on the same data but have different name. NOTE: use carefully due to Link()! - inline void Duplicate(std::wstring name) - { mglVar *v=new mglVar(name); v->Link(*this); v->MoveAfter(this); } - /// Move variable after var and copy func from var (if func is 0) - inline void MoveAfter(mglVar *var) + mreal Maximal() const + { return a0+mgl_max(mgl_max(di*(nx-1),dj*(ny-1)),mgl_max(dk*(nz-1),0)); } + mreal Minimal() const + { return a0+mgl_min(mgl_min(di*(nx-1),dj*(ny-1)),mgl_min(dk*(nz-1),0)); } + + /// Copy data from other mglDataV variable + inline const mglDataV &operator=(const mglDataV &d) + { nx=d.nx; ny=d.ny; nz=d.nz; a0=d.a0; + di=d.di; dj=d.dj; dk=d.dk; return d; } + inline mreal operator=(mreal val) + { di=dj=dk=0; a0=val; return val; } + /// Get the value in given cell of the data without border checking + mreal value(mreal x,mreal y,mreal z,mreal *dx=0,mreal *dy=0,mreal *dz=0) const + { if(dx) *dx=di; if(dy) *dy=dj; if(dz) *dz=dk; + return a0+di*x+dj*y+dk*z; } + mreal v(long i,long j=0,long k=0) const + { return a0+di*i+dj*j+dk*k; } + mreal vthr(long ii) const + { register long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny); + return a0+di*i+dj*j+dk*k; } + // add for speeding up !!! + mreal dvx(long ,long =0,long =0) const { return di; } + mreal dvy(long ,long =0,long =0) const { return dj; } + mreal dvz(long ,long =0,long =0) const { return dk; } +}; +//----------------------------------------------------------------------------- +/// Class which present FFT frequency as data array +class MGL_EXPORT mglDataW : public mglDataA +{ + long nx; ///< number of points in 1st dimensions ('x' dimension) + long ny; ///< number of points in 2nd dimensions ('y' dimension) + long nz; ///< number of points in 3d dimensions ('z' dimension) + mreal di, dj, dk; +public: + + mglDataW(long xx=1,long yy=1,long zz=1,mreal dp=0,char dir='x'):nx(xx),ny(yy),nz(zz) + { Freq(dp,dir); } + mglDataW(const mglDataW &d):nx(d.nx),ny(d.ny),nz(d.nz),di(d.di),dj(d.dj),dk(d.dk) {} +#if MGL_HAVE_RVAL + mglDataW(mglDataW &&d):nx(d.nx),ny(d.ny),nz(d.nz),di(d.di),dj(d.dj),dk(d.dk) + { s=d.s; temp=d.temp; func=d.func; o=d.o; d.func=0; } +#endif + virtual ~mglDataW() {} + + /// Get sizes + long GetNx() const { return nx; } + long GetNy() const { return ny; } + long GetNz() const { return nz; } + + /// Create or recreate the array with specified size and fill it by zero + inline void Create(long mx,long my=1,long mz=1) + { nx=mx; ny=my; nz=mz; } + /// For going throw all elements + inline void All() { di=dj=dk=1; } + /// Equidistantly fill the data to range [x1,x2] in direction dir + inline void Freq(mreal dp,char dir='x') + { + di=dj=dk=0; + if(dir=='x') di=dp; + if(dir=='y') dj=dp; + if(dir=='z') dk=dp; + } + mreal Maximal() const + { return mgl_max(mgl_max(di*(nx-1),dj*(ny-1)),mgl_max(dk*(nz-1),0)); } + mreal Minimal() const + { return mgl_min(mgl_min(di*(nx-1),dj*(ny-1)),mgl_min(dk*(nz-1),0)); } + + /// Copy data from other mglDataV variable + inline const mglDataW &operator=(const mglDataW &d) + { nx=d.nx; ny=d.ny; nz=d.nz; di=d.di; dj=d.dj; dk=d.dk; return d; } + /// Get the value in given cell of the data without border checking + mreal value(mreal x,mreal y,mreal z,mreal *dx=0,mreal *dy=0,mreal *dz=0) const + { if(dx) *dx=di; if(dy) *dy=dj; if(dz) *dz=dk; + return di*(x1?(v2.x-v1.x)/(nx-1):0; + dy = ny>1?(v2.y-v1.y)/(ny-1):0; + dz = nz>1?(v2.z-v1.z)/(nz-1):0; + } + mreal (*dfunc)(mreal i, mreal j, mreal k, void *par); + void *par; +public: + + mglDataF(long xx=1,long yy=1,long zz=1):nx(xx),ny(yy),nz(zz), dfunc(0),par(0) + { ex=0; v2=mglPoint(1,1,1); setD(); } + mglDataF(const mglDataF &d) : nx(d.nx), ny(d.ny), nz(d.nz), str(d.str), v1(d.v1), v2(d.v2), dx(d.dx),dy(d.dy),dz(d.dz), dfunc(d.dfunc),par(d.par) + { ex = mgl_create_expr(str.c_str()); } +#if MGL_HAVE_RVAL + mglDataF(mglDataF &&d):nx(d.nx),ny(d.ny),nz(d.nz), str(d.str), v1(d.v1),v2(d.v2), ex(d.ex), dx(d.dx),dy(d.dy),dz(d.dz), dfunc(d.dfunc),par(d.par) + { s=d.s; temp=d.temp; func=d.func; o=d.o; d.ex=0; d.func=0; } +#endif + virtual ~mglDataF() { mgl_delete_expr(ex); } + + /// Get sizes + long GetNx() const { return nx; } + long GetNy() const { return ny; } + long GetNz() const { return nz; } + + /// Create or recreate the array with specified size and fill it by zero + inline void Create(long mx,long my=1,long mz=1) { nx=mx; ny=my; nz=mz; setD(); } + inline void SetRanges(mglPoint p1, mglPoint p2) { v1=p1; v2=p2; setD(); } + /// Set formula to be used as dfunction + inline void SetFormula(const char *eq) + { + mgl_delete_expr(ex); dfunc=0; par=0; + if(eq && *eq) { ex = mgl_create_expr(eq); str=eq; } + else { ex=0; str=""; } + } + /// Set dfunction and coordinates range [r1,r2] + inline void SetFunc(mreal (*f)(mreal,mreal,mreal,void*), void *p=NULL) + { mgl_delete_expr(ex); ex=0; dfunc=f; par=p; } + + mreal value(mreal i,mreal j=0,mreal k=0, mreal *di=0,mreal *dj=0,mreal *dk=0) const { - if(prev) prev->next = next; - if(next) next->prev = prev; - prev = next = 0; - if(var) + mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; + if(di) *di = 0; if(dj) *dj = 0; if(dk) *dk = 0; + if(dfunc) { - prev = var; next = var->next; - var->next = this; - if(func==0) func = var->func; + res = dfunc(x,y,z, par); + if(di) *di = dfunc(x+dx,y,z, par)-res; + if(dj) *dj = dfunc(x,y+dy,z, par)-res; + if(dk) *dk = dfunc(x,y,z+dz, par)-res; } - if(next) next->prev = this; + else if(ex) + { + if(di) *di = mgl_expr_diff(ex,'x',x,y,z)*dx; + if(dj) *dj = mgl_expr_diff(ex,'y',x,y,z)*dy; + if(dk) *dk = mgl_expr_diff(ex,'z',x,y,z)*dz; + res = mgl_expr_eval(ex,x,y,z); + } + return res; + } + /// Copy data from other mglDataV variable + inline const mglDataF &operator=(const mglDataF &d) + { nx=d.nx; ny=d.ny; nz=d.nz; v1=d.v1; v2=d.v2; setD(); + str=d.str; ex = mgl_create_expr(str.c_str()); dfunc=d.dfunc; par=d.par; return d; } + /// Get the value in given cell of the data without border checking + mreal v(long i,long j=0,long k=0) const + { + mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; + if(dfunc) res = dfunc(x,y,z, par); + else if(ex) res = mgl_expr_eval(ex,x,y,z); + return res; + } + mreal vthr(long i) const + { + mreal res=0, x=v1.x+dx*(i%nx), y=v1.y+dy*((i/nx)%ny), z=v1.z+dz*(i/(nx*ny)); + if(dfunc) res = dfunc(x,y,z, par); + else if(ex) res = mgl_expr_eval(ex,x,y,z); + return res; } + // add for speeding up !!! + mreal dvx(long i,long j=0,long k=0) const + { + mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; + if(dfunc) res = dfunc(x+dx,y,z, par)-dfunc(x,y,z, par); + else if(ex) res = mgl_expr_eval(ex,x+dx,y,z)-mgl_expr_eval(ex,x,y,z); + return res; + } + mreal dvy(long i,long j=0,long k=0) const + { + mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; + if(dfunc) res = dfunc(x,y+dy,z, par)-dfunc(x,y,z, par); + else if(ex) res = mgl_expr_eval(ex,x,y+dy,z)-mgl_expr_eval(ex,x,y,z); + return res; + } + mreal dvz(long i,long j=0,long k=0) const + { + mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; + if(dfunc) res = dfunc(x,y,z+dz, par)-dfunc(x,y,z, par); + else if(ex) res = mgl_expr_eval(ex,x,y,z+dz)-mgl_expr_eval(ex,x,y,z); + return res; + } +}; +//----------------------------------------------------------------------------- +/// Class which present variable as data array +class MGL_EXPORT mglDataT : public mglDataA +{ + const mglDataA &dat; + long ind; +public: + mglDataT(const mglDataT &d) : dat(d.dat), ind(d.ind) { s = d.s; } + mglDataT(const mglDataA &d, long col=0) : dat(d), ind(col) {} +#if MGL_HAVE_RVAL + mglDataT(mglDataT &&d):dat(d.dat),ind(d.ind) + { s=d.s; temp=d.temp; func=d.func; o=d.o; d.func=0; } +#endif + virtual ~mglDataT() {} + + /// Get sizes + long GetNx() const { return dat.GetNy(); } + long GetNy() const { return dat.GetNz(); } + long GetNz() const { return 1; } + + mreal Maximal() const + { return mglSubData(dat,ind).Maximal(); } + mreal Minimal() const + { return mglSubData(dat,ind).Minimal(); } + inline void SetInd(long i, const wchar_t *name) + { ind = i; s = name; } + inline void SetInd(long i, wchar_t name) + { ind = i; s = name; } + + /// Get the value in given cell of the data without border checking + mreal v(long i,long j=0,long =0) const + { return dat.v(ind,i,j); } + mreal vthr(long i) const + { return dat.vthr(ind+dat.GetNx()*i); } + // add for speeding up !!! + mreal dvx(long i,long j=0,long =0) const + { return dat.dvy(ind,i,j); } + mreal dvy(long i,long j=0,long =0) const + { return dat.dvz(ind,i,j); } + mreal dvz(long ,long =0,long =0) const + { return 0; } }; +//----------------------------------------------------------------------------- +class MGL_EXPORT mglDataR : public mglDataA +{ + const mglDataA &dat; + long ind; +public: + mglDataR(const mglDataR &d) : dat(d.dat), ind(d.ind) { s = d.s; } + mglDataR(const mglDataA &d, long row=0) : dat(d), ind(row) {} +#if MGL_HAVE_RVAL + mglDataR(mglDataR &&d):dat(d.dat),ind(d.ind) + { s=d.s; temp=d.temp; func=d.func; o=d.o; d.func=0; } #endif + virtual ~mglDataR() {} + + /// Get sizes + long GetNx() const { return dat.GetNx(); } + long GetNy() const { return 1; } + long GetNz() const { return 1; } + + mreal Maximal() const + { return mglSubData(dat,-1,ind).Maximal(); } + mreal Minimal() const + { return mglSubData(dat,-1,ind).Minimal(); } + inline void SetInd(long i, const wchar_t *name) + { ind = i; s = name; } + inline void SetInd(long i, wchar_t name) + { ind = i; s = name; } + + /// Get the value in given cell of the data without border checking + mreal v(long i,long =0,long =0) const + { return dat.v(i,ind,0); } + mreal vthr(long i) const + { return dat.vthr(i+dat.GetNx()*ind); } + // add for speeding up !!! + mreal dvx(long i,long j=0,long =0) const + { return dat.dvx(i,ind,0); } + mreal dvy(long i,long j=0,long =0) const + { return 0; } + mreal dvz(long ,long =0,long =0) const + { return 0; } +}; //----------------------------------------------------------------------------- #endif #endif diff --git a/include/mgl2/data_cf.h b/include/mgl2/data_cf.h index 224ef76..2976bde 100644 --- a/include/mgl2/data_cf.h +++ b/include/mgl2/data_cf.h @@ -46,8 +46,8 @@ void MGL_EXPORT mgl_srnd_(int *seed); double MGL_EXPORT mgl_rnd(); double MGL_EXPORT mgl_rnd_(); /// Get integer power of x -double MGL_EXPORT mgl_ipow(double x,int n); -double MGL_EXPORT mgl_ipow_(mreal *x,int *n); +double MGL_EXPORT_CONST mgl_ipow(double x,int n); +double MGL_EXPORT_PURE mgl_ipow_(mreal *x,int *n); /// Get number of seconds since 1970 for given string double MGL_EXPORT mgl_get_time(const char *time, const char *fmt); double MGL_EXPORT mgl_get_time_(const char *time, const char *fmt,int,int); @@ -64,8 +64,6 @@ uintptr_t MGL_EXPORT mgl_create_data_file_(const char *fname, int len); /// Delete HMDT object void MGL_EXPORT mgl_delete_data(HMDT dat); void MGL_EXPORT mgl_delete_data_(uintptr_t *dat); -/// Get information about the data (sizes and momentum) to string -MGL_EXPORT const char *mgl_data_info(HCDT dat); /// Rearange data dimensions void MGL_EXPORT mgl_data_rearrange(HMDT dat, long mx,long my,long mz); @@ -113,11 +111,6 @@ void MGL_EXPORT mgl_data_set_values_(uintptr_t *d, const char *val, int *nx, int /// Read data array from HDF file (parse HDF4 and HDF5 files) int MGL_EXPORT mgl_data_read_hdf(HMDT d,const char *fname,const char *data); int MGL_EXPORT mgl_data_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n); -/// Save data to HDF file -void MGL_EXPORT mgl_data_save_hdf(HCDT d,const char *fname,const char *data,int rewrite); -void MGL_EXPORT mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n); -/// Put HDF data names into buf as '\t' separated. -int MGL_EXPORT mgl_datas_hdf(const char *fname, char *buf, long size); /// Read data from tab-separated text file with auto determining size int MGL_EXPORT mgl_data_read(HMDT dat, const char *fname); int MGL_EXPORT mgl_data_read_(uintptr_t *d, const char *fname,int l); @@ -133,12 +126,6 @@ int MGL_EXPORT mgl_data_read_range_(uintptr_t *d, const char *fname, mreal *n1, /// Read data from tab-separated text files with auto determining size which filenames are satisfied to template (like "t_*.dat") int MGL_EXPORT mgl_data_read_all(HMDT dat, const char *templ, int as_slice); int MGL_EXPORT mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l); -/// Save whole data array (for ns=-1) or only ns-th slice to text file -void MGL_EXPORT mgl_data_save(HCDT dat, const char *fname,long ns); -void MGL_EXPORT mgl_data_save_(uintptr_t *dat, const char *fname,int *ns,int); -/// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme -void MGL_EXPORT mgl_data_export(HCDT dat, const char *fname, const char *scheme,mreal v1,mreal v2,long ns); -void MGL_EXPORT mgl_data_export_(uintptr_t *dat, const char *fname, const char *scheme,mreal *v1,mreal *v2,int *ns,int,int); /// Import data array from PNG file according color scheme void MGL_EXPORT mgl_data_import(HMDT dat, const char *fname, const char *scheme,mreal v1,mreal v2); void MGL_EXPORT mgl_data_import_(uintptr_t *dat, const char *fname, const char *scheme,mreal *v1,mreal *v2,int,int); @@ -173,6 +160,9 @@ void MGL_EXPORT mgl_data_fill_(uintptr_t *dat, mreal *x1,mreal *x2,const char *d /// Modify the data by specified formula assuming x,y,z in range [r1,r2] void MGL_EXPORT mgl_data_fill_eq(HMGL gr, HMDT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt); void MGL_EXPORT mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int); +/// Fill dat by interpolated values of vdat parametrically depended on xdat for x in range [x1,x2] using global spline +void MGL_EXPORT mgl_data_refill_gs(HMDT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl); +void MGL_EXPORT mgl_data_refill_gs_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl); /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in range [x1,x2] void MGL_EXPORT mgl_data_refill_x(HMDT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl); void MGL_EXPORT mgl_data_refill_x_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl); @@ -207,22 +197,10 @@ void MGL_EXPORT mgl_data_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *v void MGL_EXPORT mgl_data_squeeze(HMDT dat, long rx,long ry,long rz,long smooth); void MGL_EXPORT mgl_data_squeeze_(uintptr_t *dat, int *rx,int *ry,int *rz,int *smooth); -/// Get maximal value of the data -mreal MGL_EXPORT mgl_data_max(HCDT dat); -mreal MGL_EXPORT mgl_data_max_(uintptr_t *dat); -/// Get maximal value of the data which is less than 0 -mreal MGL_EXPORT mgl_data_neg_max(HCDT dat); -mreal MGL_EXPORT mgl_data_neg_max_(uintptr_t *dat); -/// Get minimal value of the data -mreal MGL_EXPORT mgl_data_min(HCDT dat); -mreal MGL_EXPORT mgl_data_min_(uintptr_t *dat); -/// Get minimal value of the data which is larger than 0 -mreal MGL_EXPORT mgl_data_pos_min(HCDT dat); -mreal MGL_EXPORT mgl_data_pos_min_(uintptr_t *dat); /// Returns pointer to data element [i,j,k] MGL_EXPORT mreal *mgl_data_value(HMDT dat, long i,long j,long k); /// Returns pointer to internal data array -MGL_EXPORT mreal *mgl_data_data(HMDT dat); +MGL_EXPORT_PURE mreal *mgl_data_data(HMDT dat); /// Gets the x-size of the data. long MGL_EXPORT mgl_data_get_nx(HCDT d); @@ -234,34 +212,6 @@ long MGL_EXPORT mgl_data_get_ny_(uintptr_t *d); long MGL_EXPORT mgl_data_get_nz(HCDT d); long MGL_EXPORT mgl_data_get_nz_(uintptr_t *d); -/// Find position (after specified in i,j,k) of first nonzero value of formula -mreal MGL_EXPORT mgl_data_first(HCDT dat, const char *cond, long *i, long *j, long *k); -mreal MGL_EXPORT mgl_data_first_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); -/// Find position (before specified in i,j,k) of last nonzero value of formula -mreal MGL_EXPORT mgl_data_last(HCDT dat, const char *cond, long *i, long *j, long *k); -mreal MGL_EXPORT mgl_data_last_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); -/// Find position of first in direction 'dir' nonzero value of formula -long MGL_EXPORT mgl_data_find(HCDT dat, const char *cond, char dir, long i, long j, long k); -int MGL_EXPORT mgl_data_find_(uintptr_t *dat, const char *cond, char *dir, int *i, int *j, int *k, int,int); -/// Find if any nonzero value of formula -int MGL_EXPORT mgl_data_find_any(HCDT dat, const char *cond); -int MGL_EXPORT mgl_data_find_any_(uintptr_t *dat, const char *cond, int); -/// Get maximal value of the data and its position -mreal MGL_EXPORT mgl_data_max_int(HCDT dat, long *i, long *j, long *k); -mreal MGL_EXPORT mgl_data_max_int_(uintptr_t *dat, int *i, int *j, int *k); -/// Get maximal value of the data and its approximated position -mreal MGL_EXPORT mgl_data_max_real(HCDT dat, mreal *x, mreal *y, mreal *z); -mreal MGL_EXPORT mgl_data_max_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z); -/// Get minimal value of the data and its position -mreal MGL_EXPORT mgl_data_min_int(HCDT dat, long *i, long *j, long *k); -mreal MGL_EXPORT mgl_data_min_int_(uintptr_t *dat, int *i, int *j, int *k); -/// Get minimal value of the data and its approximated position -mreal MGL_EXPORT mgl_data_min_real(HCDT dat, mreal *x, mreal *y, mreal *z); -mreal MGL_EXPORT mgl_data_min_real_(uintptr_t *dat, mreal *x, mreal *y, mreal *z); -/// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis -mreal MGL_EXPORT mgl_data_momentum_val(HCDT d, char dir, mreal *m, mreal *w, mreal *s, mreal *k); -mreal MGL_EXPORT mgl_data_momentum_val_(uintptr_t *dat, char *dir, mreal *m, mreal *w, mreal *s, mreal *k,int); - /// Get the data which is direct multiplication (like, d[i,j] = this[i]*a[j] and so on) HMDT MGL_EXPORT mgl_data_combine(HCDT dat1, HCDT dat2); uintptr_t MGL_EXPORT mgl_data_combine_(uintptr_t *dat1, uintptr_t *dat2); @@ -346,20 +296,26 @@ void MGL_EXPORT mgl_fft(double *x, long s, long n, const void *wt, void *ws, int void MGL_EXPORT mgl_clear_fft(); /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] -mreal MGL_EXPORT mgl_data_spline(HCDT dat, mreal x,mreal y,mreal z); -mreal MGL_EXPORT mgl_data_spline_(uintptr_t *dat, mreal *x,mreal *y,mreal *z); +mreal MGL_EXPORT_PURE mgl_data_spline(HCDT dat, mreal x,mreal y,mreal z); +mreal MGL_EXPORT_PURE mgl_data_spline_(uintptr_t *dat, mreal *x,mreal *y,mreal *z); /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] -mreal MGL_EXPORT mgl_data_linear(HCDT dat, mreal x,mreal y,mreal z); -mreal MGL_EXPORT mgl_data_linear_(uintptr_t *dat, mreal *x,mreal *y,mreal *z); +mreal MGL_EXPORT_PURE mgl_data_linear(HCDT dat, mreal x,mreal y,mreal z); +mreal MGL_EXPORT_PURE mgl_data_linear_(uintptr_t *dat, mreal *x,mreal *y,mreal *z); /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] -mreal MGL_EXPORT mgl_data_spline_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz); -mreal MGL_EXPORT mgl_data_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz); +mreal MGL_EXPORT_PURE mgl_data_spline_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz); +mreal MGL_EXPORT_PURE mgl_data_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz); +/// Prepare coefficients for global spline interpolation +HMDT MGL_EXPORT mgl_gspline_init(HCDT x, HCDT v); +uintptr_t MGL_EXPORT mgl_gspline_init_(uintptr_t *x, uintptr_t *v); +/// Evaluate global spline (and its derivatives d1, d2 if not NULL) using prepared coefficients \a coef +mreal MGL_EXPORT mgl_gspline(HCDT coef, mreal dx, mreal *d1, mreal *d2); +mreal MGL_EXPORT mgl_gspline_(uintptr_t *c, mreal *dx, mreal *d1, mreal *d2); /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] -mreal MGL_EXPORT mgl_data_linear_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz); -mreal MGL_EXPORT mgl_data_linear_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz); +mreal MGL_EXPORT_PURE mgl_data_linear_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz); +mreal MGL_EXPORT_PURE mgl_data_linear_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz); /// Return an approximated x-value (root) when dat(x) = val -mreal MGL_EXPORT mgl_data_solve_1d(HCDT dat, mreal val, int spl, long i0); -mreal MGL_EXPORT mgl_data_solve_1d_(uintptr_t *dat, mreal *val, int *spl, int *i0); +mreal MGL_EXPORT_PURE mgl_data_solve_1d(HCDT dat, mreal val, int spl, long i0); +mreal MGL_EXPORT_PURE mgl_data_solve_1d_(uintptr_t *dat, mreal *val, int *spl, int *i0); /// Return an approximated value (root) when dat(x) = val HMDT MGL_EXPORT mgl_data_solve(HCDT dat, mreal val, char dir, HCDT i0, int norm); uintptr_t MGL_EXPORT mgl_data_solve_(uintptr_t *dat, mreal *val, const char *dir, uintptr_t *i0, int *norm,int); @@ -375,13 +331,13 @@ HMDT MGL_EXPORT mgl_data_resize_box(HCDT dat, long mx,long my,long mz,mreal x1,m uintptr_t MGL_EXPORT mgl_data_resize_box_(uintptr_t *dat, int *mx,int *my,int *mz,mreal *x1,mreal *x2,mreal *y1,mreal *y2,mreal *z1,mreal *z2); /// Create n-th points distribution of this data values in range [v1, v2] HMDT MGL_EXPORT mgl_data_hist(HCDT dat, long n, mreal v1, mreal v2, long nsub); -uintptr_t MGL_EXPORT mgl_data_momentum_(uintptr_t *dat, char *dir, const char *how, int,int); +uintptr_t MGL_EXPORT mgl_data_hist_(uintptr_t *dat, int *n, mreal *v1, mreal *v2, int *nsub); /// Create n-th points distribution of this data values in range [v1, v2] with weight w HMDT MGL_EXPORT mgl_data_hist_w(HCDT dat, HCDT weight, long n, mreal v1, mreal v2, long nsub); -uintptr_t MGL_EXPORT mgl_data_hist_(uintptr_t *dat, int *n, mreal *v1, mreal *v2, int *nsub); +uintptr_t MGL_EXPORT mgl_data_hist_w_(uintptr_t *dat, uintptr_t *weight, int *n, mreal *v1, mreal *v2, int *nsub); /// Get momentum (1D-array) of data along direction 'dir'. String looks like "x1" for median in x-direction, "x2" for width in x-dir and so on. HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how); -uintptr_t MGL_EXPORT mgl_data_hist_w_(uintptr_t *dat, uintptr_t *weight, int *n, mreal *v1, mreal *v2, int *nsub); +uintptr_t MGL_EXPORT mgl_data_momentum_(uintptr_t *dat, char *dir, const char *how, int,int); /// Get array which values is result of interpolation this for coordinates from other arrays HMDT MGL_EXPORT mgl_data_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm); uintptr_t MGL_EXPORT mgl_data_evaluate_(uintptr_t *dat, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm); @@ -460,18 +416,18 @@ uintptr_t MGL_EXPORT mgl_create_expr_(const char *expr, int); void MGL_EXPORT mgl_delete_expr(HMEX ex); void MGL_EXPORT mgl_delete_expr_(uintptr_t *ex); /// Return value of expression for given x,y,z variables -double MGL_EXPORT mgl_expr_eval(HMEX ex, double x, double y,double z); +double MGL_EXPORT_PURE mgl_expr_eval(HMEX ex, double x, double y,double z); double MGL_EXPORT mgl_expr_eval_(uintptr_t *ex, mreal *x, mreal *y, mreal *z); /// Return value of expression for given variables double MGL_EXPORT mgl_expr_eval_v(HMEX ex, mreal *vars); /// Return value of expression differentiation over variable dir for given x,y,z variables -double MGL_EXPORT mgl_expr_diff(HMEX ex, char dir, double x, double y,double z); +double MGL_EXPORT_PURE mgl_expr_diff(HMEX ex, char dir, double x, double y,double z); double MGL_EXPORT mgl_expr_diff_(uintptr_t *ex, const char *dir, mreal *x, mreal *y, mreal *z, int); /// Return value of expression differentiation over variable dir for given variables double MGL_EXPORT mgl_expr_diff_v(HMEX ex, char dir, mreal *vars); - +//----------------------------------------------------------------------------- #ifdef __cplusplus } #endif -//----------------------------------------------------------------------------- #endif +//----------------------------------------------------------------------------- diff --git a/include/mgl2/datac.h b/include/mgl2/datac.h index 14218d9..a865c8b 100644 --- a/include/mgl2/datac.h +++ b/include/mgl2/datac.h @@ -1,5 +1,5 @@ /*************************************************************************** - * data.h is part of Math Graphic Library + * datac.h is part of Math Graphic Library * Copyright (C) 2007-2014 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * @@ -30,11 +30,11 @@ #define mgl3 mreal(3) #define mgl4 mreal(4) //----------------------------------------------------------------------------- -/// Class for working with data array +/// Class for working with complex data array class MGL_EXPORT mglDataC : public mglDataA { public: - +using mglDataA::Momentum; long nx; ///< number of points in 1st dimensions ('x' dimension) long ny; ///< number of points in 2nd dimensions ('y' dimension) long nz; ///< number of points in 3d dimensions ('z' dimension) @@ -42,35 +42,49 @@ public: std::string id; ///< column (or slice) names bool link; ///< use external data (i.e. don't free it) - /// Initiate by other mglData variable - inline mglDataC(const mglDataC &d) { a=0; mgl_datac_set(this,&d); } // NOTE: must be constructor for mglDataC& to exclude copy one - inline mglDataC(const mglDataA *d) { a=0; mgl_datac_set(this, d); } - inline mglDataC(bool, mglDataC *d) // NOTE: Variable d will be deleted!!! + /// Initiate by other mglDataC variable + mglDataC(const mglDataC &d) { a=0; mgl_datac_set(this,&d); } // NOTE: must be constructor for mglDataC& to exclude copy one + mglDataC(const mglDataA &d) { a=0; mgl_datac_set(this,&d); } +#if MGL_HAVE_RVAL + mglDataC(mglDataC &&d):nx(d.nx),ny(d.ny),nz(d.nz),a(d.a),id(d.id),link(d.link) + { s=d.s; temp=d.temp; func=d.func; o=d.o; d.a=0; d.func=0; } +#endif + mglDataC(const mglDataA &re, const mglDataA &im) { a=0; mgl_datac_set_ri(this,&re,&im); } + mglDataC(HCDT d) { a=0; mgl_datac_set(this, d); } + mglDataC(HCDT re, HCDT im) { a=0; mgl_datac_set_ri(this, re, im); } + mglDataC(bool, mglDataC *d) // NOTE: Variable d will be deleted!!! { if(d) { nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=0; + temp=d->temp; func=d->func; o=d->o; s=d->s; id=d->id; link=d->link; delete d; } else { a=0; Create(1); } } /// Initiate by flat array - inline mglDataC(int size, const dual *d) { a=0; Set(d,size); } - inline mglDataC(int rows, int cols, const dual *d) { a=0; Set(d,cols,rows); } - inline mglDataC(int size, const double *d) { a=0; Set(d,size); } - inline mglDataC(int rows, int cols, const double *d) { a=0; Set(d,cols,rows); } - inline mglDataC(int size, const float *d) { a=0; Set(d,size); } - inline mglDataC(int rows, int cols, const float *d) { a=0; Set(d,cols,rows); } + mglDataC(int size, const dual *d) { a=0; Set(d,size); } + mglDataC(int rows, int cols, const dual *d) { a=0; Set(d,cols,rows); } + mglDataC(int size, const double *d) { a=0; Set(d,size); } + mglDataC(int rows, int cols, const double *d) { a=0; Set(d,cols,rows); } + mglDataC(int size, const float *d) { a=0; Set(d,size); } + mglDataC(int rows, int cols, const float *d) { a=0; Set(d,cols,rows); } + mglDataC(const dual *d, int size) { a=0; Set(d,size); } + mglDataC(const dual *d, int rows, int cols) { a=0; Set(d,cols,rows); } + mglDataC(const double *d, int size) { a=0; Set(d,size); } + mglDataC(const double *d, int rows, int cols) { a=0; Set(d,cols,rows); } + mglDataC(const float *d, int size) { a=0; Set(d,size); } + mglDataC(const float *d, int rows, int cols) { a=0; Set(d,cols,rows); } /// Read data from file - inline mglDataC(const char *fname) { a=0; Read(fname); } + mglDataC(const char *fname) { a=0; Read(fname); } /// Allocate the memory for data array and initialize it zero - inline mglDataC(long xx=1,long yy=1,long zz=1) { a=0; Create(xx,yy,zz); } + mglDataC(long xx=1,long yy=1,long zz=1) { a=0; Create(xx,yy,zz); } /// Delete the array virtual ~mglDataC() { if(!link && a) delete []a; } - inline dual GetVal(long i, long j=0, long k=0) + inline dual GetVal(long i, long j=0, long k=0) const { return mgl_datac_get_value(this,i,j,k);} inline void SetVal(dual f, long i, long j=0, long k=0) { mgl_datac_set_value(this,f,i,j,k); } /// Get sizes - inline long GetNx() const { return nx; } - inline long GetNy() const { return ny; } - inline long GetNz() const { return nz; } + long GetNx() const { return nx; } + long GetNy() const { return ny; } + long GetNz() const { return nz; } /// Link external data array (don't delete it at exit) inline void Link(dual *A, long NX, long NY=1, long NZ=1) @@ -160,7 +174,7 @@ public: { mgl_datac_fill_eq(gr,this,eq,&vdat,&wdat,opt); } /// Equidistantly fill the data to range [x1,x2] in direction dir inline void Fill(dual x1,dual x2=NaN,char dir='x') - { return mgl_datac_fill(this,x1,x2,dir); } + { mgl_datac_fill(this,x1,x2,dir); } /// Put value to data element(s) inline void Put(dual val, long i=-1, long j=-1, long k=-1) @@ -182,7 +196,7 @@ public: inline bool Read(const char *fname,long mx,long my=1,long mz=1) { return mgl_datac_read_dim(this,fname,mx,my,mz); } /// Save whole data array (for ns=-1) or only ns-th slice to text file - inline void Save(const char *fname,long ns=-1) const + void Save(const char *fname,long ns=-1) const { mgl_datac_save(this,fname,ns); } /// Read data from tab-separated text files with auto determining size which filenames are result of sprintf(fname,templ,t) where t=from:step:to inline bool ReadRange(const char *templ, double from, double to, double step=1, bool as_slice=false) @@ -193,19 +207,13 @@ public: /// Read data from text file with size specified at beginning of the file inline bool ReadMat(const char *fname, long dim=2) { return mgl_datac_read_mat(this,fname,dim); } - /// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme - inline void Export(const char *fname,const char *scheme,mreal v1=0,mreal v2=0,long ns=-1) const - { mgl_data_export(this,fname,scheme,v1,v2,ns); } /// Read data array from HDF file (parse HDF4 and HDF5 files) inline int ReadHDF(const char *fname,const char *data) { return mgl_datac_read_hdf(this,fname,data); } /// Save data to HDF file - inline void SaveHDF(const char *fname,const char *data,bool rewrite=false) const + void SaveHDF(const char *fname,const char *data,bool rewrite=false) const { mgl_datac_save_hdf(this,fname,data,rewrite); } - /// Put HDF data names into buf as '\t' separated. - inline static int DatasHDF(const char *fname, char *buf, long size) - { return mgl_datas_hdf(fname,buf,size); } /// Get real part of data values inline mglData Real() const @@ -219,56 +227,61 @@ public: /// Get argument of data values inline mglData Arg() const { return mglData(true,mgl_datac_arg(this)); } - + /// Get column (or slice) of the data filled by formulas of named columns - inline mglData Column(const char *eq) const - { return mglData(true,mgl_data_column(this,eq)); } + inline mglDataC Column(const char *eq) const + { return mglDataC(true,mgl_datac_column(this,eq)); } /// Get momentum (1D-array) of data along direction 'dir'. String looks like "x1" for median in x-direction, "x2" for width in x-dir and so on. - inline mglData Momentum(char dir, const char *how) const - { return mglData(true,mgl_data_momentum(this,dir,how)); } + inline mglDataC Momentum(char dir, const char *how) const + { return mglDataC(true,mgl_datac_momentum(this,dir,how)); } /// Get sub-array of the data with given fixed indexes - inline mglData SubData(long xx,long yy=-1,long zz=-1) const - { return mglData(true,mgl_data_subdata(this,xx,yy,zz)); } - inline mglData SubData(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) const - { return mglData(true,mgl_data_subdata_ext(this,&xx,&yy,&zz)); } + inline mglDataC SubData(long xx,long yy=-1,long zz=-1) const + { return mglDataC(true,mgl_datac_subdata(this,xx,yy,zz)); } + inline mglDataC SubData(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) const + { return mglDataC(true,mgl_datac_subdata_ext(this,&xx,&yy,&zz)); } + inline mglDataC SubData(const mglDataA &xx, const mglDataA &yy) const + { return mglDataC(true,mgl_datac_subdata_ext(this,&xx,&yy,0)); } + inline mglDataC SubData(const mglDataA &xx) const + { return mglDataC(true,mgl_datac_subdata_ext(this,&xx,0,0)); } /// Get trace of the data array - inline mglData Trace() const - { return mglData(true,mgl_data_trace(this)); } + inline mglDataC Trace() const + { return mglDataC(true,mgl_datac_trace(this)); } + /// Get array which is result of summation in given direction or directions + inline mglDataC Sum(const char *dir) const + { return mglDataC(true,mgl_datac_sum(this,dir)); } + /// Get the data which is direct multiplication (like, d[i,j] = this[i]*a[j] and so on) + inline mglDataC Combine(const mglDataA &dat) const + { return mglDataC(true,mgl_datac_combine(this,&dat)); } + /// Resize the data to new size of box [x1,x2]*[y1,y2]*[z1,z2] + inline mglDataC Resize(long mx,long my=1,long mz=1, mreal x1=0,mreal x2=1, mreal y1=0,mreal y2=1, mreal z1=0,mreal z2=1) const + { return mglDataC(true,mgl_datac_resize_box(this,mx,my,mz,x1,x2,y1,y2,z1,z2)); } + /// Get array which values is result of interpolation this for coordinates from other arrays + inline mglDataC Evaluate(const mglData &idat, bool norm=true) const + { return mglDataC(true,mgl_datac_evaluate(this,&idat,0,0,norm)); } + inline mglDataC Evaluate(const mglData &idat, const mglData &jdat, bool norm=true) const + { return mglDataC(true,mgl_datac_evaluate(this,&idat,&jdat,0,norm)); } + inline mglDataC Evaluate(const mglData &idat, const mglData &jdat, const mglData &kdat, bool norm=true) const + { return mglDataC(true,mgl_datac_evaluate(this,&idat,&jdat,&kdat,norm)); } + + /// Find correlation with another data arrays + inline mglDataC Correl(const mglData &dat, const char *dir) const + { return mglDataC(true,mgl_datac_correl(this,&dat,dir)); } + /// Find auto correlation function + inline mglDataC AutoCorrel(const char *dir) const + { return mglDataC(true,mgl_datac_correl(this,this,dir)); } + /// Create n-th points distribution of this data values in range [v1, v2] inline mglData Hist(long n,mreal v1=0,mreal v2=1, long nsub=0) const { return mglData(true,mgl_data_hist(this,n,v1,v2,nsub)); } /// Create n-th points distribution of this data values in range [v1, v2] with weight w inline mglData Hist(const mglDataA &w, long n,mreal v1=0,mreal v2=1, long nsub=0) const { return mglData(true,mgl_data_hist_w(this,&w,n,v1,v2,nsub)); } - /// Get array which is result of summation in given direction or directions - inline mglData Sum(const char *dir) const - { return mglData(true,mgl_data_sum(this,dir)); } /// Get array which is result of maximal values in given direction or directions inline mglData Max(const char *dir) const { return mglData(true,mgl_data_max_dir(this,dir)); } /// Get array which is result of minimal values in given direction or directions inline mglData Min(const char *dir) const { return mglData(true,mgl_data_min_dir(this,dir)); } - /// Get the data which is direct multiplication (like, d[i,j] = this[i]*a[j] and so on) - inline mglData Combine(const mglDataA &dat) const - { return mglData(true,mgl_data_combine(this,&dat)); } - /// Resize the data to new size of box [x1,x2]*[y1,y2]*[z1,z2] - inline mglData Resize(long mx,long my=1,long mz=1, mreal x1=0,mreal x2=1, mreal y1=0,mreal y2=1, mreal z1=0,mreal z2=1) const - { return mglData(true,mgl_data_resize_box(this,mx,my,mz,x1,x2,y1,y2,z1,z2)); } - /// Get array which values is result of interpolation this for coordinates from other arrays - inline mglData Evaluate(const mglData &idat, bool norm=true) const - { return mglData(true,mgl_data_evaluate(this,&idat,0,0,norm)); } - inline mglData Evaluate(const mglData &idat, const mglData &jdat, bool norm=true) const - { return mglData(true,mgl_data_evaluate(this,&idat,&jdat,0,norm)); } - inline mglData Evaluate(const mglData &idat, const mglData &jdat, const mglData &kdat, bool norm=true) const - { return mglData(true,mgl_data_evaluate(this,&idat,&jdat,&kdat,norm)); } - - /// Find correlation with another data arrays - inline mglDataC Correl(const mglData &dat, const char *dir) const - { return mglDataC(true,mgl_datac_correl(this,&dat,dir)); } - /// Find auto correlation function - inline mglDataC AutoCorrel(const char *dir) const - { return mglDataC(true,mgl_datac_correl(this,this,dir)); } /// Cumulative summation the data in given direction or directions inline void CumSum(const char *dir) { mgl_datac_cumsum(this,dir); } @@ -332,66 +345,50 @@ public: { return mglData(true,mgl_data_solve(this, val, dir, 0, norm)); } inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const { return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); } - - /// Print information about the data (sizes and momentum) to string - inline const char *PrintInfo() const { return mgl_data_info(this); } - /// Print information about the data (sizes and momentum) to FILE (for example, stdout) - inline void PrintInfo(FILE *fp) const - { if(fp) { fprintf(fp,"%s",mgl_data_info(this)); fflush(fp); } } - /// Get maximal value of the data - inline mreal Maximal() const { return mgl_data_max(this); } - /// Get minimal value of the data - inline mreal Minimal() const { return mgl_data_min(this); } - /// Get maximal value of the data and its position - inline mreal Maximal(long &i,long &j,long &k) const - { return mgl_data_max_int(this,&i,&j,&k); } - /// Get minimal value of the data and its position - inline mreal Minimal(long &i,long &j,long &k) const - { return mgl_data_min_int(this,&i,&j,&k); } - /// Get maximal value of the data and its approximated position - inline mreal Maximal(mreal &x,mreal &y,mreal &z) const - { return mgl_data_max_real(this,&x,&y,&z); } - /// Get minimal value of the data and its approximated position - inline mreal Minimal(mreal &x,mreal &y,mreal &z) const - { return mgl_data_min_real(this,&x,&y,&z); } - /// Copy data from other mglData variable - inline mglDataC &operator=(const mglData &d) - { Set(&d); return *this; } - /// Copy data from other mglDataC variable - inline mglDataC &operator=(const mglDataC &d) - { if(this!=&d) Set(d.a,d.nx,d.ny,d.nz); return *this; } + /// Copy data from other mglDataA variable + inline const mglDataA &operator=(const mglDataA &d) + { if(this!=&d) Set(&d); return d; } + inline const mglDataC &operator=(const mglDataC &d) + { if(this!=&d) Set(&d); return d; } inline dual operator=(dual val) { for(long i=0;i=nx || j>=ny || k>=nz) printf("Wrong index in mglData"); - return abs(a[i+nx*(j+ny*k)]); } + +#ifndef DEBUG + /// Get the value in given cell of the data + mreal v(long i,long j=0,long k=0) const { return abs(a[i+nx*(j+ny*k)]); } + /// Set the value in given cell of the data + void set_v(mreal val, long i,long j=0,long k=0) { a[i+nx*(j+ny*k)]=val; } #else - { return abs(a[i+nx*(j+ny*k)]); } + /// Get the value in given cell of the data with border checking + mreal v(long i,long j=0,long k=0) const { return mgl_abs(mgl_datac_get_value(this,i,j,k)); } + /// Set the value in given cell of the data + void set_v(mreal val, long i,long j=0,long k=0) { mgl_datac_set_value(this,val,i,j,k); } #endif - inline mreal vthr(long i) const { return abs(a[i]); } + mreal vthr(long i) const { return abs(a[i]); } // add for speeding up !!! - inline mreal dvx(long i,long j=0,long k=0) const + mreal dvx(long i,long j=0,long k=0) const { register long i0=i+nx*(j+ny*k); return i>0? abs(i0? abs(j0? abs(j0? abs(k0? abs(k #endif -#endif #endif -#define MGL_VER2 2.2 // minor version of MathGL 2.* (like 1.3 for v.2.1.3) +#define MGL_VER2 3.0 // minor version of MathGL 2.* (like 1.3 for v.2.1.3) //----------------------------------------------------------------------------- #ifdef WIN32 //_MSC_VER needs this before math.h #define _USE_MATH_DEFINES @@ -77,32 +91,22 @@ typedef unsigned long uintptr_t; #include #include -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define fmin(a,b) ((a)<(b))?(a):(b) -#define fmax(a,b) ((a)>(b))?(a):(b) -#endif - #if defined(_MSC_VER) +#if (_MSC_VER<1800) #define collapse(a) // MSVS don't support OpenMP 3.* #define strtoull _strtoui64 #define hypot _hypot #define getcwd _getcwd #define chdir _chdir // BORLAND has chdir +#endif #define snprintf _snprintf #endif -#if defined(_MSC_VER) || defined(__BORLANDC__) +#if !MGL_SYS_NAN #include #include - -#ifdef WIN32 const unsigned long long mgl_nan[2] = {0x7fffffffffffffff, 0x7fffffff}; const unsigned long long mgl_inf[2] = {0x7ff0000000000000, 0x7f800000}; -#else -const unsigned long mgl_nan[2] = {0x7fffffffffffffff, 0x7fffffff}; -const unsigned long mgl_inf[2] = {0x7ff0000000000000, 0x7f800000}; -#endif - #define NANd (*(double*)mgl_nan) #define NANf (*(float*)(mgl_nan+1)) #define INFd (*(double*)mgl_inf) @@ -123,8 +127,7 @@ const unsigned long mgl_inf[2] = {0x7ff0000000000000, 0x7f800000}; #define INFINITY INFf #endif #endif - -#endif +#endif // !MGL_SYS_NAN #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ @@ -154,13 +157,23 @@ typedef float mreal; #define MGL_DEF_VIEWER "evince" #endif //----------------------------------------------------------------------------- +#if MGL_HAVE_TYPEOF +#define mgl_isbad(a) ({typeof (a) _a = (a); _a-_a!=mreal(0.);}) +#define mgl_isfin(a) ({typeof (a) _a = (a); _a-_a==mreal(0.);}) +#define mgl_isnum(a) ({typeof (a) _a = (a); _a==_a;}) +#define mgl_isnan(a) ({typeof (a) _a = (a); _a!=_a;}) +#define mgl_min(a,b) ({typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _b : _a;}) +#define mgl_max(a,b) ({typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _a : _b;}) +#define mgl_sign(a) ({typeof (a) _a = (a); _a<0 ? -1:1;}) +#else #define mgl_min(a,b) (((a)>(b)) ? (b) : (a)) #define mgl_max(a,b) (((a)>(b)) ? (a) : (b)) #define mgl_isnan(a) ((a)!=(a)) -//#define mgl_isnum(a) ((a)==(a) && 2*(a)!=(a)) #define mgl_isnum(a) ((a)==(a)) -#define mgl_isfin(a) ((a)-(a)==0.) -#define mgl_isbad(a) ((a)-(a)!=0.) +#define mgl_isfin(a) ((a)-(a)==mreal(0.)) +#define mgl_isbad(a) ((a)-(a)!=mreal(0.)) +#define mgl_sign(a) ((a)<0 ? -1:1) +#endif //----------------------------------------------------------------------------- #define SMOOTH_NONE 0 #define SMOOTH_LINE_3 1 @@ -226,6 +239,11 @@ enum{ // Codes for warnings/messages #define MGL_DEF_SCH "BbcyrR" // default palette #define MGL_COLORS "kwrgbcymhWRGBCYMHlenpquLENPQU" //----------------------------------------------------------------------------- +/// Brushes for mask with symbol "-+=;oOsS~<>jdD*^" correspondingly +extern uint64_t mgl_mask_val[16]; +#define MGL_MASK_ID "-+=;oOsS~<>jdD*^" +#define MGL_SOLID_MASK 0xffffffffffffffff +//----------------------------------------------------------------------------- #define MGL_TRANSP_NORM 0x000000 #define MGL_TRANSP_GLASS 0x000001 #define MGL_TRANSP_LAMP 0x000002 @@ -250,34 +268,46 @@ enum{ // Codes for warnings/messages #define MGL_ONESIDED 0x080000 ///< Render only front side of surfaces if output format supports (for debugging) #define MGL_NO_ORIGIN 0x100000 ///< Don't draw tick labels at axis origin //----------------------------------------------------------------------------- +#if MGL_HAVE_C99_COMPLEX +#include +#if MGL_USE_DOUBLE +typedef double _Complex mdual; +#else +typedef float _Complex mdual; +#endif +#define mgl_abs(x) cabs(x) +#endif #ifdef __cplusplus //----------------------------------------------------------------------------- extern float mgl_cos[360]; ///< contain cosine with step 1 degree //----------------------------------------------------------------------------- #include typedef std::complex dual; +typedef std::complex ddual; +#if !MGL_HAVE_C99_COMPLEX +#define mdual dual +#define _Complex_I dual(0,1) +#define mgl_abs(x) abs(x) +#endif //----------------------------------------------------------------------------- extern "C" { #else #include -#if MGL_USE_DOUBLE -typedef double _Complex dual; -#else -typedef float _Complex dual; -#endif +typedef double _Complex ddual; +#define dual mdual #endif /// Find length of wchar_t string (bypass standard wcslen bug) -double MGL_EXPORT mgl_hypot(double x, double y); +double MGL_EXPORT_CONST mgl_hypot(double x, double y); /// Find length of wchar_t string (bypass standard wcslen bug) -size_t MGL_EXPORT mgl_wcslen(const wchar_t *str); +size_t MGL_EXPORT_PURE mgl_wcslen(const wchar_t *str); /// Get RGB values for given color id or fill by -1 if no one found void MGL_EXPORT mgl_chrrgb(char id, float rgb[3]); /// Check if string contain color id and return its number -long MGL_EXPORT mgl_have_color(const char *stl); +long MGL_EXPORT_PURE mgl_have_color(const char *stl); /// Find symbol in string excluding {} and return its position or NULL -const char *mglchr(const char *str, char ch); +MGL_EXPORT_PURE const char *mglchr(const char *str, char ch); /// Find any symbol from chr in string excluding {} and return its position or NULL -const char *mglchrs(const char *str, const char *chr); +MGL_EXPORT_PURE const char *mglchrs(const char *str, const char *chr); /// Set number of thread for plotting and data handling (for pthread version only) void MGL_EXPORT mgl_set_num_thr(int n); void MGL_EXPORT mgl_set_num_thr_(int *n); diff --git a/include/mgl2/eval.h b/include/mgl2/eval.h index 65dcb95..9043ccf 100644 --- a/include/mgl2/eval.h +++ b/include/mgl2/eval.h @@ -33,29 +33,29 @@ class MGL_EXPORT mglFormula // îáúåêò äëÿ ââîäà è âû÷èñ { public: /// Evaluates the formula for 'x','r'=\a x, 'y','n'=\a y, 'z','t'=\a z, 'u'=\a u - mreal Calc(mreal x,mreal y=0,mreal z=0,mreal u=0) const; + mreal Calc(mreal x,mreal y=0,mreal z=0,mreal u=0) const MGL_FUNC_PURE; /// Evaluates the formula for 'x, y, z, u, v, w' - mreal Calc(mreal x,mreal y,mreal z,mreal u,mreal v,mreal w) const; + mreal Calc(mreal x,mreal y,mreal z,mreal u,mreal v,mreal w) const MGL_FUNC_PURE; /// Evaluates the formula for variables var - mreal Calc(const mreal var[MGL_VS]) const; + mreal Calc(const mreal var[MGL_VS]) const MGL_FUNC_PURE; /// Evaluates the formula for 'x','r'=\a x, 'y','n'=\a y, 'z','t'=\a z, 'u'=\a u - mreal CalcD(char diff, mreal x,mreal y=0,mreal z=0,mreal u=0) const; + mreal CalcD(char diff, mreal x,mreal y=0,mreal z=0,mreal u=0) const MGL_FUNC_PURE; /// Evaluates the formula for 'x, y, z, u, v, w' - mreal CalcD(char diff, mreal x,mreal y,mreal z,mreal u,mreal v,mreal w) const; + mreal CalcD(char diff, mreal x,mreal y,mreal z,mreal u,mreal v,mreal w) const MGL_FUNC_PURE; /// Evaluates the derivates of the formula for variables var respect to variable diff - mreal CalcD(const mreal var[MGL_VS], char diff) const; + mreal CalcD(const mreal var[MGL_VS], char diff) const MGL_FUNC_PURE; /// Return error code - int GetError() const; + inline int GetError() const { return Error; } /// Parse the formula str and create formula-tree mglFormula(const char *str); /// Clean up formula-tree ~mglFormula(); protected: - mreal CalcIn(const mreal *a1) const; - mreal CalcDIn(int id, const mreal *a1) const; + mreal CalcIn(const mreal *a1) const MGL_FUNC_PURE; + mreal CalcDIn(int id, const mreal *a1) const MGL_FUNC_PURE; mglFormula *Left,*Right; // first and second argument of the function int Kod; // the function ID - mreal Res; // the number or the variable ID + mreal Res; // the number or the variable ID static int Error; }; //----------------------------------------------------------------------------- diff --git a/include/mgl2/evalc.h b/include/mgl2/evalc.h index 34d8115..202ca81 100644 --- a/include/mgl2/evalc.h +++ b/include/mgl2/evalc.h @@ -27,21 +27,21 @@ class MGL_EXPORT mglFormulaC // ������ ��� ����� { public: /// Evaluates the formula for 'x','r'=\a x, 'y','n'=\a y, 'z','t'=\a z, 'u'=\a u - dual Calc(dual x,dual y=0,dual z=0,dual u=0) const; + dual Calc(dual x,dual y=0,dual z=0,dual u=0) const MGL_FUNC_PURE; /// Evaluates the formula for 'x, y, z, u, v, w' - dual Calc(dual x,dual y,dual z,dual u,dual v,dual w) const; + dual Calc(dual x,dual y,dual z,dual u,dual v,dual w) const MGL_FUNC_PURE; /// Evaluates the formula for variables var - dual Calc(const dual var[MGL_VS]) const; + dual Calc(const dual var[MGL_VS]) const MGL_FUNC_PURE; /// Return error code - int GetError() const; + inline int GetError() const { return Error; } /// Parse the formula str and create formula-tree mglFormulaC(const char *str); /// Clean up formula-tree virtual ~mglFormulaC(); protected: - dual CalcIn(const dual *a1) const; + dual CalcIn(const dual *a1) const MGL_FUNC_PURE; mglFormulaC *Left,*Right; // first and second argument of the function - int Kod; // the function ID + int Kod; // the function ID dual Res; // the number or the variable ID static int Error; }; diff --git a/include/mgl2/fit.h b/include/mgl2/fit.h index 1ea4598..0b8a1a0 100644 --- a/include/mgl2/fit.h +++ b/include/mgl2/fit.h @@ -38,7 +38,8 @@ HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT x, HCDT y, HCDT s, const char *eq, con HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt); HMDT MGL_EXPORT mgl_fit_xyzas(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt); -MGL_EXPORT const char *mgl_get_fit(HMGL gr); +MGL_EXPORT_CONST const char *mgl_get_fit(HMGL gr); +int MGL_EXPORT mgl_get_fit_(uintptr_t *gr, char *out, int len); HMDT MGL_EXPORT mgl_hist_x(HMGL gr, HCDT x, HCDT a, const char *opt); HMDT MGL_EXPORT mgl_hist_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *opt); diff --git a/include/mgl2/fltk.h b/include/mgl2/fltk.h index b1ba719..9ddf91f 100644 --- a/include/mgl2/fltk.h +++ b/include/mgl2/fltk.h @@ -61,8 +61,8 @@ public: #endif #include -#include -#include +#include +#include #include #include #include @@ -76,7 +76,7 @@ public: Fl_Valuator *phi_val; ///< pointer to external phi-angle validator Fl_MathGL(int x, int y, int w, int h, const char *label=0); - ~Fl_MathGL(); + virtual ~Fl_MathGL(); /// Update (redraw) plot virtual void update(); @@ -108,6 +108,7 @@ public: { popup = pmenu; wpar = wdg; vpar = v; } inline void zoom_region(mreal xx1,mreal xx2,mreal yy1, mreal yy2) { x1=xx1; y1=yy1; x2=xx2; y2=yy2; } + void stop(bool stop=true); protected: mglCanvas *gr; ///< pointer to grapher @@ -159,7 +160,7 @@ public: { mgl_set_size(FMGL->get_graph(),scroll->w(),scroll->h()); FMGL->size(scroll->w(),scroll->h()); update(); } Fl_MGLView(int x, int y, int w, int h, const char *label=0); - ~Fl_MGLView(); + virtual ~Fl_MGLView(); void update(); ///< Update picture by calling user drawing function protected: Fl_Button *alpha_bt, *light_bt, *rotate_bt, *anim_bt, *zoom_bt, *grid_bt; diff --git a/include/mgl2/font.h b/include/mgl2/font.h index 2666c09..2e08a01 100644 --- a/include/mgl2/font.h +++ b/include/mgl2/font.h @@ -44,10 +44,24 @@ #define MGL_DEF_FONT_NAME "STIX" #endif //----------------------------------------------------------------------------- +struct mglGlyphDescr +{ + wchar_t id; ///< Unicode ID for glyph + int tr[4]; ///< Shift of glyph description by triangles (for solid font) + int ln[4]; ///< Shift of glyph description by lines (for wire font) + short numt[4]; ///< Number of triangles in glyph description (for solid font) + short numl[4]; ///< Number of lines in glyph description (for wire font) + short width[4]; ///< Width of glyph for wire font + mglGlyphDescr() { memset(this,0,sizeof(mglGlyphDescr)); } +}; +inline bool operator<(const mglGlyphDescr &a,const mglGlyphDescr &b) { return a.id(const mglGlyphDescr &a,const mglGlyphDescr &b) { return a.id>b.id; } +//----------------------------------------------------------------------------- struct MGL_EXPORT mglTeXsymb { unsigned kod; const wchar_t *tex; }; const float mgl_fgen = 4*14; /// Get font color, style and align for internal parser -char mglGetStyle(const char *how, int *font, int *align=0); +bool MGL_EXPORT mglGetStyle(const char *how, int *font, int *align=0); +long MGL_EXPORT_PURE mgl_internal_code(unsigned s, const std::vector &glyphs); class mglBase; //----------------------------------------------------------------------------- /// Class for font typeface and text plotting procedures @@ -56,7 +70,7 @@ class MGL_EXPORT mglFont public: mglBase *gr; ///< mglBase class used for drawing characters mglFont(const char *name=0, const char *path=0); - ~mglFont(); + virtual ~mglFont(); bool parse; ///< Parse LaTeX symbols /// Load font data to memory. Normally used by constructor. @@ -68,46 +82,41 @@ public: /// Restore default font void Restore(); /// Return true if font is loaded - inline bool Ready() const { return numg!=0; } + inline bool Ready() const { return GetNumGlyph()!=0; } /// Get height of text - float Height(int font) const; + float Height(int font) const MGL_FUNC_PURE; /// Get height of text - float Height(const char *how) const; + float Height(const char *how) const MGL_FUNC_PURE; /// Print text string for font specified by string - float Puts(const char *str,const char *how,float col) const; + float Puts(const char *str,const char *how,float c1,float c2) const; /// Get width of text string for font specified by string float Width(const char *str,const char *how) const; /// Print text string for font specified by string - float Puts(const wchar_t *str,const char *how,float col) const; + float Puts(const wchar_t *str,const char *how,float c1,float c2) const; /// Get width of text string for font specified by string float Width(const wchar_t *str,const char *how) const; /// Get internal code for symbol - long Internal(unsigned s) const; + inline long Internal(unsigned s) const { return mgl_internal_code(s,glyphs); } /// Return number of glyphs - inline unsigned GetNumGlyph() const { return numg; }; + inline unsigned GetNumGlyph() const { return glyphs.size(); }; /// Return some of pointers - inline const short *GetTr(int s, long j) const { return Buf+tr[s][j]; } - inline const short *GetLn(int s, long j) const { return Buf+ln[s][j]; } - inline int GetNt(int s, long j) const { return numt[s][j]; } - inline int GetNl(int s, long j) const { return numl[s][j]; } - inline short GetWidth(int s, long j) const { return width[s][j]; } - inline float GetFact(int s) const { return fact[s]; } + inline const short *GetTr(int s, long j) const { return Buf+glyphs[j].tr[s]; } + inline const short *GetLn(int s, long j) const { return Buf+glyphs[j].ln[s]; } + inline int GetNt(int s, long j) const { return glyphs[j].numt[s]; } + inline int GetNl(int s, long j) const { return glyphs[j].numl[s]; } + inline short GetWidth(int s, long j) const { return glyphs[j].width[s]; } + inline float GetFact(int s) const { return fact[s]; } + inline wchar_t GetUnicode(long j) const { return j>=0?glyphs[j].id:0; } protected: - wchar_t *id; ///< Unicode ID for glyph - int *tr[4]; ///< Shift of glyph description by triangles (for solid font) - int *ln[4]; ///< Shift of glyph description by lines (for wire font) - short *numt[4]; ///< Number of triangles in glyph description (for solid font) - short *numl[4]; ///< Number of lines in glyph description (for wire font) - short *width[4];///< Width of glyph for wire font + std::vector glyphs; ///< information about know glyphs float fact[4]; ///< Divider for width of glyph - unsigned numg; ///< Number of glyphs short *Buf; ///< Buffer for glyph descriptions long numb; ///< Buffer size /// Print text string for font specified by integer constant - float Puts(const wchar_t *str,int font,int align, float col) const; + float Puts(const wchar_t *str,int font,int align, float c1,float c2) const; /// Get width of text string for font specified by integer constant float Width(const wchar_t *str,int font=0) const; /// Replace TeX symbols by its UTF code and add font styles @@ -115,17 +124,17 @@ protected: /// Draw string recursively /* x,y - position, f - factor, style: 0x1 - italic, 0x2 - bold, 0x4 - overline, 0x8 - underline, 0x10 - empty (not draw) */ - float Puts(const unsigned *str, float x,float y,float f,int style,float col) const; + float Puts(const unsigned *str, float x,float y,float f,int style,float c1,float c2) const; /// Parse LaTeX command unsigned Parse(const wchar_t *s) const; /// Get symbol for character ch with given font style - unsigned Symbol(char ch) const; + unsigned Symbol(char ch) const MGL_FUNC_PURE; private: float get_ptr(long &i,unsigned *str, unsigned **b1, unsigned **b2,float &w1,float &w2, float f1, float f2, int st) const; - bool read_data(const char *fname, float *ff, short *wdt, short *numl, int *posl, short *numt, int *post, std::vector &buf); + bool read_data(const char *fname, int s, std::vector &buf, std::vector &extra); void main_copy(); bool read_main(const char *fname, std::vector &buf); - void mem_alloc(); + inline void mem_alloc(long numg) { glyphs.resize(numg); } bool read_def(); void draw_ouline(int st, float x, float y, float f, float g, float ww, float ccol) const; }; diff --git a/include/mgl2/mgl.h b/include/mgl2/mgl.h index 8266c96..91530bf 100644 --- a/include/mgl2/mgl.h +++ b/include/mgl2/mgl.h @@ -49,7 +49,7 @@ public: { gr = graph; mgl_use_graph(gr,1); } virtual ~mglGraph() { if(mgl_use_graph(gr,-1)<1) mgl_delete_graph(gr); } - /// Get pointer to internal mglCanvas object + /// Get pointer to internal HMGL object inline HMGL Self() { return gr; } /// Set default parameters for plotting inline void DefaultPlotParam() { mgl_set_def_param(gr); } @@ -58,6 +58,14 @@ public: /// Get name of plot for saving filename inline const char *GetPlotId() { return mgl_get_plotid(gr); } + /// Ask to stop drawing + inline void Stop(bool stop=true) { mgl_ask_stop(gr, stop); } + /// Check if plot termination is asked + inline bool NeedStop() { return mgl_need_stop(gr); } + /// Set callback function for event processing + inline void SetEventFunc(void (*func)(void *), void *par=NULL) + { mgl_set_event_func(gr, func, par); } + /// Set the transparency on/off. inline void Alpha(bool enable) { mgl_set_alpha(gr, enable); } /// Set default value of alpha-channel @@ -216,9 +224,16 @@ public: { mgl_set_ticks_val(gr,dir,&v,lbl,add); } inline void SetTicksVal(char dir, const mglDataA &v, const wchar_t *lbl, bool add=false) { mgl_set_ticks_valw(gr,dir,&v,lbl,add); } - /// Set the ticks parameters - inline void SetTicks(char dir, double d=0, int ns=0, double org=NaN) - { mgl_set_ticks(gr, dir, d, ns, org); } + /// Add manual tick at given position. Use "" to disable this feature. + inline void AddTick(char dir, double val, const char *lbl) + { mgl_add_tick(gr,dir,val,lbl); } + inline void AddTick(char dir, double val, const wchar_t *lbl) + { mgl_add_tickw(gr,dir,val,lbl); } + /// Set the ticks parameters and string for its factor + inline void SetTicks(char dir, double d=0, int ns=0, double org=NaN, const char *factor="") + { mgl_set_ticks_fact(gr, dir, d, ns, org, factor); } + inline void SetTicks(char dir, double d, int ns, double org, const wchar_t *factor) + { mgl_set_ticks_factw(gr, dir, d, ns, org, factor); } /// Auto adjust ticks inline void Adjust(const char *dir="xyzc") { mgl_adjust_ticks(gr, dir); } @@ -288,6 +303,9 @@ public: /// Set angle of view independently from Rotate(). inline void View(double TetX,double TetZ=0,double TetY=0) { mgl_view(gr, TetX, TetZ, TetY); } + /// Set angle of view independently from Rotate(). + inline void ViewAsRotate(double TetZ,double TetX,double TetY=0) + { mgl_view(gr, -TetX, -TetZ, -TetY); } /// Zoom in/out a part of picture (use Zoom(0, 0, 1, 1) for restore default) inline void Zoom(double x1, double y1, double x2, double y2) { mgl_zoom(gr, x1, y1, x2, y2); } @@ -388,6 +406,8 @@ public: inline void SetFrame(int i) { mgl_set_frame(gr, i); } /// Append drawing data from i-th frame (work if MGL_VECT_FRAME is set on) inline void ShowFrame(int i){ mgl_show_frame(gr, i); } + /// Clear list of primitives for current drawing + inline void ClearFrame() { mgl_clear_frame(gr); } /// Start write frames to cinema using GIF format inline void StartGIF(const char *fname, int ms=100) @@ -402,21 +422,23 @@ public: { mgl_import_mgld(gr, fname, add); } /// Copy RGB values into array which is allocated by user - inline void GetRGB(char *imgdata, int imglen) + inline bool GetRGB(char *imgdata, int imglen) { long w=mgl_get_width(gr), h=mgl_get_height(gr); if(imglen>=3*w*h) memcpy(imgdata, mgl_get_rgb(gr),3*w*h); + return imglen>=3*w*h; } inline const unsigned char *GetRGB() { return mgl_get_rgb(gr); } /// Copy RGBA values into array which is allocated by user - inline void GetRGBA(char *imgdata, int imglen) + inline bool GetRGBA(char *imgdata, int imglen) { long w=mgl_get_width(gr), h=mgl_get_height(gr); if(imglen>=4*w*h) memcpy(imgdata, mgl_get_rgba(gr),4*w*h); + return imglen>=4*w*h; } inline const unsigned char *GetRGBA() { return mgl_get_rgba(gr); } /// Copy BGRN values into array which is allocated by user - inline void GetBGRN(unsigned char *imgdata, int imglen) + inline bool GetBGRN(unsigned char *imgdata, int imglen) { long w=mgl_get_width(gr), h=mgl_get_height(gr), i; const unsigned char *buf=mgl_get_rgb(gr); @@ -427,7 +449,16 @@ public: imgdata[4*i+2] = buf[3*i]; imgdata[4*i+3] = 255; } + return imglen>=4*w*h; + } + /// Copy RGBA values of background image into array which is allocated by user + inline bool GetBackground(char *imgdata, int imglen) + { + long w=mgl_get_width(gr), h=mgl_get_height(gr); + if(imglen>=4*w*h) memcpy(imgdata, mgl_get_background(gr),4*w*h); + return imglen>=4*w*h; } + inline const unsigned char *GetBackground() { return mgl_get_background(gr); } /// Get width of the image inline int GetWidth() { return mgl_get_width(gr); } /// Get height of the image @@ -460,10 +491,18 @@ public: /// Clear up the frame inline void Clf(double r, double g, double b) { mgl_clf_rgb(gr, r, g, b); } + inline void Clf(const char *col) { mgl_clf_str(gr, col); } inline void Clf(char col) { mgl_clf_chr(gr, col); } inline void Clf() { mgl_clf(gr); } /// Clear unused points and primitives. Useful only in combination with SetFaceNum(). inline void ClearUnused() { mgl_clear_unused(gr); } + + /// Load background image + inline void LoadBackground(const char *fname, double alpha=1) + { mgl_load_background(gr,fname,alpha); } + /// Force drawing the image and use it as background one + inline void Rasterize() { mgl_rasterize(gr); } + /// Draws the point (ball) at position {x,y,z} with color c inline void Ball(mglPoint p, char c='r') { char s[3]={'.',c,0}; mgl_mark(gr, p.x, p.y, p.z, s); } @@ -510,6 +549,15 @@ public: /// Draws the rhomb between points p1,p2 with color stl and width r inline void Rhomb(mglPoint p1, mglPoint p2, double r, const char *stl="r") { mgl_rhomb(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, r,stl); } + /// Draws the polygon based on points p1,p2 with color stl + inline void Polygon(mglPoint p1, mglPoint p2, int n, const char *stl="r") + { mgl_polygon(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, n,stl); } + /// Draws the arc around axis pr with center at p0 and starting from p1, by color stl and angle a (in degrees) + inline void Arc(mglPoint p0, mglPoint pr, mglPoint p1, double a, const char *stl="r") + { mgl_arc_ext(gr, p0.x,p0.y,p0.z, pr.x,pr.y,pr.z, p1.x,p1.y,p1.z, a,stl); } + /// Draws the arc around axis 'z' with center at p0 and starting from p1, by color stl and angle a (in degrees) + inline void Arc(mglPoint p0, mglPoint p1, double a, const char *stl="r") + { mgl_arc_ext(gr, p0.x,p0.y,p0.z, 0,0,1, p1.x,p1.y,p0.z, a,stl); } /// Print text in position p with specified font inline void Putsw(mglPoint p,const wchar_t *text,const char *font=":C",double size=-1) @@ -1089,6 +1137,16 @@ public: { mgl_tricont_xyzc(gr, &nums, &x, &y, &z, &a, sch, opt); } inline void TriContV(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_tricont_xyzcv(gr, &v, &nums, &x, &y, &z, &a, sch, opt); } + inline void TriCont(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") + { mgl_tricont_xyzcv(gr, &v, &nums, &x, &y, &z, &a, sch, opt); } + + /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c. + inline void TriContVt(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") + { mgl_tricontv_xyc(gr, &nums, &x, &y, &z, sch, opt); } + inline void TriContVt(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") + { mgl_tricontv_xyzc(gr, &nums, &x, &y, &z, &a, sch, opt); } + inline void TriContVt(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") + { mgl_tricontv_xyzcv(gr, &v, &nums, &x, &y, &z, &a, sch, opt); } /// Draw dots in points {x,y,z}. inline void Dots(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") @@ -1214,7 +1272,7 @@ public: mglParse(mglParse &p) { pr = p.pr; mgl_use_parser(pr,1); } mglParse(bool setsize=false) { pr=mgl_create_parser(); mgl_parser_allow_setsize(pr, setsize); } - ~mglParse() { if(mgl_use_parser(pr,-1)<1) mgl_delete_parser(pr); } + virtual ~mglParse() { if(mgl_use_parser(pr,-1)<1) mgl_delete_parser(pr); } /// Get pointer to internal mglParser object inline HMPR Self() { return pr; } /// Parse and draw single line of the MGL script @@ -1231,7 +1289,7 @@ public: inline void Execute(mglGraph *gr, FILE *fp, bool print=false) { mgl_parse_file(gr->Self(), pr, fp, print); } - /// Return type of command: 0 - not found, 1 - data plot, 2 - other plot, + /// Return type of command: 0 - not found, 1 - other data plot, 2 - func plot, /// 3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program /// 8 - 1d plot, 9 - 2d plot, 10 - 3d plot, 11 - dd plot, 12 - vector plot /// 13 - axis, 14 - primitives, 15 - axis setup, 16 - text/legend, 17 - data transform @@ -1272,16 +1330,23 @@ public: /// Find variable with given name or add a new one /// NOTE !!! You must not delete obtained data arrays !!! - inline mglVar *AddVar(const char *name) - { return dynamic_cast(mgl_parser_add_var(pr, name)); } - inline mglVar *AddVar(const wchar_t *name) - { return dynamic_cast(mgl_parser_add_varw(pr, name)); } + inline mglData *AddVar(const char *name) + { return mgl_parser_add_var(pr, name); } + inline mglData *AddVar(const wchar_t *name) + { return mgl_parser_add_varw(pr, name); } /// Find variable with given name or return NULL if no one /// NOTE !!! You must not delete obtained data arrays !!! - inline mglVar *FindVar(const char *name) - { return dynamic_cast(mgl_parser_find_var(pr, name)); } - inline mglVar *FindVar(const wchar_t *name) - { return dynamic_cast(mgl_parser_find_varw(pr, name)); } + inline mglDataA *FindVar(const char *name) + { return mgl_parser_find_var(pr, name); } + inline mglDataA *FindVar(const wchar_t *name) + { return mgl_parser_find_varw(pr, name); } + /// Get variable with given id. Can be NULL for temporary ones. + /// NOTE !!! You must not delete obtained data arrays !!! + inline mglDataA *GetVar(unsigned long id) + { return mgl_parser_get_var(pr,id); } + /// Get number of variables + inline long GetNumVar() + { return mgl_parser_num_var(pr); } /// Delete variable with name inline void DeleteVar(const char *name) { mgl_parser_del_var(pr, name); } inline void DeleteVar(const wchar_t *name) { mgl_parser_del_varw(pr, name); } @@ -1290,4 +1355,4 @@ public: }; //----------------------------------------------------------------------------- #endif -#endif \ No newline at end of file +#endif diff --git a/include/mgl2/mgl_pas.pas b/include/mgl2/mgl_pas.pas index 2e6537a..85d594a 100644 --- a/include/mgl2/mgl_pas.pas +++ b/include/mgl2/mgl_pas.pas @@ -129,8 +129,65 @@ procedure mgl_fltk_run(); cdecl; external libmglfltk; function mgl_create_graph_qt(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglqt; procedure mgl_qt_run(); cdecl; external libmglqt; -{== ../include/mgl2/base_cf.h ==} +{== ../../include/mgl2/abstract.h ==} //----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +/// Set name for data variable (can be used in mgl_formula_calc() or in MGL scripts) +procedure mgl_data_set_name( !!! mglDataA *dat;const name: PChar); cdecl; external libmgl; +procedure mgl_data_set_name_w( !!! mglDataA *dat;const name: PWideChar); cdecl; external libmgl; +/// Set callback function which is called at deleting variable +/// Save whole data array (for ns=-1) or only ns-th slice to text file +procedure mgl_data_save(const dat: HMDT;const fname: PChar;ns: integer); cdecl; external libmgl; +/// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme +procedure mgl_data_export(const dat: HMDT;const fname: PChar;const scheme: PChar;v1: mreal;v2: mreal;ns: integer); cdecl; external libmgl; +/// Save data to HDF file +procedure mgl_data_save_hdf(const d: HMDT;const fname: PChar;const data: PChar;rewrite: integer); cdecl; external libmgl; +/// Get information about the data (sizes and momentum) to string +function mgl_data_info(const dat: HMDT): PChar; cdecl; external libmgl; +/// Put HDF data names into buf as '\t' separated. +function mgl_datas_hdf(const fname: PChar;buf: PChar;size: integer): integer; cdecl; external libmgl; +/// Get maximal value of the data +function mgl_data_max(const dat: HMDT): mreal; cdecl; external libmgl; +/// Get maximal value of the data which is less than 0 +function mgl_data_neg_max(const dat: HMDT): mreal; cdecl; external libmgl; +/// Get minimal value of the data +function mgl_data_min(const dat: HMDT): mreal; cdecl; external libmgl; +/// Get minimal value of the data which is larger than 0 +function mgl_data_pos_min(const dat: HMDT): mreal; cdecl; external libmgl; +/// Find position (after specified in i,j,k) of first nonzero value of formula +function mgl_data_first(const dat: HMDT;const cond: PChar;i: Pint;j: Pint;k: Pint): mreal; cdecl; external libmgl; +/// Find position (before specified in i,j,k) of last nonzero value of formula +function mgl_data_last(const dat: HMDT;const cond: PChar;i: Pint;j: Pint;k: Pint): mreal; cdecl; external libmgl; +/// Find position of first in direction 'dir' nonzero value of formula +function mgl_data_find(const dat: HMDT;const cond: PChar;dir: char;i: integer;j: integer;k: integer): integer; cdecl; external libmgl; +/// Find if any nonzero value of formula +function mgl_data_find_any(const dat: HMDT;const cond: PChar): integer; cdecl; external libmgl; +/// Get maximal value of the data and its position +function mgl_data_max_int(const dat: HMDT;i: Pint;j: Pint;k: Pint): mreal; cdecl; external libmgl; +/// Get maximal value of the data and its approximated position +function mgl_data_max_real(const dat: HMDT;x: Pmreal;y: Pmreal;z: Pmreal): mreal; cdecl; external libmgl; +/// Get minimal value of the data and its position +function mgl_data_min_int(const dat: HMDT;i: Pint;j: Pint;k: Pint): mreal; cdecl; external libmgl; +/// Get minimal value of the data and its approximated position +function mgl_data_min_real(const dat: HMDT;x: Pmreal;y: Pmreal;z: Pmreal): mreal; cdecl; external libmgl; +/// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis +function mgl_data_momentum_val(const d: HMDT;dir: char;m: Pmreal;w: Pmreal;s: Pmreal;k: Pmreal): mreal; cdecl; external libmgl; +//----------------------------------------------------------------------------- +/// Callback function for asking user a question. Result shouldn't exceed 1024. +//----------------------------------------------------------------------------- +/// Abstract class for data array +// { return i>0 ? (i0 ? (j0 ? (k DataList; ///< List with data and its names + std::vector NumList; ///< List with numbers and its names bool AllowSetSize; ///< Allow using setsize command bool AllowFileIO; ///< Allow reading/saving files bool Stop; ///< Stop command was. Flag prevent further execution @@ -101,10 +95,10 @@ public: long InUse; ///< Smart pointer (number of users) mglParser(bool setsize=false); - ~mglParser(); + virtual ~mglParser(); /// Find the command by the keyword name - mglCommand *FindCommand(const char *name); - mglCommand *FindCommand(const wchar_t *name); + const mglCommand *FindCommand(const char *name) const MGL_FUNC_PURE; + const mglCommand *FindCommand(const wchar_t *name) const MGL_FUNC_PURE; /// Parse and execute the string of MGL script inline int Parse(HMGL gr, const char *str, long pos=0) { mglGraph GR(gr); return Parse(&GR,str,pos); } @@ -134,14 +128,14 @@ public: /// Check if name is function and return its address (or 0 if no) long IsFunc(const std::wstring &name, int *narg=0); /// Find variable or return 0 if absent - mglVar *FindVar(const char *name); - mglVar *FindVar(const wchar_t *name); + mglDataA *FindVar(const char *name) MGL_FUNC_PURE; + mglDataA *FindVar(const wchar_t *name) MGL_FUNC_PURE; /// Find variable or create it if absent - mglVar *AddVar(const char *name); - mglVar *AddVar(const wchar_t *name); + mglData *AddVar(const char *name); + mglData *AddVar(const wchar_t *name); /// Find number or return 0 if absent - mglNum *FindNum(const char *name); - mglNum *FindNum(const wchar_t *name); + mglNum *FindNum(const char *name) MGL_FUNC_PURE; + mglNum *FindNum(const wchar_t *name) MGL_FUNC_PURE; /// Find number or create it if absent mglNum *AddNum(const char *name); mglNum *AddNum(const wchar_t *name); @@ -152,8 +146,6 @@ public: void AddCommand(mglCommand *cmd, int num=0); /// Restore Once flag inline void RestoreOnce() { Once = true; } - /// Delete variable - void DeleteVar(mglVar *v); /// Delete variable by its name void DeleteVar(const char *name); void DeleteVar(const wchar_t *name); diff --git a/include/mgl2/pde.h b/include/mgl2/pde.h index 47c50be..c756886 100644 --- a/include/mgl2/pde.h +++ b/include/mgl2/pde.h @@ -34,22 +34,26 @@ HMDT MGL_EXPORT mgl_pde_solve(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im uintptr_t MGL_EXPORT mgl_pde_solve_(uintptr_t* gr, const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, mreal *dz, mreal *k0,const char *opt,int,int); /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) HADT MGL_EXPORT mgl_qo2d_solve_c(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); -HADT MGL_EXPORT mgl_qo2d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); +HADT MGL_EXPORT mgl_qo2d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); uintptr_t MGL_EXPORT mgl_qo2d_solve_c_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, mreal *r, mreal *k0, uintptr_t* xx, uintptr_t* yy, int); /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) HMDT MGL_EXPORT mgl_qo2d_solve(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); -HMDT MGL_EXPORT mgl_qo2d_func(dual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); +HMDT MGL_EXPORT mgl_qo2d_func(ddual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); uintptr_t MGL_EXPORT mgl_qo2d_solve_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, mreal *r, mreal *k0, uintptr_t* xx, uintptr_t* yy, int); /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) HADT MGL_EXPORT mgl_qo3d_solve_c(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); -HADT MGL_EXPORT mgl_qo3d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); +HADT MGL_EXPORT mgl_qo3d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); uintptr_t MGL_EXPORT mgl_qo3d_solve_c_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, mreal *r, mreal *k0, uintptr_t* xx, uintptr_t* yy, uintptr_t* zz, int); /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) HMDT MGL_EXPORT mgl_qo3d_solve(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); -HMDT MGL_EXPORT mgl_qo3d_func(dual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); +HMDT MGL_EXPORT mgl_qo3d_func(ddual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); uintptr_t MGL_EXPORT mgl_qo3d_solve_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, mreal *r, mreal *k0, uintptr_t* xx, uintptr_t* yy, uintptr_t* zz, int); /// Saves result of ODE solving of n equations with right part func and initial conditions x0 over time interval [0,tmax] with time step dt -HMDT MGL_EXPORT mgl_ode_solve(void (*func)(const mreal *x, mreal *dx, void *par), int n, mreal *x0, mreal dt, mreal tmax, void *par); +HMDT MGL_EXPORT mgl_ode_solve(void (*func)(const mreal *x, mreal *dx, void *par), int n, const mreal *x0, mreal dt, mreal tmax, void *par); +/// Saves result of ODE solving for var variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt +HMDT MGL_EXPORT mgl_ode_solve_str(const char *func, const char *var, HCDT x0, mreal dt, mreal tmax); +/// Saves result of ODE solving of n equations with right part func and initial conditions x0 over time interval [0,tmax] with time step dt. Function bord (if not NULL) is called each time step to apply border reflection. +HMDT MGL_EXPORT mgl_ode_solve_ex(void (*func)(const mreal *x, mreal *dx, void *par), int n, const mreal *x0, mreal dt, mreal tmax, void *par, void (*bord)(mreal *x, const mreal *xp, void *par)); /// Finds ray with starting point r0, p0 (and prepares ray data for mgl_qo2d_solve) HMDT MGL_EXPORT mgl_ray_trace(const char *ham, mreal x0, mreal y0, mreal z0, mreal px, mreal py, mreal pz, mreal dt, mreal tmax); uintptr_t MGL_EXPORT mgl_ray_trace_(const char *ham, mreal *x0, mreal *y0, mreal *z0, mreal *px, mreal *py, mreal *pz, mreal *dt, mreal *tmax,int); diff --git a/include/mgl2/prim.h b/include/mgl2/prim.h index 404f1ce..5da1bb9 100644 --- a/include/mgl2/prim.h +++ b/include/mgl2/prim.h @@ -71,6 +71,16 @@ void MGL_EXPORT mgl_ellipse_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mre /// Draws the rhomb between points p1,p2 with color stl and width r void MGL_EXPORT mgl_rhomb(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl); void MGL_EXPORT mgl_rhomb_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, int); +/// Draws the polygon based on points p1,p2 with color stl +void MGL_EXPORT mgl_polygon(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, int n, const char *stl); +void MGL_EXPORT mgl_polygon_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, int *n, const char *stl, int); + /// Draws the arc around axis pr with center at p0 and starting from p1, by color stl and angle a (in degrees) +void MGL_EXPORT mgl_arc_ext(HMGL gr, double x0, double y0, double z0, double xr, double yr, double zr, double x1, double y1, double z1, double a, const char* stl); +void MGL_EXPORT mgl_arc_ext_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *xr, mreal *yr, mreal *zr, mreal *x1, mreal *y1, mreal *z1, mreal *a, const char *stl, int); + /// Draws the arc around axis 'z' with center at p0 and starting from p1, by color stl and angle a (in degrees) +void MGL_EXPORT mgl_arc(HMGL gr, double x0, double y0, double x1, double y1, double a, const char* stl); +void MGL_EXPORT mgl_arc_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *x1, mreal *y1, mreal *a, const char *stl,int l); + /// Draw cones from points {x,y,z} to axis plane void MGL_EXPORT mgl_cones_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); diff --git a/include/mgl2/qmathgl.h b/include/mgl2/qmathgl.h index a9fd085..e416d7d 100644 --- a/include/mgl2/qmathgl.h +++ b/include/mgl2/qmathgl.h @@ -32,13 +32,13 @@ class QScrollArea; class QSpinBox; class QTimer; class mglCanvas; +class mglTask; //----------------------------------------------------------------------------- /// Class is Qt widget which display MathGL graphics class MGL_EXPORT QMathGL : public QWidget { Q_OBJECT public: - friend void *mgl_qt_thr(void *); QString appName; ///< Application name for message boxes bool autoResize; ///< Allow auto resizing (default is false) bool enableMouse; ///< Enable mouse handlers @@ -62,18 +62,19 @@ public: inline void zoomRegion(mreal xx1,mreal xx2,mreal yy1, mreal yy2) { x1=xx1; y1=yy1; x2=xx2; y2=yy2; } - int getPer() {return int(per);} ///< Get perspective value - int getPhi() {return int(phi);} ///< Get Phi-angle value - int getTet() {return int(tet);} ///< Get Theta-angle value - bool getAlpha() {return alpha;} ///< Get transparency state - bool getLight() {return light;} ///< Get lightning state - bool getZoom() {return zoom;} ///< Get mouse zooming state - bool getRotate(){return rotate;} ///< Get mouse rotation state - bool getViewYZ(){return viewYZ;} ///< Get mouse rotation axis + int getPer() const {return int(per);} ///< Get perspective value + int getPhi() const {return int(phi);} ///< Get Phi-angle value + int getTet() const {return int(tet);} ///< Get Theta-angle value + bool getAlpha() const {return alpha;} ///< Get transparency state + bool getLight() const {return light;} ///< Get lightning state + bool getZoom() const {return zoom;} ///< Get mouse zooming state + bool getRotate() const {return rotate;}///< Get mouse rotation state + bool getViewYZ() const {return viewYZ;}///< Get mouse rotation axis bool isActive(int xs,int ys); ///< Check if active point is pressed public slots: - void refresh(); + void refresh(); ///< Redraw image with new zoom and view parameters + void refreshHQ(); ///< Redraw image with HQ (can be slower than refresh()) void update(); ///< Update picture void copy(); ///< copy graphics to clipboard void copyClickCoor(); ///< copy click coordinates to clipboard @@ -87,6 +88,7 @@ public slots: void setGrid(bool r); ///< Switch on/off grid drawing void imgSize(int w, int h); ///< Set image size void setViewYZ(bool v); ///< Switch on/off rotation around Y and Z axis + void setDotsPreview(bool d=true); ///< Set to use dots for image preview/rotation void setCustZoom(bool a); ///< Switch on/off using custom zoom void setCustDraw(bool a); ///< Switch on/off using custom draw @@ -127,6 +129,8 @@ public slots: void addCurve(); ///< add curve into primitives void addRhomb(); ///< add rhombus into primitives void addEllipse(); ///< add ellipse into primitives + void addArc(); ///< add arc into primitives + void addPolygon(int n=-1); ///< add polygon into primitives void addText(QString txt=""); ///< add text into primitives void setStyle(int id, QString stl);///< set style for primitive with id @@ -152,7 +156,7 @@ signals: void frameChanged(int); ///< Need another frame to show void showWarn(QString); ///< Show warnings void posChanged(QString message); ///< user click to show mouse position - void objChanged(int objId); ///< User double-click to select object/line + void objChanged(int objId); ///< User click to select object/line void refreshData(); void doubleClick(int id); ///< Double mouse click by object with id void askStyle(int id); ///< Update style @@ -176,8 +180,8 @@ protected: int (*draw_func)(mglBase *gr, void *par); mglDraw *draw; ///< Class for drawing -- need to call directly due to inheritance mechanism QString mousePos; ///< Last mouse position - QPixmap pic; ///< Pixmap for drawing (changed by update) - double tet, phi; ///< Rotation angles + QPixmap pic; ///< Pixmap for drawing (changed by update) + double tet, phi; ///< Rotation angles double per; ///< Value of perspective ( must be in [0,1) ) bool alpha; ///< Transparency state bool light; ///< Lightning state @@ -185,17 +189,24 @@ protected: bool custDraw; ///< Use custom draw before main drawing bool zoom; ///< Mouse zoom state bool grid; ///< Grid drawing state - bool rotate; ///< Mouse rotation state - bool viewYZ; ///< Set mouse rotation around Y and Z axis (instead of X and Z) + bool rotate; ///< Mouse rotation state + bool viewYZ; ///< Set mouse rotation around Y and Z axis (instead of X and Z) + bool dotsRefr; ///< Set dots for image preview/rotation mreal x1,x2,y1,y2; ///< Zoom in region mreal ax1,ax2,ay1,ay2; ///< Axis range zoom bool showMessage; ///< Flag for showing messages (enabled by each execute()) QMenu *popup; ///< Pointer to pop-up menu QTimer *timer; ///< Timer for animation + QTimer *timerRefr; ///< Timer for redrawing +private slots: + void afterPlot(); ///< minor tuning after plot was done private: int x0, y0, xe, ye; ///< Temporary variables for mouse uchar *grBuf; - void draw_thr(); + void drawPrim(); + int prevQuality; +// QThread *thread; +// mglTask *task; }; //----------------------------------------------------------------------------- /// Class for drawing the MGL script @@ -214,6 +225,6 @@ public: /// Convert bitmap from mglCanvasWnd to QPixmap void mglConvertFromGraph(QPixmap &pic, mglCanvas *gr, uchar **buf); /// Make menu, toolbars and return popup menu for MainWindow -QMenu *mglMakeMenu(QMainWindow* Wnd, QMathGL* QMGL, QSpinBox*& tet, QSpinBox*& phi); +MGL_EXPORT QMenu *mglMakeMenu(QMainWindow* Wnd, QMathGL* QMGL, QSpinBox*& tet, QSpinBox*& phi); //----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/type.h b/include/mgl2/type.h index 6fa165c..85758a3 100644 --- a/include/mgl2/type.h +++ b/include/mgl2/type.h @@ -24,6 +24,7 @@ //----------------------------------------------------------------------------- const mreal Pi = M_PI; const mreal NaN = NAN; +const mreal Inf = INFINITY; const mreal mgl_min_a = 1./256; //----------------------------------------------------------------------------- #define MGL_SET_XYZ(p,xx,yy,zz) {p.x=(xx);p.y=(yy);p.z=(zz);} @@ -35,12 +36,18 @@ const mreal mgl_min_a = 1./256; struct MGL_EXPORT mglPoint { mreal x,y,z,c; - mglPoint(mreal X=0,mreal Y=0,mreal Z=0,mreal C=0){x=X;y=Y;z=Z;c=C;} + mglPoint(mreal X=0,mreal Y=0,mreal Z=0,mreal C=0):x(X),y(Y),z(Z),c(C) {} + mglPoint(const mglPoint &d):x(d.x),y(d.y),z(d.z),c(d.c) {} +#if MGL_HAVE_RVAL + mglPoint(mglPoint &&d):x(d.x),y(d.y),z(d.z),c(d.c) {} +#endif inline bool IsNAN() { return (x!=x || y!=y || z!=z || c!=c); } inline mreal val(int i) { return (i<2 ? (i==0 ? x:y) : (i==2 ? z:c)); } inline mreal norm() { return sqrt(x*x+y*y+z*z); } inline void Normalize() { mreal v=norm(); x/=v; y/=v; z/=v; } + inline const mglPoint &operator=(const mglPoint &p) + { x=p.x; y=p.y; z=p.z; c=p.c; return p; } inline void operator+=(const mglPoint &a) { x+=a.x; y+=a.y; z+=a.z; c+=a.c; } inline void operator-=(const mglPoint &a) { x-=a.x; y-=a.y; z-=a.z; c-=a.c; } inline void operator+=(mreal a) { x+=a; y+=a; z+=a; } @@ -74,9 +81,11 @@ inline mglPoint operator^(const mglPoint &a, const mglPoint &b) inline mglPoint operator!(const mglPoint &a) { mreal f=mgl_hypot(a.x,a.y); return f==0?mglPoint(0.,1.,0.):mglPoint(-a.y/f, a.x/f, 0); } inline bool operator==(const mglPoint &a, const mglPoint &b) -{ return !memcmp(&a, &b, sizeof(mglPoint)); } +{ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)+(a.c-b.c)*(a.c-b.c)==0; } +//{ return !memcmp(&a, &b, sizeof(mglPoint)); } inline bool operator!=(const mglPoint &a, const mglPoint &b) -{ return memcmp(&a, &b, sizeof(mglPoint)); } +{ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)+(a.c-b.c)*(a.c-b.c)!=0; } +//{ return memcmp(&a, &b, sizeof(mglPoint)); } inline bool operator<(const mglPoint &a, const mglPoint &b) { return a.x<=b.x && a.y<=b.y && a.z<=b.z; } inline bool operator>(const mglPoint &a, const mglPoint &b) @@ -94,11 +103,16 @@ struct MGL_EXPORT mglColor float a; ///< Alpha component of color /// Constructor for RGB components manualy - mglColor(float R,float G,float B, float A=1){ r=R; g=G; b=B; a=A; } + mglColor(float R,float G,float B, float A=1):r(R),g(G),b(B),a(A) {} /// Constructor set default color - mglColor() { r=g=b=0; a=1; } + mglColor():r(0),g(0),b(0),a(1) {} /// Constructor set color from character id mglColor(char c, float bright=1) { Set(c,bright); } + /// Copy constructor + mglColor(const mglColor &d):r(d.r),g(d.g),b(d.b),a(d.a) {} +#if MGL_HAVE_RVAL + mglColor(mglColor &&d):r(d.r),g(d.g),b(d.b),a(d.a) {} +#endif /// Set color as Red, Green, Blue values void Set(float R,float G,float B,float A=1) { r=R; g=G; b=B; a=A; } /// Set color as Red, Green, Blue values @@ -123,11 +137,15 @@ struct MGL_EXPORT mglColor float rgb[3]; mgl_chrrgb(p,rgb); Set(mglColor(rgb[0],rgb[1],rgb[2]),bright); } + inline const mglColor &operator=(const mglColor &p) + { r=p.r; g=p.g; b=p.b; a=p.a; return p; } /// Copy color from other one inline bool operator==(const mglColor &c) const - { return !memcmp(this, &c, sizeof(mglColor)); } + { return (r-c.r)*(r-c.r)+(g-c.g)*(g-c.g)+(b-c.b)*(b-c.b)+(a-c.a)*(a-c.a)==0; } +// { return !memcmp(this, &c, sizeof(mglColor)); } inline bool operator!=(const mglColor &c) const - { return memcmp(this, &c, sizeof(mglColor)); } + { return (r-c.r)*(r-c.r)+(g-c.g)*(g-c.g)+(b-c.b)*(b-c.b)+(a-c.a)*(a-c.a)!=0; } +// { return memcmp(this, &c, sizeof(mglColor)); } inline bool operator<(const mglColor &c) const { return memcmp(this, &c, sizeof(mglColor))<0; } // transparency still the same diff --git a/include/xpm/accessories-calculator.png b/include/xpm/accessories-calculator.png deleted file mode 100644 index 9248971..0000000 Binary files a/include/xpm/accessories-calculator.png and /dev/null differ diff --git a/include/xpm/accessories-calculator.xpm b/include/xpm/accessories-calculator.xpm deleted file mode 100644 index 7a35ccb..0000000 --- a/include/xpm/accessories-calculator.xpm +++ /dev/null @@ -1,112 +0,0 @@ -/* XPM */ -static const char * accessories_calculator_xpm[] = { -"16 16 93 2", -" c None", -". c #555753", -"+ c #B8BBB3", -"@ c #858971", -"# c #787C66", -"$ c #83876F", -"% c #7A7E68", -"& c #7D816A", -"* c #777B5E", -"= c #555843", -"- c #585B45", -"; c #474938", -"> c #393B2D", -", c #717559", -"' c #989C8A", -") c #969A88", -"! c #979B89", -"~ c #44494A", -"{ c #3A4041", -"] c #3F4446", -"^ c #383D3F", -"/ c #303638", -"( c #303537", -"_ c #2F3537", -": c #313739", -"< c #9C9FA1", -"[ c #5B5C5C", -"} c #595A5C", -"| c #737678", -"1 c #5B5C5E", -"2 c #595A5B", -"3 c #66696B", -"4 c #595A5A", -"5 c #585858", -"6 c #616365", -"7 c #626567", -"8 c #515354", -"9 c #535555", -"0 c #535455", -"a c #5E605C", -"b c #6B6D6B", -"c c #808080", -"d c #7F7F7F", -"e c #535353", -"f c #7E7E7E", -"g c #818181", -"h c #555555", -"i c #575757", -"j c #565758", -"k c #848484", -"l c #898989", -"m c #696A69", -"n c #545454", -"o c #555556", -"p c #787878", -"q c #545657", -"r c #878787", -"s c #888888", -"t c #87898A", -"u c #505051", -"v c #505152", -"w c #646667", -"x c #535354", -"y c #515151", -"z c #616364", -"A c #515252", -"B c #606365", -"C c #5B5B5B", -"D c #5A5A5A", -"E c #7D7D7D", -"F c #828282", -"G c #545455", -"H c #585859", -"I c #696A68", -"J c #858585", -"K c #565656", -"L c #838383", -"M c #8A8A8A", -"N c #8D8D8D", -"O c #858788", -"P c #646666", -"Q c #525353", -"R c #616262", -"S c #555757", -"T c #5E5F5F", -"U c #9B9B9B", -"V c #858686", -"W c #888989", -"X c #868686", -"Y c #878888", -"Z c #6C6D6B", -"` c #757674", -" . c #787977", -". . . . . . . . . . . . . . . . ", -". + + + + + + + + + + + + + + . ", -". + @ @ @ @ @ @ @ # $ % & @ + . ", -". + * * * * * * * = - ; > , + . ", -". + ' ' ' ' ' ' ' ) ! ) ! ' + . ", -". ~ + + + + + + + + + + + + { . ", -". ] ^ / / ( _ _ _ _ _ _ _ _ : . ", -". < [ } | 1 2 3 4 5 6 7 8 9 0 . ", -"a b c d e f g h d g i j k l k . ", -". m d f n f f o p d i q r s r . ", -". t u v w x y z A y 6 B 5 C D . ", -". m c d 9 E g n F k G H r s s . ", -". I k E y c J K L J K 5 M N M . ", -". O n G P Q K R S K T 5 M U M . ", -". O V V W V X Y X X Y Z ` .` . ", -". . . . . . . . . . . . . . . . "}; diff --git a/include/xpm/alpha.png b/include/xpm/alpha.png deleted file mode 100644 index fdb8836..0000000 Binary files a/include/xpm/alpha.png and /dev/null differ diff --git a/include/xpm/alpha.xpm b/include/xpm/alpha.xpm index 1c41468..102c0e1 100644 --- a/include/xpm/alpha.xpm +++ b/include/xpm/alpha.xpm @@ -1,26 +1,126 @@ /* XPM */ static const char * alpha_xpm[] = { -"16 16 7 1", -" c None", -"! c #000000", -"# c #0000FF", -"$ c #000080", -"% c #008080", -"& c #FFFFFF", -"' c #00FFFF", -" ", -" ", -" #$$$$$$ ", -" !$!!$!!!!# ", -" #%%&$%''!'%'$ ", -"#%##!#$'%#%%##! ", -" !%%!$&%%'!!%%$ ", -" #''%#%!$##''% ", -" %''##%&&%''# ", -" %'%#%&&%'# ", -" #'%#%&$'% ", -" $'#%&%% ", -" %%%#%# ", -" #!%$% ", -" #!$ ", -" !# "}; +"16 16 107 2", +" c None", +". c #395155", +"+ c #3A5155", +"@ c #384F54", +"# c #4C6A71", +"$ c #68929C", +"% c #B8FFFF", +"& c #B1F9FF", +"* c #B7FFFF", +"= c #6B939C", +"- c #113F4A", +"; c #7CADB9", +"> c #B4FCFF", +", c #84BAC8", +"' c #51585B", +") c #78888C", +"! c #79898D", +"~ c #4D4D4D", +"{ c #17B0D6", +"] c #2CE0FF", +"^ c #1D99B8", +"/ c #1F282B", +"( c #A1E2F3", +"_ c #ABF0FF", +": c #ACF2FF", +"< c #658187", +"[ c #E1FFFF", +"} c #D7F8FF", +"| c #D7F9FF", +"1 c #D7F7FF", +"2 c #428494", +"3 c #28D6FF", +"4 c #2AD6FF", +"5 c #26C3EA", +"6 c #1A88A2", +"7 c #346974", +"8 c #7BB8C6", +"9 c #9FDEEE", +"0 c #97D4E3", +"a c #C2E2E9", +"b c #D6F8FF", +"c c #C5E6ED", +"d c #2DB7DA", +"e c #2AD1FB", +"f c #23BFE6", +"g c #0B6A81", +"h c #42B0CC", +"i c #4DB0C8", +"j c #3A575C", +"k c #7B878A", +"l c #7D8A8E", +"m c #7D8A8D", +"n c #3B4A4E", +"o c #0586A5", +"p c #00BEED", +"q c #005A70", +"r c #317F93", +"s c #56DFFF", +"t c #47AEC7", +"u c #7ADDF6", +"v c #81ECFF", +"w c #84F0FF", +"x c #2F7E90", +"y c #00DBFF", +"z c #0094B9", +"A c #3FA4BC", +"B c #4CC5E4", +"C c #72D1E7", +"D c #7FE4FE", +"E c #80E5FF", +"F c #78D1E8", +"G c #0EABD1", +"H c #00BBEA", +"I c #51D4F4", +"J c #3A7888", +"K c #85EEFF", +"L c #60C0D8", +"M c #00B7E6", +"N c #0096BB", +"O c #215764", +"P c #3FA7C0", +"Q c #70C6DC", +"R c #83ECFF", +"S c #378599", +"T c #00B1DE", +"U c #4AC5E4", +"V c #447B89", +"W c #82E8FF", +"X c #84E4FD", +"Y c #007696", +"Z c #00556A", +"` c #0A1A1E", +" . c #4FC5E2", +".. c #75D1E8", +"+. c #81E7FF", +"@. c #598B98", +"#. c #00B1DF", +"$. c #235C69", +"%. c #6BC4DA", +"&. c #82E6FF", +"*. c #148099", +"=. c #2C5B65", +"-. c #74D6F0", +";. c #074F61", +">. c #13353F", +",. c #67B8C9", +"'. c #0E191C", +" . + + @ ", +" # $ % & & * = - ", +" ; > , ' ) ! ~ { ] ^ ", +" / ( _ : < [ } | 1 2 3 4 5 6 ", +" 7 8 9 0 a b } } b c d e f g ", +" h i j k l l l l m n o p q ", +" r s t u v v v v w x y z ", +" A B C D E E E F G H ", +" I J K D E E L M N ", +" O P Q E E R S T ", +" U V W E X Y Z ", +" ` ...+.@.#. ", +" $.%.&.*. ", +" =.-.;. ", +" >.,. ", +" '. "}; diff --git a/include/xpm/alpha_on.xpm b/include/xpm/alpha_on.xpm deleted file mode 100644 index 58e50f7..0000000 --- a/include/xpm/alpha_on.xpm +++ /dev/null @@ -1,26 +0,0 @@ -/* XPM */ -static const char * alpha_on_xpm[] = { -"16 16 7 1", -" c None", -"! c #000000", -"# c #FF0000", -"$ c #800000", -"% c #808000", -"& c #FFFFFF", -"' c #FFFF00", -" ", -" ", -" #$$$$$$ ", -" !$!!$!!!!# ", -" #%%&$%''!'%'$ ", -"#%##!#$'%#%%##! ", -" !%%!$&%%'!!%%$ ", -" #''%#%!$##''% ", -" %''##%&&%''# ", -" %'%#%&&%'# ", -" #'%#%&$'% ", -" $'#%&%% ", -" %%%#%# ", -" #!%$% ", -" #!$ ", -" !# "}; diff --git a/include/xpm/arc.xpm b/include/xpm/arc.xpm new file mode 100644 index 0000000..28f80a1 --- /dev/null +++ b/include/xpm/arc.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * arc_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ...... ", +" .. .. ", +" . . ", +" . ", +" . ", +" .", +" .", +" .", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/include/xpm/axis.xpm b/include/xpm/axis.xpm new file mode 100644 index 0000000..65014f1 --- /dev/null +++ b/include/xpm/axis.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * axis_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" .. ", +" . ", +" . ", +" .. ", +" . ", +" . ", +" .. ", +" . ", +" . ", +" .. ", +" . ", +" . ", +" .............. ", +" . . . . ", +" "}; diff --git a/include/xpm/axis_sh.xpm b/include/xpm/axis_sh.xpm index eab287c..d09869f 100644 --- a/include/xpm/axis_sh.xpm +++ b/include/xpm/axis_sh.xpm @@ -1,5 +1,5 @@ /* XPM */ -static char * axis_sh_xpm[] = { +static const char * axis_sh_xpm[] = { "16 16 3 1", " c None", ". c #000000", diff --git a/include/xpm/barrow_a.xpm b/include/xpm/barrow_a.xpm new file mode 100644 index 0000000..8545b8f --- /dev/null +++ b/include/xpm/barrow_a.xpm @@ -0,0 +1,21 @@ +/* XPM */ +const char * barrow_a_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" ... ", +" .... ", +" ..... ", +" ...... ", +"............... ", +" ...... ", +" ..... ", +" .... ", +" ... ", +" ", +" ", +" ", +" "}; diff --git a/include/xpm/barrow_d.xpm b/include/xpm/barrow_d.xpm new file mode 100644 index 0000000..fe133de --- /dev/null +++ b/include/xpm/barrow_d.xpm @@ -0,0 +1,21 @@ +/* XPM */ +const char * barrow_d_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" . ", +" ... ", +" ..... ", +" ....... ", +"............... ", +" ....... ", +" ..... ", +" ... ", +" . ", +" ", +" ", +" ", +" "}; diff --git a/include/xpm/barrow_i.xpm b/include/xpm/barrow_i.xpm new file mode 100644 index 0000000..54e91ad --- /dev/null +++ b/include/xpm/barrow_i.xpm @@ -0,0 +1,21 @@ +/* XPM */ +const char * barrow_i_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +"............... ", +" .. ", +" .. ", +" .. ", +" .. ", +" .. ", +" ", +" ", +" "}; diff --git a/include/xpm/barrow_k.xpm b/include/xpm/barrow_k.xpm new file mode 100644 index 0000000..be962b1 --- /dev/null +++ b/include/xpm/barrow_k.xpm @@ -0,0 +1,21 @@ +/* XPM */ +const char * barrow_k_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" .. ", +" ... .. ", +" .... .. ", +" ..... .. ", +" ........ ", +"............... ", +" ........ ", +" ..... .. ", +" .... .. ", +" ... .. ", +" .. ", +" ", +" ", +" "}; diff --git a/include/xpm/barrow_n.xpm b/include/xpm/barrow_n.xpm new file mode 100644 index 0000000..7d2b54c --- /dev/null +++ b/include/xpm/barrow_n.xpm @@ -0,0 +1,21 @@ +/* XPM */ +const char * barrow_n_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +".............. ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/include/xpm/barrow_o.xpm b/include/xpm/barrow_o.xpm new file mode 100644 index 0000000..a0ea264 --- /dev/null +++ b/include/xpm/barrow_o.xpm @@ -0,0 +1,21 @@ +/* XPM */ +const char * barrow_o_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" .... ", +" ...... ", +" ........ ", +" ........ ", +".............. ", +" ........ ", +" ........ ", +" ....... ", +" .... ", +" ", +" ", +" ", +" "}; diff --git a/include/xpm/barrow_s.xpm b/include/xpm/barrow_s.xpm new file mode 100644 index 0000000..f19c4d8 --- /dev/null +++ b/include/xpm/barrow_s.xpm @@ -0,0 +1,21 @@ +/* XPM */ +const char * barrow_s_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" ........ ", +" ........ ", +" ........ ", +" ........ ", +".............. ", +" ........ ", +" ........ ", +" ........ ", +" ........ ", +" ", +" ", +" ", +" "}; diff --git a/include/xpm/barrow_t.xpm b/include/xpm/barrow_t.xpm new file mode 100644 index 0000000..06e23d5 --- /dev/null +++ b/include/xpm/barrow_t.xpm @@ -0,0 +1,21 @@ +/* XPM */ +const char * barrow_t_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" .. ", +" .... ", +" ...... ", +" ........ ", +"............... ", +" ........ ", +" ...... ", +" .... ", +" .. ", +" ", +" ", +" ", +" "}; diff --git a/include/xpm/barrow_v.xpm b/include/xpm/barrow_v.xpm new file mode 100644 index 0000000..b31d4d2 --- /dev/null +++ b/include/xpm/barrow_v.xpm @@ -0,0 +1,21 @@ +/* XPM */ +const char * barrow_v_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" ... ", +" .... ", +" ..... ", +" ...... ", +"........... ", +" ...... ", +" ..... ", +" .... ", +" ... ", +" ", +" ", +" ", +" "}; diff --git a/include/xpm/box.xpm b/include/xpm/box.xpm index e2d9d12..23260d1 100644 --- a/include/xpm/box.xpm +++ b/include/xpm/box.xpm @@ -1,5 +1,5 @@ /* XPM */ -static char * box_xpm[] = { +static const char * box_xpm[] = { "16 16 3 1", " c None", ". c #000000", diff --git a/include/xpm/comment.xpm b/include/xpm/comment.xpm new file mode 100644 index 0000000..1aebddd --- /dev/null +++ b/include/xpm/comment.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * comment_xpm[] = { +"16 16 2 1", +" c None", +". c #009f00", +" ", +" ", +" ", +" . . ", +" . . ", +" . . ", +" ............ ", +" . . ", +" . . ", +" . . ", +" . . ", +" ............ ", +" . . ", +" . . ", +" . . ", +" "}; diff --git a/include/xpm/delete.xpm b/include/xpm/delete.xpm new file mode 100644 index 0000000..a191ea2 --- /dev/null +++ b/include/xpm/delete.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * delete_xpm[] = { +"16 16 2 1", +" c none", +". c #000000", +" ", +" ", +" ", +" ... ... ", +" ... ... ", +" ... ... ", +" ...... ", +" .... ", +" .... ", +" ...... ", +" ... ... ", +" ... ... ", +" ... ... ", +" ", +" ", +" "}; diff --git a/include/xpm/dialog-information.png b/include/xpm/dialog-information.png deleted file mode 100644 index 8851b99..0000000 Binary files a/include/xpm/dialog-information.png and /dev/null differ diff --git a/include/xpm/document-export.png b/include/xpm/document-export.png deleted file mode 100644 index eb82440..0000000 Binary files a/include/xpm/document-export.png and /dev/null differ diff --git a/include/xpm/document-export.xpm b/include/xpm/document-export.xpm deleted file mode 100644 index 489a4f4..0000000 --- a/include/xpm/document-export.xpm +++ /dev/null @@ -1,166 +0,0 @@ -/* XPM */ -static const char * document_export_xpm[] = { -"16 16 147 2", -" c None", -". c #38678B", -"+ c #3D698A", -"@ c #4A7180", -"# c #58787A", -"$ c #B1CEE6", -"% c #D0DFEF", -"& c #C5DBEC", -"* c #9BC2DF", -"= c #688BA0", -"- c #436E88", -"; c #6B7F88", -"> c #667173", -", c #627075", -"' c #4A6D85", -") c #41749A", -"! c #44789F", -"~ c #9EBFD9", -"{ c #C1D9EB", -"] c #5186AF", -"^ c #4E6A7D", -"/ c #6E99B6", -"( c #ABCBE2", -"_ c #92B7D3", -": c #547D9B", -"< c #D5DFE5", -"[ c #7798B0", -"} c #79A7CA", -"| c #8FB3CE", -"1 c #3D6B8E", -"2 c #ACBCC3", -"3 c #5892BD", -"4 c #EF9800", -"5 c #ECA307", -"6 c #BDD552", -"7 c #98BFDC", -"8 c #719FBF", -"9 c #739FC0", -"0 c #96BBD8", -"a c #95A9AF", -"b c #02ABF0", -"c c #0074F6", -"d c #F97200", -"e c #FE3C00", -"f c #FF3500", -"g c #CAC6AC", -"h c #ABC8DF", -"i c #92A6AC", -"j c #BFE6E5", -"k c #1CFFDF", -"l c #32FFCA", -"m c #F99A00", -"n c #FF7400", -"o c #FDA917", -"p c #E4E822", -"q c #9DE4A5", -"r c #37698D", -"s c #ACCBE3", -"t c #3B6B8F", -"u c #8BA4AF", -"v c #9EDEE9", -"w c #8CFDCB", -"x c #BBFF41", -"y c #ECEA10", -"z c #F2C505", -"A c #B2FA4B", -"B c #53F8BE", -"C c #3BC4F1", -"D c #328AFE", -"E c #AABCD1", -"F c #3F6C8E", -"G c #9AAEB4", -"H c #BBF8EA", -"I c #A0FE7E", -"J c #EEEEEE", -"K c #FAC004", -"L c #FDB701", -"M c #DDE01B", -"N c #49FEB4", -"O c #00AEFF", -"P c #0039FF", -"Q c #0024B3", -"R c #0029CA", -"S c #0057FF", -"T c #03BDFB", -"U c #28FFD3", -"V c #85FE79", -"W c #E3FF18", -"X c #DDFE1F", -"Y c #C7FF34", -"Z c #8BFF72", -"` c #F0CA07", -" . c #AFFA4D", -".. c #59FEA3", -"+. c #2FE6CE", -"@. c #21CBDE", -"#. c #17CDE7", -"$. c #13DBEB", -"%. c #13FFE9", -"&. c #16FFE5", -"*. c #43FABA", -"=. c #3DF5C0", -"-. c #2BECD2", -";. c #08D3F4", -">. c #009FFF", -",. c #F89A00", -"'. c #FE5F00", -"). c #FB4D00", -"!. c #FC5500", -"~. c #FE7E00", -"{. c #F8C805", -"]. c #BDFB3F", -"^. c #51FFAC", -"/. c #0BDAF2", -"(. c #0082FF", -"_. c #0045FC", -":. c #0037EC", -"<. c #003DFE", -"[. c #0041FF", -"}. c #F86B00", -"|. c #E60000", -"1. c #B60000", -"2. c #B30000", -"3. c #BB0000", -"4. c #EE1200", -"5. c #FF9A00", -"6. c #AAFF53", -"7. c #0BEBF1", -"8. c #006DFF", -"9. c #0035F2", -"0. c #0037E9", -"a. c #006CFF", -"b. c #0ED7F0", -"c. c #F88F01", -"d. c #F94100", -"e. c #E92400", -"f. c #E21D00", -"g. c #EA2400", -"h. c #FA4200", -"i. c #FF9100", -"j. c #F2D10B", -"k. c #B7F746", -"l. c #80F87D", -"m. c #6EF18E", -"n. c #75F389", -"o. c #94FB69", -"p. c #D2EA2B", -" . . . + @ # ", -" $ % & * = - ", -"; > , ' ) ! ~ { ] ^ ", -" / . ( _ : < ", -" [ . } | 1 2 ", -" . . . . } 3 . . . . ", -" 4 5 6 . 7 8 8 8 9 0 . a b c ", -" d e f g . 7 9 9 h . i j k l ", -" m n o p q r s 7 t u v w x y ", -" z A B C D E F . G H I J K L ", -" M N O P Q R S T U V W X Y Z ", -" ` ...+.@.#.$.%.&.*.=.-.;.>. ", -" ,.'.).!.~.{.].^./.(._.:.<.[. ", -" }.|.1.2.3.4.5.6.7.8.9.0.a.b. ", -" c.d.e.f.g.h.i.j.k.l.m.n.o.p. ", -" "}; diff --git a/include/xpm/document-import.png b/include/xpm/document-import.png deleted file mode 100644 index 0b4e816..0000000 Binary files a/include/xpm/document-import.png and /dev/null differ diff --git a/include/xpm/document-import.xpm b/include/xpm/document-import.xpm deleted file mode 100644 index 39c5113..0000000 --- a/include/xpm/document-import.xpm +++ /dev/null @@ -1,189 +0,0 @@ -/* XPM */ -static const char * document_import_xpm[] = { -"16 16 170 2", -" c None", -". c #FB6801", -"+ c #FF3F00", -"@ c #FF6200", -"# c #EDDE11", -"$ c #58FFA6", -"% c #07C2F8", -"& c #0070FF", -"* c #0064FF", -"= c #0195FF", -"- c #0AD3F4", -"; c #2CFFD1", -"> c #5CFEA1", -", c #7A7A7A", -"' c #797979", -") c #FAA302", -"! c #F1B50D", -"~ c #BFE240", -"{ c #61F29D", -"] c #10BFEE", -"^ c #0066FF", -"/ c #0043FF", -"( c #0170FF", -"_ c #0EC8F0", -": c #59FCA5", -"< c #C6FB38", -"[ c #F5CE09", -"} c #787878", -"| c #C9C9C9", -"1 c #C7C7C7", -"2 c #DFE11A", -"3 c #56FAA8", -"4 c #08A6F7", -"5 c #004EE6", -"6 c #0032C9", -"7 c #0041FF", -"8 c #0297FD", -"9 c #27F0D6", -"0 c #91FF6C", -"a c #E1FF1B", -"b c #EDEC10", -"c c #E5E019", -"d c #737373", -"e c #C5C5C5", -"f c #B0B0B0", -"g c #DDE31D", -"h c #0FB6F0", -"i c #047CF5", -"j c #0374F4", -"k c #049DFB", -"l c #0FE8EF", -"m c #43FFBB", -"n c #7EFF81", -"o c #8CFF72", -"p c #65FA99", -"q c #2CE1D3", -"r c #6E6E6E", -"s c #C1C1C0", -"t c #ACACAC", -"u c #F9A502", -"v c #F5A10A", -"w c #E0A31C", -"x c #CCB833", -"y c #B3DD4C", -"z c #83FC7B", -"A c #2DFFD0", -"B c #0DDEF1", -"C c #059FF9", -"D c #0279F8", -"E c #0062FD", -"F c #004DFF", -"G c #6A6A6A", -"H c #BDBDBD", -"I c #A9A9A9", -"J c #FA6201", -"K c #E00600", -"L c #C00000", -"M c #C40100", -"N c #ED1C00", -"O c #FAA205", -"P c #85FF79", -"Q c #08C2F6", -"R c #004CFC", -"S c #0030BE", -"T c #0051EC", -"U c #0AA6F5", -"V c #656565", -"W c #B7B7B7", -"X c #A6A6A6", -"Y c #FB7E01", -"Z c #F32E00", -"` c #DE1A00", -" . c #DE1900", -".. c #F42F00", -"+. c #FF8400", -"@. c #E6DE18", -"#. c #91F96D", -"$. c #60EA9E", -"%. c #5AE5A4", -"&. c #73F18B", -"*. c #B7F047", -"=. c #5F5F5F", -"-. c #B3B3B3", -";. c #406CA5", -">. c #3868A5", -",. c #3768A5", -"'. c #3666A5", -"). c #3566A5", -"!. c #3566A4", -"~. c #3465A4", -"{. c #3767A6", -"]. c #5B5B5B", -"^. c #AEAEAE", -"/. c #C0D5EA", -"(. c #C1D5EA", -"_. c #C1D6EA", -":. c #BBD2E8", -"<. c #3465A5", -"[. c #565656", -"}. c #C3D6EA", -"|. c #92B5DB", -"1. c #95B8DC", -"2. c #B9D0E7", -"3. c #3466A4", -"4. c #515151", -"5. c #A5A5A4", -"6. c #3666A4", -"7. c #C5D7EB", -"8. c #98B9DD", -"9. c #95B7DC", -"0. c #B8CEE7", -"a. c #4C4C4C", -"b. c #A1A1A1", -"c. c #3767A5", -"d. c #BFD2E9", -"e. c #9BBADD", -"f. c #9ABADD", -"g. c #96B7DC", -"h. c #8FB2DA", -"i. c #8BB0D8", -"j. c #B1C9E4", -"k. c #484848", -"l. c #9B9B9B", -"m. c #A5C1E1", -"n. c #8EB2D9", -"o. c #8AAFD8", -"p. c #85ACD7", -"q. c #83AAD6", -"r. c #81A9D5", -"s. c #7EA7D4", -"t. c #79A3D3", -"u. c #77A2D2", -"v. c #7BA5D3", -"w. c #95B6DB", -"x. c #3567A6", -"y. c #494949", -"z. c #999999", -"A. c #3968A5", -"B. c #94B5DB", -"C. c #82AAD5", -"D. c #7DA6D4", -"E. c #7FA8D4", -"F. c #85ABD5", -"G. c #7E8896", -"H. c #5588BF", -"I. c #5689C0", -"J. c #4B7EB7", -"K. c #3667A6", -"L. c #454A51", -"M. c #3565A4", -" . + @ # $ % & * = - ; > ", -", ' ' ) ! ~ { ] ^ / ( _ : < [ ", -"} | 1 2 3 4 5 6 7 8 9 0 a b c ", -"d e f g 3 h i j k l m n o p q ", -"r s t u v w x y z A B C D E F ", -"G H I J K L M N O P Q R S T U ", -"V W X Y Z ` ...+.@.#.$.%.&.*. ", -"=.-.;.>.>.,.'.'.).!.!.!.~.~.~.{.", -"].^.)././././././.(._._._._.:.<.", -"[.I !.}.|.|.|.|.|.|.|.|.|.1.2.3.", -"4.5.6.7.8.8.8.8.8.8.8.8.8.9.0.).", -"a.b.c.d.e.f.f.f.f.f.f.g.h.i.j.).", -"k.l.>.m.n.o.p.q.r.s.t.u.u.v.w.x.", -"y.z.A.B.C.D.D.D.D.D.D.D.D.E.F.'.", -"k.G.A.H.I.I.I.I.I.I.I.I.I.I.J.K.", -"L.~.~.~.~.~.~.~.~.~.~.~.~.~.M. "}; diff --git a/include/xpm/document-new.png b/include/xpm/document-new.png deleted file mode 100644 index 4c3efdd..0000000 Binary files a/include/xpm/document-new.png and /dev/null differ diff --git a/include/xpm/document-new.xpm b/include/xpm/document-new.xpm deleted file mode 100644 index 6336507..0000000 --- a/include/xpm/document-new.xpm +++ /dev/null @@ -1,78 +0,0 @@ -/* XPM */ -static const char * document_new_xpm[] = { -"16 16 59 1", -" c None", -". c #9E9E9E", -"+ c #818181", -"@ c #8C8C7C", -"# c #9F9F72", -"$ c #AFAE6A", -"% c #EDE436", -"& c #FFFFFF", -"* c #F2EE9B", -"= c #F7F069", -"- c #FAF24D", -"; c #F7EF46", -"> c #F4EB28", -", c #ECECEC", -"' c #EAEAEA", -") c #EBEBEB", -"! c #F0EDB4", -"~ c #F7F06A", -"{ c #FCF43A", -"] c #FDF668", -"^ c #FDF66A", -"/ c #FBF23C", -"( c #F9EF1E", -"_ c #F2EE9C", -": c #FAF24E", -"< c #FDF667", -"[ c #FEFAB5", -"} c #FEFAB8", -"| c #FDF56B", -"1 c #FAEF22", -"2 c #F3EF9B", -"3 c #FEFABB", -"4 c #FEFBBF", -"5 c #FDF66E", -"6 c #FAF022", -"7 c #EDEDED", -"8 c #F1EEB1", -"9 c #F8F167", -"0 c #FDF440", -"a c #FDF771", -"b c #FDF772", -"c c #FCF343", -"d c #F6EC24", -"e c #EFEEE0", -"f c #F4EF96", -"g c #F8F163", -"h c #FBF346", -"i c #FBF345", -"j c #F7EF5D", -"k c #EEEEEE", -"l c #EEEEE2", -"m c #F3F0B1", -"n c #F5F092", -"o c #F5F09A", -"p c #969677", -"q c #EFEFEF", -"r c #F0F0F0", -"s c #F1F1F1", -"t c #F2F2F2", -".++++++++@#$% ", -"+&&&&&&&&*=-;> ", -"+&,'')))!~{]^/( ", -"+&'')),,_:<[}|1 ", -"+&')),,,2:^3456 ", -"+&)),,,7890abcd ", -"+&)),,77efghij ", -"+&),,77kklmnop ", -"+&,,77kkqqqr&+ ", -"+&,,77kkqqrr&+ ", -"+&,7kkqqrsss&+ ", -"+&77kkqrrsst&+ ", -"+&77kqqrrstt&+ ", -"+&&&&&&&&&&&&+ ", -".++++++++++++. ", -" "}; diff --git a/include/xpm/document-open.png b/include/xpm/document-open.png deleted file mode 100644 index ab94046..0000000 Binary files a/include/xpm/document-open.png and /dev/null differ diff --git a/include/xpm/document-open.xpm b/include/xpm/document-open.xpm deleted file mode 100644 index 10b148b..0000000 --- a/include/xpm/document-open.xpm +++ /dev/null @@ -1,156 +0,0 @@ -/* XPM */ -static const char * document_open_xpm[] = { -"16 16 137 2", -" c None", -". c #565854", -"+ c #575955", -"@ c #595B57", -"# c #5A5C58", -"$ c #5F615D", -"% c #7A7A7A", -"& c #797979", -"* c #F7F7F7", -"= c #F9F9F9", -"- c #FAFAFA", -"; c #FBFBFB", -"> c #FCFCFC", -", c #A2A3A2", -"' c #5B5C58", -") c #787878", -"! c #C9C9C9", -"~ c #C7C7C7", -"{ c #C4C4C4", -"] c #555753", -"^ c #DADADA", -"/ c #D3D3D3", -"( c #D2D2D2", -"_ c #CFCFCF", -": c #CDCDCD", -"< c #FEFEFE", -"[ c #939392", -"} c #5B5E5A", -"| c #737373", -"1 c #C5C5C5", -"2 c #B0B0B0", -"3 c #ACACAC", -"4 c #DCDCDC", -"5 c #9C9D9C", -"6 c #D5D5D4", -"7 c #FDFDFD", -"8 c #969796", -"9 c #5B5D59", -"0 c #6E6E6E", -"a c #C1C1C0", -"b c #AAAAAA", -"c c #E2E2E2", -"d c #DFDFDF", -"e c #DEDEDE", -"f c #DDDDDD", -"g c #E0E0E0", -"h c #E9E9E9", -"i c #E5E5E5", -"j c #D0D0D0", -"k c #5D5F5B", -"l c #6A6A6A", -"m c #BDBDBD", -"n c #A9A9A9", -"o c #A5A5A5", -"p c #E6E6E6", -"q c #9FA09E", -"r c #9C9D9B", -"s c #E3E3E3", -"t c #D0D1D0", -"u c #656565", -"v c #B7B7B7", -"w c #A6A6A6", -"x c #A1A1A1", -"y c #EBEBEB", -"z c #EAEAEA", -"A c #E8E8E8", -"B c #E7E7E7", -"C c #D9D9D9", -"D c #5B5C59", -"E c #5F5F5F", -"F c #B3B3B3", -"G c #406CA5", -"H c #3868A5", -"I c #3768A5", -"J c #3666A5", -"K c #3566A5", -"L c #3566A4", -"M c #3465A4", -"N c #3767A6", -"O c #5B5B5B", -"P c #AEAEAE", -"Q c #C0D5EA", -"R c #C1D5EA", -"S c #C1D6EA", -"T c #BBD2E8", -"U c #3465A5", -"V c #565656", -"W c #C3D6EA", -"X c #92B5DB", -"Y c #95B8DC", -"Z c #B9D0E7", -"` c #3466A4", -" . c #515151", -".. c #A5A5A4", -"+. c #3666A4", -"@. c #C5D7EB", -"#. c #98B9DD", -"$. c #95B7DC", -"%. c #B8CEE7", -"&. c #4C4C4C", -"*. c #3767A5", -"=. c #BFD2E9", -"-. c #9BBADD", -";. c #9ABADD", -">. c #96B7DC", -",. c #8FB2DA", -"'. c #8BB0D8", -"). c #B1C9E4", -"!. c #484848", -"~. c #9B9B9B", -"{. c #A5C1E1", -"]. c #8EB2D9", -"^. c #8AAFD8", -"/. c #85ACD7", -"(. c #83AAD6", -"_. c #81A9D5", -":. c #7EA7D4", -"<. c #79A3D3", -"[. c #77A2D2", -"}. c #7BA5D3", -"|. c #95B6DB", -"1. c #3567A6", -"2. c #494949", -"3. c #999999", -"4. c #3968A5", -"5. c #94B5DB", -"6. c #82AAD5", -"7. c #7DA6D4", -"8. c #7FA8D4", -"9. c #85ABD5", -"0. c #7E8896", -"a. c #5588BF", -"b. c #5689C0", -"c. c #4B7EB7", -"d. c #3667A6", -"e. c #454A51", -"f. c #3565A4", -" . + . + + @ # $ ", -"% & & & . * = - ; ; > , ' ", -") ! ~ { ] ^ / / ( _ : < [ } ", -"| 1 2 3 ] 4 5 5 5 5 6 < 7 8 9 ", -"0 a 3 b . c d e e f g h i j k ", -"l m n o . p q r r r f s s t 9 ", -"u v w x + y z z h h A A B C D ", -"E F G H H I J J K L L L M M M N ", -"O P K Q Q Q Q Q Q R S S S S T U ", -"V n L W X X X X X X X X X Y Z ` ", -" ...+.@.#.#.#.#.#.#.#.#.#.$.%.K ", -"&.x *.=.-.;.;.;.;.;.;.>.,.'.).K ", -"!.~.H {.].^./.(._.:.<.[.[.}.|.1.", -"2.3.4.5.6.7.7.7.7.7.7.7.7.8.9.J ", -"!.0.4.a.b.b.b.b.b.b.b.b.b.b.c.d.", -"e.M M M M M M M M M M M M M f. "}; diff --git a/include/xpm/document-print.png b/include/xpm/document-print.png deleted file mode 100644 index 35c37bd..0000000 Binary files a/include/xpm/document-print.png and /dev/null differ diff --git a/include/xpm/document-print.xpm b/include/xpm/document-print.xpm deleted file mode 100644 index 21170e9..0000000 --- a/include/xpm/document-print.xpm +++ /dev/null @@ -1,86 +0,0 @@ -/* XPM */ -static const char * document_print_xpm[] = { -"16 16 67 1", -" c None", -". c #AAABA9", -"+ c #F9F9F9", -"@ c #888A85", -"# c #F8F8F8", -"$ c #C4C4C4", -"% c #F1F1F1", -"& c #F3F3F3", -"* c #F7F7F7", -"= c #C6C6C6", -"- c #C7C7C7", -"; c #E0E0E0", -"> c #E2E2E2", -", c #E3E3E3", -"' c #E5E5E5", -") c #E6E6E6", -"! c #E7E7E7", -"~ c #F6F6F6", -"{ c #F5F5F5", -"] c #F5F5F6", -"^ c #7D7E7C", -"/ c #858684", -"( c #ABABAB", -"_ c #A9A9A9", -": c #AAAAAA", -"< c #FCFCFC", -"[ c #F4F4F4", -"} c #E8E8E8", -"| c #FDFDFD", -"1 c #D4D4D4", -"2 c #EDEDED", -"3 c #AEAEAE", -"4 c #DFDFDF", -"5 c #E1E1E1", -"6 c #DCDCDC", -"7 c #9F9F9F", -"8 c #CDCCCB", -"9 c #F0F0F0", -"0 c #CCCBCB", -"a c #DDDDDD", -"b c #DEDEDE", -"c c #D9D9D9", -"d c #8C8B8A", -"e c #C5C5C5", -"f c #F2F2F2", -"g c #BEBEBE", -"h c #868584", -"i c #7A7978", -"j c #767574", -"k c #787675", -"l c #767472", -"m c #72716F", -"n c #747372", -"o c #B2B2B2", -"p c #BBBBBB", -"q c #B9B9B9", -"r c #B8B8B8", -"s c #B8B8B7", -"t c #B6B6B6", -"u c #B3B3B3", -"v c #B5B5B5", -"w c #B7B7B7", -"x c #ECECEC", -"y c #D7D7D7", -"z c #D8D8D8", -"A c #D5D5D5", -"B c #D6D6D6", -" ", -" ........... ", -" .++++@+++#. ", -" .+$$@@@$$#. ", -" .+%@@@@@&*. ", -" .*$$=@=--#. ", -" .*;>,@')!*. ", -" .~{{{{]]~*. ", -" ^^/(_(((((_:/^^", -" ^<+[[[[[[[[[)}^", -" ^|123&4,5>;678^", -" ^90aabbb6aacde^", -" ^fghiijklmnkoe^", -" ^fpqqrrstuvwr-^", -" ^xyzzyyyyyAyB1^", -" ^^^^^^^^^^^^^^^"}; diff --git a/include/xpm/document-properties.png b/include/xpm/document-properties.png deleted file mode 100644 index ab0e8ea..0000000 Binary files a/include/xpm/document-properties.png and /dev/null differ diff --git a/include/xpm/document-properties.xpm b/include/xpm/document-properties.xpm deleted file mode 100644 index e12cda1..0000000 --- a/include/xpm/document-properties.xpm +++ /dev/null @@ -1,60 +0,0 @@ -/* XPM */ -static const char * document_properties_xpm[] = { -"16 16 41 1", -" c None", -". c #999999", -"+ c #818181", -"@ c #FFFFFF", -"# c #ECECEC", -"$ c #EAEAEA", -"% c #EBEBEB", -"& c #EDEDED", -"* c #F0F0F0", -"= c #C4C4C4", -"- c #C5C5C5", -"; c #C6C6C6", -"> c #C7C7C7", -", c #696969", -"' c #D2D2D2", -") c #EEEEEE", -"! c #B0B0B0", -"~ c #585858", -"{ c #696966", -"] c #6A6A6A", -"^ c #D2D2CC", -"/ c #D6D6D6", -"( c #595959", -"_ c #626262", -": c #6C6C6C", -"< c #DCDCDC", -"[ c #EFEFEF", -"} c #D4D4D4", -"| c #777777", -"1 c #858585", -"2 c #909090", -"3 c #9D9D9D", -"4 c #C8C8C8", -"5 c #B5B5B5", -"6 c #929292", -"7 c #9E9E9E", -"8 c #ABABAB", -"9 c #E0E0E0", -"0 c #ADADAD", -"a c #BABABA", -"b c #959595", -" .++++++++++++ ", -" +@@@@@@@@@@@@+ ", -" +@#$$%%%##&*@+ ", -" +@$=--;;;;>*@+ ", -" +@$%%,,,'&)*@+ ", -" +@%-;!~~~;>*@+ ", -" +@%,'#',{#)*@+ ", -" +@%~~!~]]^)*@+ ", -" +@#,,,]]]]/*@+ ", -" +@#!~~~~(_:<@+ ", -" +@#&))[}|123@+ ", -" +@&;>>445678@+ ", -" +@&&)[[**90a@+ ", -" +@@@@@@@@@@@@+ ", -" b++++++++++++b ", -" "}; diff --git a/include/xpm/document-save.png b/include/xpm/document-save.png deleted file mode 100644 index 22ff495..0000000 Binary files a/include/xpm/document-save.png and /dev/null differ diff --git a/include/xpm/document-save.xpm b/include/xpm/document-save.xpm deleted file mode 100644 index e651d91..0000000 --- a/include/xpm/document-save.xpm +++ /dev/null @@ -1,126 +0,0 @@ -/* XPM */ -static const char * document_save_xpm[] = { -"16 16 107 2", -" c None", -". c #38678B", -"+ c #3D698A", -"@ c #4A7180", -"# c #58787A", -"$ c #B1CEE6", -"% c #D0DFEF", -"& c #C5DBEC", -"* c #9BC2DF", -"= c #688BA0", -"- c #436E88", -"; c #6B7F88", -"> c #667173", -", c #627075", -"' c #4A6D85", -") c #41749A", -"! c #44789F", -"~ c #9EBFD9", -"{ c #C1D9EB", -"] c #5186AF", -"^ c #4E6A7D", -"/ c #6E706B", -"( c #6B716E", -"_ c #E2E6DD", -": c #FFFFFF", -"< c #DDE1D6", -"[ c #C9D6DD", -"} c #6E99B6", -"| c #ABCBE2", -"1 c #92B7D3", -"2 c #547D9B", -"3 c #D5DFE5", -"4 c #F4F4F4", -"5 c #72756B", -"6 c #FDFDFD", -"7 c #EEEEEE", -"8 c #EDEDED", -"9 c #DFE2DE", -"0 c #7798B0", -"a c #79A7CA", -"b c #8FB3CE", -"c c #3D6B8E", -"d c #ACBCC3", -"e c #EDEDEE", -"f c #EDEEEE", -"g c #EDEEED", -"h c #F3F4F3", -"i c #FCFBFC", -"j c #EBECEC", -"k c #5892BD", -"l c #ECECEC", -"m c #F3F3F3", -"n c #FAFAFA", -"o c #E9E9EA", -"p c #CACFC4", -"q c #98BFDC", -"r c #719FBF", -"s c #739FC0", -"t c #96BBD8", -"u c #95A9AF", -"v c #EAE9EA", -"w c #F2F2F2", -"x c #F9F9F9", -"y c #E4E4E4", -"z c #C5CBBF", -"A c #ABC8DF", -"B c #92A6AC", -"C c #F1F1F1", -"D c #ACCBE3", -"E c #3B6B8F", -"F c #F7F7F7", -"G c #E3E3E3", -"H c #CED4C8", -"I c #3F6C8E", -"J c #9AAEB4", -"K c #FCFCFC", -"L c #F0F0F0", -"M c #FEFEFE", -"N c #EBEBEB", -"O c #CECECE", -"P c #C9C9C9", -"Q c #C5C5C5", -"R c #D6D6D6", -"S c #9F9F9F", -"T c #AFAFAF", -"U c #BCBCBC", -"V c #C4C4C4", -"W c #C8C8C8", -"X c #D0D0D0", -"Y c #A9A9A9", -"Z c #D2D2D2", -"` c #B9B9B9", -" . c #CACACA", -".. c #CDCDCD", -"+. c #C3C3C3", -"@. c #AAAAA9", -"#. c #B4B4B4", -"$. c #C2C2C2", -"%. c #CBCBCB", -"&. c #A8A7A8", -"*. c #D1D1D1", -"=. c #A8A7A7", -"-. c #B7B6B6", -";. c #DDDDDD", -">. c #DCDCDC", -",. c #D5D5D5", -"'. c #CFCFCF", -" . . . + @ # ", -" $ % & * = - ", -"; > , ' ) ! ~ { ] ^ / / / / / / ", -"( _ : < [ } . | 1 2 3 : : : 4 / ", -"5 6 7 8 9 0 . a b c d e f g h / ", -"/ i j . . . . a k . . . . l m / ", -"/ n o p . q r r r s t . u v w / ", -"/ x n y z . q s s A . B y 4 C / ", -"/ x 7 n y z . D q E B y n 7 C / ", -"/ F G 7 n n H I . J n K 7 G L / ", -"/ M : : : : : : : 4 4 N N G L / ", -"/ O P P P P Q P P Q Q Q Q Q R / ", -"/ O Q S T U V W X Y Z Y Z ` ./ ", -"/ ..+.@.#.$.V W %.&.*.=.*.-. ./ ", -"/ ;.>.>.>.,.,.'.'.'.'.'.'.'. ./ ", -"/ / / / / / / / / / / / / / / / "}; diff --git a/include/xpm/edit-copy.png b/include/xpm/edit-copy.png deleted file mode 100644 index 8dd48c4..0000000 Binary files a/include/xpm/edit-copy.png and /dev/null differ diff --git a/include/xpm/edit-copy.xpm b/include/xpm/edit-copy.xpm deleted file mode 100644 index 6c9d2b2..0000000 --- a/include/xpm/edit-copy.xpm +++ /dev/null @@ -1,60 +0,0 @@ -/* XPM */ -static const char * edit_copy_xpm[] = { -"16 16 41 1", -" c None", -". c #888A85", -"+ c #FFFFFF", -"@ c #F0F0EF", -"# c #EFEFEE", -"$ c #C8C8C7", -"% c #9A9B97", -"& c #8D8F8A", -"* c #8A8C87", -"= c #898B86", -"- c #C7C7C6", -"; c #C6C6C5", -"> c #EEEEED", -", c #EDEDEC", -"' c #FEFEFE", -") c #ECECEC", -"! c #C4C4C3", -"~ c #FAFAFA", -"{ c #F3F3F3", -"] c #F9F9F9", -"^ c #EBEBEB", -"/ c #EAEAEA", -"( c #EEEEEE", -"_ c #F7F7F6", -": c #C3C4C3", -"< c #F3F3F2", -"[ c #F4F4F3", -"} c #F2F2F2", -"| c #8C8E89", -"1 c #FEFEFD", -"2 c #989A95", -"3 c #F8F8F7", -"4 c #E3E4E2", -"5 c #FAFAF9", -"6 c #E3E3E2", -"7 c #F4F4F4", -"8 c #F6F6F5", -"9 c #FCFCFB", -"0 c #FBFBFB", -"a c #D4D4D4", -"b c #989A96", -" .......... ", -" ++++++++++. ", -" +@#####@@+. ", -" +@$%..........&", -" +@@*++++++++++.", -" +@$=+@@@@@@@@+.", -" +@#*+@------@+.", -" +#;=+@@@@@@@@+.", -" +>,*+@-----@@+.", -" ')!=+@@@@@@@~{.", -" ]^/*+@-----(_:.", -" <[}*+@@@@@||||.", -" ====1@@@@~2~34.", -" =5@@@~~2~6..", -" =7_890ab4.. ", -" |=........ "}; diff --git a/include/xpm/edit-cut.png b/include/xpm/edit-cut.png deleted file mode 100644 index dc9eb9a..0000000 Binary files a/include/xpm/edit-cut.png and /dev/null differ diff --git a/include/xpm/edit-cut.xpm b/include/xpm/edit-cut.xpm deleted file mode 100644 index 367226c..0000000 --- a/include/xpm/edit-cut.xpm +++ /dev/null @@ -1,107 +0,0 @@ -/* XPM */ -static const char * edit_cut_xpm[] = { -"16 16 88 1", -" c None", -". c #8B8D88", -"+ c #939590", -"@ c #8F918C", -"# c #8E908B", -"$ c #F7F7F7", -"% c #90918D", -"& c #D2D3D0", -"* c #D2D4D0", -"= c #EFF0EF", -"- c #92948F", -"; c #AAACA7", -"> c #C6C8C3", -", c #8D8F8A", -"' c #B3B5B0", -") c #F7F7F6", -"! c #CCCEC9", -"~ c #AEAFAB", -"{ c #DBDCD9", -"] c #91938E", -"^ c #8C8E89", -"/ c #B6B8B3", -"( c #CDCECB", -"_ c #B5B6B2", -": c #9FA09C", -"< c #B5B6B3", -"[ c #B8BAB5", -"} c #E1E1DF", -"| c #F5F6F5", -"1 c #9A9C97", -"2 c #A8A9A5", -"3 c #BABBB7", -"4 c #E7E8E6", -"5 c #8A8C87", -"6 c #898984", -"7 c #C5C6C3", -"8 c #B3B2AF", -"9 c #9C2F2C", -"0 c #AE1818", -"a c #AB1616", -"b c #A60606", -"c c #A34A45", -"d c #A60202", -"e c #C71A19", -"f c #AD1717", -"g c #A90707", -"h c #D22020", -"i c #CE1E1E", -"j c #B70F0E", -"k c #A40502", -"l c #A80403", -"m c #C91A1A", -"n c #D12020", -"o c #CB1F1F", -"p c #A90A0A", -"q c #A80606", -"r c #D01F1F", -"s c #A80303", -"t c #C01514", -"u c #A60101", -"v c #CD1D1C", -"w c #C01513", -"x c #CD1D1D", -"y c #A70606", -"z c #AB1414", -"A c #D52323", -"B c #CE1D1D", -"C c #CA1B1A", -"D c #AB0D0D", -"E c #CF1D1D", -"F c #B50B0B", -"G c #D32121", -"H c #AA0C0C", -"I c #AA0909", -"J c #D62323", -"K c #B80D0D", -"L c #D11F1F", -"M c #AB1111", -"N c #AB1313", -"O c #DB2727", -"P c #A80707", -"Q c #AA0808", -"R c #D42222", -"S c #AA0E0E", -"T c #AB1010", -"U c #AA0D0D", -"V c #AA0B0B", -"W c #A90B0B", -" .+ .@ ", -" #$. %&@ ", -" .*=- ;>, ", -" ,'). #!~. ", -" .{=]^/(. ", -" ,_$.:<[. ", -" .}|12. ", -" ,34;#5 ", -" 6789 ", -" 0abcdef0 ", -" ghijklmnop ", -" qrstu vwsxy ", -" zA Bp sC nz ", -" DE FGH IJK LM ", -" NOrBP QREBN ", -" STa UVW "}; diff --git a/include/xpm/edit-delete.png b/include/xpm/edit-delete.png deleted file mode 100644 index 184f762..0000000 Binary files a/include/xpm/edit-delete.png and /dev/null differ diff --git a/include/xpm/edit-delete.xpm b/include/xpm/edit-delete.xpm deleted file mode 100644 index 1b2b8d4..0000000 --- a/include/xpm/edit-delete.xpm +++ /dev/null @@ -1,155 +0,0 @@ -/* XPM */ -static const char * edit_delete_xpm[] = { -"16 16 136 2", -" c None", -". c #2E3436", -"+ c #64696A", -"@ c #909894", -"# c #E9EAE3", -"$ c #EEEFEC", -"% c #EFF0EE", -"& c #D2D5D3", -"* c #BFC1C1", -"= c #979A9B", -"- c #424749", -"; c #D9DBD6", -"> c #C7CAC4", -", c #6E7672", -"' c #424745", -") c #242727", -"! c #313432", -"~ c #7A837E", -"{ c #B3B8B3", -"] c #CBCECB", -"^ c #CBCFCB", -"/ c #D6D9D3", -"( c #D2D5CD", -"_ c #DADCD6", -": c #AEB3AD", -"< c #5C6362", -"[ c #353939", -"} c #373A38", -"| c #585E5B", -"1 c #8D948F", -"2 c #AAAFA7", -"3 c #D2D6D2", -"4 c #B5BAB5", -"5 c #E5E5E1", -"6 c #F0F0ED", -"7 c #ECEDE9", -"8 c #E3E5E0", -"9 c #DDDED9", -"0 c #CBCEC7", -"a c #B6BBB3", -"b c #A2A8A0", -"c c #B3B8B0", -"d c #BABFB7", -"e c #ABB0A8", -"f c #CBCECD", -"g c #E0E2E2", -"h c #E6E6DD", -"i c #F4F4EF", -"j c #F4F3F1", -"k c #F4F4F1", -"l c #F3F4F0", -"m c #F0F0EB", -"n c #E5E6E0", -"o c #D6D9D2", -"p c #919894", -"q c #8B8F8D", -"r c #898D8D", -"s c #9A9C9C", -"t c #C2C5C4", -"u c #BCC0BF", -"v c #D9DBD2", -"w c #DFE0D8", -"x c #D9DBD4", -"y c #CCD0CF", -"z c #848C89", -"A c #969C99", -"B c #86898A", -"C c #53585A", -"D c #5A5F60", -"E c #8B8F8F", -"F c #ADAFB0", -"G c #E4E5E5", -"H c #E3E5E5", -"I c #E3E5E4", -"J c #A1A4A4", -"K c #686D6E", -"L c #3C4041", -"M c #4C5052", -"N c #6B7171", -"O c #323838", -"P c #2E3434", -"Q c #2B3132", -"R c #2B3133", -"S c #292E30", -"T c #282D2F", -"U c #272C2E", -"V c #393D3C", -"W c #939594", -"X c #AFB5B3", -"Y c #B0B6B4", -"Z c #69706E", -"` c #979F9B", -" . c #6A716D", -".. c #393E3B", -"+. c #5F6764", -"@. c #333734", -"#. c #616866", -"$. c #989B99", -"%. c #B7BBBB", -"&. c #D5D8D6", -"*. c #818A88", -"=. c #D1D4D2", -"-. c #7E8785", -";. c #515756", -">. c #899290", -",. c #434844", -"'. c #6E7774", -"). c #A0A3A1", -"!. c #D6D9D7", -"~. c #858D8A", -"{. c #D8DBD8", -"]. c #A2A8A3", -"^. c #555B59", -"/. c #979E9C", -"(. c #454B47", -"_. c #6F7875", -":. c #D4D7D5", -"<. c #838C89", -"[. c #D8DBD7", -"}. c #9B9D9B", -"|. c #AFB1B0", -"1. c #CCCFCF", -"2. c #B9BBBB", -"3. c #DDDFDC", -"4. c #A0A7A4", -"5. c #878B88", -"6. c #929595", -"7. c #727373", -"8. c #575C5E", -"9. c #9B9C9B", -"0. c #D5D8D7", -"a. c #CFD2D0", -"b. c #BFC0BF", -"c. c #BEC1BF", -"d. c #878787", -"e. c #54595A", -" . . . . . . ", -" . + @ # $ % & * = . ", -" - ; > , ' ) ! ~ { ] ^ . ", -" . / ( _ : < [ } | 1 2 3 4 . ", -" . 5 6 7 8 9 0 a b c d e f . ", -" . g h i j k l m n o p q r . ", -" . s t u v w x y z A B C . . ", -" . D E F G H I J K L M . ", -" . N O P Q R S T U V W . ", -" . X Y Z ` ...+.@.#.$.. ", -" . %.&.*.=.-.;.>.,.'.).. ", -" . %.!.~.{.].^./.(._.).. ", -" . %.:.<.[.].^./.(.'.}.. ", -" . |.1.2.3.].^.4.5.6.7.. ", -" . 8.9.0.a.b.c.d.e.. ", -" . . . . . . "}; diff --git a/include/xpm/edit-find.png b/include/xpm/edit-find.png deleted file mode 100644 index d072d3c..0000000 Binary files a/include/xpm/edit-find.png and /dev/null differ diff --git a/include/xpm/edit-find.xpm b/include/xpm/edit-find.xpm deleted file mode 100644 index 8a8fb2e..0000000 --- a/include/xpm/edit-find.xpm +++ /dev/null @@ -1,96 +0,0 @@ -/* XPM */ -static const char * edit_find_xpm[] = { -"16 16 77 1", -" c None", -". c #9A9B97", -"+ c #888A85", -"@ c #8D8F8A", -"# c #8A8C87", -"$ c #FFFFFF", -"% c #898B86", -"& c #F0F0EF", -"* c #C7C7C6", -"= c #D6D6D5", -"- c #818380", -"; c #828480", -"> c #A8A9A6", -", c #AEBAC8", -"' c #A6BCD2", -") c #A2BAD4", -"! c #A8B9CD", -"~ c #D6D7D5", -"{ c #A8B7C8", -"] c #8AACD2", -"^ c #BFD3E7", -"/ c #C5D7EA", -"( c #9CBAD9", -"_ c #90ADCB", -": c #A3AEBB", -"< c #85A9CF", -"[ c #DCE6F2", -"} c #E8EEF7", -"| c #E4ECF5", -"1 c #CADAEC", -"2 c #8EB2D8", -"3 c #97AFCB", -"4 c #A2B8D0", -"5 c #A5C0DF", -"6 c #D9E4F1", -"7 c #E0EAF3", -"8 c #DDE7F2", -"9 c #C1D4E9", -"0 c #A0BEDF", -"a c #81A6D0", -"b c #FEFEFD", -"c c #A9BFD6", -"d c #A5C1E0", -"e c #D0DEEE", -"f c #DAE5F2", -"g c #CDDCED", -"h c #C8D9EC", -"i c #BCD0E8", -"j c #80A7D1", -"k c #FAFAF9", -"l c #A7B5C3", -"m c #89ABD0", -"n c #B3CAE5", -"o c #C3D7EB", -"p c #C1D4EA", -"q c #CFDDEE", -"r c #A3BDDA", -"s c #93AFCE", -"t c #CFCFCD", -"u c #9FB8D1", -"v c #91B3D6", -"w c #AFC5DF", -"x c #B2CAE3", -"y c #A0BAD6", -"z c #97B4D3", -"A c #757673", -"B c #8C8E89", -"C c #7E807B", -"D c #B3C8DC", -"E c #8BACCF", -"F c #80A8D1", -"G c #99B3D0", -"H c #A3A4A3", -"I c #6C6E6A", -"J c #8D8E8C", -"K c #B8B8B7", -"L c #848482", -".++++++++++@ ", -"#$$$$$$$$$$+ ", -"%$&&&&&&&&$+ ", -"#$&******&$+ ", -"%$&&&&=----; ", -"#$&**>-,')!- ", -"%$&&~-{]^/(_- ", -"#$&*-:<[}|123- ", -"#$&&-4567890a- ", -"%b&&-cdefghij- ", -"%k&&-lmnopqrs- ", -"%$$$t-uvwxyz-A ", -"B%+++C-DEFG-HHI ", -" I----JKHHL", -" JKHL", -" JJL"}; diff --git a/include/xpm/edit-paste.png b/include/xpm/edit-paste.png deleted file mode 100644 index 24588a3..0000000 Binary files a/include/xpm/edit-paste.png and /dev/null differ diff --git a/include/xpm/edit-paste.xpm b/include/xpm/edit-paste.xpm deleted file mode 100644 index 333091c..0000000 --- a/include/xpm/edit-paste.xpm +++ /dev/null @@ -1,96 +0,0 @@ -/* XPM */ -static const char * edit_paste_xpm[] = { -"16 16 77 1", -" c None", -". c #5F5F5E", -"+ c #5C5C5C", -"@ c #6D4401", -"# c #6C4401", -"$ c #6B4403", -"% c #5C5C5B", -"& c #959589", -"* c #97978A", -"= c #C08424", -"- c #A47E3E", -"; c #706D64", -"> c #5E5E5E", -", c #7F7F7C", -"' c #80807D", -") c #7E7E7B", -"! c #6E6C64", -"~ c #A17C40", -"{ c #B97F23", -"] c #6C4301", -"^ c #6F4602", -"/ c #C68827", -"( c #716F64", -"_ c #F1F1F1", -": c #E0E0E0", -"< c #BBBBBB", -"[ c #F2F2F2", -"} c #6E6D64", -"| c #C58727", -"1 c #6A4200", -"2 c #666864", -"3 c #FFFFFF", -"4 c #F0F0EF", -"5 c #676964", -"6 c #C28628", -"7 c #C58726", -"8 c #B3B5B5", -"9 c #EFEFEE", -"0 c #EFEFED", -"a c #EDEDEB", -"b c #6E4602", -"c c #B2B4B4", -"d c #B1B2B2", -"e c #EAEAE8", -"f c #EDEDEC", -"g c #EBEBEA", -"h c #DBDBD9", -"i c #EEEEED", -"j c #ECECEB", -"k c #EBEBE9", -"l c #E9E9E7", -"m c #DADAD8", -"n c #CCCDCA", -"o c #ECECEA", -"p c #E8E8E6", -"q c #CDCECB", -"r c #B9BAB6", -"s c #B8B9B5", -"t c #6E4502", -"u c #E7E7E5", -"v c #D9D9D6", -"w c #B9B9B6", -"x c #E7E7E4", -"y c #D8D8D5", -"z c #C1C2BE", -"A c #B7B7B4", -"B c #706D63", -"C c #EDEEED", -"D c #FEFEFE", -"E c #FEFEFD", -"F c #BA7F23", -"G c #A77D3B", -"H c #736F64", -"I c #6A6C68", -"J c #A37C3D", -"K c #B37B22", -"L c #6B4301", -" .++++. ", -" @#$%&**&%$## ", -" @=-;>,'')>!~{] ", -" ^/(_:<<<<:[}|1 ", -" ^/234444443561 ", -" ^7234888893561 ", -" ^72344440a3561 ", -" b723488cde3561 ", -" b72349fgeh3561 ", -" b723ijklmn3561 ", -" b723oepqrs3561 ", -" t723luvw333561 ", -" t723xyzA335|61 ", -" t7BCDDD9E5|||1 ", -" ]FGHIIIIIJJJKL ", -" ]##########L "}; diff --git a/include/xpm/edit-redo.png b/include/xpm/edit-redo.png deleted file mode 100644 index c3b0df0..0000000 Binary files a/include/xpm/edit-redo.png and /dev/null differ diff --git a/include/xpm/edit-redo.xpm b/include/xpm/edit-redo.xpm deleted file mode 100644 index c83b376..0000000 --- a/include/xpm/edit-redo.xpm +++ /dev/null @@ -1,66 +0,0 @@ -/* XPM */ -static const char * edit_redo_xpm[] = { -"16 16 47 1", -" c None", -". c #4E9A06", -"+ c #AEF36C", -"@ c #8F9B0C", -"# c #A9DE49", -"$ c #AEF16A", -"% c #AEF26B", -"& c #B3F573", -"* c #A6EF61", -"= c #73D216", -"- c #ACD945", -"; c #AFEF67", -"> c #A1E950", -", c #A0DB24", -"' c #A9D846", -") c #B1EF65", -"! c #A4DE24", -"~ c #97DD2A", -"{ c #AFD71A", -"] c #75D318", -"^ c #9DC230", -"/ c #B1ED60", -"( c #A5DF26", -"_ c #C8D009", -": c #77D014", -"< c #8AE234", -"[ c #559F0C", -"} c #B1E963", -"| c #BAE031", -"1 c #CBD417", -"2 c #9BD622", -"3 c #A1DA23", -"4 c #D9DE23", -"5 c #529D0A", -"6 c #B2EC64", -"7 c #CDD624", -"8 c #93A10B", -"9 c #CCD41E", -"0 c #BEE246", -"a c #99A605", -"b c #B3D937", -"c c #B8DD3A", -"d c #AFC723", -"e c #919D05", -"f c #5AA80F", -"g c #C0D62C", -"h c #9A9902", -" . ", -" .. ", -" .+. ", -" ....++. ", -" .@#$%&*=+. ", -" .-;>,,,,==+. ", -" .')!~,,{===]+.", -" .^/({{_:====<. ", -" [}|1233334=<. ", -" 5678.....9<. ", -" .0a. .<. ", -" .b. .. ", -" .c. . ", -" .de ", -" fgh ", -" "}; diff --git a/include/xpm/edit-select-all.png b/include/xpm/edit-select-all.png deleted file mode 100644 index f4b0b19..0000000 Binary files a/include/xpm/edit-select-all.png and /dev/null differ diff --git a/include/xpm/edit-select-all.xpm b/include/xpm/edit-select-all.xpm deleted file mode 100644 index 08ee62a..0000000 --- a/include/xpm/edit-select-all.xpm +++ /dev/null @@ -1,56 +0,0 @@ -/* XPM */ -static const char * edit_select_all_xpm[] = { -"16 16 37 1", -" c None", -". c #8B8D89", -"+ c #888A85", -"@ c #8C8E89", -"# c #FDFDFD", -"$ c #FEFEFE", -"% c #FCFCFC", -"& c #FBFBFB", -"* c #FAFAFA", -"= c #F9F9F9", -"- c #8B8D88", -"; c #A8BED6", -"> c #A9BFD7", -", c #AAC0D8", -"' c #ABC1D9", -") c #F8F8F8", -"! c #8197AF", -"~ c #ACC2DA", -"{ c #ADC3DB", -"] c #AEC4DC", -"^ c #EBEBEB", -"/ c #AFC5DD", -"( c #ECECEC", -"_ c #B0C6DE", -": c #EEEEEE", -"< c #B1C7DF", -"[ c #F0F0F0", -"} c #B2C8E0", -"| c #F2F2F2", -"1 c #F7F7F7", -"2 c #000000", -"3 c #B3C9E1", -"4 c #F4F4F4", -"5 c #F5F5F5", -"6 c #F6F6F6", -"7 c #8298B0", -"8 c #8D8F8A", -" .++++++++++++@ ", -" +#$$##%%&&**=- ", -" +#;>>,,''''')- ", -" +$>!!!!~!!!~)- ", -" +#,!!!!{{{{{)- ", -" +#,!!!!{]]]^)- ", -" +%'!!!!]!!/()- ", -" +%~~{]//___:)- ", -" +%~{]//__<<[)- ", -" +&~!!!!!!!}|1- ", -" +&{]/__2}2341- ", -" +*{]/_<}25661- ", -" +={7777}21)11- ", -" +={]/_<}21=)1- ", -" +))))))2)2)))- ", -" @++++++++++++8 "}; diff --git a/include/xpm/edit-undo.png b/include/xpm/edit-undo.png deleted file mode 100644 index 8b0fef9..0000000 Binary files a/include/xpm/edit-undo.png and /dev/null differ diff --git a/include/xpm/edit-undo.xpm b/include/xpm/edit-undo.xpm deleted file mode 100644 index 3bce212..0000000 --- a/include/xpm/edit-undo.xpm +++ /dev/null @@ -1,80 +0,0 @@ -/* XPM */ -static const char * edit_undo_xpm[] = { -"16 16 61 1", -" c None", -". c #C4A000", -"+ c #FBF3AD", -"@ c #FBE425", -"# c #BEA113", -"$ c #BB9F15", -"% c #BBA11B", -"& c #F6E131", -"* c #FAE320", -"= c #FAEC73", -"- c #FAEB6F", -"; c #F7E86E", -"> c #F7E86C", -", c #BCA114", -"' c #C1A314", -") c #F6E02F", -"! c #F7E232", -"~ c #F1DB29", -"{ c #F5E02F", -"] c #E3CD16", -"^ c #ECD936", -"/ c #F6E769", -"( c #E3CE41", -"_ c #C1A313", -": c #F8E232", -"< c #E8D21D", -"[ c #E1CD40", -"} c #BDA116", -"| c #FBED79", -"1 c #F4DF2C", -"2 c #D6C004", -"3 c #DFC80B", -"4 c #F3E56A", -"5 c #C5AB1B", -"6 c #BCA015", -"7 c #FBED76", -"8 c #DAC304", -"9 c #F9EA69", -"0 c #F7DD05", -"a c #DFC80A", -"b c #D8C207", -"c c #EBDC6F", -"d c #BFA31B", -"e c #C4A901", -"f c #EEE16E", -"g c #DFC90F", -"h c #F2E469", -"i c #C0A41A", -"j c #F5E66D", -"k c #EFE276", -"l c #C1A319", -"m c #C8AC02", -"n c #F2E788", -"o c #C2A211", -"p c #CBAA0E", -"q c #E9DA5D", -"r c #C0A623", -"s c #DBC443", -"t c #D8C543", -"u c #EADB66", -"v c #C2A611", -" . ", -" .. ", -" .+. ", -" .+@..#$% ", -" .+&*=-;>,' ", -" .+)!~{~]^/(_ ", -".+):!!{~<<<^[} ", -" .|:1222<<<3456 ", -" .78799990abcd ", -" .77....efghi ", -" .7. .jkl ", -" .. mno ", -" . pqr ", -" str ", -" uv ", -" "}; diff --git a/include/xpm/film-b.png b/include/xpm/film-b.png deleted file mode 100644 index edccf1b..0000000 Binary files a/include/xpm/film-b.png and /dev/null differ diff --git a/include/xpm/film-b.xpm b/include/xpm/film-b.xpm deleted file mode 100644 index 3f50d46..0000000 --- a/include/xpm/film-b.xpm +++ /dev/null @@ -1,34 +0,0 @@ -/* XPM */ -static const char * film_b_xpm[] = { -"16 16 15 1", -" c None", -". c #7474D1", -"+ c #7171D0", -"@ c #7070CF", -"# c #6F6FCF", -"$ c #6A6ACD", -"% c #6868CD", -"& c #7373D0", -"* c #7979D2", -"= c #7C7CD3", -"- c #7676D1", -"; c #7E7ED3", -"> c #8282D5", -", c #8585D6", -"' c #8181D4", -" ", -" ", -" .+@#$$%$%%% ", -" . &+##$#$ % ", -" **..++#+##$ ", -" = *-..+.+ # ", -" ;==**....&+ ", -" > ;==**** . ", -" ,>>'==*=*** ", -" > ;==**** . ", -" ;==**....&+ ", -" = *-..+.+ # ", -" **..++#+##$ ", -" . &+##$#$ % ", -" .+@#$$%$%%% ", -" "}; diff --git a/include/xpm/film-r.xpm b/include/xpm/film-r.xpm deleted file mode 100644 index b84f594..0000000 --- a/include/xpm/film-r.xpm +++ /dev/null @@ -1,32 +0,0 @@ -/* XPM */ -static const char * film_r_xpm[] = { -"16 16 13 1", -" c None", -". c #B53C3C", -"+ c #B23B3B", -"@ c #AF3A3A", -"# c #AE3939", -"$ c #A63737", -"% c #A53737", -"& c #BD3F3F", -"* c #C04141", -"= c #BA3E3E", -"- c #C14444", -"; c #C24949", -"> c #C44F4F", -" ", -" ", -" .+@#$$%$%%% ", -" . .+##$#$ % ", -" &&..++#+##$ ", -" * &=..+.+ # ", -" -**&&.....+ ", -" ; -**&&&& . ", -" >;;;**&*&&& ", -" ; -**&&&& . ", -" -**&&.....+ ", -" * &=..+.+ # ", -" &&..++#+##$ ", -" . .+##$#$ % ", -" .+@#$$%$%%% ", -" "}; diff --git a/include/xpm/folder.png b/include/xpm/folder.png deleted file mode 100644 index 65bd0bb..0000000 Binary files a/include/xpm/folder.png and /dev/null differ diff --git a/include/xpm/format-indent-more.png b/include/xpm/format-indent-more.png deleted file mode 100644 index 00309ea..0000000 Binary files a/include/xpm/format-indent-more.png and /dev/null differ diff --git a/include/xpm/format-indent-more.xpm b/include/xpm/format-indent-more.xpm deleted file mode 100644 index d2193fd..0000000 --- a/include/xpm/format-indent-more.xpm +++ /dev/null @@ -1,53 +0,0 @@ -/* XPM */ -static const char * format_indent_more_xpm[] = { -"16 16 34 1", -" c None", -". c #4E8FCC", -"+ c #498DC7", -"@ c #FFFFFF", -"# c #4B90CB", -"$ c #FEFEFE", -"% c #FABFBA", -"& c #A22320", -"* c #F9B7B3", -"= c #921B18", -"- c #F9B5B1", -"; c #FCD2D2", -"> c #F49A9A", -", c #E67674", -"' c #D55653", -") c #BE3936", -"! c #F8B3B0", -"~ c #F49A98", -"{ c #D45552", -"] c #F8B2AE", -"^ c #F39D99", -"/ c #E67572", -"( c #F8B0AC", -"_ c #F39B97", -": c #E67772", -"< c #D35653", -"[ c #F8AEAA", -"} c #F39795", -"| c #E57471", -"1 c #D35451", -"2 c #F8AEAC", -"3 c #F8B1AC", -"4 c #FBCAC7", -"5 c #4C8ECC", -" .++++++++++++. ", -" +@@@@@@@@@@@@# ", -" +@@@@@@@@@@@$# ", -" +@@@@@#####@$# ", -" +@@@@@%@@@@@$# ", -" +@@@@@&*@@@@@# ", -" +@@@@@&=-@@@@# ", -" +;>,')&==!@@@# ", -" +;~,{)&===]@$# ", -" +;^/{)&====($# ", -" +;_:<)&===[@$# ", -" +;}|1)&==2@@@# ", -" +@@@@@&=3@@@@# ", -" +@@@@@&3@@@@@# ", -" +@@@@@4$$@@@@# ", -" .############5 "}; diff --git a/include/xpm/go-down.png b/include/xpm/go-down.png deleted file mode 100644 index 3dd7fcc..0000000 Binary files a/include/xpm/go-down.png and /dev/null differ diff --git a/include/xpm/go-down.xpm b/include/xpm/go-down.xpm deleted file mode 100644 index e11a2cf..0000000 --- a/include/xpm/go-down.xpm +++ /dev/null @@ -1,112 +0,0 @@ -/* XPM */ -static const char * go_down_xpm[] = { -"16 16 93 2", -" c None", -". c #3A7404", -"+ c #3A7304", -"@ c #C7DEB0", -"# c #C3DCAB", -"$ c #BFDAA6", -"% c #B1D291", -"& c #A3CA7E", -"* c #C8DFB1", -"= c #8DBE5F", -"- c #86BA55", -"; c #71AE37", -"> c #4E9A06", -", c #C7DFB1", -"' c #78B241", -") c #8CBD5D", -"! c #85B954", -"~ c #7CB447", -"{ c #3B7504", -"] c #3B7604", -"^ c #C5DDAD", -"/ c #89BC59", -"( c #82B850", -"_ c #6FAD34", -": c #568927", -"< c #C2DBAA", -"[ c #C6DEAF", -"} c #C2DCAA", -"| c #88BD56", -"1 c #82BA4D", -"2 c #63AA1F", -"3 c #53A208", -"4 c #A5CE7F", -"5 c #A4CD7E", -"6 c #A4CC7E", -"7 c #9FC778", -"8 c #4B8218", -"9 c #3B7404", -"0 c #7AA54F", -"a c #B8D69B", -"b c #8DBE5D", -"c c #8AC058", -"d c #87C051", -"e c #7EBC42", -"f c #5AAB0C", -"g c #59AB0B", -"h c #59AA0A", -"i c #58A90C", -"j c #97C768", -"k c #659A34", -"l c #99BF75", -"m c #A9D183", -"n c #89C252", -"o c #87C34D", -"p c #69B61E", -"q c #5FB40D", -"r c #5EB30D", -"s c #89C54E", -"t c #84B755", -"u c #40780D", -"v c #B1D390", -"w c #98CC65", -"x c #7DC23B", -"y c #62B90F", -"z c #65BC0F", -"A c #65BD10", -"B c #7BC532", -"C c #9FCE71", -"D c #3F780A", -"E c #578C26", -"F c #B7DB94", -"G c #79C331", -"H c #67C011", -"I c #6AC512", -"J c #73C91F", -"K c #A8DB78", -"L c #52891E", -"M c #7AAA4C", -"N c #A0D66D", -"O c #69C412", -"P c #6ECB14", -"Q c #A5E06C", -"R c #72A83F", -"S c #3C7604", -"T c #8DBF5D", -"U c #8DD14C", -"V c #90D54E", -"W c #92C55F", -"X c #427A0E", -"Y c #A2D174", -"Z c #A3D375", -"` c #427B0E", -" . c #568B24", -" . + + + + + + . ", -" + @ # $ % & & + ", -" + * = - ; > & + ", -" + , = - ' > & + ", -" + @ ) ! ~ > & + ", -"{ + + + ] ^ / ( _ > & ] + + + { ", -" : < [ ^ } | 1 2 3 4 5 6 7 8 ", -" 9 0 a b c d e f g h i j k 9 ", -" . l m n o p q q r s t { ", -" u v w x y z A B C D ", -" E F G H I J K L ", -" { M N O P Q R S ", -" ] T U V W S ", -" X Y Z ` ", -" . . ", -" S S "}; diff --git a/include/xpm/go-first.png b/include/xpm/go-first.png deleted file mode 100644 index 9c15c09..0000000 Binary files a/include/xpm/go-first.png and /dev/null differ diff --git a/include/xpm/go-first.xpm b/include/xpm/go-first.xpm deleted file mode 100644 index 3687e51..0000000 --- a/include/xpm/go-first.xpm +++ /dev/null @@ -1,119 +0,0 @@ -/* XPM */ -static const char * go_first_xpm[] = { -"16 16 100 2", -" c None", -". c #3A7304", -"+ c #3B7504", -"@ c #3B7404", -"# c #588B28", -"$ c #3A7404", -"% c #81AA58", -"& c #C4DCAC", -"* c #457C12", -"= c #A6C787", -"- c #BEDAA5", -"; c #C6DEAF", -"> c #629135", -", c #BBD6A1", -"' c #B0D290", -") c #91C064", -"! c #C3DDAB", -"~ c #3B7604", -"{ c #3B7506", -"] c #86AE5F", -"^ c #BDD9A3", -"/ c #9DC775", -"( c #8CBD5D", -"_ c #8BBE5B", -": c #C2DDA8", -"< c #C0DDA5", -"[ c #BEDBA2", -"} c #BBD99E", -"| c #B8D79A", -"1 c #B4D496", -"2 c #487E17", -"3 c #A0C380", -"4 c #B1D292", -"5 c #8BBC5D", -"6 c #86BA55", -"7 c #87BD54", -"8 c #87BF52", -"9 c #87C04F", -"0 c #85C04C", -"a c #81BE46", -"b c #7CBA3F", -"c c #76B539", -"d c #B4D594", -"e c #AECE8F", -"f c #9CC673", -"g c #7DB448", -"h c #7DB549", -"i c #80B74B", -"j c #83BC4B", -"k c #81BF46", -"l c #79BC37", -"m c #71BA2A", -"n c #69B51E", -"o c #65B31B", -"p c #65B01D", -"q c #B0D58E", -"r c #A1C77E", -"s c #68A92B", -"t c #62A523", -"u c #5FA81A", -"v c #5DAB11", -"w c #5CB00C", -"x c #60B50D", -"y c #62B80E", -"z c #61B80E", -"A c #5FB50D", -"B c #5CAF0C", -"C c #A8D280", -"D c #41790E", -"E c #85B25A", -"F c #8FBF62", -"G c #59A213", -"H c #55A509", -"I c #5AAD0B", -"J c #64BB0F", -"K c #66BF10", -"L c #63BB0F", -"M c #5FB40D", -"N c #A9D480", -"O c #6A9C3B", -"P c #9CC772", -"Q c #70B42D", -"R c #62B90E", -"S c #B0DE83", -"T c #B2E184", -"U c #ADDA82", -"V c #AAD681", -"W c #50851D", -"X c #99C66E", -"Y c #8AC74E", -"Z c #64BB11", -"` c #B1E084", -" . c #3F7B05", -".. c #3F780A", -"+. c #87B955", -"@. c #9FD56C", -"#. c #6AA136", -"$. c #ACDB7E", -"%. c #4E8619", -"&. c #3C7604", -". . + ", -". . @ # . ", -". . $ % & . ", -". . * = - ; . ", -". . @ > , ' ) ! ~ . . . . $ ", -". . { ] ^ / ( _ : < [ } | 1 . ", -". . 2 3 4 5 6 7 8 9 0 a b c d . ", -". . e f g h i j k l m n o p q . ", -". . r ( s t u v w x y z A B C . ", -". . D E F G H I A J K K L M N . ", -". . $ O P Q w R S T T S U V . ", -". . @ W X Y Z ` .. . . . $ ", -". . ..+.@.` . ", -". . + #.$.. ", -". . ~ %.. ", -". . &. "}; diff --git a/include/xpm/go-last.png b/include/xpm/go-last.png deleted file mode 100644 index 6e904ef..0000000 Binary files a/include/xpm/go-last.png and /dev/null differ diff --git a/include/xpm/go-last.xpm b/include/xpm/go-last.xpm deleted file mode 100644 index 2103750..0000000 --- a/include/xpm/go-last.xpm +++ /dev/null @@ -1,119 +0,0 @@ -/* XPM */ -static const char * go_last_xpm[] = { -"16 16 100 2", -" c None", -". c #3B7504", -"+ c #3A7304", -"@ c #568927", -"# c #3A7404", -"$ c #C0DBA7", -"% c #7EA955", -"& c #C3DCAB", -"* c #BCD8A0", -"= c #A4C684", -"- c #447B11", -"; c #3B7604", -"> c #C1DBA9", -", c #8EBE5F", -"' c #AFD28D", -") c #BAD6A0", -"! c #629135", -"~ c #3B7404", -"{ c #B2D393", -"] c #B4D496", -"^ c #B7D69A", -"/ c #BAD79E", -"( c #BDD9A1", -"_ c #C0DCA4", -": c #8AC058", -"< c #8EC25C", -"[ c #9FCB76", -"} c #BFDBA4", -"| c #86AF60", -"1 c #3B7506", -"2 c #B0D190", -"3 c #6CAB30", -"4 c #71AE37", -"5 c #76B23D", -"6 c #7DB845", -"7 c #83BE4B", -"8 c #87C150", -"9 c #8BC353", -"0 c #8CC356", -"a c #91C560", -"b c #B4D694", -"c c #A2C581", -"d c #497E17", -"e c #ACCF8A", -"f c #59A016", -"g c #589F14", -"h c #5EA718", -"i c #6AB226", -"j c #76BB35", -"k c #83C245", -"l c #88C64B", -"m c #88C54D", -"n c #87C34D", -"o c #84BF4C", -"p c #B0D092", -"q c #A3CA7E", -"r c #4E9A06", -"s c #509E07", -"t c #56A609", -"u c #5AAD0B", -"v c #5EB30D", -"w c #61B70E", -"x c #66BB16", -"y c #6CBC1F", -"z c #71BC2A", -"A c #73B930", -"B c #92C560", -"C c #A3C97F", -"D c #52A108", -"E c #58A90A", -"F c #5DB10C", -"G c #62B80E", -"H c #66BE10", -"I c #67C011", -"J c #6ABB1B", -"K c #99CE66", -"L c #89B85B", -"M c #42790E", -"N c #A6CF7F", -"O c #A9D480", -"P c #ACD881", -"Q c #AFDC83", -"R c #6AC412", -"S c #6CC813", -"T c #80CC35", -"U c #A6D777", -"V c #6EA33D", -"W c #3D7904", -"X c #AFDD83", -"Y c #6DC815", -"Z c #97DC55", -"` c #A3D673", -" . c #52891E", -".. c #A5DC6E", -"+. c #8DC459", -"@. c #3F790A", -"#. c #AAD97D", -"$. c #6CA436", -"%. c #3C7604", -"&. c #4D8519", -" . + + ", -" + @ # + + ", -" + $ % # + + ", -" + & * = - + + ", -"# + + + + ; > , ' ) ! ~ + + ", -"+ { ] ^ / ( _ : < [ } | 1 + + ", -"+ 2 3 4 5 6 7 8 9 0 a b c d + + ", -"+ e f g h i j k l m n o [ p + + ", -"+ q r s t u v w x y z A B C + + ", -"+ q r D E F G H I H J K L M + + ", -"+ q q N O P Q R S T U V . + + ", -"# + + + + W X Y Z ` .; + + ", -" + X ..+.@. + + ", -" + #.$.%. + + ", -" + &.%. + + ", -" ; + + "}; diff --git a/include/xpm/go-next-b.png b/include/xpm/go-next-b.png deleted file mode 100644 index 1f48daf..0000000 Binary files a/include/xpm/go-next-b.png and /dev/null differ diff --git a/include/xpm/go-next.png b/include/xpm/go-next.png deleted file mode 100644 index 6ef8de7..0000000 Binary files a/include/xpm/go-next.png and /dev/null differ diff --git a/include/xpm/go-next.xpm b/include/xpm/go-next.xpm deleted file mode 100644 index 49e0f2f..0000000 --- a/include/xpm/go-next.xpm +++ /dev/null @@ -1,119 +0,0 @@ -/* XPM */ -static const char * go_next_xpm[] = { -"16 16 100 2", -" c None", -". c #3B7504", -"+ c #3A7304", -"@ c #598C2A", -"# c #3A7404", -"$ c #CBE1B7", -"% c #82AB5A", -"& c #CEE3BB", -"* c #C3DCAB", -"= c #A4C684", -"- c #437A10", -"; c #3B7604", -"> c #CBE0B6", -", c #99C46F", -"' c #B1D291", -") c #B7D49C", -"! c #5F8F31", -"~ c #3B7404", -"{ c #C0DBA7", -"] c #C2DCAA", -"^ c #C5DDAD", -"/ c #C6DEAF", -"( c #C7DEB0", -"_ c #91C164", -": c #8FC161", -"< c #9DC873", -"[ c #BBD99F", -"} c #81AB5A", -"| c #3A7405", -"1 c #BDD9A3", -"2 c #85B954", -"3 c #88BB58", -"4 c #8BBC5B", -"5 c #8BBD5C", -"6 c #8CBE5C", -"7 c #8DC15C", -"8 c #8DC25A", -"9 c #8AC255", -"0 c #8CC358", -"a c #AFD48C", -"b c #9CC37A", -"c c #467C14", -"d c #B9D79C", -"e c #74AF3B", -"f c #6EAC33", -"g c #68A92B", -"h c #6BAC2F", -"i c #78B63D", -"j c #82BE49", -"k c #89C350", -"l c #88C44D", -"m c #84C249", -"n c #80BE44", -"o c #9BCA6D", -"p c #AACE89", -"q c #5E8F30", -"r c #A3CA7E", -"s c #4E9A06", -"t c #52A007", -"u c #57A709", -"v c #5BAE0B", -"w c #5FB20E", -"x c #66B817", -"y c #6CBA1F", -"z c #6FBA26", -"A c #8DC655", -"B c #9EC976", -"C c #568926", -"D c #4F9C06", -"E c #54A408", -"F c #5AAC0B", -"G c #5EB30D", -"H c #62B90E", -"I c #64BC0F", -"J c #6CBF1C", -"K c #9CD267", -"L c #8BBB5D", -"M c #427A0E", -"N c #A4CC7E", -"O c #A7D17F", -"P c #AAD581", -"Q c #61B70E", -"R c #66BF10", -"S c #7FCB34", -"T c #A8DA78", -"U c #71A63E", -"V c #3C7804", -"W c #ABD681", -"X c #64BA11", -"Y c #92D352", -"Z c #A5D773", -"` c #538B1E", -" . c #3C7604", -".. c #ABD781", -"+. c #A0D56C", -"@. c #8BC158", -"#. c #40790A", -"$. c #A6D37B", -"%. c #6AA136", -"&. c #4D8418", -" . ", -" + @ # ", -" + $ % # ", -" + & * = - ", -"# + + + + ; > , ' ) ! ~ ", -"+ { ] ^ / ( ( _ : < [ } | ", -"+ 1 2 3 4 5 6 7 8 9 0 a b c ", -"+ d e f g h i j k l m n o p q . ", -"+ r s s s t u v w x y z A B C . ", -"+ r s s D E F G H I J K L M ", -"+ r r r N O P Q R S T U ; ", -"# + + + + V W X Y Z ` . ", -" + ..+.@.#. ", -" + $.%. . ", -" + &.; ", -" . "}; diff --git a/include/xpm/go-previous-b.png b/include/xpm/go-previous-b.png deleted file mode 100644 index 7c8443a..0000000 Binary files a/include/xpm/go-previous-b.png and /dev/null differ diff --git a/include/xpm/go-previous.png b/include/xpm/go-previous.png deleted file mode 100644 index 659cd90..0000000 Binary files a/include/xpm/go-previous.png and /dev/null differ diff --git a/include/xpm/go-previous.xpm b/include/xpm/go-previous.xpm deleted file mode 100644 index 65984e8..0000000 --- a/include/xpm/go-previous.xpm +++ /dev/null @@ -1,117 +0,0 @@ -/* XPM */ -static const char * go_previous_xpm[] = { -"16 16 98 2", -" c None", -". c #3B7504", -"+ c #3B7404", -"@ c #598B29", -"# c #3A7304", -"$ c #3A7404", -"% c #7FA956", -"& c #C8DFB1", -"* c #437A10", -"= c #A0C37E", -"- c #BDD9A3", -"; c #CAE0B5", -"> c #5D8D2E", -", c #B3D296", -"' c #AACF88", -") c #91C064", -"! c #C7DFB1", -"~ c #3B7604", -"{ c #3A7405", -"] c #7DA855", -"^ c #B5D497", -"/ c #94C26A", -"( c #87BA57", -"_ c #8BBD5C", -": c #C4DDAC", -"< c #C5DEAE", -"[ c #C6DEAE", -"} c #C2DCAA", -"| c #457C13", -"1 c #97BD72", -"2 c #A7CD84", -"3 c #80B64D", -"4 c #7DB549", -"5 c #82B74F", -"6 c #85B954", -"7 c #88BB58", -"8 c #89BC59", -"9 c #8ABC5A", -"0 c #BFDAA6", -"a c #5A8C2C", -"b c #A5C982", -"c c #90BF63", -"d c #70AD35", -"e c #75B23C", -"f c #7BB642", -"g c #7FB947", -"h c #7AB742", -"i c #71B035", -"j c #65A827", -"k c #5EA31D", -"l c #60A420", -"m c #68A92B", -"n c #B8D69B", -"o c #578927", -"p c #9DC477", -"q c #87BB54", -"r c #66AC22", -"s c #66AF20", -"t c #62AF17", -"u c #5CAD0E", -"v c #59AC0B", -"w c #58A90A", -"x c #55A409", -"y c #519E07", -"z c #4E9A06", -"A c #A3CA7E", -"B c #41790E", -"C c #87B65B", -"D c #96CA65", -"E c #65B519", -"F c #60B50D", -"G c #61B70E", -"H c #61B60E", -"I c #5EB30D", -"J c #5AAD0B", -"K c #56A609", -"L c #6EA23D", -"M c #A5D576", -"N c #7CC833", -"O c #69C211", -"P c #67C111", -"Q c #AEDB82", -"R c #ACD881", -"S c #A9D480", -"T c #A6CF7F", -"U c #52891E", -"V c #A3D572", -"W c #97DA54", -"X c #6EC915", -"Y c #B0DE83", -"Z c #3D7904", -"` c #3F790A", -" . c #8DC459", -".. c #A5DC6E", -"+. c #3C7604", -"@. c #6BA236", -"#. c #A9D77D", -"$. c #4D8419", -" . ", -" + @ # ", -" $ % & # ", -" * = - ; # ", -" + > , ' ) ! ~ # # # # $ ", -" { ] ^ / ( _ : < [ < : } # ", -" | 1 2 3 4 5 6 7 8 9 8 7 0 # ", -". a b c d e f g h i j k l m n # ", -". o p q r s t u v w x y z z A # ", -" B C D E F G H I J K y z A # ", -" . L M N O P Q R S T A A # ", -" ~ U V W X Y Z # # # # $ ", -" ` ...Y # ", -" +.@.#.# ", -" ~ $.# ", -" . "}; diff --git a/include/xpm/go-up.png b/include/xpm/go-up.png deleted file mode 100644 index fa9a7d7..0000000 Binary files a/include/xpm/go-up.png and /dev/null differ diff --git a/include/xpm/go-up.xpm b/include/xpm/go-up.xpm deleted file mode 100644 index d3ae19f..0000000 --- a/include/xpm/go-up.xpm +++ /dev/null @@ -1,124 +0,0 @@ -/* XPM */ -static const char * go_up_xpm[] = { -"16 16 105 2", -" c None", -". c #3B7504", -"+ c #578928", -"@ c #568926", -"# c #41790F", -"$ c #A7CA87", -"% c #A2C77E", -"& c #41790E", -"* c #3A7404", -"= c #96BD72", -"- c #9AC572", -"; c #95C26A", -"> c #86B35B", -", c #3B7404", -"' c #78A54E", -") c #B0D291", -"! c #7DB448", -"~ c #76B13F", -"{ c #6A9C3B", -"] c #578A28", -"^ c #BBD7A0", -"/ c #8CBD5F", -"( c #80B64D", -"_ c #7AB344", -": c #5CA21A", -"< c #9AC471", -"[ c #4F841D", -"} c #40780D", -"| c #B7D49C", -"1 c #A0C97A", -"2 c #8BBE5A", -"3 c #86BC51", -"4 c #74B438", -"5 c #53A308", -"6 c #6CAF2C", -"7 c #97C36E", -"8 c #3E770A", -"9 c #A1C480", -"0 c #B5D597", -"a c #96C569", -"b c #91C560", -"c c #8BC356", -"d c #66B01D", -"e c #59AC0B", -"f c #59AB0B", -"g c #85C14D", -"h c #84B455", -"i c #7FA956", -"j c #C7DFB0", -"k c #A0CB77", -"l c #9ACA6C", -"m c #96CA63", -"n c #81C143", -"o c #5EB30D", -"p c #5FB50D", -"q c #5FB40D", -"r c #5FB20F", -"s c #9BCE6A", -"t c #679C35", -"u c #588B28", -"v c #CAE0B5", -"w c #D0E5BC", -"x c #CEE5B8", -"y c #CBE5B3", -"z c #97CD63", -"A c #68BA19", -"B c #64BC0F", -"C c #65BE10", -"D c #AFDC83", -"E c #AEDB82", -"F c #ACD982", -"G c #A6D37B", -"H c #4C8418", -"I c #3A7304", -"J c #3C7804", -"K c #CBE6B2", -"L c #89C94B", -"M c #65BD10", -"N c #69C311", -"O c #6BC712", -"P c #B2E184", -"Q c #3E7A05", -"R c #CAE5B0", -"S c #78C331", -"T c #67C011", -"U c #6CC813", -"V c #71CF15", -"W c #B4E585", -"X c #C8E4AD", -"Y c #6DBD1F", -"Z c #66BF10", -"` c #6AC512", -" . c #6DC913", -".. c #B3E384", -"+. c #C5E2A9", -"@. c #65B616", -"#. c #63BA0F", -"$. c #66BE10", -"%. c #67C111", -"&. c #B0DE83", -"*. c #C1DFA5", -"=. c #AAD581", -"-. c #ABD781", -";. c #ADDA82", -">. c #ADD982", -" . . ", -" + @ ", -" # $ % & ", -" * = - ; > * ", -" , ' ) ! ~ ; { * ", -" ] ^ / ( _ : < [ ", -" } | 1 2 3 4 5 6 7 8 ", -" * 9 0 a b c d e f g h . ", -" , i j k l m n o p q r s t . ", -" u v w x y z A B C D E F G H ", -". I I I J K L M N O P Q I I I . ", -" I R S T U V W I ", -" I X Y Z ` ...I ", -" I +.@.#.$.%.&.I ", -" I *.=.-.F ;.>.I ", -" * I I I I I I , "}; diff --git a/include/xpm/help-contents.png b/include/xpm/help-contents.png deleted file mode 100644 index b3ae2c3..0000000 Binary files a/include/xpm/help-contents.png and /dev/null differ diff --git a/include/xpm/help-contents.xpm b/include/xpm/help-contents.xpm deleted file mode 100644 index a307af2..0000000 --- a/include/xpm/help-contents.xpm +++ /dev/null @@ -1,123 +0,0 @@ -/* XPM */ -static const char * help_contents_xpm[] = { -"16 16 104 2", -" c None", -". c #8D8F8A", -"+ c #898B86", -"@ c #888A85", -"# c #8F918C", -"$ c #FFFFFF", -"% c #8A8C87", -"& c #DEE1DB", -"* c #C0C3BC", -"= c #BABDB6", -"- c #C2C4BE", -"; c #EAECE8", -"> c #DFE2DC", -", c #E3E5E0", -"' c #E6E9E4", -") c #EDEEEB", -"! c #EFF0ED", -"~ c #F0F1EF", -"{ c #F0F1EE", -"] c #EEF0ED", -"^ c #ECEDEA", -"/ c #E0E3DD", -"( c #E4E6E1", -"_ c #C5ABA8", -": c #A37A77", -"< c #A47E7B", -"[ c #CAB1AE", -"} c #EDEFEC", -"| c #E1E3DE", -"1 c #B17977", -"2 c #A32827", -"3 c #D69392", -"4 c #EEEEEC", -"5 c #EEEEED", -"6 c #D79C9B", -"7 c #A52927", -"8 c #B57D7B", -"9 c #C6ABA8", -"0 c #F08686", -"a c #EB5757", -"b c #BAA6A2", -"c c #EB5C5C", -"d c #F09F9F", -"e c #A62A29", -"f c #D0B4B2", -"g c #A2837F", -"h c #D78F8E", -"i c #EC5757", -"j c #AB1010", -"k c #B99390", -"l c #ED5F5F", -"m c #DBA4A2", -"n c #A6827E", -"o c #F0F0EE", -"p c #BAA9A6", -"q c #B68885", -"r c #F4F5F3", -"s c #F8F8F7", -"t c #BD9896", -"u c #BBA6A3", -"v c #F2F2F1", -"w c #BAA8A5", -"x c #B79693", -"y c #F8F9F8", -"z c #BA8D8B", -"A c #BCAEAB", -"B c #F5F5F4", -"C c #A47F7B", -"D c #E09392", -"E c #EC8C8C", -"F c #A21B1B", -"G c #B89490", -"H c #BA9694", -"I c #A11C1B", -"J c #EDA7A7", -"K c #E39E9D", -"L c #A68481", -"M c #C6ACA8", -"N c #B21C1C", -"O c #F69090", -"P c #EE9897", -"Q c #BFAEAB", -"R c #C0AFAC", -"S c #EFB2B1", -"T c #F9B1B1", -"U c #B32020", -"V c #D0B5B3", -"W c #E2E5E0", -"X c #B27774", -"Y c #B32221", -"Z c #E6AAA9", -"` c #F8F8F8", -" . c #FAFAF9", -".. c #EAB8B7", -"+. c #B52626", -"@. c #B77B79", -"#. c #F2F3F0", -"$. c #E2E4DF", -"%. c #E6E8E4", -"&. c #C5ADA9", -"*. c #A47C79", -"=. c #A57B78", -"-. c #CDB3B1", -";. c #F1F2F0", -" . + @ @ @ @ @ @ @ @ @ @ + # ", -" + $ $ $ $ $ $ $ $ $ $ $ $ % ", -" @ $ & * = = = = = = - ; $ @ ", -" @ $ > , ' ; ) ! ~ { ] ^ $ @ ", -" @ $ / ( _ : . . < [ ~ } $ @ ", -" @ $ | 1 2 3 4 5 6 7 8 ! $ @ ", -" @ $ 9 2 0 a b b c d e f $ @ ", -" @ $ g h i j k k j l m n $ @ ", -" @ $ . o p q r s t u v . $ @ ", -" @ $ . v w x r y z A B . $ @ ", -" @ $ C D E F G H I J K L $ @ ", -" @ $ M N O P Q R S T U V $ @ ", -" @ $ W X Y Z ` ...+.@.#.$ @ ", -" @ $ $.%.&.*.. . =.-.r ;.$ @ ", -" + $ $ $ $ $ $ $ $ $ $ $ $ % ", -" . + @ @ @ @ @ @ @ @ @ @ + # "}; diff --git a/include/xpm/help-faq.png b/include/xpm/help-faq.png deleted file mode 100644 index f6bc721..0000000 Binary files a/include/xpm/help-faq.png and /dev/null differ diff --git a/include/xpm/help-faq.xpm b/include/xpm/help-faq.xpm deleted file mode 100644 index 1b8b9fe..0000000 --- a/include/xpm/help-faq.xpm +++ /dev/null @@ -1,92 +0,0 @@ -/* XPM */ -static const char * help_faq_xpm[] = { -"16 16 73 1", -" c None", -". c #B6B8B4", -"+ c #93938F", -"@ c #888A85", -"# c #8D908A", -"$ c #BDBEBB", -"% c #FCFCFC", -"& c #FFFFFF", -"* c #BBBCBB", -"= c #8D8F89", -"- c #91928E", -"; c #93968F", -"> c #B4B5B1", -", c #EEEEEB", -"' c #A0BDDA", -") c #A3BFDB", -"! c #91B3D5", -"~ c #DBE2EB", -"{ c #FCFCFB", -"] c #BCBDBA", -"^ c #B8B9B7", -"/ c #F1F1F1", -"( c #F2F2F1", -"_ c #ADC6DE", -": c #BFD1E2", -"< c #FEFEFE", -"[ c #8F918C", -"} c #8D8E8A", -"| c #F2F2F0", -"1 c #EFEFED", -"2 c #A1BDDA", -"3 c #91B3D6", -"4 c #E1E7EC", -"5 c #92948F", -"6 c #F5F5F4", -"7 c #BDD0E5", -"8 c #ACC6DF", -"9 c #F4F5F4", -"0 c #8F908C", -"a c #F1F1F0", -"b c #AEC6DE", -"c c #BFD1E3", -"d c #F8F8F6", -"e c #8AAFD5", -"f c #FBFBFB", -"g c #F8F8F7", -"h c #8AAFD6", -"i c #7AA5D3", -"j c #8A8C88", -"k c #FBFBFA", -"l c #90938E", -"m c #8E8F8B", -"n c #FDFDFD", -"o c #7AA5D2", -"p c #8B8D88", -"q c #949591", -"r c #F6F6F5", -"s c #969994", -"t c #C0C1BE", -"u c #FEFEFD", -"v c #90928E", -"w c #90938C", -"x c #EEEEEC", -"y c #8D8F8A", -"z c #939590", -"A c #979994", -"B c #90908C", -"C c #DFDFDE", -"D c #90928D", -"E c #EDEDEC", -"F c #8F908B", -"G c #DFE0DE", -"H c #8E908B", -" ", -" .+@@@@# ", -" .$%&&&&%* ", -" =-@@@@;>,')!~{#", -" ]%&&&&%]^/(_:<[", -"}%|12)34{56789<[", -"0<||a|bc<0dedd&[", -"[<666789<[ffff&[", -"[&ggghgg&[ c #F9F9F8", -", c #4D4E4B", -"' c #5B5E5A", -") c #6E6F6C", -"! c #EEEFEE", -"~ c #FCFDFC", -"{ c #FBFBFB", -"] c #595A57", -"^ c #595A56", -"/ c #646662", -"( c #EBEBEA", -"_ c #575855", -": c #6A6B67", -"< c #767874", -"[ c #EBECEA", -"} c #FAFAFA", -"| c #F2F4F1", -"1 c #F1F1F0", -"2 c #666763", -"3 c #E6E7E6", -"4 c #FAFAF9", -"5 c #626460", -"6 c #73756F", -"7 c #80817C", -"8 c #D4D6D3", -"9 c #F1F2F0", -"0 c #E7E9E4", -"a c #DFE2DD", -"b c #FCFCFB", -"c c #737470", -"d c #CFD1CE", -"e c #F2F3F0", -"f c #E8EAE6", -"g c #E0E2DD", -"h c #6D6E6A", -"i c #82837F", -"j c #ABAEA8", -"k c #F0F1EF", -"l c #F9FAF9", -"m c #FEFEFE", -"n c #797B75", -"o c #7F817C", -"p c #969791", -"q c #EEEFED", -"r c #767973", -"s c #838581", -"t c #91928C", -"u c #C9CBC6", -"v c #838580", -"w c #8D9089", -"x c #AFB0AC", -"y c #81837D", -"z c #90938C", -"A c #9C9E97", -"B c #9A9D97", -"C c #ADAFAA", -"D c #82837E", -" ", -" ", -" ", -" . . ", -" +@@ #@$ ", -" %&*= -;>, ", -" ')!~{]^/(~{_ ", -" :<[}|1{234|1{5 ", -" 67890abcdefgbh ", -" ijklmnopq4mr ", -" stulv wxly ", -" zAB CAo ", -" D D ", -" ", -" ", -" "}; diff --git a/include/xpm/media-seek-forward.png b/include/xpm/media-seek-forward.png deleted file mode 100644 index 4d7e2cd..0000000 Binary files a/include/xpm/media-seek-forward.png and /dev/null differ diff --git a/include/xpm/media-seek-forward.xpm b/include/xpm/media-seek-forward.xpm deleted file mode 100644 index e386c53..0000000 --- a/include/xpm/media-seek-forward.xpm +++ /dev/null @@ -1,88 +0,0 @@ -/* XPM */ -static const char * media_seek_forward_xpm[] = { -"16 16 69 1", -" c None", -". c #414140", -"+ c #4A4B48", -"@ c #494A47", -"# c #3D3D3B", -"$ c #3D3F3B", -"% c #4D4E4B", -"& c #F9F9F8", -"* c #696C68", -"= c #4C4C4A", -"- c #4E504C", -"; c #FCFCFC", -"> c #747571", -", c #4E4F4C", -"' c #575855", -") c #FBFBFB", -"! c #FCFDFC", -"~ c #EBEBEA", -"{ c #646662", -"] c #595A56", -"^ c #595A57", -"/ c #EEEFEE", -"( c #6E6F6C", -"_ c #5B5E5A", -": c #626460", -"< c #F1F1F0", -"[ c #F2F4F1", -"} c #FAFAF9", -"| c #E6E7E6", -"1 c #666763", -"2 c #FAFAFA", -"3 c #EBECEA", -"4 c #767874", -"5 c #6A6B67", -"6 c #6D6E6A", -"7 c #FCFCFB", -"8 c #E0E2DD", -"9 c #E8EAE6", -"0 c #F2F3F0", -"a c #CFD1CE", -"b c #737470", -"c c #DFE2DD", -"d c #E7E9E4", -"e c #F1F2F0", -"f c #D4D6D3", -"g c #80817C", -"h c #73756F", -"i c #767973", -"j c #FEFEFE", -"k c #EEEFED", -"l c #969791", -"m c #7F817C", -"n c #797B75", -"o c #F9FAF9", -"p c #F0F1EF", -"q c #ABAEA8", -"r c #82837F", -"s c #81837D", -"t c #AFB0AC", -"u c #8D9089", -"v c #838580", -"w c #C9CBC6", -"x c #91928C", -"y c #838581", -"z c #9C9E97", -"A c #ADAFAA", -"B c #9A9D97", -"C c #90938C", -"D c #82837E", -" ", -" ", -" ", -" . . ", -" +@# @@$ ", -" %&*= -;>, ", -" ')!~{]^)!/(_ ", -" :)<[}|1)<[2345 ", -" 67890ab7cdefgh ", -" ij}klmnjopqr ", -" sotu vowxy ", -" mzA BzC ", -" D D ", -" ", -" ", -" "}; diff --git a/include/xpm/object-rotate-right-on.xpm b/include/xpm/object-rotate-right-on.xpm deleted file mode 100644 index 978ad9e..0000000 --- a/include/xpm/object-rotate-right-on.xpm +++ /dev/null @@ -1,67 +0,0 @@ -/* XPM */ -static char * object_rotate_right_on_xpm[] = { -"16 16 48 1", -" c None", -". c #7439AE", -"+ c #6D36A3", -"@ c #6C36A2", -"# c #6F37A6", -"$ c #7339AC", -"% c #6E37A5", -"& c #F7F3FB", -"* c #F9F5FC", -"= c #F8F4FB", -"- c #EFE7F7", -"; c #D4BEE9", -"> c #8E55C6", -", c #7238AB", -"' c #DECDEE", -") c #DFCFEF", -"! c #E1D2F0", -"~ c #EADFF4", -"{ c #F5F0FA", -"] c #D3BCE9", -"^ c #DAC7EC", -"/ c #DCCAED", -"( c #E2D3F0", -"_ c #EEE5F6", -": c #D8C4EB", -"< c #ECE2F5", -"[ c #D5C0EA", -"} c #773BB2", -"| c #B28BD8", -"1 c #F3ECF9", -"2 c #F1EAF8", -"3 c #945EC9", -"4 c #7138A9", -"5 c #BE9DDE", -"6 c #D1BAE8", -"7 c #7E3FBD", -"8 c #CEB5E6", -"9 c #CDB4E6", -"0 c #CBB1E4", -"a c #C9AEE3", -"b c #C8ACE3", -"c c #FBF8FD", -"d c #C5A8E2", -"e c #C3A4E1", -"f c #C2A3E0", -"g c #E0D0EF", -"h c #C0A0DF", -"i c #F2EBF8", -" .+@@#$$ ", -" %&**=-;>, ", -" @='')!~{]. ", -" @=^^^^^/-($ ", -" %{&&{_'::<[. ", -" ,+@@}|1^;[23 ", -" 45~66![. ", -" 7188;<, ", -" @19081# ", -" @@,1aba1$@@", -" @c1)ddd'1c@", -" @c!efe(c@ ", -" @cghgc@ ", -" @cic@ ", -" @*@ ", -" @ "}; diff --git a/include/xpm/object-rotate-right.png b/include/xpm/object-rotate-right.png deleted file mode 100644 index 49e5727..0000000 Binary files a/include/xpm/object-rotate-right.png and /dev/null differ diff --git a/include/xpm/object-rotate-right.xpm b/include/xpm/object-rotate-right.xpm deleted file mode 100644 index c9b4357..0000000 --- a/include/xpm/object-rotate-right.xpm +++ /dev/null @@ -1,103 +0,0 @@ -/* XPM */ -static const char * object_rotate_right_xpm[] = { -"16 16 84 1", -" c None", -". c #D2650C", -"+ c #CE5D02", -"@ c #CE5C00", -"# c #CF5F03", -"$ c #D1640B", -"% c #D1640C", -"& c #CF5D03", -"* c #FEF7EF", -"= c #FFF9F1", -"- c #FEF8F0", -"; c #FCEFDF", -"> c #F4D1AE", -", c #DB8138", -"' c #D1630A", -") c #FFF8EF", -"! c #FDDCAA", -"~ c #FDDDAB", -"{ c #FDE0B4", -"] c #FEE9CA", -"^ c #FEF6E8", -"/ c #F3CFAA", -"( c #D1650C", -"_ c #FFF8ED", -": c #FDD8A2", -"< c #FDDAA7", -"[ c #FEEED6", -"} c #F9E1C5", -"| c #D2640B", -"1 c #CF5D02", -"2 c #FEF6EA", -"3 c #FFF7EC", -"4 c #FFF5E7", -"5 c #FEEDD4", -"6 c #FDD599", -"7 c #FEEBCE", -"8 c #F6D1A8", -"9 c #D2660D", -"0 c #D2630A", -"a c #D1680F", -"b c #E8AA72", -"c c #FEF2E0", -"d c #FDD191", -"e c #FDD294", -"f c #FEF1DC", -"g c #DD8A40", -"h c #D06107", -"i c #EDB883", -"j c #FEE9CB", -"k c #FDCE89", -"l c #FEDFB3", -"m c #F6D1A9", -"n c #D2650B", -"o c #D5701B", -"p c #FFF3E3", -"q c #FDCA81", -"r c #FDEBD5", -"s c #D16206", -"t c #CE5C01", -"u c #FEF3E2", -"v c #FCC97D", -"w c #FCC778", -"x c #FCCA7F", -"y c #FEF3E3", -"z c #CF5E01", -"A c #D0620A", -"B c #FCC574", -"C c #FCC370", -"D c #FCC473", -"E c #FEF3E4", -"F c #D0640C", -"G c #FEFCF8", -"H c #FDDDAD", -"I c #FCC068", -"J c #FFFCF9", -"K c #FEDFB2", -"L c #FCBE61", -"M c #FCBD5F", -"N c #FEE0B3", -"O c #FEDDAD", -"P c #FCBA5A", -"Q c #FEDEAF", -"R c #FEF1DE", -"S c #FEFAF6", -" .+@@#$% ", -" &*==-;>,' ", -" @)!!~{]^/( ", -" @_:::::<[}| ", -" 123345!66789 ", -" 0+@@abc:defg ", -" hijkklmn ", -" opqqdrs ", -" tuvwxyz ", -" @@AcBCDEF@@", -" @GyHIII!yG@", -" @JKLMLNJ@ ", -" @JOPQJ@ ", -" @JRJ@ ", -" @S@ ", -" @ "}; diff --git a/include/xpm/other.xpm b/include/xpm/other.xpm new file mode 100644 index 0000000..e2d7562 --- /dev/null +++ b/include/xpm/other.xpm @@ -0,0 +1,117 @@ +/* XPM */ +static const char * other_xpm[] = { +"16 16 98 2", +" c None", +". c #FFFFFF", +"+ c #00CAFF", +"@ c #00ADFF", +"# c #0000EB", +"$ c #00007F", +"% c #0000B4", +"& c #0000B9", +"* c #00D1FF", +"= c #73FF8B", +"- c #68FF96", +"; c #00BFFF", +"> c #0000C3", +", c #0000C7", +"' c #01DDFD", +") c #0041FF", +"! c #0DFBF1", +"~ c #3EFFC0", +"{ c #00EEFF", +"] c #0024FF", +"^ c #000082", +"/ c #000083", +"( c #2EFFD0", +"_ c #00E9FF", +": c #0001EA", +"< c #0074FF", +"[ c #009CFF", +"} c #0058FF", +"| c #0000D5", +"1 c #009FFF", +"2 c #63FF9B", +"3 c #0000C1", +"4 c #00009D", +"5 c #0000F7", +"6 c #0042FF", +"7 c #0030FF", +"8 c #0000DC", +"9 c #000080", +"0 c #0017FE", +"a c #00E0FF", +"b c #0000F6", +"c c #0075FF", +"d c #0094FF", +"e c #0044FF", +"f c #0000BE", +"g c #000086", +"h c #000BFE", +"i c #004FFF", +"j c #0000AC", +"k c #006EFF", +"l c #10FEEE", +"m c #35FFC9", +"n c #0000C9", +"o c #0083FF", +"p c #0031FF", +"q c #000090", +"r c #0007F9", +"s c #0BF9F3", +"t c #7EFF80", +"u c #58FFA6", +"v c #007DFF", +"w c #000085", +"x c #1FFFDF", +"y c #000081", +"z c #0039FF", +"A c #00DBFF", +"B c #01BDFD", +"C c #0AFEF4", +"D c #0000AA", +"E c #00009A", +"F c #001BFC", +"G c #00C9FE", +"H c #4BFFB3", +"I c #0006F7", +"J c #008FFF", +"K c #6FFF8F", +"L c #F5FF09", +"M c #FFDB00", +"N c #F1FB0D", +"O c #0021FF", +"P c #0000EA", +"Q c #13FCEB", +"R c #F0FF0E", +"S c #FF8700", +"T c #FF5B00", +"U c #EDFC11", +"V c #12FDEC", +"W c #0003E9", +"X c #00B7FF", +"Y c #98FF66", +"Z c #FFDF00", +"` c #FFB300", +" . c #00B8FF", +".. c #0067FF", +"+. c #04E9FA", +"@. c #1DFCE1", +"#. c #00EDFF", +"$. c #000088", +" + @ # $ $ % ", +" & * = - ; > $ $ , ' ", +" $ $ ) ! ~ { ] ^ $ $ / ( _ ", +" $ $ : < [ } | $ $ $ $ 1 2 3 ", +" $ $ 4 5 6 7 8 9 $ $ $ 0 a 7 $ ", +" $ $ / b c d e f $ $ g h i 8 $ ", +" $ $ j k l m * # $ $ n o p q $ ", +" $ $ r s t u v w $ $ j x 1 y $ ", +" $ $ z A B $ $ $ $ $ $ C ~ D $ ", +" $ $ $ $ E F [ G [ 0 E $ H I $ ", +" $ $ $ D J K L M N K J D $ O $ ", +" $ $ P Q R S T S U V W $ $ $ ", +" $ f X Y Z ` Z Y .f $ $ $ ", +" $ > ..+.@.#...> $ $ ", +" $ $ y $.^ $ ", +" $ $ $ "}; diff --git a/include/xpm/plot.xpm b/include/xpm/plot.xpm index e6e79c1..acc1eea 100644 --- a/include/xpm/plot.xpm +++ b/include/xpm/plot.xpm @@ -7,17 +7,17 @@ static const char * plot_xpm[] = { "@ c #FF0000", " ", " . ", -" .. + ", +".. + ", " . ++ ", " . + ", -" .. + ", +".. + ", " . + ", " . + ", -" .. @@@+ ", +".. @@@+ ", " . @ +@ @ ", " .@@ + @ @ ", -" .. + @@@ ", +".. + @@@ ", " . ++ ", -" .++ . . . ", -" .............. ", -" "}; +" .++ ", +"............... ", +" . . . . "}; diff --git a/include/xpm/polygon.xpm b/include/xpm/polygon.xpm new file mode 100644 index 0000000..ecbdb8f --- /dev/null +++ b/include/xpm/polygon.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char *polygon_xpm[]={ +"16 16 2 1", +" c None", +". c #000000", +" ", +" .. ", +" . . ", +" .. .. ", +" . . ", +" .. .. ", +". .", +". .", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" . . ", +" .......... "}; diff --git a/include/xpm/preferences-system.png b/include/xpm/preferences-system.png deleted file mode 100644 index 9460dfc..0000000 Binary files a/include/xpm/preferences-system.png and /dev/null differ diff --git a/include/xpm/preferences-system.xpm b/include/xpm/preferences-system.xpm deleted file mode 100644 index 1dc058b..0000000 --- a/include/xpm/preferences-system.xpm +++ /dev/null @@ -1,63 +0,0 @@ -/* XPM */ -static const char * preferences_system_xpm[] = { -"16 16 44 1", -" c None", -". c #888A85", -"+ c #ECEBE9", -"@ c #EFEFEE", -"# c #F0F0EE", -"$ c #F0F0F0", -"% c #FAFAFA", -"& c #8A8C87", -"* c #F6F6F5", -"= c #ABACA9", -"- c #F7F7F7", -"; c #E5E3E2", -"> c #ADADAA", -", c #EEEEEC", -"' c #F3F3F3", -") c #F0F0EF", -"! c #EEEEED", -"~ c #ECECEA", -"{ c #BAB9B6", -"] c #D2D1D0", -"^ c #A4A4A3", -"/ c #B8B7B5", -"( c #B9B8B7", -"_ c #204A87", -": c #7D8385", -"< c #CAC9C8", -"[ c #BFBEBD", -"} c #ADBBCC", -"| c #7C93B3", -"1 c #D4D3D3", -"2 c #BDC8D4", -"3 c #788DA4", -"4 c #92A5BE", -"5 c #E4E3E2", -"6 c #C6C4C2", -"7 c #748AA2", -"8 c #7A95B4", -"9 c #D4D3D2", -"0 c #C4C3C2", -"a c #7D91A7", -"b c #7A95B5", -"c c #728BAE", -"d c #A0A19E", -"e c #869CB8", -" ", -" . . ", -" .+. .@. ", -" .#. .$. ", -" . .%. .& ", -".*=.-;>, . ", -" .')!~{. . ", -" ....]^.. ", -" /.(. ", -" ___:><[. ", -" _}}|_..1[. ", -" _2334_ .56.. ", -"_}378|_ .90. ", -"_}abc_ .d. ", -"_4ee_ ... ", -" ___ "}; diff --git a/include/xpm/process-stop.png b/include/xpm/process-stop.png deleted file mode 100644 index ab6808f..0000000 Binary files a/include/xpm/process-stop.png and /dev/null differ diff --git a/include/xpm/process-stop.xpm b/include/xpm/process-stop.xpm deleted file mode 100644 index a5a48e9..0000000 --- a/include/xpm/process-stop.xpm +++ /dev/null @@ -1,152 +0,0 @@ -/* XPM */ -static const char * process_stop_xpm[] = { -"16 16 133 2", -" c None", -". c #890000", -"+ c #860000", -"@ c #AF2222", -"# c #F68888", -"$ c #F78B8B", -"% c #F68A8A", -"& c #F68787", -"* c #F58383", -"= c #B82323", -"- c #B12222", -"; c #F38383", -"> c #DC4242", -", c #D52F2F", -"' c #DB3C3C", -") c #F17575", -"! c #B41F1F", -"~ c #B22424", -"{ c #D53737", -"] c #DA3B3B", -"^ c #F06F6F", -"/ c #B11B1B", -"( c #B32626", -"_ c #DB4141", -": c #D75757", -"< c #DACDCD", -"[ c #D75F5F", -"} c #D85C5C", -"| c #E6D9D9", -"1 c #DB5F5F", -"2 c #D93B3B", -"3 c #EF6A6A", -"4 c #B01818", -"5 c #880202", -"6 c #F68989", -"7 c #DB4040", -"8 c #D89292", -"9 c #DBDBDB", -"0 c #DAD6D6", -"a c #D76060", -"b c #D85A5A", -"c c #E6E0E0", -"d c #EDEDED", -"e c #E5A5A5", -"f c #D22F2F", -"g c #D63B3B", -"h c #EE6868", -"i c #890303", -"j c #D53030", -"k c #D89999", -"l c #DFDFDF", -"m c #E2DEDE", -"n c #E6DFDF", -"o c #ECECEC", -"p c #E6ABAB", -"q c #D23131", -"r c #D02F2F", -"s c #CE2F2F", -"t c #ED6565", -"u c #890202", -"v c #DEACAC", -"w c #E8E8E8", -"x c #E8BCBC", -"y c #D13131", -"z c #CF2F2F", -"A c #CC2F2F", -"B c #EC6161", -"C c #D85B5B", -"D c #F1F1F1", -"E c #F3EDED", -"F c #DA6464", -"G c #C92929", -"H c #E94545", -"I c #F58585", -"J c #D75B5B", -"K c #E5DFDF", -"L c #E4AAAA", -"M c #E6A5A5", -"N c #F9F9F9", -"O c #FCF7F7", -"P c #DA6767", -"Q c #C51A1A", -"R c #BD0202", -"S c #E83737", -"T c #F26969", -"U c #D52323", -"V c #D21F1F", -"W c #DE9292", -"X c #CE2828", -"Y c #E9A5A5", -"Z c #FEFEFE", -"` c #E39696", -" . c #BD0000", -".. c #BD0303", -"+. c #E63434", -"@. c #B82424", -"#. c #EF5A5A", -"$. c #D31111", -"%. c #CB0101", -"&. c #D65858", -"*. c #C70303", -"=. c #C50000", -"-. c #C30000", -";. c #C10101", -">. c #D65F5F", -",. c #BE0404", -"'. c #DF2B2B", -"). c #C71D1D", -"!. c #870000", -"~. c #B72121", -"{. c #ED5252", -"]. c #D01010", -"^. c #C70000", -"/. c #C10000", -"(. c #BF0000", -"_. c #BE0505", -":. c #DF2C2C", -"<. c #C41B1B", -"[. c #880000", -"}. c #B41D1D", -"|. c #EB4C4C", -"1. c #CC0F0F", -"2. c #BF0505", -"3. c #DF2D2D", -"4. c #BF1919", -"5. c #B11A1A", -"6. c #EC4A4A", -"7. c #ED4747", -"8. c #EB4343", -"9. c #EA3F3F", -"0. c #E83B3B", -"a. c #E73737", -"b. c #BC1818", -" . + + + + + + . ", -" . @ # $ $ % & * = . ", -" . - ; > , , , , ' ) ! . ", -" . ~ ; > { , , , , { ] ^ / . ", -". ( ; _ : < [ , , } | 1 2 3 4 . ", -"5 6 7 , 8 9 0 a b c d e f g h 5 ", -"i # , , j k l m n o p q r s t u ", -"i # , , , j v w o x y z s A B u ", -"i # , , , C n o D E F s A G H u ", -"i I , , J K o L M N O P Q R S u ", -"5 T U V W o L r X Y Z ` ...+.u ", -". @.#.$.%.&.*.=.-.;.>.R ,.'.).!.", -" . ~.{.].^.=.-./.(. ._.:.<.[. ", -" . }.|.1.-./.(. .2.3.4.[. ", -" . 5.6.7.8.9.0.a.b.[. ", -" . + + + + + + [. "}; diff --git a/include/xpm/rotate_on.xpm b/include/xpm/rotate_on.xpm deleted file mode 100644 index 45cfe6d..0000000 --- a/include/xpm/rotate_on.xpm +++ /dev/null @@ -1,22 +0,0 @@ -/* XPM */ -static const char *rotate_on_xpm[]={ -"16 16 3 1", -". c None", -"# c #800000", -"a c #ff0000", -"......#########.", -"......#aaaaaa#..", -".......#aaaa##..", -"..###..#aaaaa#..", -".#aa#..#aaa#aa#.", -".#aa#...#a##aa#.", -"#aa#....#a#.#aa#", -"#aa#.....#..#aa#", -"#aa#........#aa#", -"#aa#........#aa#", -".#a#........#a#.", -".#aa#......#aa#.", -"..#aa##..##aa#..", -"...#aaa##aaa#...", -"....##aaaa##....", -"......####......"}; diff --git a/include/xpm/show_on.xpm b/include/xpm/show_on.xpm deleted file mode 100644 index bce9067..0000000 --- a/include/xpm/show_on.xpm +++ /dev/null @@ -1,22 +0,0 @@ -/* XPM */ -static const char * show_on_xpm[] = { -"16 16 3 1", -" c None", -". c #000000", -"+ c #FF3F00", -" ", -" ", -" ............ ", -" . .++++++. . ", -" ...++++++... ", -" . .++++++. . ", -" . .++++++. . ", -" ...++++++... ", -" . .++++++. . ", -" . .++++++. . ", -" ...++++++... ", -" . .++++++. . ", -" . .++++++. . ", -" ...++++++... ", -" . .++++++. . ", -" ............ "}; diff --git a/include/xpm/smth.xpm b/include/xpm/smth.xpm deleted file mode 100644 index a2b9d46..0000000 --- a/include/xpm/smth.xpm +++ /dev/null @@ -1,22 +0,0 @@ -/* XPM */ -static const char * smth_xpm[] = { -"16 16 3 1", -" c None", -". c #000000", -"+ c #FF0000", -" ", -" ", -" ", -" ", -" . ", -" . ", -" . . . ", -" . . .. ", -" +++. . . ", -" +. ++ +++. ", -" . .++ ++ ", -" . . . .+ ", -" . . . . ", -" . ", -" . ", -" "}; diff --git a/include/xpm/stop.xpm b/include/xpm/stop.xpm new file mode 100644 index 0000000..028f468 --- /dev/null +++ b/include/xpm/stop.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static const char * stop_xpm[] = { +"16 16 4 1", +" c None", +". c #770000", +"+ c #FF0000", +"@ c #FFFFFF", +" ", +" ...... ", +" .++++++. ", +" .++++++++. ", +" .++++++++++. ", +" .+++@@++@@+++. ", +" .+++@@@@@@+++. ", +" .++++@@@@++++. ", +" .++++@@@@++++. ", +" .+++@@@@@@+++. ", +" .+++@@++@@+++. ", +" .++++++++++. ", +" .++++++++. ", +" .++++++. ", +" ...... ", +" "}; diff --git a/include/xpm/sum.xpm b/include/xpm/sum.xpm deleted file mode 100644 index fc017ac..0000000 --- a/include/xpm/sum.xpm +++ /dev/null @@ -1,21 +0,0 @@ -/* XPM */ -static const char * sum_xpm[] = { -"16 16 2 1", -" c None", -". c #000000", -" ", -" ", -" .......... ", -" . . ", -" . . ", -" . ", -" . ", -" . ", -" .. ", -" . ", -" . ", -" . ", -" . . ", -" . . ", -" .......... ", -" "}; diff --git a/include/xpm/swap.xpm b/include/xpm/swap.xpm deleted file mode 100644 index 6ad367c..0000000 --- a/include/xpm/swap.xpm +++ /dev/null @@ -1,23 +0,0 @@ -/* XPM */ -static const char * swap_xpm[] = { -"16 16 4 1", -" c None", -". c #0000FF", -"+ c #000000", -"@ c #FF0000", -" ", -" . .. ", -" . . ", -" . . ", -" . . ", -" ...... ", -" + + ", -" + + ", -" + + ", -" + + + + ", -" ++ @@@ ++ ", -" +++ @ @ +++ ", -" @ @ ", -" @ @ ", -" @@@ @@@ ", -" "}; diff --git a/include/xpm/system-file-manager.png b/include/xpm/system-file-manager.png deleted file mode 100644 index 60cade4..0000000 Binary files a/include/xpm/system-file-manager.png and /dev/null differ diff --git a/include/xpm/text-x-generic.png b/include/xpm/text-x-generic.png deleted file mode 100644 index 2d7f2d6..0000000 Binary files a/include/xpm/text-x-generic.png and /dev/null differ diff --git a/include/xpm/tiles.xpm b/include/xpm/tiles.xpm new file mode 100644 index 0000000..505dadd --- /dev/null +++ b/include/xpm/tiles.xpm @@ -0,0 +1,132 @@ +/* XPM */ +static const char * tiles_xpm[] = { +"16 16 113 2", +" c None", +". c #00D9FB", +"+ c #00FEC7", +"@ c #7DFF1E", +"# c #DBDF08", +"$ c #EAC004", +"% c #E5D403", +"& c #FF5D00", +"* c #FC1600", +"= c #FC2500", +"- c #00EAE9", +"; c #00E9CA", +"> c #05F1B1", +", c #03F8B5", +"' c #00FFC7", +") c #00FFD6", +"! c #FF5900", +"~ c #FD0600", +"{ c #FA0000", +"] c #FF2600", +"^ c #00A1FF", +"/ c #00CEFF", +"( c #00FEE9", +"_ c #00FF71", +": c #80FF12", +"< c #CFFF07", +"[ c #FF7000", +"} c #FF5800", +"| c #FE7200", +"1 c #F9B100", +"2 c #00EDF2", +"3 c #1AFF56", +"4 c #C1FA00", +"5 c #FDD600", +"6 c #FFA700", +"7 c #FF9200", +"8 c #F3D400", +"9 c #A0FD21", +"0 c #21F996", +"a c #ECF100", +"b c #FFC900", +"c c #FF9B00", +"d c #FF9300", +"e c #FDA700", +"f c #AEFF05", +"g c #00F9C7", +"h c #00AAFF", +"i c #0052FF", +"j c #FDCA00", +"k c #E6DE00", +"l c #FCA900", +"m c #ADFF00", +"n c #00FCC3", +"o c #00C8FF", +"p c #0089FF", +"q c #0079FE", +"r c #0094FF", +"s c #00CDFF", +"t c #93E71F", +"u c #6BF55F", +"v c #57FA76", +"w c #3EFF80", +"x c #1BFF89", +"y c #00FF84", +"z c #00FF95", +"A c #F52C00", +"B c #F03200", +"C c #F23E00", +"D c #FB5B00", +"E c #F39E00", +"F c #D4EA00", +"G c #3BFF31", +"H c #00FCD9", +"I c #00C2FF", +"J c #FE5500", +"K c #E70200", +"L c #B30000", +"M c #9C0000", +"N c #A30000", +"O c #C30000", +"P c #F61400", +"Q c #FF9600", +"R c #99FD04", +"S c #01FDD5", +"T c #00A6FF", +"U c #0054FF", +"V c #0037FF", +"W c #EC0400", +"X c #BD0000", +"Y c #A20000", +"Z c #A00000", +"` c #B70000", +" . c #EA0100", +".. c #FF5600", +"+. c #EDE300", +"@. c #0CF5CC", +"#. c #06D2E4", +"$. c #09CEE0", +"%. c #18E5C1", +"&. c #4AFF6C", +"*. c #C1EB09", +"=. c #FF7200", +"-. c #FE4F00", +";. c #F73E00", +">. c #F03A00", +",. c #F03800", +"'. c #F63A00", +"). c #E2BD00", +"!. c #D0C10A", +"~. c #CDC110", +"{. c #DFBB02", +"]. c #F7B100", +"^. c #FF9C00", +" ", +" ", +" . + @ # $ % ", +"& * = - ; > , ' ) ", +"! ~ { ] ^ / ( _ : < ", +"[ } | 1 2 3 4 5 6 ", +"7 8 9 0 a b c d ", +"e f g h i j k ", +"l m n o p q r s ", +" t u v w x y z ", +" A B C D E F G H I ", +"J K L M N O P Q R S T U V ", +"} W X Y Z ` ...+. @.#.$.%.&.*.", +"=.-.;.>.,.'. ).!.~.{.].^.", +" ", +" "}; diff --git a/include/xpm/udav.png b/include/xpm/udav.png deleted file mode 100644 index 76ba7d9..0000000 Binary files a/include/xpm/udav.png and /dev/null differ diff --git a/include/xpm/unused/smth.xpm b/include/xpm/unused/smth.xpm new file mode 100644 index 0000000..a2b9d46 --- /dev/null +++ b/include/xpm/unused/smth.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static const char * smth_xpm[] = { +"16 16 3 1", +" c None", +". c #000000", +"+ c #FF0000", +" ", +" ", +" ", +" ", +" . ", +" . ", +" . . . ", +" . . .. ", +" +++. . . ", +" +. ++ +++. ", +" . .++ ++ ", +" . . . .+ ", +" . . . . ", +" . ", +" . ", +" "}; diff --git a/include/xpm/unused/sum.xpm b/include/xpm/unused/sum.xpm new file mode 100644 index 0000000..fc017ac --- /dev/null +++ b/include/xpm/unused/sum.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * sum_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" .......... ", +" . . ", +" . . ", +" . ", +" . ", +" . ", +" .. ", +" . ", +" . ", +" . ", +" . . ", +" . . ", +" .......... ", +" "}; diff --git a/include/xpm/unused/swap.xpm b/include/xpm/unused/swap.xpm new file mode 100644 index 0000000..6ad367c --- /dev/null +++ b/include/xpm/unused/swap.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static const char * swap_xpm[] = { +"16 16 4 1", +" c None", +". c #0000FF", +"+ c #000000", +"@ c #FF0000", +" ", +" . .. ", +" . . ", +" . . ", +" . . ", +" ...... ", +" + + ", +" + + ", +" + + ", +" + + + + ", +" ++ @@@ ++ ", +" +++ @ @ +++ ", +" @ @ ", +" @ @ ", +" @@@ @@@ ", +" "}; diff --git a/include/xpm/vect.xpm b/include/xpm/vect.xpm new file mode 100644 index 0000000..7d91322 --- /dev/null +++ b/include/xpm/vect.xpm @@ -0,0 +1,60 @@ +/* XPM */ +static const char * vect_xpm[] = { +"16 16 41 1", +" c None", +". c #B3FF00", +"+ c #AEF900", +"@ c #FBF400", +"# c #FEF700", +"$ c #FFDA00", +"% c #AFFB00", +"& c #FDF600", +"* c #FDF500", +"= c #FD9600", +"- c #FD9000", +"; c #FA8F00", +"> c #FEAB00", +", c #FD9500", +"' c #FB9400", +") c #FE9100", +"! c #FBAA00", +"~ c #FCA900", +"{ c #FF9700", +"] c #FF9200", +"^ c #FDA900", +"/ c #FDAB00", +"( c #FB9D00", +"_ c #FC0B00", +": c #FF0A00", +"< c #FF4400", +"[ c #FB4200", +"} c #FC9E00", +"| c #FE9F00", +"1 c #FD4400", +"2 c #FC4400", +"3 c #FFA000", +"4 c #FB1600", +"5 c #FCAD00", +"6 c #D00000", +"7 c #D20000", +"8 c #FD1500", +"9 c #FA1500", +"0 c #FEAF00", +"a c #D10000", +"b c #FDAE00", +" .+ @# $ ", +" % &@ $ ", +". & ", +" * ", +" = -; >", +" ,' ) !~", +"{ ] ^ ", +" ] / ", +" (", +" _: <[ }|", +" _ 12 3 ", +" < | ", +" ", +" 4 5", +" 67 89 50", +"a 8 b "}; diff --git a/include/xpm/view-refresh.png b/include/xpm/view-refresh.png deleted file mode 100644 index 3fd71d6..0000000 Binary files a/include/xpm/view-refresh.png and /dev/null differ diff --git a/include/xpm/view-refresh.xpm b/include/xpm/view-refresh.xpm deleted file mode 100644 index 32d59ea..0000000 --- a/include/xpm/view-refresh.xpm +++ /dev/null @@ -1,113 +0,0 @@ -/* XPM */ -static const char * view_refresh_xpm[] = { -"16 16 94 2", -" c None", -". c #3A69A7", -"+ c #3A6AA7", -"@ c #3667A5", -"# c #3969A7", -"$ c #3868A6", -"% c #6890C0", -"& c #8FB0D3", -"* c #A8C2DF", -"= c #A8C1DE", -"- c #93B1D4", -"; c #5F87B9", -"> c #3767A5", -", c #3465A4", -"' c #3969A6", -") c #8CADD3", -"! c #9DBDDC", -"~ c #A1BEDD", -"{ c #B4CBE5", -"] c #BFD3E9", -"^ c #CCDDEE", -"/ c #D5E2F0", -"( c #BFD2E7", -"_ c #4B77AF", -": c #4371AB", -"< c #3566A4", -"[ c #6990C0", -"} c #7298C5", -"| c #3C6BA8", -"1 c #5D85B7", -"2 c #A1BBD9", -"3 c #D8E4F1", -"4 c #DBE6F2", -"5 c #DDE8F3", -"6 c #88A7CE", -"7 c #C8D8EA", -"8 c #4170AB", -"9 c #3C6CA9", -"0 c #3869A6", -"a c #6188B9", -"b c #CDDBEB", -"c c #E2EBF5", -"d c #E6EEF6", -"e c #3565A4", -"f c #6891C7", -"g c #C7D7E9", -"h c #C6D8EB", -"i c #E3ECF5", -"j c #3A6AA6", -"k c #8FACD0", -"l c #E7EEF6", -"m c #4774AD", -"n c #4C77AF", -"o c #4C78AF", -"p c #E5EDF5", -"q c #E5EDF6", -"r c #E4ECF5", -"s c #9CB7D7", -"t c #3768A6", -"u c #C4D7EB", -"v c #C9D9EA", -"w c #3566A5", -"x c #6C95C9", -"y c #537FB7", -"z c #E4EDF5", -"A c #C1D2E6", -"B c #4D79B0", -"C c #3C6BA9", -"D c #4F7CB6", -"E c #3768A5", -"F c #95B2D4", -"G c #E0E9F4", -"H c #CCDCED", -"I c #8FADD2", -"J c #4C78B0", -"K c #3D6DA9", -"L c #5B84B7", -"M c #4E7AB1", -"N c #B4CAE3", -"O c #C9DAEC", -"P c #BCD1E7", -"Q c #B0C9E3", -"R c #A0BEDE", -"S c #88ABD2", -"T c #82A5CE", -"U c #8EAED3", -"V c #3767A6", -"W c #5580B5", -"X c #84A6CE", -"Y c #97B6D8", -"Z c #99B9DB", -"` c #8AACD3", -" . c #6D94C2", -".. c #3B6BA7", -" . + @ # + ", -" $ % & * = - ; > , ", -" ' ) ! ~ { ] ^ / ( _ @ : < ", -" # [ } | < + 1 2 3 4 5 6 7 + ", -" $ 8 9 + 0 a b c d d + ", -" e + f > < g h i j ", -" , $ k l 4 d j ", -" , , m n n o , ", -" , , , , , , , ", -" , p q r s t , ", -" < d u v , w x y , ", -" > d i z A B 0 C D + E ", -" $ 3 F G 5 H I J w ' ' K J + ", -" > L @ M N O P Q R S T U $ ", -" , @ V W X Y Z ` .$ ", -" , + 0 < + .. "}; diff --git a/include/xpm/weather-clear.png b/include/xpm/weather-clear.png deleted file mode 100644 index 7dc15ea..0000000 Binary files a/include/xpm/weather-clear.png and /dev/null differ diff --git a/include/xpm/weather-clear.xpm b/include/xpm/weather-clear.xpm deleted file mode 100644 index 2b21ab2..0000000 --- a/include/xpm/weather-clear.xpm +++ /dev/null @@ -1,95 +0,0 @@ -/* XPM */ -static const char * weather_clear_xpm[] = { -"16 16 76 1", -" c None", -". c #FCB03E", -"+ c #FCB13E", -"@ c #FCAF3E", -"# c #FCB23F", -"$ c #FDCD83", -"% c #FCCC82", -"& c #FCC470", -"* c #FCB953", -"= c #FCB23E", -"- c #FCC66D", -"; c #FDE6BF", -"> c #FEF9E7", -", c #FEFCF0", -"' c #FEF9DF", -") c #FDEAAD", -"! c #FBBA57", -"~ c #FCB33F", -"{ c #FDE6C1", -"] c #FEFEFB", -"^ c #FEFCEF", -"/ c #FEF8CE", -"( c #FDF4B0", -"_ c #FCF4AD", -": c #FDF0A2", -"< c #FAB545", -"[ c #FEF8E7", -"} c #FEFDF0", -"| c #FEF9CF", -"1 c #FDF4AC", -"2 c #FDF089", -"3 c #FCEF87", -"4 c #FCD964", -"5 c #FCB33E", -"6 c #FCCD84", -"7 c #FEFCF1", -"8 c #FEF8D0", -"9 c #FEF9D0", -"0 c #FDF6BE", -"a c #FDF3A1", -"b c #FCEF81", -"c c #FCEC68", -"d c #FCE768", -"e c #FBB13E", -"f c #FCC570", -"g c #FEFAE3", -"h c #FDF5B1", -"i c #FDF4AE", -"j c #FDF3A2", -"k c #FDF08C", -"l c #FCED71", -"m c #FCE959", -"n c #FCE459", -"o c #FBB13F", -"p c #FCBC57", -"q c #FDECB4", -"r c #FCF4AB", -"s c #FDF08B", -"t c #FCEF82", -"u c #FCEA5A", -"v c #FCEA57", -"w c #FBD349", -"x c #FBBD5B", -"y c #FDF1AA", -"z c #FCEF84", -"A c #FCEB65", -"B c #FCE956", -"C c #FCE34E", -"D c #FAB43F", -"E c #FCB43F", -"F c #FBB94A", -"G c #FBDB6C", -"H c #FCE86E", -"I c #FCE55D", -"J c #FCD549", -"K c #FBB43F", -" ", -" .+ ", -" ++ ", -" @# $%&* =@ ", -" =-;>,')!~# ", -" {]^/(_:< ", -" $[}}|12345 ", -" ++67890abcde+. ", -" .+fghijklmno++ ", -" pqrstluvw# ", -" xyzABvCD ", -" #EFGHIJK5= ", -" @= #oe5 #@ ", -" ++ ", -" +. ", -" "}; diff --git a/include/xpm/x-office-presentation.png b/include/xpm/x-office-presentation.png deleted file mode 100644 index f7ea302..0000000 Binary files a/include/xpm/x-office-presentation.png and /dev/null differ diff --git a/include/xpm/x-office-spreadsheet.png b/include/xpm/x-office-spreadsheet.png deleted file mode 100644 index a6b1268..0000000 Binary files a/include/xpm/x-office-spreadsheet.png and /dev/null differ diff --git a/include/xpm/x-office-spreadsheet.xpm b/include/xpm/x-office-spreadsheet.xpm deleted file mode 100644 index 8707737..0000000 --- a/include/xpm/x-office-spreadsheet.xpm +++ /dev/null @@ -1,143 +0,0 @@ -/* XPM */ -static const char * x_office_spreadsheet_xpm[] = { -"16 16 124 2", -" c None", -". c #999999", -"+ c #818181", -"@ c #FFFFFF", -"# c #B7B7B7", -"$ c #B7B7B8", -"% c #9E9E9F", -"& c #B8B8B8", -"* c #9F9F9F", -"= c #B8B8B9", -"- c #9E9E9E", -"; c #9F9F9E", -"> c #B7B8B7", -", c #C3C3C3", -"' c #EEEEEE", -") c #C2C2C2", -"! c #EEEFEE", -"~ c #EFEEEF", -"{ c #B1B1B1", -"] c #B9B8B9", -"^ c #E0E0E0", -"/ c #E0E1E0", -"( c #E1E0E0", -"_ c #E1E1E1", -": c #B9B8B8", -"< c #C4C4C4", -"[ c #C3C4C4", -"} c #EEEEEF", -"| c #EFEFEF", -"1 c #F0EFEF", -"2 c #B9B9B8", -"3 c #B9B9B9", -"4 c #C9A6A5", -"5 c #AE3A36", -"6 c #A50F0C", -"7 c #A40201", -"8 c #A40D0A", -"9 c #B03B37", -"0 c #8D6969", -"a c #9E403D", -"b c #A70A07", -"c c #C66453", -"d c #CB715C", -"e c #C9735D", -"f c #C5715B", -"g c #BF6C59", -"h c #C06E61", -"i c #AC201D", -"j c #A73634", -"k c #B2B2B2", -"l c #A65C5B", -"m c #AF2017", -"n c #CB725D", -"o c #C7654D", -"p c #BB5338", -"q c #B65136", -"r c #B04E35", -"s c #B35D47", -"t c #AE5B45", -"u c #A95743", -"v c #AA2F28", -"w c #9F2523", -"x c #A51412", -"y c #CA6F5A", -"z c #BF5439", -"A c #BA5237", -"B c #B44F36", -"C c #AF4D34", -"D c #886556", -"E c #765F5A", -"F c #715B56", -"G c #6B5853", -"H c #77605B", -"I c #9D0D0C", -"J c #C76951", -"K c #B85137", -"L c #B24E36", -"M c #AD4C34", -"N c #AE653A", -"O c #95995D", -"P c #1D84A0", -"Q c #177F99", -"R c #3D91A5", -"S c #3B8EA0", -"T c #A20101", -"U c #9F1212", -"V c #CA7E6D", -"W c #B85F48", -"X c #AB4C33", -"Y c #A64932", -"Z c #B18B44", -"` c #B8BC50", -" . c #358086", -".. c #509CAD", -"+. c #278397", -"@. c #496E77", -"#. c #970909", -"$. c #BC7878", -"%. c #9C1D1A", -"&. c #BD7E6D", -"*. c #BE7F70", -"=. c #BD8374", -"-. c #CDC787", -";. c #CBD089", -">. c #B4B48A", -",. c #5C93A0", -"'. c #44656D", -"). c #7B1618", -"!. c #A12F2F", -"~. c #959595", -"{. c #934040", -"]. c #9E0605", -"^. c #99463D", -"/. c #9E624D", -"(. c #A6A14C", -"_. c #9F9B4A", -":. c #948845", -"<. c #4B3C43", -"[. c #9A0505", -"}. c #A32B2B", -"|. c #991C1C", -"1. c #A00C0C", -"2. c #A30201", -"3. c #A42525", -". + + + + + + + + + + + + ", -"+ @ @ @ @ @ @ @ @ @ @ @ @ + ", -"+ @ # # $ % & & * = = * @ + ", -"+ @ - ; * * * * * * * * @ + ", -"+ @ > , , * ' ' ) ! ~ ) @ + ", -"+ @ { & ] * ^ / ) ( _ ) @ + ", -"+ @ : < [ * } ~ ) | 1 ) @ + ", -"+ @ { 2 3 * 4 5 6 7 7 8 9 0 ", -"+ @ 3 < < a b c d e f g h i j ", -"+ @ k 3 l m n o p q r s t u v w ", -"+ @ 3 < x y z A B C D E F G H I ", -"+ @ k 3 7 J K L M N O P Q R S T ", -"+ @ 3 < U V W X Y Z ` ...+.@.#.", -"+ @ @ @ $.%.&.*.=.-.;.>.,.'.).!.", -"~.+ + + + {.].^./.(._.:.<.[.}. ", -" |.1.2.T 1.3. "}; diff --git a/include/xpm/zoom-fit-best-r.xpm b/include/xpm/zoom-fit-best-r.xpm deleted file mode 100644 index a77f7e1..0000000 --- a/include/xpm/zoom-fit-best-r.xpm +++ /dev/null @@ -1,88 +0,0 @@ -/* XPM */ -static const char * zoom_fit_best_r_xpm[] = { -"16 16 69 1", -" c None", -". c #C34C4C", -"+ c #C34E4E", -"@ c #D98C8C", -"# c #E9BCBC", -"$ c #F2D8D8", -"% c #C95C5C", -"& c #EAC1C1", -"* c #ECC7C7", -"= c #DC9595", -"- c #EBC3C3", -"; c #CF7070", -"> c #B33C3C", -", c #BD3F3F", -"' c #D27878", -") c #D07373", -"! c #BA3E3E", -"~ c #FEFDFD", -"{ c #D37E7E", -"] c #BE3F3F", -"^ c #B13B3B", -"/ c #C44F4F", -"( c #DA9090", -"_ c #D27979", -": c #B83D3D", -"< c #D58282", -"[ c #D07171", -"} c #E1A6A6", -"| c #DFA0A0", -"1 c #CD6868", -"2 c #CB6464", -"3 c #D37C7C", -"4 c #C75757", -"5 c #C95E5E", -"6 c #C85B5B", -"7 c #AC3939", -"8 c #DD9A9A", -"9 c #C75858", -"0 c #AE3939", -"a c #DE9D9D", -"b c #DB9393", -"c c #EECDCD", -"d c #CB6262", -"e c #B23B3B", -"f c #EFCFCF", -"g c #EDC8C8", -"h c #D47F7F", -"i c #B73D3D", -"j c #CD6A6A", -"k c #CE6C6C", -"l c #CA6060", -"m c #EECCCC", -"n c #F1D4D4", -"o c #E6B5B5", -"p c #E9BEBE", -"q c #F0D3D3", -"r c #CE6D6D", -"s c #903030", -"t c #DF9F9F", -"u c #F3DEDE", -"v c #C34B4B", -"w c #DC9797", -"x c #DE9C9C", -"y c #C65555", -"z c #822B2B", -"A c #DA9191", -"B c #852C2C", -"C c #7F2A2A", -"D c #812B2B", -" .+..+. ", -" .@#$$#@. ", -" %&*=@@=-&% ", -" .&;>,')!>;&. ", -".@->~~{]~~^-@. ", -"/#(,~]_):~>(#+ ", -".$<[,[}|12%_$. ", -".$3452=@67+3$. ", -"/&87~7990~7a&/ ", -".bc^~~>d~~efb. ", -" /ghi:jk::hg. ", -" lmn#oopqclrs ", -" /tcuuc|/vwxs ", -" /y//4/ z>vAB", -" C^;B", -" CD "}; diff --git a/include/xpm/zoom-fit-best.png b/include/xpm/zoom-fit-best.png deleted file mode 100644 index eb28409..0000000 Binary files a/include/xpm/zoom-fit-best.png and /dev/null differ diff --git a/include/xpm/zoom-fit-best.xpm b/include/xpm/zoom-fit-best.xpm deleted file mode 100644 index c093447..0000000 --- a/include/xpm/zoom-fit-best.xpm +++ /dev/null @@ -1,133 +0,0 @@ -/* XPM */ -static const char * zoom_fit_best_xpm[] = { -"16 16 114 2", -" c None", -". c #878B87", -"+ c #868C8A", -"@ c #888B89", -"# c #ACB6BF", -"$ c #CDD6DD", -"% c #E4E7E9", -"& c #929594", -"* c #CFD8E0", -"= c #D3DDE5", -"- c #A4BFDC", -"; c #99B9DA", -"> c #9AB9DA", -", c #A4BFDD", -"' c #CFDAE5", -") c #87A6CA", -"! c #547FB5", -"~ c #5B84B8", -"{ c #8AAAD0", -"] c #88A9CF", -"^ c #5983B7", -"/ c #537EB5", -"( c #527EB5", -"_ c #FFFFFF", -": c #90AED2", -"< c #5C85B8", -"[ c #507DB4", -"} c #868C8B", -"| c #9DBBDA", -"1 c #5E86B8", -"2 c #8CABD1", -"3 c #87A8CF", -"4 c #5982B7", -"5 c #9EBBDA", -"6 c #878B88", -"7 c #8EB2D6", -"8 c #85A7CE", -"9 c #5A84B7", -"0 c #86A7CE", -"a c #AFC8E4", -"b c #AAC5E2", -"c c #7DA1CC", -"d c #799FCA", -"e c #7199C8", -"f c #86ACD4", -"g c #89AED4", -"h c #6C96C6", -"i c #739AC8", -"j c #799ECA", -"k c #A0BEDF", -"l c #9AB9DC", -"m c #7198C7", -"n c #4D7AB2", -"o c #638FC2", -"p c #878C8B", -"q c #CFD8DE", -"r c #A7C1DD", -"s c #4D7BB3", -"t c #4E7BB3", -"u c #6E97C6", -"v c #4F7CB3", -"w c #A9C3DE", -"x c #D0D8DE", -"y c #888B87", -"z c #B1BAC1", -"A c #D9E1E8", -"B c #517DB4", -"C c #779DC9", -"D c #527EB4", -"E c #DAE2E8", -"F c #B2BBC1", -"G c #8A8C8A", -"H c #D7DDE2", -"I c #96B0CF", -"J c #5680B5", -"K c #5681B6", -"L c #7FA2CC", -"M c #80A3CC", -"N c #5781B6", -"O c #D8DEE3", -"P c #949895", -"Q c #DADFE3", -"R c #E1E6EA", -"S c #C7D7E8", -"T c #BDD2E6", -"U c #BED2E6", -"V c #C8D8E8", -"W c #DFE5EA", -"X c #DBE0E4", -"Y c #959896", -"Z c #9DA09B", -"` c #60625F", -" . c #8A8D8A", -".. c #BCC1C4", -"+. c #DCE0E2", -"@. c #E9EBEB", -"#. c #BDC2C5", -"$. c #898C88", -"%. c #878A84", -"&. c #B9BCB6", -"*. c #BDBFBC", -"=. c #61635F", -"-. c #8A8C88", -";. c #8D918D", -">. c #8B8D89", -",. c #8E918D", -"'. c #575955", -"). c #7A7B78", -"!. c #B7B8B6", -"~. c #595B57", -"{. c #555753", -"]. c #767873", -"^. c #A0A29F", -"/. c #565854", -" . + . . + . ", -" @ # $ % % $ # @ ", -" & * = - ; > , ' * & ", -" @ * ) ! ~ { ] ^ / ) * @ ", -". # ' ( _ _ : < _ _ [ ' # . ", -"} $ | ~ _ 1 2 3 4 _ ! 5 $ + ", -"6 % 7 8 9 0 a b c d e f % . ", -"6 % g h i j k l m n o g % . ", -"p q r s _ t u u v _ t w x p ", -"y z A B _ _ / C _ _ D E F y ", -" G H I J K L M N K I O . ", -" P Q R S T U V W X Y Z ` ", -" ...+.@.@.+.#.$.%.&.*.=. ", -" -.;.>.>.,.-. '.).%.!.~.", -" {.].^.~.", -" {./. "}; diff --git a/include/xpm/zoom-in.png b/include/xpm/zoom-in.png deleted file mode 100644 index 31ac736..0000000 Binary files a/include/xpm/zoom-in.png and /dev/null differ diff --git a/include/xpm/zoom-in.xpm b/include/xpm/zoom-in.xpm deleted file mode 100644 index 22e285b..0000000 --- a/include/xpm/zoom-in.xpm +++ /dev/null @@ -1,124 +0,0 @@ -/* XPM */ -static const char * zoom_in_xpm[] = { -"16 16 105 2", -" c None", -". c #878B87", -"+ c #868C8A", -"@ c #888B89", -"# c #ACB6BF", -"$ c #CDD6DD", -"% c #E4E7E9", -"& c #929594", -"* c #CFD8E0", -"= c #D3DDE5", -"- c #A4BFDC", -"; c #99B9DA", -"> c #9AB9DA", -", c #A4BFDD", -"' c #CFDAE5", -") c #B4C9DF", -"! c #9DBDDD", -"~ c #B5CDE6", -"{ c #5C84B8", -"] c #5B84B8", -"^ c #B0CAE4", -"/ c #9ABADD", -"( c #98B9DC", -"_ c #BCD1E8", -": c #5F87B9", -"< c #FFFFFF", -"[ c #5A84B7", -"} c #ABC6E2", -"| c #91B4DA", -"1 c #868C8B", -"2 c #9DBBDA", -"3 c #B6CDE6", -"4 c #5D85B8", -"5 c #5E86B8", -"6 c #5982B7", -"7 c #5781B6", -"8 c #9FBDDE", -"9 c #9EBBDA", -"0 c #878B88", -"a c #8EB2D6", -"b c #5983B7", -"c c #507DB4", -"d c #86ACD4", -"e c #89AED4", -"f c #4E7BB3", -"g c #4A78B2", -"h c #878C8B", -"i c #CFD8DE", -"j c #A7C1DD", -"k c #86ADD6", -"l c #4F7CB3", -"m c #89AED6", -"n c #A9C3DE", -"o c #D0D8DE", -"p c #888B87", -"q c #B1BAC1", -"r c #D9E1E8", -"s c #94B6DA", -"t c #96B7DB", -"u c #527EB5", -"v c #537EB5", -"w c #97B8DB", -"x c #DAE2E8", -"y c #B2BBC1", -"z c #8A8C8A", -"A c #D7DDE2", -"B c #CAD8E6", -"C c #A4C0DF", -"D c #A6C2E0", -"E c #A7C3E1", -"F c #D8DEE3", -"G c #949895", -"H c #DADFE3", -"I c #E1E6EA", -"J c #C7D7E8", -"K c #BDD2E6", -"L c #BED2E6", -"M c #C8D8E8", -"N c #DFE5EA", -"O c #DBE0E4", -"P c #959896", -"Q c #9DA09B", -"R c #60625F", -"S c #8A8D8A", -"T c #BCC1C4", -"U c #DCE0E2", -"V c #E9EBEB", -"W c #BDC2C5", -"X c #898C88", -"Y c #878A84", -"Z c #B9BCB6", -"` c #BDBFBC", -" . c #61635F", -".. c #8A8C88", -"+. c #8D918D", -"@. c #8B8D89", -"#. c #8E918D", -"$. c #575955", -"%. c #7A7B78", -"&. c #B7B8B6", -"*. c #595B57", -"=. c #555753", -"-. c #767873", -";. c #A0A29F", -">. c #565854", -" . + . . + . ", -" @ # $ % % $ # @ ", -" & * = - ; > , ' * & ", -" @ * ) ! ~ { ] ^ / ) * @ ", -". # ' ( _ : < < [ } | ' # . ", -"1 $ 2 3 4 5 < < 6 7 8 9 $ + ", -"0 % a b < < < < < < c d % . ", -"0 % e f < < < < < < g e % . ", -"h i j k f f < < l f m n o h ", -"p q r s t u < < v ( w x y p ", -" z A B C D 7 7 E D B F . ", -" G H I J K L M N O P Q R ", -" S T U V V U W X Y Z ` . ", -" ..+.@.@.#... $.%.Y &.*.", -" =.-.;.*.", -" =.>. "}; diff --git a/include/xpm/zoom-original.png b/include/xpm/zoom-original.png deleted file mode 100644 index 8e35414..0000000 Binary files a/include/xpm/zoom-original.png and /dev/null differ diff --git a/include/xpm/zoom-original.xpm b/include/xpm/zoom-original.xpm deleted file mode 100644 index 6cc6b3c..0000000 --- a/include/xpm/zoom-original.xpm +++ /dev/null @@ -1,130 +0,0 @@ -/* XPM */ -static const char * zoom_original_xpm[] = { -"16 16 111 2", -" c None", -". c #878B87", -"+ c #868C8A", -"@ c #888B89", -"# c #ACB6BF", -"$ c #CDD6DD", -"% c #E4E7E9", -"& c #929594", -"* c #CFD8E0", -"= c #D3DDE5", -"- c #A4BFDC", -"; c #99B9DA", -"> c #9AB9DA", -", c #A4BFDD", -"' c #CFDAE5", -") c #B4C9DF", -"! c #9DBDDD", -"~ c #B5CDE6", -"{ c #5C84B8", -"] c #5B84B8", -"^ c #B0CAE4", -"/ c #9ABADD", -"( c #98B9DC", -"_ c #BCD1E8", -": c #5F87B9", -"< c #FFFFFF", -"[ c #5A84B7", -"} c #ABC6E2", -"| c #91B4DA", -"1 c #868C8B", -"2 c #9DBBDA", -"3 c #B6CDE6", -"4 c #5D85B8", -"5 c #5982B7", -"6 c #A7C3E1", -"7 c #9FBDDE", -"8 c #9EBBDA", -"9 c #878B88", -"0 c #8EB2D6", -"a c #5A83B7", -"b c #5681B6", -"c c #9EBDDE", -"d c #86ACD4", -"e c #89AED4", -"f c #8AAFD7", -"g c #94B6DB", -"h c #547FB5", -"i c #507DB4", -"j c #85ACD5", -"k c #7BA5D2", -"l c #878C8B", -"m c #CFD8DE", -"n c #A7C1DD", -"o c #86ADD6", -"p c #89AED6", -"q c #4E7BB3", -"r c #4F7CB3", -"s c #8BB0D7", -"t c #A9C3DE", -"u c #D0D8DE", -"v c #888B87", -"w c #B1BAC1", -"x c #D9E1E8", -"y c #94B6DA", -"z c #96B7DB", -"A c #527EB5", -"B c #537EB5", -"C c #97B8DB", -"D c #DAE2E8", -"E c #B2BBC1", -"F c #8A8C8A", -"G c #D7DDE2", -"H c #CAD8E6", -"I c #A4C0DF", -"J c #A6C2E0", -"K c #5781B6", -"L c #D8DEE3", -"M c #949895", -"N c #DADFE3", -"O c #E1E6EA", -"P c #C7D7E8", -"Q c #BDD2E6", -"R c #BED2E6", -"S c #C8D8E8", -"T c #DFE5EA", -"U c #DBE0E4", -"V c #959896", -"W c #9DA09B", -"X c #60625F", -"Y c #8A8D8A", -"Z c #BCC1C4", -"` c #DCE0E2", -" . c #E9EBEB", -".. c #BDC2C5", -"+. c #898C88", -"@. c #878A84", -"#. c #B9BCB6", -"$. c #BDBFBC", -"%. c #61635F", -"&. c #8A8C88", -"*. c #8D918D", -"=. c #8B8D89", -"-. c #8E918D", -";. c #575955", -">. c #7A7B78", -",. c #B7B8B6", -"'. c #595B57", -"). c #555753", -"!. c #767873", -"~. c #A0A29F", -"{. c #565854", -" . + . . + . ", -" @ # $ % % $ # @ ", -" & * = - ; > , ' * & ", -" @ * ) ! ~ { ] ^ / ) * @ ", -". # ' ( _ : < < [ } | ' # . ", -"1 $ 2 3 4 < < < 5 6 7 8 $ + ", -"9 % 0 ^ [ a < < b c | d % . ", -"9 % e f g h < < i j k e % . ", -"l m n o p q < < r s p t u l ", -"v w x y z A < < B ( C D E v ", -" F G H I J K K 6 J H L . ", -" M N O P Q R S T U V W X ", -" Y Z ` . .` ..+.@.#.$.%. ", -" &.*.=.=.-.&. ;.>.@.,.'.", -" ).!.~.'.", -" ).{. "}; diff --git a/include/xpm/zoom-out.png b/include/xpm/zoom-out.png deleted file mode 100644 index df5be3c..0000000 Binary files a/include/xpm/zoom-out.png and /dev/null differ diff --git a/include/xpm/zoom-out.xpm b/include/xpm/zoom-out.xpm deleted file mode 100644 index 7bd9c37..0000000 --- a/include/xpm/zoom-out.xpm +++ /dev/null @@ -1,127 +0,0 @@ -/* XPM */ -static const char * zoom_out_xpm[] = { -"16 16 108 2", -" c None", -". c #878B87", -"+ c #868C8A", -"@ c #888B89", -"# c #ACB6BF", -"$ c #CDD6DD", -"% c #E4E7E9", -"& c #929594", -"* c #CFD8E0", -"= c #D3DDE5", -"- c #A4BFDC", -"; c #99B9DA", -"> c #9AB9DA", -", c #A4BFDD", -"' c #CFDAE5", -") c #B4C9DF", -"! c #9DBDDD", -"~ c #B5CDE6", -"{ c #B7CEE7", -"] c #B0CAE4", -"^ c #9ABADD", -"/ c #98B9DC", -"( c #BCD1E8", -"_ c #C2D6EA", -": c #C1D4EA", -"< c #BAD0E7", -"[ c #B2CBE5", -"} c #ABC6E2", -"| c #91B4DA", -"1 c #868C8B", -"2 c #9DBBDA", -"3 c #B6CDE6", -"4 c #5D85B8", -"5 c #5E86B8", -"6 c #5C85B8", -"7 c #5B84B8", -"8 c #5982B7", -"9 c #5781B6", -"0 c #9FBDDE", -"a c #9EBBDA", -"b c #878B88", -"c c #8EB2D6", -"d c #5983B7", -"e c #FFFFFF", -"f c #507DB4", -"g c #86ACD4", -"h c #89AED4", -"i c #4E7BB3", -"j c #4A78B2", -"k c #878C8B", -"l c #CFD8DE", -"m c #A7C1DD", -"n c #86ADD6", -"o c #4F7CB3", -"p c #89AED6", -"q c #A9C3DE", -"r c #D0D8DE", -"s c #888B87", -"t c #B1BAC1", -"u c #D9E1E8", -"v c #94B6DA", -"w c #96B7DB", -"x c #9ABADC", -"y c #97B8DB", -"z c #DAE2E8", -"A c #B2BBC1", -"B c #8A8C8A", -"C c #D7DDE2", -"D c #CAD8E6", -"E c #A4C0DF", -"F c #A6C2E0", -"G c #A7C3E1", -"H c #A8C4E1", -"I c #D8DEE3", -"J c #949895", -"K c #DADFE3", -"L c #E1E6EA", -"M c #C7D7E8", -"N c #BDD2E6", -"O c #BED2E6", -"P c #C8D8E8", -"Q c #DFE5EA", -"R c #DBE0E4", -"S c #959896", -"T c #9DA09B", -"U c #60625F", -"V c #8A8D8A", -"W c #BCC1C4", -"X c #DCE0E2", -"Y c #E9EBEB", -"Z c #BDC2C5", -"` c #898C88", -" . c #878A84", -".. c #B9BCB6", -"+. c #BDBFBC", -"@. c #61635F", -"#. c #8A8C88", -"$. c #8D918D", -"%. c #8B8D89", -"&. c #8E918D", -"*. c #575955", -"=. c #7A7B78", -"-. c #B7B8B6", -";. c #595B57", -">. c #555753", -",. c #767873", -"'. c #A0A29F", -"). c #565854", -" . + . . + . ", -" @ # $ % % $ # @ ", -" & * = - ; > , ' * & ", -" @ * ) ! ~ { ~ ] ^ ) * @ ", -". # ' / ( _ : < [ } | ' # . ", -"1 $ 2 3 4 5 6 7 8 9 0 a $ + ", -"b % c d e e e e e e f g % . ", -"b % h i e e e e e e j h % . ", -"k l m n i i o o o i p q r k ", -"s t u v w / x x x / y z A s ", -" B C D E F G H G F D I . ", -" J K L M N O P Q R S T U ", -" V W X Y Y X Z ` ...+.@. ", -" #.$.%.%.&.#. *.=. .-.;.", -" >.,.'.;.", -" >.). "}; diff --git a/include/xpm/zoom_in.xpm b/include/xpm/zoom_in.xpm index ee3ce6f..22e285b 100644 --- a/include/xpm/zoom_in.xpm +++ b/include/xpm/zoom_in.xpm @@ -1,25 +1,124 @@ /* XPM */ -static const char *zoom_in_xpm[]={ -"16 16 6 1", -"# c None", -". c #000000", -"a c #000080", -"c c #804000", -"b c #d3e4e8", -"d c #ffff00", -".##...##...##...", -".####aa#########", -".##aabbaa#######", -"##abbbbbba#####.", -"##abbbbbba#####.", -".abbbbbbbba####.", -".abbbbbbbba#####", -".#abbbbbba######", -"##abbbbbba#####.", -"###aabbaaccc###.", -".####aa##cddc##.", -".########cdddc##", -".#########cdddc#", -"###########cddc.", -"############cc#.", -"...##...##...##."}; +static const char * zoom_in_xpm[] = { +"16 16 105 2", +" c None", +". c #878B87", +"+ c #868C8A", +"@ c #888B89", +"# c #ACB6BF", +"$ c #CDD6DD", +"% c #E4E7E9", +"& c #929594", +"* c #CFD8E0", +"= c #D3DDE5", +"- c #A4BFDC", +"; c #99B9DA", +"> c #9AB9DA", +", c #A4BFDD", +"' c #CFDAE5", +") c #B4C9DF", +"! c #9DBDDD", +"~ c #B5CDE6", +"{ c #5C84B8", +"] c #5B84B8", +"^ c #B0CAE4", +"/ c #9ABADD", +"( c #98B9DC", +"_ c #BCD1E8", +": c #5F87B9", +"< c #FFFFFF", +"[ c #5A84B7", +"} c #ABC6E2", +"| c #91B4DA", +"1 c #868C8B", +"2 c #9DBBDA", +"3 c #B6CDE6", +"4 c #5D85B8", +"5 c #5E86B8", +"6 c #5982B7", +"7 c #5781B6", +"8 c #9FBDDE", +"9 c #9EBBDA", +"0 c #878B88", +"a c #8EB2D6", +"b c #5983B7", +"c c #507DB4", +"d c #86ACD4", +"e c #89AED4", +"f c #4E7BB3", +"g c #4A78B2", +"h c #878C8B", +"i c #CFD8DE", +"j c #A7C1DD", +"k c #86ADD6", +"l c #4F7CB3", +"m c #89AED6", +"n c #A9C3DE", +"o c #D0D8DE", +"p c #888B87", +"q c #B1BAC1", +"r c #D9E1E8", +"s c #94B6DA", +"t c #96B7DB", +"u c #527EB5", +"v c #537EB5", +"w c #97B8DB", +"x c #DAE2E8", +"y c #B2BBC1", +"z c #8A8C8A", +"A c #D7DDE2", +"B c #CAD8E6", +"C c #A4C0DF", +"D c #A6C2E0", +"E c #A7C3E1", +"F c #D8DEE3", +"G c #949895", +"H c #DADFE3", +"I c #E1E6EA", +"J c #C7D7E8", +"K c #BDD2E6", +"L c #BED2E6", +"M c #C8D8E8", +"N c #DFE5EA", +"O c #DBE0E4", +"P c #959896", +"Q c #9DA09B", +"R c #60625F", +"S c #8A8D8A", +"T c #BCC1C4", +"U c #DCE0E2", +"V c #E9EBEB", +"W c #BDC2C5", +"X c #898C88", +"Y c #878A84", +"Z c #B9BCB6", +"` c #BDBFBC", +" . c #61635F", +".. c #8A8C88", +"+. c #8D918D", +"@. c #8B8D89", +"#. c #8E918D", +"$. c #575955", +"%. c #7A7B78", +"&. c #B7B8B6", +"*. c #595B57", +"=. c #555753", +"-. c #767873", +";. c #A0A29F", +">. c #565854", +" . + . . + . ", +" @ # $ % % $ # @ ", +" & * = - ; > , ' * & ", +" @ * ) ! ~ { ] ^ / ) * @ ", +". # ' ( _ : < < [ } | ' # . ", +"1 $ 2 3 4 5 < < 6 7 8 9 $ + ", +"0 % a b < < < < < < c d % . ", +"0 % e f < < < < < < g e % . ", +"h i j k f f < < l f m n o h ", +"p q r s t u < < v ( w x y p ", +" z A B C D 7 7 E D B F . ", +" G H I J K L M N O P Q R ", +" S T U V V U W X Y Z ` . ", +" ..+.@.@.#... $.%.Y &.*.", +" =.-.;.*.", +" =.>. "}; diff --git a/include/xpm/zoom_on.xpm b/include/xpm/zoom_on.xpm deleted file mode 100644 index bb19096..0000000 --- a/include/xpm/zoom_on.xpm +++ /dev/null @@ -1,25 +0,0 @@ -/* XPM */ -static const char *zoom_on_xpm[]={ -"16 16 6 1", -" c None", -". c #000000", -"a c #800000", -"c c #804000", -"b c #ff3f3f", -"d c #007f7f", -". ... ... ...", -". aa ", -". aabbaa ", -" abbbbbba .", -" abbbbbba .", -".abbbbbbbba .", -".abbbbbbbba ", -". abbbbbba ", -" abbbbbba .", -" aabbaaccc .", -". aa cddc .", -". cdddc ", -". cdddc ", -" cddc.", -" cc .", -"... ... ... ."}; diff --git a/include/xpm/zoom_out.xpm b/include/xpm/zoom_out.xpm index f5c3805..82b040e 100644 --- a/include/xpm/zoom_out.xpm +++ b/include/xpm/zoom_out.xpm @@ -1,25 +1,130 @@ /* XPM */ -static const char *zoom_out_xpm[]={ -"16 16 6 1", -". c None", -"c c #000000", -"# c #000080", -"b c #804000", -"a c #d3e4e8", -"d c #ffff00", -"................", -"....##..........", -"..##aa##........", -".#aaaaaa#.......", -".#aaaaaa#.......", -"#aaaaaaaa#......", -"#aaaaaaaa#......", -".#aaaaaa#.......", -".#aaaaaa#.......", -"..##aa##bb......", -"....##..bbbb....", -"..c....c.bddb...", -".cc.c.cc.bdddb..", -"..c....c..bdddb.", -"..c.c..c...bddb.", -"..c....c....bb.."}; +static const char * zoom_out_xpm[] = { +"16 16 111 2", +" c None", +". c #878B87", +"+ c #868C8A", +"@ c #888B89", +"# c #ACB6BF", +"$ c #CDD6DD", +"% c #E4E7E9", +"& c #929594", +"* c #CFD8E0", +"= c #D3DDE5", +"- c #A4BFDC", +"; c #99B9DA", +"> c #9AB9DA", +", c #A4BFDD", +"' c #CFDAE5", +") c #B4C9DF", +"! c #9DBDDD", +"~ c #B5CDE6", +"{ c #5C84B8", +"] c #5B84B8", +"^ c #B0CAE4", +"/ c #9ABADD", +"( c #98B9DC", +"_ c #BCD1E8", +": c #5F87B9", +"< c #FFFFFF", +"[ c #5A84B7", +"} c #ABC6E2", +"| c #91B4DA", +"1 c #868C8B", +"2 c #9DBBDA", +"3 c #B6CDE6", +"4 c #5D85B8", +"5 c #5982B7", +"6 c #A7C3E1", +"7 c #9FBDDE", +"8 c #9EBBDA", +"9 c #878B88", +"0 c #8EB2D6", +"a c #5A83B7", +"b c #5681B6", +"c c #9EBDDE", +"d c #86ACD4", +"e c #89AED4", +"f c #8AAFD7", +"g c #94B6DB", +"h c #547FB5", +"i c #507DB4", +"j c #85ACD5", +"k c #7BA5D2", +"l c #878C8B", +"m c #CFD8DE", +"n c #A7C1DD", +"o c #86ADD6", +"p c #89AED6", +"q c #4E7BB3", +"r c #4F7CB3", +"s c #8BB0D7", +"t c #A9C3DE", +"u c #D0D8DE", +"v c #888B87", +"w c #B1BAC1", +"x c #D9E1E8", +"y c #94B6DA", +"z c #96B7DB", +"A c #527EB5", +"B c #537EB5", +"C c #97B8DB", +"D c #DAE2E8", +"E c #B2BBC1", +"F c #8A8C8A", +"G c #D7DDE2", +"H c #CAD8E6", +"I c #A4C0DF", +"J c #A6C2E0", +"K c #5781B6", +"L c #D8DEE3", +"M c #949895", +"N c #DADFE3", +"O c #E1E6EA", +"P c #C7D7E8", +"Q c #BDD2E6", +"R c #BED2E6", +"S c #C8D8E8", +"T c #DFE5EA", +"U c #DBE0E4", +"V c #959896", +"W c #9DA09B", +"X c #60625F", +"Y c #8A8D8A", +"Z c #BCC1C4", +"` c #DCE0E2", +" . c #E9EBEB", +".. c #BDC2C5", +"+. c #898C88", +"@. c #878A84", +"#. c #B9BCB6", +"$. c #BDBFBC", +"%. c #61635F", +"&. c #8A8C88", +"*. c #8D918D", +"=. c #8B8D89", +"-. c #8E918D", +";. c #575955", +">. c #7A7B78", +",. c #B7B8B6", +"'. c #595B57", +"). c #555753", +"!. c #767873", +"~. c #A0A29F", +"{. c #565854", +" . + . . + . ", +" @ # $ % % $ # @ ", +" & * = - ; > , ' * & ", +" @ * ) ! ~ { ] ^ / ) * @ ", +". # ' ( _ : < < [ } | ' # . ", +"1 $ 2 3 4 < < < 5 6 7 8 $ + ", +"9 % 0 ^ [ a < < b c | d % . ", +"9 % e f g h < < i j k e % . ", +"l m n o p q < < r s p t u l ", +"v w x y z A < < B ( C D E v ", +" F G H I J K K 6 J H L . ", +" M N O P Q R S T U V W X ", +" Y Z ` . .` ..+.@.#.$.%. ", +" &.*.=.=.-.&. ;.>.@.,.'.", +" ).!.~.'.", +" ).{. "}; diff --git a/json/main.js b/json/main.js index d13345c..4e88df6 100644 --- a/json/main.js +++ b/json/main.js @@ -24,12 +24,13 @@ var main = function() { //var script = "rotate 10 20: box:axis:fsurf 'sin(pi*x*y)'"; var makeSampleScript = function() { +// var mgl = "fsurf 'x' 'rgb';value 4"; + var mgl = "origintick off\n"; mgl += "title 'qqq' '@k':ranges -2 2 -2 2 -2 2:colorbar '>'\n" // NOTE: Ranges MUST BE specified for correctly work of zoomaxis feature mgl += "facenum 50:"; mgl += "origin 0 0 0:axis :xlabel 'x':ylabel 'y':zlabel 'z':" mgl += "box:fplot 'sin(x^2)'\n"; // This is just for testing zoomaxis features - mgl += "fplot 'sin(2*pi*t)' '2*t-1' 'cos(2*pi*t)' 'm2o':fsurf 'sin(pi*x*y)':"; mgl += "text 0 0 'aaa'"; return mgl; } diff --git a/json/mathgl.Graph.js b/json/mathgl.Graph.js index fcc2153..5ae6984 100644 --- a/json/mathgl.Graph.js +++ b/json/mathgl.Graph.js @@ -336,7 +336,7 @@ mathgl.Graph.prototype.__mgl_draw_prim = function(obj, ctx, prim, scl) { mathgl.Graph.prototype.__mgl_pf = function(obj, z) { // return 1/obj.pf; - return (1-this.__fov)/obj.pf/(1-this.__fov*z/obj.depth); // TODO: check calc coordinates!!! + return (1-this.__fov/1.37)/obj.pf/(1-this.__fov*z/obj.depth); // TODO: check calc coordinates!!! // return 1/(1+obj.pf*(1-z/obj.depth)); } @@ -611,39 +611,39 @@ mathgl.Graph.prototype.zoomOut = function() { this.zoomAxis(1./1.1); } -mathgl.Graph.prototype.getView = function(mgl) { - return this.__view; +mathgl.Graph.prototype.getView = function(mgl) { + return this.__view; } -mathgl.Graph.prototype.reloadGeometry = function() { - var mgl = this.__geometry.mgl; - this.__geometry = this.__backend.geometry(mgl); - this.__geometry.mgl = mgl; +mathgl.Graph.prototype.reloadGeometry = function() { + var mgl = this.__geometry.mgl; + this.__geometry = this.__backend.geometry(mgl); + this.__geometry.mgl = mgl; } -mathgl.Graph.prototype.redraw = function() { - this.__renderStart(); +mathgl.Graph.prototype.redraw = function() { + this.__renderStart(); } -mathgl.Graph.prototype.destroy = function() { - this.__view.destroy(); +mathgl.Graph.prototype.destroy = function() { + this.__view.destroy(); this.__view = null; this.__backend = null; this.__canvas = null; this.__geometry = null; -} +} -/** @param type {String} data url type (e.g. "image/png") */ +/** @param type {String} data url type (e.g. "image/png") */ mathgl.Graph.prototype.toDataURL = function(type) { this.__canvas.toDataURL(type); } -/** Set perspective angle of view: @param val - degree of perspective in range 0...1 (0 - use default orthogonal projection) */ +/** Set perspective angle of view: @param val - degree of perspective in range 0...1 (0 - use default orthogonal projection) */ mathgl.Graph.prototype.setPerspective = function(val) { - this.__fov = val; + this.__fov = val; } -/** Set maximal number of drawable points in draft mode */ +/** Set maximal number of drawable points in draft mode */ mathgl.Graph.prototype.setMaxDraftPoints = function(count) { this.__maxDraftPoints = count; } diff --git a/json/mathgl.View.js b/json/mathgl.View.js index a203379..e06cb4a 100644 --- a/json/mathgl.View.js +++ b/json/mathgl.View.js @@ -25,6 +25,7 @@ mathgl.View = function() { this.__distance = 1.0; this.__pitch = 0; this.__yaw = 0; + this.__theta = 0; } @@ -110,6 +111,8 @@ mathgl.View.prototype.viewMatrix = function() { var sp = Math.sin(this.__pitch); var cy = Math.cos(this.__yaw); var sy = Math.sin(this.__yaw); + var ct = Math.cos(this.__theta); + var st = Math.sin(this.__theta); var lh = true; // coordinate system is left handed var distanceMatrix = $M([[1, 0, 0, 0], @@ -124,7 +127,10 @@ mathgl.View.prototype.viewMatrix = function() { [ 0, 1, 0, 0], [ sy, 0, cy, 0], [ 0, 0, 0, 1]]); - var viewMatrix = Matrix.I(4); + var viewMatrix = $M([[ ct,-st, 0, 0], + [ st, ct, 0, 0], + [ 0, 0, 1, 0], + [ 0, 0, 0, 1]]); viewMatrix = viewMatrix.x(distanceMatrix); viewMatrix = viewMatrix.x(pitchMatrix); viewMatrix = viewMatrix.x(yawMatrix); @@ -142,7 +148,10 @@ mathgl.View.prototype.__onMouseMove = function(e) { var x = e.offsetX; var y = e.offsetY; this.__yaw += 0.5 * (this.__mouseX - x) * Math.PI / 180; - this.__pitch += 0.5 * (y - this.__mouseY) * Math.PI / 180; +// if(Math.abs(Math.cos(this.__yaw))>0.3) + this.__pitch += 0.5 * (y - this.__mouseY) * Math.PI / 180; +// else +// this.__theta += 0.5 * (y - this.__mouseY) * Math.PI / 180; this.__mouseX = x; this.__mouseY = y; if(this.__pitch > 63) this.__pitch -= 20*Math.PI; diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index 6cecfe0..68ec117 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -8,7 +8,32 @@ set(mgl_clean_files "") SET_SOURCE_FILES_PROPERTIES(mathgl.i numpy.i PROPERTIES CPLUSPLUS ON) -if(MGL_HAVE_PYTHON) +FIND_PACKAGE(SWIG) +if(NOT SWIG_FOUND) + message(SEND_ERROR "Couldn't find swig needed for interfaces compiling.") +endif(NOT SWIG_FOUND) +INCLUDE(${SWIG_USE_FILE}) + +if(enable-python) + set(Python_ADDITIONAL_VERSIONS 2.7) + FIND_PACKAGE(PythonInterp) + if(NOT PYTHONINTERP_FOUND) + message(SEND_ERROR "Couldn't find python interpreter.") + endif(NOT PYTHONINTERP_FOUND) + FIND_PACKAGE(PythonLibs) + if(NOT PYTHONLIBS_FOUND) + message(SEND_ERROR "Couldn't find python development libraries.") + endif(NOT PYTHONLIBS_FOUND) + execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print numpy.get_include()" + OUTPUT_VARIABLE NUMPY_INCLUDE_PATH + RESULT_VARIABLE NUMPY_ERR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(NOT NUMPY_INCLUDE_PATH) + message(SEND_ERROR "Couldn't find numpy.") + endif(NOT NUMPY_INCLUDE_PATH) + include_directories(${PYTHON_INCLUDE_DIR}) execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(prefix='${CMAKE_INSTALL_PREFIX}')" @@ -29,9 +54,14 @@ if(MGL_HAVE_PYTHON) install(FILES ${MathGL_BINARY_DIR}/lang/mathgl.py ${MathGL_BINARY_DIR}/lang/mathgl.pyc DESTINATION ${MGL_PYTHON_SITE_PACKAGES}) install (TARGETS _mathgl LIBRARY DESTINATION ${MGL_PYTHON_SITE_PACKAGES}) set(mgl_clean_files ${mgl_clean_files} mathgl.py) -endif(MGL_HAVE_PYTHON) +endif(enable-python) + +if(enable-lua) + INCLUDE(FindLua51) + if(NOT LUA51_FOUND) + message(SEND_ERROR "Couldn't find Lua 5.1 library.") + endif(NOT LUA51_FOUND) -if(MGL_HAVE_LUA) include_directories(${LUA_INCLUDE_DIR}) set(SWIG_MODULE_mgl-lua_EXTRA_DEPS numpy.i ${src_imp_dep}) SWIG_ADD_MODULE(mgl-lua lua mathgl.i) @@ -39,9 +69,26 @@ if(MGL_HAVE_LUA) set_target_properties(mgl-lua PROPERTIES PREFIX "" BUILD_WITH_INSTALL_RPATH ON) install (TARGETS mgl-lua LIBRARY DESTINATION ${MGL_LIB_INSTALL_DIR}) -endif(MGL_HAVE_LUA) +endif(enable-lua) + +if(enable-octave) + find_program(oct_prog octave-config) + if(NOT oct_prog) + message(SEND_ERROR "Couldn't find octave-config needed for octave interfaces compiling.") + endif(NOT oct_prog) + find_program(oct_exec octave) + if(NOT oct_exec) + message(SEND_ERROR "Couldn't find octave needed for octave interfaces compiling.") + endif(NOT oct_exec) + find_program(oct_mk mkoctfile) + if(NOT oct_mk) + message(SEND_ERROR "Couldn't find mkoctfile needed for octave interfaces compiling.") + endif(NOT oct_mk) + find_program(oct_tar tar) + if(NOT oct_tar) + message(SEND_ERROR "Couldn't find tar needed for octave interfaces creation.") + endif(NOT oct_tar) -if(MGL_HAVE_OCTAVE) execute_process(COMMAND ${oct_prog} -p CANONICAL_HOST_TYPE OUTPUT_VARIABLE oct_host OUTPUT_STRIP_TRAILING_WHITESPACE) @@ -82,5 +129,5 @@ message(STATUS "${oct_prog} ${oct_host} ${oct_api}") WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang )") endif(enable-octave-install) set(mgl_clean_files ${mgl_clean_files} mathgl) -endif(MGL_HAVE_OCTAVE) +endif(enable-octave) set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mgl_clean_files}") diff --git a/lang/data.i b/lang/data.i index 77dd22d..1435bbe 100644 --- a/lang/data.i +++ b/lang/data.i @@ -31,34 +31,37 @@ public: bool link; ///< use external data (i.e. don't free it) /// Initiate by other mglData variable - inline mglData(const mglData &d) { a=0; mgl_data_set(this,&d); } // NOTE: must be constructor for mglData& to exclude copy one - inline mglData(const mglData *d) { a=0; mgl_data_set(this, d); } - inline mglData(bool, mglData *d) // NOTE: Variable d will be deleted!!! + mglData(const mglData &d) { a=0; mgl_data_set(this,&d); } // NOTE: must be constructor for mglData& to exclude copy one + mglData(const mglData *d) { a=0; mgl_data_set(this, d); } + mglData(bool, mglData *d) // NOTE: Variable d will be deleted!!! { if(d) { nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=0; id=d->id; link=d->link; delete d; } else { a=0; Create(1); } } /// Initiate by flat array - inline mglData(int size, const float *d) { a=0; Set(d,size); } - inline mglData(int rows, int cols, const float *d) { a=0; Set(d,cols,rows); } - inline mglData(int size, const double *d) { a=0; Set(d,size); } - inline mglData(int rows, int cols, const double *d) { a=0; Set(d,cols,rows); } - inline mglData(const double *d, int size) { a=0; Set(d,size); } - inline mglData(const double *d, int rows, int cols) { a=0; Set(d,cols,rows); } + mglData(int size, const float *d) { a=0; Set(d,size); } + mglData(int rows, int cols, const float *d) { a=0; Set(d,cols,rows); } + mglData(int size, const double *d) { a=0; Set(d,size); } + mglData(int rows, int cols, const double *d) { a=0; Set(d,cols,rows); } + mglData(const double *d, int size) { a=0; Set(d,size); } + mglData(const double *d, int rows, int cols) { a=0; Set(d,cols,rows); } + mglData(const float *d, int size) { a=0; Set(d,size); } + mglData(const float *d, int rows, int cols) { a=0; Set(d,cols,rows); } /// Read data from file - inline mglData(const char *fname) { a=0; Read(fname); } + mglData(const char *fname) { a=0; Read(fname); } /// Allocate the memory for data array and initialize it zero - inline mglData(long xx=1,long yy=1,long zz=1) { a=0; Create(xx,yy,zz); } + mglData(long xx=1,long yy=1,long zz=1) { a=0; Create(xx,yy,zz); } /// Delete the array virtual ~mglData() { if(!link && a) delete []a; } - inline mreal GetVal(long i, long j=0, long k=0) + + inline mreal GetVal(long i, long j=0, long k=0) const { return mgl_data_get_value(this,i,j,k);} inline void SetVal(mreal f, long i, long j=0, long k=0) { mgl_data_set_value(this,f,i,j,k); } /// Get sizes - inline long GetNx() const { return nx; } - inline long GetNy() const { return ny; } - inline long GetNz() const { return nz; } + long GetNx() const { return nx; } + long GetNy() const { return ny; } + long GetNz() const { return nz; } /// Link external data array (don't delete it at exit) inline void Link(mreal *A, long NX, long NY=1, long NZ=1) @@ -134,15 +137,18 @@ public: inline void Modify(const char *eq,const mglData &vdat) { mgl_data_modify_vw(this,eq,&vdat,0); } /// Modify the data by specified formula assuming x,y,z in range [r1,r2] - inline void Fill(mglBase *gr, const char *eq, const char *opt="") + inline void Fill(HMGL gr, const char *eq, const char *opt="") { mgl_data_fill_eq(gr,this,eq,0,0,opt); } - inline void Fill(mglBase *gr, const char *eq, const mglData &vdat, const char *opt="") + inline void Fill(HMGL gr, const char *eq, const mglData &vdat, const char *opt="") { mgl_data_fill_eq(gr,this,eq,&vdat,0,opt); } - inline void Fill(mglBase *gr, const char *eq, const mglData &vdat, const mglData &wdat,const char *opt="") + inline void Fill(HMGL gr, const char *eq, const mglData &vdat, const mglData &wdat,const char *opt="") { mgl_data_fill_eq(gr,this,eq,&vdat,&wdat,opt); } /// Equidistantly fill the data to range [x1,x2] in direction dir inline void Fill(mreal x1,mreal x2=NaN,char dir='x') - { return mgl_data_fill(this,x1,x2,dir); } + { mgl_data_fill(this,x1,x2,dir); } + /// Fill the data by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in range [p1,p2] using global spline + inline void RefillGS(const mglData &xdat, const mglData &vdat, mreal x1, mreal x2,long sl=-1) + { mgl_data_refill_gs(this,&xdat,&vdat,x1,x2,sl); } /// Fill the data by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in range [p1,p2] inline void Refill(const mglData &xdat, const mglData &vdat, mreal x1, mreal x2,long sl=-1) { mgl_data_refill_x(this,&xdat,&vdat,x1,x2,sl); } @@ -153,14 +159,14 @@ public: inline void Refill(const mglData &xdat, const mglData &ydat, const mglData &zdat, const mglData &vdat, mglPoint p1, mglPoint p2) { mgl_data_refill_xyz(this,&xdat,&ydat,&zdat,&vdat,p1.x,p2.x,p1.y,p2.y,p1.z,p2.z); } /// Fill the data by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range of gr - inline void Refill(mglBase *gr, const mglData &xdat, const mglData &vdat, long sl=-1, const char *opt="") + inline void Refill(HMGL gr, const mglData &xdat, const mglData &vdat, long sl=-1, const char *opt="") { mgl_data_refill_gr(gr,this,&xdat,0,0,&vdat,sl,opt); } - inline void Refill(mglBase *gr, const mglData &xdat, const mglData &ydat, const mglData &vdat, long sl=-1, const char *opt="") + inline void Refill(HMGL gr, const mglData &xdat, const mglData &ydat, const mglData &vdat, long sl=-1, const char *opt="") { mgl_data_refill_gr(gr,this,&xdat,&ydat,0,&vdat,sl,opt); } - inline void Refill(mglBase *gr, const mglData &xdat, const mglData &ydat, const mglData &zdat, const mglData &vdat, const char *opt="") + inline void Refill(HMGL gr, const mglData &xdat, const mglData &ydat, const mglData &zdat, const mglData &vdat, const char *opt="") { mgl_data_refill_gr(gr,this,&xdat,&ydat,&zdat,&vdat,-1,opt); } -/// Set the data by triangulated surface values assuming x,y,z in axis range of gr - inline void Grid(mglBase *gr, const mglData &x, const mglData &y, const mglData &z, const char *opt="") + /// Set the data by triangulated surface values assuming x,y,z in axis range of gr + inline void Grid(HMGL gr, const mglData &x, const mglData &y, const mglData &z, const char *opt="") { mgl_data_grid(gr,this,&x,&y,&z,opt); } /// Set the data by triangulated surface values assuming x,y,z in range [p1, p2] inline void Grid(const mglData &xdat, const mglData &ydat, const mglData &vdat, mglPoint p1, mglPoint p2) @@ -222,6 +228,10 @@ public: { return mglData(true,mgl_data_subdata(this,xx,yy,zz)); } inline mglData SubData(const mglData &xx, const mglData &yy, const mglData &zz) const { return mglData(true,mgl_data_subdata_ext(this,&xx,&yy,&zz)); } + inline mglData SubData(const mglData &xx, const mglData &yy) const + { return mglData(true,mgl_data_subdata_ext(this,&xx,&yy,0)); } + inline mglData SubData(const mglData &xx) const + { return mglData(true,mgl_data_subdata_ext(this,&xx,0,0)); } /// Get trace of the data array inline mglData Trace() const { return mglData(true,mgl_data_trace(this)); } @@ -313,6 +323,15 @@ public: inline void FillSample(const char *how) { mgl_data_fill_sample(this,how); } + /// Return an approximated x-value (root) when dat(x) = val + inline mreal Solve(mreal val, bool use_spline=true, long i0=0) const + { return mgl_data_solve_1d(this, val, use_spline, i0); } + /// Return an approximated value (root) when dat(x) = val + inline mglData Solve(mreal val, char dir, bool norm=true) const + { return mglData(true,mgl_data_solve(this, val, dir, 0, norm)); } + inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const + { return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); } + /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] inline mreal Spline(mreal x,mreal y=0,mreal z=0) const { return mgl_data_spline(this, x,y,z); } @@ -325,14 +344,6 @@ public: /// Interpolate by line the data to given point x,\a y,\a z which normalized in range [0, 1] inline mreal Linear1(mreal x,mreal y=0,mreal z=0) const { return mgl_data_linear(this,x*(nx-1),y*(ny-1),z*(nz-1)); } - /// Return an approximated x-value (root) when dat(x) = val - inline mreal Solve(mreal val, bool use_spline=true, long i0=0) const - { return mgl_data_solve_1d(this, val, use_spline, i0); } - /// Return an approximated value (root) when dat(x) = val - inline mglData Solve(mreal val, char dir, bool norm=true) const - { return mglData(true,mgl_data_solve(this, val, dir, 0, norm)); } - inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const - { return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); } /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] inline mreal Spline(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const @@ -358,6 +369,10 @@ public: inline mreal Maximal() const { return mgl_data_max(this); } /// Get minimal value of the data inline mreal Minimal() const { return mgl_data_min(this); } + /// Get maximal value of the data which is less than 0 + inline mreal MaximalNeg() const { return mgl_data_neg_max(this); } + /// Get minimal value of the data which is larger than 0 + inline mreal MinimalPos() const { return mgl_data_pos_min(this); } /// Get maximal value of the data and its position inline mreal Maximal(long &i,long &j,long &k) const { return mgl_data_max_int(this,&i,&j,&k); } @@ -390,10 +405,10 @@ public: { return mgl_data_find_any(this,cond); } /// Copy data from other mglData variable - inline mglData &operator=(const mglData &d) - { if(this!=&d) Set(d.a,d.nx,d.ny,d.nz); return *this; } + inline const mglData &operator=(const mglData &d) + { if(this!=&d) mgl_data_set(this,&d); return d; } inline mreal operator=(mreal val) - { for(long i=0;iSelf(), pr, fp, print); } - /// Return type of command: 0 - not found, 1 - data plot, 2 - other plot, + /// Return type of command: 0 - not found, 1 - other data plot, 2 - func plot, /// 3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program /// 8 - 1d plot, 9 - 2d plot, 10 - 3d plot, 11 - dd plot, 12 - vector plot /// 13 - axis, 14 - primitives, 15 - axis setup, 16 - text/legend, 17 - data transform @@ -1256,16 +1323,23 @@ public: /// Find variable with given name or add a new one /// NOTE !!! You must not delete obtained data arrays !!! - inline mglVar *AddVar(const char *name) - { return dynamic_cast(mgl_parser_add_var(pr, name)); } - inline mglVar *AddVar(const wchar_t *name) - { return dynamic_cast(mgl_parser_add_varw(pr, name)); } + inline mglData *AddVar(const char *name) + { return mgl_parser_add_var(pr, name); } + inline mglData *AddVar(const wchar_t *name) + { return mgl_parser_add_varw(pr, name); } /// Find variable with given name or return NULL if no one /// NOTE !!! You must not delete obtained data arrays !!! - inline mglVar *FindVar(const char *name) - { return dynamic_cast(mgl_parser_find_var(pr, name)); } - inline mglVar *FindVar(const wchar_t *name) - { return dynamic_cast(mgl_parser_find_varw(pr, name)); } + inline mglData *FindVar(const char *name) + { return mgl_parser_find_var(pr, name); } + inline mglData *FindVar(const wchar_t *name) + { return mgl_parser_find_varw(pr, name); } + /// Get variable with given id. Can be NULL for temporary ones. + /// NOTE !!! You must not delete obtained data arrays !!! + inline mglData *GetVar(unsigned long id) + { return mgl_parser_get_var(pr,id); } + /// Get number of variables + inline long GetNumVar() + { return mgl_parser_num_var(pr); } /// Delete variable with name inline void DeleteVar(const char *name) { mgl_parser_del_var(pr, name); } inline void DeleteVar(const wchar_t *name) { mgl_parser_del_varw(pr, name); } @@ -1273,37 +1347,3 @@ public: void DeleteAll() { mgl_parser_del_all(pr); } }; //----------------------------------------------------------------------------- -/// Wrapper class expression evaluating -class mglExpr -{ - HMEX ex; -public: - mglExpr(const char *expr) { ex = mgl_create_expr(expr); } - ~mglExpr() { mgl_delete_expr(ex); } - /// Return value of expression for given x,y,z variables - inline double Eval(double x, double y=0, double z=0) - { return mgl_expr_eval(ex,x,y,z); } - /// Return value of expression differentiation over variable dir for given x,y,z variables - inline double Diff(char dir, double x, double y=0, double z=0) - { return mgl_expr_diff(ex,dir, x,y,z); } -}; -//----------------------------------------------------------------------------- -/// Wrapper class expression evaluating -class mglExprC -{ - HAEX ex; -public: - mglExprC(const char *expr) { ex = mgl_create_cexpr(expr); } - ~mglExprC() { mgl_delete_cexpr(ex); } - /// Return value of expression for given x,y,z variables - inline dual Eval(dual x, dual y=0, dual z=0) - { return mgl_cexpr_eval(ex,x,y,z); } - /// Return value of expression for given x,y,z,u,v,w variables - inline dual Eval(dual x, dual y, dual z, dual u, dual v, dual w) - { - dual var[26]; - var['x'-'a']=x; var['y'-'a']=y; var['z'-'a']=z; - var['u'-'a']=u; var['v'-'a']=v; var['w'-'a']=w; - return mgl_cexpr_eval_v(ex,var); } -}; -//----------------------------------------------------------------------------- diff --git a/mgllab/CMakeLists.txt b/mgllab/CMakeLists.txt deleted file mode 100644 index f64ad22..0000000 --- a/mgllab/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -if(MGL_HAVE_FLTK) - include_directories(${FLTK_INCLUDE_DIR}) - set(mgl_lab_src animate.cpp editor.cpp help.cpp mathgl.cpp setup.cpp write.cpp data.cpp grid.cpp main.cpp option.cpp table.cpp) - add_executable(mgllab ${mgl_lab_src}) - target_link_libraries(mgllab mgl mgl-fltk ${FLTK_LIBRARIES}) - install( - TARGETS mgllab - RUNTIME DESTINATION bin ) -endif(MGL_HAVE_FLTK) - diff --git a/mgllab/animate.cpp b/mgllab/animate.cpp deleted file mode 100644 index c6de245..0000000 --- a/mgllab/animate.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/* animate.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -struct ArgumentDlg -{ -public: - Fl_Window* wnd; - int OK; - Fl_Input *a[10]; - - ArgumentDlg() { memset(this,0,sizeof(ArgumentDlg)); create_dlg(); } - ~ArgumentDlg() { delete wnd; } - void FillResult(); -protected: - void create_dlg(); -} argument_dlg; -//----------------------------------------------------------------------------- -void argument_dlg_cb(Fl_Widget *, void *v) -{ argument_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void ArgumentDlg::create_dlg() -{ - wnd = new Fl_Window(325, 275, gettext("Script arguments")); - a[1] = new Fl_Input(10, 25, 150, 25, gettext("Value for $1")); a[1]->align(FL_ALIGN_TOP_LEFT); - a[2] = new Fl_Input(165, 25, 150, 25, gettext("Value for $2")); a[2]->align(FL_ALIGN_TOP_LEFT); - a[3] = new Fl_Input(10, 70, 150, 25, gettext("Value for $3")); a[3]->align(FL_ALIGN_TOP_LEFT); - a[4] = new Fl_Input(165, 70, 150, 25, gettext("Value for $4")); a[4]->align(FL_ALIGN_TOP_LEFT); - a[5] = new Fl_Input(10, 115, 150, 25, gettext("Value for $5")); a[5]->align(FL_ALIGN_TOP_LEFT); - a[6] = new Fl_Input(165, 115, 150, 25, gettext("Value for $6"));a[6]->align(FL_ALIGN_TOP_LEFT); - a[7] = new Fl_Input(10, 160, 150, 25, gettext("Value for $7")); a[7]->align(FL_ALIGN_TOP_LEFT); - a[8] = new Fl_Input(165, 160, 150, 25, gettext("Value for $8"));a[8]->align(FL_ALIGN_TOP_LEFT); - a[9] = new Fl_Input(10, 205, 150, 25, gettext("Value for $9")); a[9]->align(FL_ALIGN_TOP_LEFT); - a[0] = new Fl_Input(165, 205, 150, 25, gettext("Value for $0"));a[0]->align(FL_ALIGN_TOP_LEFT); - - Fl_Button *o; - o = new Fl_Button(75, 240, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(175, 240, 75, 25, gettext("OK")); o->callback(argument_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void ArgumentDlg::FillResult() -{ - if(a[0]->value()[0]) Parse->AddParam(0,a[0]->value()); - if(a[1]->value()[0]) Parse->AddParam(1,a[1]->value()); - if(a[2]->value()[0]) Parse->AddParam(2,a[2]->value()); - if(a[3]->value()[0]) Parse->AddParam(3,a[3]->value()); - if(a[4]->value()[0]) Parse->AddParam(4,a[4]->value()); - if(a[5]->value()[0]) Parse->AddParam(5,a[5]->value()); - if(a[6]->value()[0]) Parse->AddParam(6,a[6]->value()); - if(a[7]->value()[0]) Parse->AddParam(7,a[7]->value()); - if(a[8]->value()[0]) Parse->AddParam(8,a[8]->value()); - if(a[9]->value()[0]) Parse->AddParam(9,a[9]->value()); -} -//----------------------------------------------------------------------------- -void argument_cb(Fl_Widget *, void *) -{ - ArgumentDlg *s = &argument_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) s->FillResult(); -} -//----------------------------------------------------------------------------- -void argument_set(int n, const char *s) -{ - if(n<0 || n>9) return; - Parse->AddParam(n,s); - argument_dlg.a[n]->value(s); -} -//----------------------------------------------------------------------------- -AnimateDlg animate_dlg; -//----------------------------------------------------------------------------- -void animate_dlg_cb(Fl_Widget *, void *v) -{ - animate_dlg.swap = false; - if(!animate_dlg.rt->value() && !animate_dlg.rv->value()) - fl_message(gettext("You have to select textual string or numeric cycle")); - else if(animate_dlg.rv->value() && animate_dlg.dx->value()==0) - fl_message(gettext("You have to set nonzero step in cycle")); - else - { - double t0=atof(animate_dlg.x0->value()), t1=atof(animate_dlg.x1->value()), dt=atof(animate_dlg.dx->value()); - if((t1-t0)*dt<0) - { - if(fl_ask(gettext("Order of first and last value is wrong. Swap it?"))) - { - char s[32]; snprintf(s,32,"%g",t0); - animate_dlg.x0->value(animate_dlg.x1->value()); - animate_dlg.x1->value(s); - } - else - { fl_message(gettext("Wrong boundaries")); return; } - } - animate_dlg.OK = true; ((Fl_Window *)v)->hide(); - } -} -//----------------------------------------------------------------------------- -void animate_rad_cb(Fl_Widget *, void *v) -{ - animate_dlg.rt->value(0); - animate_dlg.rv->value(0); - ((Fl_Round_Button *)v)->value(1); -} -//----------------------------------------------------------------------------- -void animate_put_cb(Fl_Widget *, void *) -{ - if(animate_dlg.rt->value()) - { - if(animate_dlg.txt->value()==0 || strlen(animate_dlg.txt->value())==0) return; - char *s = new char[1+strlen(animate_dlg.txt->value())], *a=s; - strcpy(s, animate_dlg.txt->value()); - for(int i=0;s[i]!=0;i++) - { - if(s[i]=='\n') - { - s[i] = 0; - textbuf->append("\n##a "); - textbuf->append(a); - a = s+i+1; - } - } - if(*a) - { textbuf->append("\n##a "); textbuf->append(a); } - delete []s; - } - else if(animate_dlg.rv->value()) - { - char *s = new char[128]; - snprintf(s,128,"\n##c %s %s %s",animate_dlg.x0->value(),animate_dlg.x1->value(),animate_dlg.dx->value()); - textbuf->append(s); - delete []s; - } -} -//----------------------------------------------------------------------------- -void AnimateDlg::create_dlg() -{ - wnd = new Fl_Window(335, 350, gettext("Animation")); - new Fl_Box(10, 5, 315, 25, gettext("Redraw picture for $0 equal to:")); - rt = new Fl_Round_Button(10, 30, 200, 25, gettext("strings in lines below")); - rt->callback(animate_rad_cb, rt); - rv = new Fl_Round_Button(220, 30, 105, 25, gettext("values")); - rv->callback(animate_rad_cb, rv); - txt = new Fl_Multiline_Input(10, 60, 200, 250); - x0 = new Fl_Float_Input(220, 80, 105, 25, gettext("from")); x0->align(FL_ALIGN_TOP_LEFT); - x1 = new Fl_Float_Input(220, 130, 105, 25, gettext("to")); x1->align(FL_ALIGN_TOP_LEFT); - dx = new Fl_Float_Input(220, 180, 105, 25, gettext("with step")); dx->align(FL_ALIGN_TOP_LEFT); - - Fl_Button *o; - o = new Fl_Button(230, 215, 80, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(230, 250, 80, 25, gettext("OK")); o->callback(animate_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - save = new Fl_Check_Button(220, 285, 105, 25, gettext("save slides")); - save->tooltip(gettext("Keep slides in memory (faster animation but require more memory)")); - save->down_box(FL_DOWN_BOX); save->hide(); - - o = new Fl_Button(10, 315, 100, 25, gettext("Put to script")); o->callback(animate_put_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - dt = new Fl_Float_Input(220, 315, 105, 25, gettext("Delay (in sec)"));// dx->align(FL_ALIGN_TOP_LEFT); - - wnd->end(); -} -//----------------------------------------------------------------------------- -void AnimateDlg::FillResult(Fl_MGL* e) -{ - e->NArgs = e->ArgCur = 0; - if(e->ArgBuf) delete [](e->ArgBuf); e->ArgBuf = 0; - e->AnimDelay = atof(dt->value()); - if(rt->value()) - { - char *s; - e->ArgBuf = new char[1+strlen(txt->value())]; - strncpy(e->ArgBuf, txt->value(),32); - s = e->Args[0] = e->ArgBuf; e->NArgs = 1; - for(int i=0;s[i]!=0;i++) - if(s[i]=='\n') - { - s[i] = 0; e->Args[e->NArgs] = s+i+1; e->NArgs += 1; - } - if(e->Args[e->NArgs-1][0]==0) e->NArgs -= 1; - } - else if(rv->value() && atof(dx->value())) - { - double t0=atof(x0->value()), t1=atof(x1->value()), dt=atof(dx->value()), t; - if((t1-t0)/dt<1) - { - e->ArgBuf = new char[32]; snprintf(e->ArgBuf,32,"%g",t0); - e->NArgs = 1; e->Args[0] = e->ArgBuf; return; - } - if((t1-t0)/dt>999) - { - fl_message(gettext("Too many slides. Reduce to 1000 slides.")); - dt = (t1-t0)/998; - } - e->ArgBuf = new char[32*int(1+(t1-t0)/dt)]; - for(t=t0;(dt>0&&t<=t1)||(dt<0&&t>=t1);t+=dt) - { - snprintf(e->ArgBuf + 32*e->NArgs,32,"%g\0",t); - e->Args[e->NArgs] = e->ArgBuf + 32*e->NArgs; - e->NArgs += 1; - } - } - else fl_message(gettext("No selection. So nothing to do")); -} -//----------------------------------------------------------------------------- -void animate_cb(Fl_Widget *, void *v) -{ - ScriptWindow* e = (ScriptWindow*)v; - AnimateDlg *s = &animate_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) s->FillResult(e->graph); -} -//----------------------------------------------------------------------------- -void cpy_arg_buf(const char *str, long *size, char **buf) -{ - const char *end; - for(end=str; *end>' '; end++); - if(end>=str+*size) - { *size = end-str+1; *buf = (char *)realloc(*buf,*size); } - memset(*buf,0,*size); - strncpy(*buf,str,end-str); -} -//----------------------------------------------------------------------------- -void fill_animate(const char *text) -{ - long size=128,i; - const char *str = text; - char *buf = (char *)malloc(size), tmp[4]="#$0"; - for(i=0;i<10;i++) // first read script arguments (if one) - { - tmp[2] = '0'+i; - if((str=strstr(text,tmp))) - { - str+=3; - while(*str>0 && *str<=' ' && *str!='\n') str++; - cpy_arg_buf(str,&size,&buf); - argument_dlg.a[i]->value(buf); - Parse->AddParam(i,buf); - } - } - - char *a = (char *)malloc(size); - memset(a,0,size); i = 0; - str = text; - while((str = strstr(str, "##"))) // now read animation parameters - { - if(str[2]=='a') - { - str += 3; - while(*str>0 && *str<=' ' && *str!='\n') str++; - if(*str==0 || *str=='\n') return; // empty comment - cpy_arg_buf(str,&size,&buf); - if(i==0) Parse->AddParam(0,buf); // put first value as $0 - i += strlen(buf)+1; - if(i>=size) - { - size = (1+ (i+2)/128)*128; - a = (char *)realloc(a,size); - } - strcat(a,buf); strcat(a,"\n"); - } - if(str[2]=='c') - { - str += 3; - register long j=0,l=strlen(str); - char *s=new char[l+1],*s1=0,*s2=0,*s3=0; - bool sp=true; strcpy(s,str); - for(j=0;jvalue(s1); - animate_dlg.x1->value(s2); - animate_dlg.dx->value(s3); - animate_dlg.rv->value(1); - } - delete []s; - } - } - if(i) - { animate_dlg.txt->value(a); animate_dlg.rt->value(1); } - free(buf); free(a); -} diff --git a/mgllab/data.cpp b/mgllab/data.cpp deleted file mode 100644 index f84d34d..0000000 --- a/mgllab/data.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/* data.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -void option_in_cb(Fl_Widget *, void *v); -void style_in_cb(Fl_Widget *, void *v); -//----------------------------------------------------------------------------- -struct VarDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Choice *var; - Fl_Spinner *dim1, *dim2, *dim3; - VarDlg() { memset(this,0,sizeof(VarDlg)); create_dlg(); } - ~VarDlg() { delete wnd; } - void create_dlg(); - char *get_result(); - void init(); -} var_dlg; -//----------------------------------------------------------------------------- -void VarDlg::init() -{ - char ss[1024]; - var->clear(); - mglVar *v=Parse->FindVar(""); - while(v) - { - wcstombs(ss,v->s.c_str(),1024); - var->add(ss,0,0,v); - v = v->next; - } -} -//----------------------------------------------------------------------------- -char *VarDlg::get_result() -{ - static char res[64]; - char a1[16]=":",a2[16]=":",a3[16]=":"; - res[0]=0; - if(var->value()<0) return res; - const Fl_Menu_Item m=var->menu()[var->value()]; - if(m.text[0]) - { - if(dim3->value()>=0) - { - if(dim1->value()>=0) snprintf(a1,16,"%g",dim1->value()); - if(dim2->value()>=0) snprintf(a2,16,"%g",dim2->value()); - snprintf(a3,16,"%g",dim3->value()); - snprintf(res,64,"%s(%s,%s,%s)",m.text,a1,a2,a3); - } - else if(dim2->value()>=0) - { - if(dim1->value()>=0) snprintf(a1,16,"%g",dim1->value()); - snprintf(a2,16,"%g",dim2->value()); - snprintf(res,64,"%s(%s,%s)",m.text,a1,a2); - } - else if(dim1->value()>=0) - { - snprintf(a1,16,"%g",dim1->value()); - snprintf(res,64,"%s(%s)",m.text,a1); - } - else strncpy(res,m.text,64); - } - return res; -} -//----------------------------------------------------------------------------- -void var_chg_cb(Fl_Widget *, void *) -{ - const Fl_Menu_Item m=var_dlg.var->menu()[var_dlg.var->value()]; - if(m.text[0] && m.user_data()) - { - mglVar *a = (mglVar *)m.user_data(); - var_dlg.dim1->range(-1,a->nx-1); - var_dlg.dim2->range(-1,a->ny-1); - var_dlg.dim3->range(-1,a->nz-1); - } -} -//----------------------------------------------------------------------------- -void var_in_cb(Fl_Widget *, void *v) -{ - Fl_Input *e = (Fl_Input*)v; - VarDlg *s = &var_dlg; - s->OK = false; - s->init(); - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) e->value(s->get_result()); -} -//----------------------------------------------------------------------------- -void var_dlg_cb(Fl_Widget *, void *v) -{ var_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void VarDlg::create_dlg() -{ - wnd = new Fl_Double_Window(190, 180, gettext("Variable")); - var = new Fl_Choice(100, 10, 75, 25, gettext("Variable name")); // !!! add variables here !!! - var->callback(var_chg_cb); - dim1 = new Fl_Spinner(100, 40, 75, 25, gettext("First index")); - dim1->range(-1,0); dim1->value(-1); dim1->step(1); - dim1->tooltip(gettext("Value of first dimensions (-1 for all range)")); - dim2 = new Fl_Spinner(100, 70, 75, 25, gettext("Second index")); - dim2->range(-1,0); dim2->value(-1); dim2->step(1); - dim2->tooltip(gettext("Value of second dimensions (-1 for all range)")); - dim3 = new Fl_Spinner(100, 100, 75, 25, gettext("Third index")); - dim3->range(-1,0); dim3->value(-1); dim3->step(1); - dim3->tooltip(gettext("Value of third dimensions (-1 for all range)")); - Fl_Button *o; - o = new Fl_Button(15, 140, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o = new Fl_Return_Button(100, 140, 75, 25, gettext("OK")); o->callback(var_dlg_cb,wnd); - wnd->end(); -} -//----------------------------------------------------------------------------- -const char *cmds[]={ -"plot|area|bars|barh|boxplot|chart|error|mark|region|stem|step|tens|textmark|torus|tube", -"surf|axial|belt|boxs|cont|contd|contf|dens|fall|grid2|mesh|tile|grad", -"surf3|cloud|beam|cont3|conta|contf3|contfa|dens3|densa|grid3|grida", -"map|stfa|surfa|surfc|tile|surf3a|surf3c", -"flow|pipe|traj|vect|vectc|vectl|dew", -"contx|conty|contz|contfx|contfy|contfz|densx|densy|densz|triplot|tricont|quadplot|crust|dots", -"text|title|fgets|legend|addlegend|clearlegend|legendbox", -"new|var|copy|delete|insert|read|readmat|readall|readhdf|save|savehdf|export|import|info|idset", -"fill|fillsample|modify|put|crop|extend|rearrange|squeeze|transpose|cumsum|diff|diff2|sinfft|cosfft|hankel|envelop|integrate|mirror|norm|normsl|sew|smooth|swap|roll|addto|subto|divto|multo", -"combine|evaluate|max|min|hist|jacobian|momentum|resize|sum|trace|transform|transforma|stfad|pde|qo2d|ray", -"axis|box|colorbar|grid|xlabel|ylabel|zlabel|tlabel", -"alpha|alphadef|transparent|transptype|ambient|light|fog|arrowsize|barwidth|linewidth|marksize|plotfactor|zoom|cut|axialdir|mesgnum|font|palette|rotatetext", -"axis|ranges|caxis|crange|xrange|yrange|zrange|origin|ternary|adjust|ctick|xtick|ytick|ztick|ticklen|tickstl", -"subplot|inplot|rotate|aspect|columnplot|perspective", -"call|func|chdir|define|if|elseif|else|endif|for|next|once|stop|write|setsize", -"fit|fits|putsfit", -"fplot|fsurf|ball|cone|curve|drop|facex|facey|facez|line|rect|sphere"}; -const char *first[]={"plot", "surf", "surf3", "map", "flow", "contx", "text", "new", "fill", "combine", "alpha", "axis", "subplot", "call", "fit", "fplot"}; -const char *cmd_types="1D plots|2D plots|3D plots|Dual plots|Vector plots|Other plots|Text and legend|Create data and I-O|Data handling|Data extraction|Axis and colorbar|General setup|Axis setup|Scale and rotate|Program flow|Nonlinear fitting|Primitives"; -//----------------------------------------------------------------------------- -void data_file(char *fn) -{ - static int num=0; - static char name[32], res[256]; - snprintf(name,32,"mgl_%d",num); num++; - mglData *v = Parse->AddVar(name); - v->Read(fn); - if(v->nz>1) - snprintf(res,256,"#read %s '%s'\nrotate 40 60\ncrange %s\nbox\nsurf3 %s\n", name, fn, name, name); - else if(v->ny>1) - snprintf(res,256,"#read %s '%s'\nrotate 40 60\ncrange %s\nzrange %s\nbox\nsurf %s\n", name, fn, name, name, name); - else - snprintf(res,256,"#read %s '%s'\nyrange %s\nbox\nplot %s\n", name, fn, name, name); - textbuf->text(res); -} -//----------------------------------------------------------------------------- -// -// New Command dialog -// -//----------------------------------------------------------------------------- -struct CmdDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Choice *type, *cmd; - Fl_Input *var_x, *var_y, *var_z, *var_u, *var_v, *var_w; - Fl_Box *fmt, *dsc; - Fl_Input *stl, *zval, *par1, *par2, *opt; - Fl_Help_View *help; - - CmdDlg() { memset(this,0,sizeof(CmdDlg)); create_dlg(); } - ~CmdDlg() { delete wnd; } - void create_dlg(); - char *get_result(); -} cmd_dlg; -//----------------------------------------------------------------------------- -void cmd_dlg_cb(Fl_Widget *, void *v) // add variables checking -{ cmd_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void type_cmd_cb(Fl_Widget *, void *) -{ - int val = cmd_dlg.type->value(); - if(val>=0 && val<16) - { - cmd_dlg.cmd->clear(); cmd_dlg.cmd->add(cmds[val]); - cmd_dlg.dsc->copy_label(Parse->CmdDesc(first[val])); - cmd_dlg.fmt->copy_label(Parse->CmdFormat(first[val])); - - static char str[300]; // load help for command -#ifdef WIN32 - snprintf(str,300,"%s\\mgl_en.html#%s",docdir,first[val]); -#else - snprintf(str,300,"%s/mgl_en.html#%s",docdir,first[val]); -#endif - cmd_dlg.help->load(str); - } - cmd_dlg.cmd->value(0); -} -//----------------------------------------------------------------------------- -void desc_cmd_cb(Fl_Widget *, void *) -{ - const char *name = cmd_dlg.cmd->mvalue()->text; - cmd_dlg.dsc->copy_label(Parse->CmdDesc(name)); - cmd_dlg.fmt->copy_label(Parse->CmdFormat(name)); - - static char str[300]; // load help for command -#ifdef WIN32 - snprintf(str,300,"%s\\mgl_en.html#%s",docdir,name); -#else - snprintf(str,300,"%s/mgl_en.html#%s",docdir,name); -#endif - cmd_dlg.help->load(str); -} -//----------------------------------------------------------------------------- -void CmdDlg::create_dlg() -{ - Fl_Button *o; - wnd = new Fl_Double_Window(500, 450, gettext("Command properties")); - type = new Fl_Choice(90, 10, 170, 25, gettext("Type of plot")); - type->tooltip(gettext("Select one of general types of plot")); - cmd = new Fl_Choice(350, 10, 100, 25, gettext("Command")); - cmd->tooltip(gettext("Select kind of plot in this group")); - - fmt = new Fl_Box(0, 40, 500, 25); - fmt->box(UDAV_DOWN_BOX); - fmt->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - fmt->tooltip(gettext("Format of command and its arguments")); - dsc = new Fl_Box(0, 70, 500, 25); - dsc->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - dsc->tooltip(gettext("Short command description")); - - type->callback(type_cmd_cb,cmd); cmd->callback(desc_cmd_cb,0); - type->add(gettext(cmd_types)); type_cmd_cb(0,0); - - var_x = new Fl_Input(15, 115, 50, 25, "X"); var_x->align(FL_ALIGN_TOP); - o = new Fl_Button(65, 115, 25, 25, ".."); o->callback(var_in_cb,var_x); - var_y = new Fl_Input(95, 115, 50, 25, "Y"); var_y->align(FL_ALIGN_TOP); - o = new Fl_Button(145, 115, 25, 25, ".."); o->callback(var_in_cb,var_y); - var_z = new Fl_Input(175, 115, 50, 25, "Z"); var_z->align(FL_ALIGN_TOP); - o = new Fl_Button(225, 115, 25, 25, ".."); o->callback(var_in_cb,var_z); - var_u = new Fl_Input(255, 115, 50, 25, gettext("Vx or A")); var_u->align(FL_ALIGN_TOP); - o = new Fl_Button(305, 115, 25, 25, ".."); o->callback(var_in_cb,var_u); - var_v = new Fl_Input(335, 115, 50, 25, gettext("Vy or C")); var_v->align(FL_ALIGN_TOP); - o = new Fl_Button(385, 115, 25, 25, ".."); o->callback(var_in_cb,var_v); - var_w = new Fl_Input(415, 115, 50, 25, "Vz");var_w->align(FL_ALIGN_TOP); - o = new Fl_Button(465, 115, 25, 25, ".."); o->callback(var_in_cb,var_w); - - stl = new Fl_Input(15, 165, 50, 25, gettext("Style")); - stl->align(FL_ALIGN_TOP); stl->tooltip(gettext("String argument with command style (or scheme or font)")); - o = new Fl_Button(65, 165, 25, 25, ".."); o->callback(style_in_cb, stl); - - zval = new Fl_Input(95, 165, 75, 25, gettext("zVal or sVal")); - zval->align(FL_ALIGN_TOP); - zval->tooltip(gettext("Z-value or value of slice.\nKeep empty for default value")); - par1 = new Fl_Input(175, 165, 75, 25, gettext("Text or dir")); - par1->align(FL_ALIGN_TOP); - par1->tooltip(gettext("Text (in text command) or direction (in cont3, contf3, dens3)")); - par2 = new Fl_Input(255, 165, 75, 25, gettext("Number")); - par2->align(FL_ALIGN_TOP); - par2->tooltip(gettext("Number of contours in cont* commands")); - - opt = new Fl_Input(15, 215, 290, 25, gettext("Options")); - opt->align(FL_ALIGN_TOP_LEFT); - opt->tooltip(gettext("Command options")); - o = new Fl_Button(305, 215, 25, 25, ".."); o->callback(option_in_cb, opt); - - o = new Fl_Button(405, 180, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb, wnd); - o = new Fl_Return_Button(405, 215, 75, 25, gettext("OK")); o->callback(cmd_dlg_cb, wnd); - - help = new Fl_Help_View(0, 250, 500, 200); - wnd->end(); -} -//----------------------------------------------------------------------------- -char *CmdDlg::get_result() -{ - static char res[1024],buf[128]; - res[0]=0; - const char *cn = cmd->mvalue()->text; - - bool sl3 = !strcmp(cn,"cont3") || !strcmp(cn,"contf3") || !strcmp(cn,"dens3"); - strcpy(res,"\n"); strncat(res,cn,1022); - snprintf(buf,128,"%s%s%s%s%s%s%s%s%s%s%s%s", var_x->value()[0]?" ":"", var_x->value(), - var_y->value()[0]?" ":"", var_y->value(), var_z->value()[0]?" ":"", var_z->value(), - var_u->value()[0]?" ":"", var_u->value(), var_v->value()[0]?" ":"", var_v->value(), - var_w->value()[0]?" ":"", var_w->value()); - strcat(res,buf); - - if(!strcmp(cn,"text") && par1->value()[0]) - { strcat(res," '"); strcat(res,par1->value()); strcat(res,"'"); } - if(sl3 && !par1->value()[0]) - { - strcat(res," 'x'"); - fl_message(gettext("You should specify direction.\nDirection 'x' is selected by default")); - if(zval->value()[0]) - { snprintf(buf,128," %d",atoi(zval->value())); strcat(res,buf); } - } - if(sl3 && par1->value()[0]) - { - strcat(res," '"); strcat(res,par1->value()); strcat(res,"'"); - if(zval->value()[0]) - { snprintf(buf,128," %d",atoi(zval->value())); strcat(res,buf); } - } - if(stl->value()[0]) - { strcat(res," '"); strcat(res,stl->value()); strcat(res,"'"); } - if(!sl3 && zval->value()[0]) - { snprintf(buf,128," %d",atoi(zval->value())); strcat(res,buf); } - if(!sl3 && par2->value()[0]) - { snprintf(buf,128," %d",atoi(par2->value())); strcat(res,buf); } - if(opt->value()[0]) strcat(res,opt->value()); -// strcat(res,"\n"); - return res; -} -//----------------------------------------------------------------------------- -void command_cb(Fl_Widget *, void *v) -{ - CmdDlg *s = &cmd_dlg; - ScriptWindow* e = (ScriptWindow*)v; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - { - long i=e->editor->insert_position(), j=textbuf->line_end(i); - e->editor->insert_position(j); - e->editor->insert(s->get_result()); - } -} -//----------------------------------------------------------------------------- -void plot_dat_cb(Fl_Widget *, void *) -{ - CmdDlg *s = &cmd_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - textbuf->insert(textbuf->length(), s->get_result()); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/editor.cpp b/mgllab/editor.cpp deleted file mode 100644 index e522eac..0000000 --- a/mgllab/editor.cpp +++ /dev/null @@ -1,516 +0,0 @@ -/* editor.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#ifdef __MWERKS__ -# define FL_DLL -#endif -#include "udav.h" -//----------------------------------------------------------------------------- -int changed = 0; -char filename[256] = ""; -Fl_Text_Buffer *textbuf = 0; -void data_file(char *v); -//----------------------------------------------------------------------------- -// Syntax highlighting stuff... -Fl_Text_Buffer *stylebuf = 0; -Fl_Text_Display::Style_Table_Entry styletable[] = { // Style table - { FL_BLACK, FL_COURIER, 14, 0 }, // A - Plain - { FL_DARK_GREEN,FL_COURIER_ITALIC, 14, 0 }, // B - Line comments - { FL_BLUE, FL_COURIER, 14, 0 }, // C - Number - { FL_RED, FL_COURIER, 14, 0 }, // D - Strings - { FL_DARK_BLUE, FL_COURIER_BOLD, 14, 0 }, // E - Usual ommand - { FL_DARK_CYAN, FL_COURIER_BOLD, 14, 0 }, // F - Flow command - { FL_DARK_MAGENTA, FL_COURIER_BOLD,14, 0 }, // G - New-data command - { FL_DARK_RED, FL_COURIER, 14, 0 }, // H - Option - { FL_DARK_GREEN,FL_COURIER_BOLD, 14, 0 }}; // I - Inactive command -//----------------------------------------------------------------------------- -bool is_sfx(const char *s) // suffix -{ - register long i,n=strlen(s); - for(i=0;i='a';i++); - if(i==1 && s[0]=='a') return true; - if(i==2 && strchr("axyz",s[1]) && strchr("nmawsk",s[0])) return true; - if(i==3 && (!strncmp("fst",s,3) || !strncmp("lst",s,3) || !strncmp("max",s,3) || - !strncmp("min",s,3) || !strncmp("sum",s,3))) - return true; - return false; -// char *t = new char[i+1]; memcpy(t,s,i*sizeof(char)); t[i]=0; -} -//----------------------------------------------------------------------------- -bool is_opt(const char *s) // option -{ - const char *o[]={"xrange","yrange","zrange","crange","alpha", - "cut","value","meshnum","size","legend"}; - int l[10] = {6, 6, 6, 6, 5, 3, 5, 7, 4, 6}; - register long i; - for(i=0;i<10;i++) if(!strncmp(o[i],s,l[i]) && s[l[i]]<=' ') return true; - return false; -} -//----------------------------------------------------------------------------- -bool is_num(const char *s) // number -{ - register long i,n=strlen(s); - if(s[0]==':' && (s[1]<=' ' || s[1]==';')) return true; - if(n>=2 && !strncmp("pi",s,2) && (s[2]<=' ' || s[2]==';' || s[2]==':')) return true; - if(n>=2 && !strncmp("on",s,2) && (s[2]<=' ' || s[2]==';' || s[2]==':')) return true; - if(n>=3 && !strncmp("off",s,3) && (s[3]<=' ' || s[3]==';' || s[2]==':')) return true; - if(n>=3 && !strncmp("nan",s,3) && (s[3]<=' ' || s[3]==';' || s[2]==':')) return true; - for(i=0;iCmdType(w); - if(rts==5) res = 'G'; - else if(rts==7) res = 'F'; - else if(rts) res = 'E'; - delete []w; return res; -} -//----------------------------------------------------------------------------- -// Parse text and produce style data. -void style_parse(const char *text, char *style, int /*length*/) -{ - register long i; - long n=strlen(text); - bool nl=true, arg=true; - // Style letters: - // A - Plain - // B - Line comments - // C - Number - // D - Strings - // E - Usual command - // F - Flow command - // G - New data command - // H - Option - - for(i=0;ilength() + 1]; - char *text = textbuf->text(); - memset(style, 'A', textbuf->length()); - style[textbuf->length()] = '\0'; - if (!stylebuf) stylebuf = new Fl_Text_Buffer(textbuf->length()); - style_parse(text, style, textbuf->length()); - stylebuf->text(style); - delete[] style; - free(text); -} -//----------------------------------------------------------------------------- -// Update unfinished styles. -void style_unfinished_cb(int, void*) {} -//----------------------------------------------------------------------------- -// Update the style buffer... -void style_update(int pos, // Position of update - int nInserted, // Number of inserted chars - int nDeleted, // Number of deleted chars - int /*nRestyled*/, // Number of restyled chars - const char */*deletedText*/,// Text that was deleted - void *cbArg) // Callback data -{ - long start, end; // Start and end of text - char last, // Last style on line - *style, // Style data - *text; // Text data - - // If this is just a selection change, just unselect the style buffer... - if (nInserted == 0 && nDeleted == 0) { stylebuf->unselect(); return; } - // Track changes in the text buffer... - if (nInserted > 0) - { - // Insert characters into the style buffer... - style = new char[nInserted + 1]; - memset(style, 'A', nInserted); - style[nInserted] = '\0'; - - stylebuf->replace(pos, pos + nDeleted, style); - delete[] style; - } - else // Just delete characters in the style buffer... - stylebuf->remove(pos, pos + nDeleted); - - // Select the area that was just updated to avoid unnecessary callbacks... - stylebuf->select(pos, pos + nInserted - nDeleted); - - // Re-parse the changed region; we do this by parsing from the - // beginning of the previous line of the changed region to the end of - // the line of the changed region... Then we check the last - // style character and keep updating if we have a multi-line - // comment character... - start = textbuf->line_start(pos); - end = textbuf->line_end(pos + nInserted); - text = textbuf->text_range(start, end); - style = stylebuf->text_range(start, end); - if (start==end) last = 0; - else last = style[end-start-1]; - style_parse(text, style, end - start); - stylebuf->replace(start, end, style); - ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end); - - if (start==end || last != style[end-start-1]) - { - // Either the user deleted some text, or the last character on - // the line changed styles, so reparse the remainder of the buffer... - free(text); free(style); - - end = textbuf->length(); - text = textbuf->text_range(start, end); - style = stylebuf->text_range(start, end); - style_parse(text, style, end - start); - stylebuf->replace(start, end, style); - ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end); - } - free(text); free(style); -} -//----------------------------------------------------------------------------- -ScriptWindow::ScriptWindow(int w, int h, const char* t) : Fl_Double_Window(w, h, t) -{ - replace_dlg = new Fl_Window(300, 105, gettext("Replace")); - replace_find = new Fl_Input(80, 10, 210, 25, gettext("Find:")); - replace_find->align(FL_ALIGN_LEFT); - - replace_with = new Fl_Input(80, 40, 210, 25, gettext("Replace:")); - replace_with->align(FL_ALIGN_LEFT); - - replace_all = new Fl_Button(10, 70, 90, 25, gettext("Replace All")); - replace_all->callback((Fl_Callback *)replall_cb, this); - replace_all->box(UDAV_UP_BOX); replace_all->down_box(UDAV_DOWN_BOX); - - replace_next = new Fl_Return_Button(105, 70, 120, 25, "Replace Next"); - replace_next->callback((Fl_Callback *)replace2_cb, this); - replace_next->box(UDAV_UP_BOX); replace_next->down_box(UDAV_DOWN_BOX); - - replace_cancel = new Fl_Button(230, 70, 60, 25, gettext("Cancel")); - replace_cancel->callback((Fl_Callback *)replcan_cb, this); - replace_cancel->box(UDAV_UP_BOX); replace_cancel->down_box(UDAV_DOWN_BOX); - - replace_dlg->end(); - replace_dlg->set_non_modal(); - editor = 0; *search = 0; - - setup_dlg = new SetupDlg; - setup_dlg->CreateDlg(); -} -//----------------------------------------------------------------------------- -ScriptWindow::~ScriptWindow() -{ - delete replace_dlg; - delete setup_dlg->wnd; -} -//----------------------------------------------------------------------------- -int check_save(void) -{ - if (!changed) return 1; - int r = fl_choice(gettext("The current file has not been saved.\n" - "Would you like to save it now?"), - gettext("Cancel"), gettext("Save"), gettext("Don't Save")); - if(r==1) { save_cb(0,0); return !changed; } // Save the file... - return (r==2) ? 1 : 0; -} -//----------------------------------------------------------------------------- -int loading = 0; -void load_file(char *newfile, int ipos) -{ - long len = strlen(newfile); - pref.set("last_file",newfile); - if(ipos==-1 && (!strcmp(newfile+len-4,".dat") || !strcmp(newfile+len-4,".csv"))) - { - data_file(newfile); - strncpy(newfile+len-4,".mgl",4); - strncpy(filename, newfile,256); - } - else - { - loading = 1; - int insert = (ipos != -1); - changed = insert; - if(!insert) *filename=0; - long r; - if(!insert) r = textbuf->loadfile(newfile); - else r = textbuf->insertfile(newfile, ipos); - - char *t = textbuf->text(); -#ifndef WIN32 - register size_t i,l=strlen(t); - for(i=0;itext(t); -#endif - fill_animate(t); free(t); - - if (r) - fl_alert(gettext("Error reading from file \'%s\':\n%s."), newfile, strerror(errno)); - else if(!insert) strncpy(filename, newfile,256); - loading = 0; - textbuf->call_modify_callbacks(); - } -} -//----------------------------------------------------------------------------- -void save_file(char *newfile) -{ - pref.set("last_file",newfile); - if (textbuf->savefile(newfile)) - fl_alert(gettext("Error writing to file \'%s\':\n%s."), newfile, strerror(errno)); - else - strncpy(filename, newfile,256); - changed = 0; - textbuf->call_modify_callbacks(); -} -//----------------------------------------------------------------------------- -void copy_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - Fl_Text_Editor::kf_copy(0, e->editor); -} -//----------------------------------------------------------------------------- -void cut_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - Fl_Text_Editor::kf_cut(0, e->editor); -} -//----------------------------------------------------------------------------- -void delete_cb(Fl_Widget*, void*) { textbuf->remove_selection(); } -//----------------------------------------------------------------------------- -void find_cb(Fl_Widget* w, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - const char *val; - val = fl_input(gettext("Search String:"), e->search); - if (val != NULL) { strncpy(e->search, val,256); find2_cb(w, v); } -} -//----------------------------------------------------------------------------- -void find2_cb(Fl_Widget* w, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - if (e->search[0] == '\0') { find_cb(w, v); return; } - - int pos = e->editor->insert_position(); - long found = textbuf->search_forward(pos, e->search, &pos); - if (found) { - // Found a match; select and update the position... - textbuf->select(pos, pos+strlen(e->search)); - e->editor->insert_position(pos+strlen(e->search)); - e->editor->show_insert_position(); - } - else fl_alert(gettext("No occurrences of \'%s\' found!"), e->search); -} -//----------------------------------------------------------------------------- -void changed_cb(int, int nInserted, int nDeleted,int, const char*, void* v) -{ - if ((nInserted || nDeleted) && !loading) changed = 1; - ScriptWindow *w = (ScriptWindow *)v; - set_title(w); - if (loading) w->editor->show_insert_position(); -} -//----------------------------------------------------------------------------- -void insert_cb(Fl_Widget*, void *v) -{ - char *newfile = fl_file_chooser(gettext("Insert File?"), "*", filename); - ScriptWindow *w = (ScriptWindow *)v; - if (newfile != NULL) load_file(newfile, w->editor->insert_position()); -} -//----------------------------------------------------------------------------- -void paste_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - Fl_Text_Editor::kf_paste(0, e->editor); -} -//----------------------------------------------------------------------------- -void replace_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - e->replace_dlg->show(); -} -//----------------------------------------------------------------------------- -void replace2_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - const char *find = e->replace_find->value(); - const char *replace = e->replace_with->value(); - if (find[0] == '\0') { e->replace_dlg->show(); return; } - e->replace_dlg->hide(); - - int pos = e->editor->insert_position(); - long found = textbuf->search_forward(pos, find, &pos); - if (found) - { - // Found a match; update the position and replace text... - textbuf->select(pos, pos+strlen(find)); - textbuf->remove_selection(); - textbuf->insert(pos, replace); - textbuf->select(pos, pos+strlen(replace)); - e->editor->insert_position(pos+strlen(replace)); - e->editor->show_insert_position(); - } - else fl_alert(gettext("No occurrences of \'%s\' found!"), find); -} -//----------------------------------------------------------------------------- -void replall_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - const char *find = e->replace_find->value(); - const char *replace = e->replace_with->value(); - - find = e->replace_find->value(); - if (find[0] == '\0') { e->replace_dlg->show(); return; } - e->replace_dlg->hide(); - e->editor->insert_position(0); - long times = 0; - - // Loop through the whole string - for (long found = 1; found;) - { - int pos = e->editor->insert_position(); - found = textbuf->search_forward(pos, find, &pos); - if (found) - { - // Found a match; update the position and replace text... - textbuf->select(pos, pos+strlen(find)); - textbuf->remove_selection(); - textbuf->insert(pos, replace); - e->editor->insert_position(pos+strlen(replace)); - e->editor->show_insert_position(); - times++; - } - } - if (times) fl_message(gettext("Replaced %ld occurrences."), times); - else fl_alert(gettext("No occurrences of \'%s\' found!"), find); -} -//----------------------------------------------------------------------------- -void replcan_cb(Fl_Widget*, void* v) -{ - ScriptWindow* e = (ScriptWindow*)v; - e->replace_dlg->hide(); -} -//----------------------------------------------------------------------------- -void view_cb(Fl_Widget*, void*); -//#include "xpm/window.xpm" -//#include "xpm/option.xpm" -//#include "xpm/table.xpm" -#include "xpm/plot.xpm" -#include "xpm/help-contents.xpm" -#include "xpm/edit-cut.xpm" -#include "xpm/edit-copy.xpm" -#include "xpm/edit-paste.xpm" -#include "xpm/edit-find.xpm" -#include "xpm/document-open.xpm" -#include "xpm/document-new.xpm" -#include "xpm/document-save.xpm" -Fl_Widget *add_editor(ScriptWindow *w) -{ - Fl_Window *w1=new Fl_Window(0,30,300,430,0); - Fl_Group *g = new Fl_Group(0,0,290,30); - Fl_Button *o; - - o = new Fl_Button(0, 1, 25, 25); o->image(new Fl_Pixmap(document_new_xpm)); - o->tooltip(gettext("New script")); o->callback(new_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(25, 1, 25, 25); o->tooltip(gettext("Open script or data file")); - o->image(new Fl_Pixmap(document_open_xpm)); o->callback(open_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(50, 1, 25, 25); o->tooltip(gettext("Save script to file")); - o->image(new Fl_Pixmap(document_save_xpm)); o->callback(save_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - o = new Fl_Button(80, 1, 25, 25); o->tooltip(gettext("Cut selection to clipboard")); - o->image(new Fl_Pixmap(edit_cut_xpm)); o->callback(cut_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(105, 1, 25, 25); o->tooltip(gettext("Copy selection to clipboard")); - o->image(new Fl_Pixmap(edit_copy_xpm)); o->callback(copy_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(130, 1, 25, 25); o->tooltip(gettext("Paste text from clipboard")); - o->image(new Fl_Pixmap(edit_paste_xpm)); o->callback(paste_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(155, 1, 25, 25); o->tooltip(gettext("Find text")); - o->image(new Fl_Pixmap(edit_find_xpm)); o->callback(find_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - o = new Fl_Button(185, 1, 25, 25); o->tooltip(gettext("Insert MGL command")); - o->image(new Fl_Pixmap(plot_xpm)); o->callback(command_cb,w); - o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); -// o = new Fl_Button(185, 1, 25, 25); o->tooltip(gettext("Insert command options")); -// o->image(new Fl_Pixmap(option_xpm)); o->callback(option_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); -// o = new Fl_Button(210, 1, 25, 25); o->tooltip(gettext("Edit data array")); -// o->image(new Fl_Pixmap(table_xpm)); o->callback(table_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); -// o = new Fl_Button(235, 1, 25, 25); o->tooltip(gettext("New view window")); -// o->image(new Fl_Pixmap(window_xpm));o->callback(view_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(210, 1, 25, 25); o->tooltip(gettext("Show help window")); - o->image(new Fl_Pixmap(help_contents_xpm)); o->callback(help_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - g->end(); g->resizable(0); - - w->editor = new Fl_Text_Editor(0, 28, 300, 400); - w->editor->buffer(textbuf); - w->editor->highlight_data(stylebuf, styletable, sizeof(styletable) / sizeof(styletable[0]), 'A', style_unfinished_cb, 0); - w->editor->textfont(FL_COURIER); - - textbuf->add_modify_callback(style_update, w->editor); - textbuf->add_modify_callback(changed_cb, w); - textbuf->call_modify_callbacks(); - - w1->end(); - w1->resizable(w->editor); //w->graph); - return w1; -} -//----------------------------------------------------------------------------- diff --git a/mgllab/grid.cpp b/mgllab/grid.cpp deleted file mode 100644 index e192818..0000000 --- a/mgllab/grid.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* grid.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -Fl_Callback input_cb; -//----------------------------------------------------------------------------- -void input_cb(Fl_Widget*, void* v) { ((Fl_Data_Table*)v)->set_value(); } -//----------------------------------------------------------------------------- -Fl_Data_Table::Fl_Data_Table(int x, int y, int w, int h, const char *l) : Fl_Table(x,y,w,h,l) -{ - callback(&event_callback, (void*)this); - input = new Fl_Input(w/2,h/2,0,0); - input->hide(); - input->callback(input_cb, (void*)this); - input->when(FL_WHEN_ENTER_KEY_ALWAYS); - input->maximum_size(16); -// (new Fl_Box(9999,9999,0,0))->hide(); // HACK: prevent flickering in Fl_Scroll - end(); -} -//----------------------------------------------------------------------------- -// Handle drawing all cells in table -void Fl_Data_Table::draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H) -{ - static char s[32]; - fl_push_clip(X, Y, W, H); - switch ( context ) - { - case CONTEXT_COL_HEADER: - fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color()); - fl_font(FL_HELVETICA | FL_BOLD, 14); - fl_color(FL_BLACK); snprintf(s,32,"%d",C); - fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER); - break; - case CONTEXT_ROW_HEADER: - fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color()); - fl_font(FL_HELVETICA | FL_BOLD, 14); - fl_color(FL_BLACK); snprintf(s,32,"%d",R); - fl_draw(s, X, Y, W, H, FL_ALIGN_CENTER); - break; - case CONTEXT_CELL: - if (R == row && C == col && input->visible()) break; - fl_draw_box(FL_THIN_DOWN_BOX, X, Y, W, H, FL_WHITE); - fl_pop_clip(); - fl_push_clip(X+3, Y+3, W-6, H-6); - fl_font(FL_HELVETICA, 14); - fl_color(FL_BLACK); - if(mgl_isnan(data[C+nx*R])) strcpy(s,"nan"); - else snprintf(s,32,"%g",data[C+nx*R]); - fl_draw(s, X+3, Y+3, W-6, H-6, FL_ALIGN_RIGHT); - break; - case CONTEXT_RC_RESIZE: - if (!input->visible()) break; - find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); - if (X!=input->x() || Y!=input->y() || W!=input->w() || H!=input->h()) - input->resize(X,Y,W,H); - break; - default: break; - } - fl_pop_clip(); -} -//----------------------------------------------------------------------------- -void Fl_Data_Table::cell_click() -{ - int R = callback_row(), C = callback_col(); - TableContext context = callback_context(); - - if(context==CONTEXT_CELL) - { - if (input->visible()) //input->do_callback(); - { - const char *s = input->value(); - data[col + nx*row] = (s[0]==0 || !strcmp(s,"nan")) ? NAN : atof(s); - } - row = R; col = C; - int XX,YY,WW,HH; - find_cell(CONTEXT_CELL, R, C, XX, YY, WW, HH); - input->resize(XX,YY,WW,HH); - char s[32]; - if(mgl_isnan(data[C+nx*R])) strcpy(s,"nan"); - else snprintf(s,32,"%g",data[C+nx*R]); - input->value(s); input->show(); - input->take_focus(); - } -} -//----------------------------------------------------------------------------- -void Fl_Data_Table::set_value() -{ - const char *s = input->value(); - data[col + nx*row] = (s[0]==0 || !strcmp(s,"nan")) ? NAN : atof(s); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/help.cpp b/mgllab/help.cpp deleted file mode 100644 index 1fd19af..0000000 --- a/mgllab/help.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* help.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "udav.h" -#include -#include -//----------------------------------------------------------------------------- -void help_cb(Fl_Widget*, void*v) -{ - ScriptWindow* e = (ScriptWindow*)v; - long i=e->editor->insert_position(), j0=textbuf->line_start(i),j; - - static char str[300]; - char s[32]="", *buf = textbuf->text(); - memset(s,0,32*sizeof(char)); - for(j=j0;!isspace(buf[j]) && buf[j]!='#' && buf[j]!=';' && j<31+j0;j++) - s[j-j0] = buf[j]; - free(buf); -#ifdef WIN32 - snprintf(str,300,"%s\\mgl_en.html#%s",docdir,s); -#else - snprintf(str,300,"%s/mgl_en.html#%s",docdir,s); -#endif - e->hd->load(str); - if(e->rtab) e->rtab->value(e->ghelp); -} -//----------------------------------------------------------------------------- -void link_cb(Fl_Widget*, void*v) -{ - ScriptWindow* e = (ScriptWindow*)v; - static char str[300]; -#ifdef WIN32 - snprintf(str,300,"%s\\mgl_en.html#%s",docdir,e->link_cmd->value()); -#else - snprintf(str,300,"%s/mgl_en.html#%s",docdir,e->link_cmd->value()); -#endif - e->hd->load(str); - if(e->rtab) e->rtab->value(e->ghelp); -} -//----------------------------------------------------------------------------- -void example_cb(Fl_Widget*, void*v) -{ - static char str[300]; - ScriptWindow* e = (ScriptWindow*)v; -#ifdef WIN32 - snprintf(str,300,"%s\\mgl_en.html\\mgl_en_2.html",docdir); -#else - snprintf(str,300,"%s/mgl_en.html/mgl_en_2.html",docdir); -#endif - e->hd->load(str); e->rtab->value(e->ghelp); - if(e->rtab) e->rtab->value(e->ghelp); -} -//----------------------------------------------------------------------------- -void help_in_cb(Fl_Widget*, void*v) -{ - ScriptWindow* e = (ScriptWindow*)v; - e->hd->textsize(e->hd->textsize()+1); -} -//----------------------------------------------------------------------------- -void help_out_cb(Fl_Widget*, void*v) -{ - ScriptWindow* e = (ScriptWindow*)v; - e->hd->textsize(e->hd->textsize()-1); -} -//----------------------------------------------------------------------------- -#include "xpm/udav.xpm" -void about_cb(Fl_Widget*, void*) -{ - static char s[128]; - snprintf(s,128,gettext("UDAV v. 2.%g\n(c) Alexey Balakin, 2007\nhttp://udav.sf.net/"), MGL_VER2); - Fl_Double_Window* w = new Fl_Double_Window(355, 130, "About UDAV"); - Fl_Box* o = new Fl_Box(10, 15, 65, 65); - o->box(FL_UP_BOX); o->color(55); o->image(new Fl_Pixmap(udav_xpm)); - o = new Fl_Box(85, 15, 260, 65); o->box(UDAV_DOWN_BOX); - o->label(s); - Fl_Button *b = new Fl_Return_Button(255, 90, 90, 30, "Close"); - b->callback(close_dlg_cb,w); - b->box(UDAV_UP_BOX); b->down_box(UDAV_DOWN_BOX); - w->end(); w->set_modal(); w->show(); -} -//----------------------------------------------------------------------------- -#include "xpm/zoom-out.xpm" -#include "xpm/zoom-in.xpm" -#include "xpm/help-faq.xpm" -Fl_Widget *add_help(ScriptWindow *w) -{ - Fl_Window *w1=new Fl_Window(300,30,630,430,0); - Fl_Group *g = new Fl_Group(0,0,290,30); - Fl_Button *o; - - w->link_cmd = new Fl_Input(0,1,150,25); - w->link_cmd->when(FL_WHEN_CHANGED); - w->link_cmd->callback(link_cb,w); - - o = new Fl_Button(155, 1, 25, 25); o->tooltip(gettext("MGL samples and hints")); - o->image(new Fl_Pixmap(help_faq_xpm)); o->callback(example_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(180, 1, 25, 25); o->tooltip(gettext("Increase font size")); - o->image(new Fl_Pixmap(zoom_in_xpm)); o->callback(help_in_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(205, 1, 25, 25); o->tooltip(gettext("Decrease font size")); - o->image(new Fl_Pixmap(zoom_out_xpm)); o->callback(help_out_cb,w); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - g->end(); g->resizable(0); - - w->hd = new Fl_Help_View(0,28,630,400); - w1->end(); link_cb(w,w); - w1->resizable(w->hd); return w1; -} -//----------------------------------------------------------------------------- -void mem_dlg_cb0(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_pressed(0); } -//----------------------------------------------------------------------------- -void mem_dlg_cb1(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_pressed(1); } -//----------------------------------------------------------------------------- -void mem_dlg_cb2(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_pressed(2); } -//----------------------------------------------------------------------------- -void mem_dlg_cb3(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_pressed(3); } -//----------------------------------------------------------------------------- -void mem_update_cb(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_init(); } -//----------------------------------------------------------------------------- -Fl_Widget *add_mem(ScriptWindow *w) -{ - static int widths[] = {220,205,0}; - Fl_Button *o; - Fl_Box *b; -// wnd = new Fl_Double_Window(335, 405, gettext("Data browser")); - Fl_Window *wnd = new Fl_Window(300,30,630,430,0); - -// Fl_Group *g = new Fl_Group(10,10,610,395); - b = new Fl_Box(0, 10, 630, 25, gettext("Existed data arrays")); b->labeltype(FL_ENGRAVED_LABEL); - b = new Fl_Box(0, 35, 220, 25, gettext("name")); - b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - b = new Fl_Box(220, 35, 205, 25, gettext("dimensions")); - b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - b = new Fl_Box(425, 35, 205, 25, gettext("mem. usage")); - b->box(FL_THIN_UP_BOX); b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - - w->var = new Fl_Select_Browser(0, 60, 630, 335); w->var->column_char('\t'); - w->var->align(FL_ALIGN_TOP); w->var->column_widths(widths); - w->var->tooltip(gettext("List of available data.")); -// g->end(); - - o = new Fl_Button(10, 400, 95, 25, gettext("Edit")); o->callback(mem_dlg_cb0,w); - o->tooltip(gettext("Open table with selected data for editing.")); - o = new Fl_Button(120, 400, 95, 25, gettext("Plot")); o->callback(mem_dlg_cb1,w); - o->tooltip(gettext("Plot selected data.")); - o = new Fl_Button(230, 400, 95, 25, gettext("Delete")); o->callback(mem_dlg_cb2,w); - o->tooltip(gettext("Delete selected data.")); - o = new Fl_Button(340, 400, 95, 25, gettext("New")); o->callback(mem_dlg_cb3,w); - o->tooltip(gettext("Open dialog for new data creation.")); - o = new Fl_Button(450, 400, 95, 25, gettext("Refresh")); o->callback(mem_update_cb,w); - o->tooltip(gettext("Refresh list of variables.")); -// o = new Fl_Button(120, 335, 95, 25, gettext("Load")); o->callback(mem_dlg_cb,(void *)4); -// o = new Fl_Button(230, 335, 95, 25, gettext("Save")); o->callback(mem_dlg_cb,(void *)5); -// o = new Fl_Button(10, 370, 95, 25, gettext("Update")); o->callback(mem_upd_cb,0); - wnd->end(); wnd->resizable(w->var); return wnd; -} -//----------------------------------------------------------------------------- -void ScriptWindow::mem_init() -{ - char str[128]; - var->clear(); - mglVar *v=Parse->FindVar(""); - while(v) - { - snprintf(str,128,"%ls\t%ld*%ld*%ld\t%ld\t", v->s.c_str(), v->nx, v->ny, v->nz, sizeof(mreal)*v->nx*v->ny*v->nz); - var->add(str,v); - v = v->next; - } -} -//----------------------------------------------------------------------------- -void ScriptWindow::mem_pressed(int kind) -{ - TableWindow *w; - int ind = var->value(); - mglVar *v = (mglVar *)var->data(ind); - static char res[128]; - if(!v && kind!=3) return; - if(kind==0) - { - w = (TableWindow *)v->o; - if(!w) - { - char ss[1024]; - wcstombs(ss,v->s.c_str(),1024); ss[v->s.length()]=0; - ltab->begin(); - Fl_Group *gg = new Fl_Group(0,30,300,430); - w = new TableWindow(0,30,300,430); - gg->label(ss); gg->end(); ltab->end(); - } - w->update(v); ltab->value(w->parent()); w->show(); - } - else if(kind==1) - { - if(v->nz>1) snprintf(res,128,"box\nsurf3 %ls\n",v->s.c_str()); - else if(v->ny>1) snprintf(res,128,"box\nsurf %ls\n",v->s.c_str()); - else snprintf(res,128,"box\nplot %ls\n",v->s.c_str()); - textbuf->text(res); - } - else if(kind==2) - Parse->DeleteVar(v->s.c_str()); - else if(kind==3) - { - const char *name = fl_input(gettext("Enter name for new variable"),"dat"); - if(!name) return; - v = Parse->AddVar(name); - - ltab->begin(); - Fl_Group *gg = new Fl_Group(0,30,300,430); - w = new TableWindow(0,30,300,430); - gg->label(name); gg->end(); ltab->end(); - w->update(v); ltab->value(w->parent()); w->show(); - } - mem_init(); -} -//----------------------------------------------------------------------------- -void variables_cb(Fl_Widget *, void *v) -{ -/* MemDlg *s = &mem_dlg; - s->wnd->set_modal(); - s->init(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait();*/ -} -//----------------------------------------------------------------------------- diff --git a/mgllab/main.cpp b/mgllab/main.cpp deleted file mode 100644 index aa7ccae..0000000 --- a/mgllab/main.cpp +++ /dev/null @@ -1,304 +0,0 @@ -/* main.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -#ifndef MGL_DOC_DIR -#ifdef WIN32 -#define MGL_DOC_DIR "" -#else -#define MGL_DOC_DIR "/usr/local/share/doc/mathgl/" -#endif -#endif -//----------------------------------------------------------------------------- -char title[256]; -int num_windows = 0, auto_exec=1, plastic_scheme=1, internal_font=0; -Fl_Preferences pref(Fl_Preferences::USER,"abalakin","mgllab"); -char *docdir=0; -//----------------------------------------------------------------------------- -void set_title(Fl_Window* w) -{ - if (filename[0] == '\0') strcpy(title, "Untitled"); - else - { - char *slash; - slash = strrchr(filename, '/'); -#ifdef WIN32 - if (slash == NULL) slash = strrchr(filename, '\\'); -#endif - if (slash != NULL) strncpy(title, slash + 1,256); - else strncpy(title, filename,256); - } - if (changed) strcat(title, gettext(" (modified)")); - w->label(title); -} -//----------------------------------------------------------------------------- -void fname_cb(Fl_Widget*, void *v) -{ - ScriptWindow* e = (ScriptWindow*)v; - char *file = fl_file_chooser(gettext("Insert File Name?"), gettext("All Files (*)"), 0); - if(file) - { - char *str = new char[strlen(file)+4]; - snprintf(str,strlen(file)+4," '%s'",file); - e->editor->insert(str); - delete []str; - } -} -//----------------------------------------------------------------------------- -void new_cb(Fl_Widget*, void*) -{ - if (!check_save()) return; - filename[0] = '\0'; - textbuf->select(0, textbuf->length()); - textbuf->remove_selection(); - changed = 0; - textbuf->call_modify_callbacks(); -} -//----------------------------------------------------------------------------- -void open_cb(Fl_Widget*, void *v) -{ - if (!check_save()) return; - char *lastname=0; - if(*filename==0) { pref.get("last_file",lastname,""); strncpy(filename, lastname,256); } - char *newfile = fl_file_chooser(gettext("Open File?"), - gettext("MGL Files (*.mgl)\tDAT Files (*.{dat,csv})\tAll Files (*)"), filename); - if(lastname) free(lastname); - if(newfile != NULL) - { - load_file(newfile, -1); - if(auto_exec) ((ScriptWindow*)v)->graph->update(); - } -} -//----------------------------------------------------------------------------- -void close_cb(Fl_Widget*, void* v) -{ - Fl_Window* w = (Fl_Window*)v; - if (num_windows == 1 && !check_save()) return; - - w->hide(); - textbuf->remove_modify_callback(changed_cb, w); - delete w; - num_windows--; - if (!num_windows) exit(0); -} -//----------------------------------------------------------------------------- -void quit_cb(Fl_Widget*, void*) -{ - if (changed && !check_save()) return; - exit(0); -} -//----------------------------------------------------------------------------- -void save_cb(Fl_Widget*w, void*v) -{ - if (filename[0] == '\0') { saveas_cb(w,v); return; } // No filename - get one! - else save_file(filename); -} -//----------------------------------------------------------------------------- -void saveas_cb(Fl_Widget*, void*) -{ - char *newfile, *fname=0; - FILE *fp=0; - while(1) - { - newfile = fl_file_chooser(gettext("Save File As?"), "*.mgl", filename); - if(!newfile || !newfile[0]) break; - if(!strchr(newfile,'.')) - { - if(fname) delete []fname; - fname = new char[strlen(newfile)+5]; - strcpy(fname,newfile); strcat(fname,".mgl"); - newfile = fname; - } - fp = fopen(newfile,"r"); - if(fp) - { - fclose(fp); - if(fl_choice(gettext("File is exesist. Overwrite it?"),0,gettext("No"),gettext(" Yes "))==2) - break; - } - else break; - } - if (newfile != NULL) save_file(newfile); - if(fname) delete []fname; -} -//----------------------------------------------------------------------------- -ScriptWindow *new_view(); -void view_cb(Fl_Widget*, void*) -{ Fl_Window* w = new_view(); w->show(); } -//----------------------------------------------------------------------------- -void hint_cb(Fl_Widget*, void*) {} -//----------------------------------------------------------------------------- -Fl_Menu_Item menuitems[] = { -// { gettext("File"), 0, 0, 0, FL_SUBMENU }, - { gettext("File/New File"), 0, new_cb }, - { gettext("File/Open File..."), FL_CTRL + 'o', open_cb }, - { gettext("File/Insert File..."), FL_CTRL + 'i', insert_cb }, - { gettext("File/Save File"), FL_CTRL + 's', save_cb }, - { gettext("File/Save File As..._"), FL_CTRL + FL_SHIFT + 's', saveas_cb, 0, FL_MENU_DIVIDER }, -/*TODO { gettext("Export"), 0, 0, 0, FL_SUBMENU },*/ - { gettext("File/New View"), FL_ALT + 'w', view_cb }, - { gettext("File/Close View_"), FL_CTRL + 'w', close_cb, 0, FL_MENU_DIVIDER }, - { gettext("File/Exit"), FL_ALT + 'x', quit_cb }, -// { 0 }, - { gettext("Edit"), 0, 0, 0, FL_SUBMENU }, - { gettext("Cut"), FL_CTRL + 'x', cut_cb }, - { gettext("Copy"), FL_CTRL + 'c', copy_cb }, - { gettext("Paste"), FL_CTRL + 'v', paste_cb }, - { gettext("Delete"), 0, delete_cb, 0, FL_MENU_DIVIDER }, - { gettext("Insert"), 0, 0, 0, FL_SUBMENU }, - { gettext("options"), FL_ALT + 'o', option_cb }, - { gettext("style"), FL_ALT + 'i', style_cb }, - { gettext("filename"), 0, fname_cb }, - { gettext("command"), FL_ALT + 'c', command_cb }, - { 0 }, - { gettext("Properties"), 0, settings_cb }, - { 0 }, - { gettext("Search"), 0, 0, 0, FL_SUBMENU }, - { gettext("Find..."), FL_CTRL + 'f', find_cb }, - { gettext("Find Again"), FL_F + 3, find2_cb }, - { gettext("Replace..."), FL_CTRL + 'r', replace_cb }, - { gettext("Replace Again"), FL_F + 4, replace2_cb }, - { 0 }, -/*TODO{ gettext("Graphics"), 0, 0, 0, FL_SUBMENU },*/ -/*TODO{ gettext("Data"), 0, 0, 0, FL_SUBMENU },*/ - { gettext("Help"), 0, 0, 0, FL_SUBMENU }, - { gettext("MGL Help"), FL_F + 1, help_cb }, - { gettext("MGL Examples"), 0, example_cb }, - { gettext("Hints and FAQ"), 0, hint_cb , 0, FL_MENU_INACTIVE}, - { gettext("About UDAV"), 0, about_cb }, - { 0 }, - { 0 } -}; -//----------------------------------------------------------------------------- -void mem_upd_cb(Fl_Widget *, void *v) -{ ((ScriptWindow*)v)->mem_init(); } -//----------------------------------------------------------------------------- -ScriptWindow *new_view() -{ - Fl_Tabs* tt; - Fl_Group *gg; - ScriptWindow *w = new ScriptWindow(930, 510, title); - w->begin(); - w->menu = new Fl_Menu_Bar(0, 0, 930, 30); - -// w->menu->add(gettext("File"), 0, 0, 0, FL_SUBMENU); - w->menu->add(gettext("File/New File"), "", new_cb); - w->menu->add(gettext("File/Open File..."), "^o", open_cb, w); - w->menu->add(gettext("File/Insert File..."), "^i", insert_cb, w); - w->menu->add(gettext("File/Save File"), "^s", save_cb, w); - w->menu->add(gettext("File/Save File As..."), 0, saveas_cb, w, FL_MENU_DIVIDER); - /*TODO { gettext("Export"), 0, 0, 0, FL_SUBMENU },*/ - w->menu->add(gettext("File/New View"), "#w", view_cb, w); - w->menu->add(gettext("File/Close View"), "^w", close_cb, w, FL_MENU_DIVIDER); - w->menu->add(gettext("File/Exit"), "#x", quit_cb); -// w->menu->copy(menuitems, w); - - Fl_Tile *t = new Fl_Tile(0,30,930,455); - tt = new Fl_Tabs(0,30,300,455,0); tt->box(UDAV_UP_BOX); w->ltab = tt; - gg = new Fl_Group(0,30,300,430); gg->label(gettext("Script")); - add_editor(w); gg->end(); - tt->end(); - - tt = new Fl_Tabs(300,30,630,455,0); tt->box(UDAV_UP_BOX); w->rtab = tt; - gg = new Fl_Group(300,30,630,430,gettext("Canvas")); - w->graph = new Fl_MGL(300,30,630,430); gg->end(); - gg = new Fl_Group(300,30,630,430,gettext("Help")); - w->ghelp = gg; add_help(w); gg->end(); - gg = new Fl_Group(300,30,630,430,gettext("Memory")); - add_mem(w); gg->end(); - tt->end(); - - w->status = new Fl_Box(0,485,930,25,"Ready"); - w->status->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - w->status->color(FL_BACKGROUND_COLOR); - w->status->box(FL_DOWN_BOX); - w->graph->status = w->status; - - t->end(); w->end(); w->resizable(t); - tt->callback(mem_upd_cb, w); - w->callback((Fl_Callback *)close_cb, w); - - num_windows++; - return w; -} -//----------------------------------------------------------------------------- -void argument_set(int n, const char *s); -int main(int argc, char **argv) -{ -// Fl::lock(); - mgl_ask_func = mgl_ask_fltk; - char *buf, *buf2, ch; - pref.get("locale",buf,"ru_RU.cp1251"); setlocale(LC_CTYPE, buf); free(buf); - pref.get("plastic_scheme",plastic_scheme,1); - pref.get("internal_font",internal_font,0); - pref.get("auto_exec",auto_exec,1); - pref.get("help_dir",docdir,MGL_DOC_DIR); // docdir should be freed at exit - - Fl::visual(FL_DOUBLE|FL_RGB); - if(plastic_scheme) Fl::scheme("gtk+"); - -#ifdef USE_GETTEXT -// setlocale (LC_NUMERIC, ""); -// bindtextdomain (PACKAGE, LOCALEDIR); -// textdomain (PACKAGE); -#endif - - textbuf = new Fl_Text_Buffer; - style_init(); - ScriptWindow *w = new_view(); - - pref.get("font_dir",buf2,""); - pref.get("font_name",buf,""); - mgl_load_font(w->graph->FMGL->get_graph(),buf,buf2); - if(buf) free(buf); - if(buf2) free(buf2); - - buf = 0; - while(1) - { - ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:ho:L:"); - if(ch>='1' && ch<='9') argument_set(ch-'0', optarg); - else if(ch=='L') setlocale(LC_CTYPE, optarg); - else if(ch=='h') - { - printf("mglconv convert mgl script to bitmap png file.\nCurrent version is 2.%g\n",MGL_VER2); - printf("Usage:\tmgllab [parameter(s)] scriptfile\n"); - printf( "\t-1 str set str as argument $1 for script\n" - "\t... ...\n" - "\t-9 str set str as argument $9 for script\n" - "\t-L loc set locale to loc\n" -// "\t- get script from standard input\n" - "\t-h print this message\n" ); - free(docdir); return 0; - } - // NOTE: I will not parse stdin here - else if(ch==-1 && optind=argc) break; - } - - w->show(1, argv); - if(buf && *buf && *buf!='-') - { - load_file(buf, -1); - if(auto_exec) w->graph->update(); - } - return Fl::run(); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/mathgl.cpp b/mgllab/mathgl.cpp deleted file mode 100644 index 15716f0..0000000 --- a/mgllab/mathgl.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* mathgl.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "mgl2/mgl.h" -#include "udav.h" -//----------------------------------------------------------------------------- -#include "xpm/alpha.xpm" -#include "xpm/light.xpm" -#include "xpm/alpha_on.xpm" -#include "xpm/light_on.xpm" -#include "xpm/zoom-fit-best.xpm" -#include "xpm/zoom-fit-best-r.xpm" -#include "xpm/film-r.xpm" -#include "xpm/film-b.xpm" -#include "xpm/media-seek-forward.xpm" -#include "xpm/media-seek-backward.xpm" -#include "xpm/go-previous.xpm" -#include "xpm/go-next.xpm" -#include "xpm/go-down.xpm" -#include "xpm/zoom-out.xpm" -#include "xpm/zoom-in.xpm" -#include "xpm/go-up.xpm" -#include "xpm/zoom-original.xpm" -#include "xpm/view-refresh.xpm" -#include "xpm/rotate.xpm" -#include "xpm/rotate_on.xpm" -#include "xpm/document-properties.xpm" -//#include "xpm/preferences-system.xpm" -#include "xpm/wire.xpm" -//----------------------------------------------------------------------------- -extern int internal_font; -mglParse *Parse=0; -//----------------------------------------------------------------------------- -void udav_error(const char *Message, void *v) -{ ((Fl_MGL*)v)->status->label(Message); } -mreal udav_delay(void *v) -{ return ((Fl_MGL*)v)->AnimDelay; } -void udav_reload(void *v) -{ Parse->RestoreOnce(); ((Fl_MGL*)v)->update(); } -//----------------------------------------------------------------------------- -void udav_next(void *v) { ((Fl_MGL*)v)->next_frame(); } -void Fl_MGL::next_frame() -{ - if(NArgs==0) - { - animate_cb(this,this); - if(NArgs==0) return; - } - ArgCur = (ArgCur+1) % NArgs; - Parse->AddParam(0,Args[ArgCur]); - update(); -} -//----------------------------------------------------------------------------- -void udav_prev(void *v) { ((Fl_MGL*)v)->prev_frame(); } -void Fl_MGL::prev_frame() -{ - if(NArgs==0) - { - animate_cb(this,this); - if(NArgs==0) return; - } - ArgCur = ArgCur>0 ? ArgCur-1 : NArgs-1; - Parse->AddParam(0,Args[ArgCur]); - update(); -} -//----------------------------------------------------------------------------- -Fl_MGL::Fl_MGL(int x, int y, int w, int h, const char *label) : Fl_MGLView(x,y,w,h,label) -{ - if(!Parse) Parse = new mglParse; - Parse->AllowSetSize(true); - ArgBuf = 0; NArgs = ArgCur = 0; - script = script_pre = 0; par = this; - next = udav_next; delay = udav_delay; - prev = udav_prev; reload = udav_reload; -/*#ifdef WIN32 -// setlocale(LC_TYPE,"russian_Russia.CP1251"); - char *path; - get_doc_dir(path); - if(!FMGL->GetFont()->Load("STIX",path && path[0] ? path : ".")) FMGL->GetFont()->Restore(); - free(path); -#endif*/ -} -//----------------------------------------------------------------------------- -Fl_MGL::~Fl_MGL() { clear_scripts(); if(ArgBuf) delete []ArgBuf; } -//----------------------------------------------------------------------------- -void Fl_MGL::clear_scripts() -{ - if(script) free(script); - if(script_pre) free(script_pre); -} -//----------------------------------------------------------------------------- -void Fl_MGL::scripts(char *scr, char *pre) -{ clear_scripts(); script=scr; script_pre=pre; } -//----------------------------------------------------------------------------- -int Fl_MGL::Draw(mglGraph *gr) -{ - Parse->Execute(gr,script_pre); - Parse->Execute(gr,script); - status->label(gr->Message()); - return 0; -} -//----------------------------------------------------------------------------- -void Fl_MGL::update() -{ - // NOTE: hint for old style View(). May be I should remove it! - if(!script || !strstr(script,"rotate")) mgl_rotate(FMGL->get_graph(),0,0,0); - - Fl_MGLView::update(); - - mglVar *v = Parse->FindVar(""); - while(v) - { - if(v->o) ((TableWindow *)v->o)->update(v); - v = v->next; - } -} -//----------------------------------------------------------------------------- -void add_suffix(char *fname, const char *ext) -{ - long n=strlen(fname); - if(n>4 && fname[n-4]=='.') - { fname[n-3]=ext[0]; fname[n-2]=ext[1]; fname[n-1]=ext[2]; } - else { strcat(fname,"."); strcat(fname,ext); } - -} -//----------------------------------------------------------------------------- diff --git a/mgllab/option.cpp b/mgllab/option.cpp deleted file mode 100644 index afff0d5..0000000 --- a/mgllab/option.cpp +++ /dev/null @@ -1,439 +0,0 @@ -/* option.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -extern Fl_Menu_Item colors[]; -extern Fl_Text_Buffer *textbuf; -//----------------------------------------------------------------------------- -struct OptionDlg -{ -public: - Fl_Window* wnd; - int OK; - char result[256]; - OptionDlg() { memset(this,0,sizeof(OptionDlg)); create_dlg(); } - ~OptionDlg() { delete wnd; } - void FillResult(); -protected: - Fl_Input *xmin, *xmax, *ymin, *ymax, *zmin, *zmax, *cmin, *cmax; - Fl_Input *alpha, *amb, *mesh, *font; - Fl_Choice *cut; - - void create_dlg(); -} option_dlg; -//----------------------------------------------------------------------------- -struct StyleDlg -{ -public: -friend void style_set_cb(Fl_Widget *, void *v); -friend void style_rdo_cb(Fl_Widget *, void *v); -friend void font_cb(Fl_Widget *, void *v); -friend void line_cb(Fl_Widget *, void *v); -friend void face_cb(Fl_Widget *, void *v); - Fl_Window* wnd; - int OK; - char result[16]; - StyleDlg() { memset(this,0,sizeof(StyleDlg)); create_dlg(); } - ~StyleDlg() { delete wnd; } -protected: - Fl_Tabs *tab; - Fl_Group *ltab, *stab, *ftab; - Fl_Choice *cl, *cf, *c[7], *ae, *as; - Fl_Choice *dash, *mark, *dir, *text; - Fl_Spinner *lw; - Fl_Output *res; - Fl_Check_Button *d, *w, *sc, *rm, *it, *bf, *gt; - Fl_Round_Button *rl, *rc, *rr; - - void create_dlg(); -} style_dlg; -//----------------------------------------------------------------------------- -void option_dlg_cb(Fl_Widget *, void *v) -{ option_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void style_dlg_cb(Fl_Widget *, void *v) -{ style_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void OptionDlg::create_dlg() -{ - Fl_Button *o; - wnd = new Fl_Window(490, 180, gettext("Command options")); - new Fl_Box(10, 15, 75, 25, gettext("X-Range")); - xmin = new Fl_Input(85, 15, 75, 25); - xmin->tooltip(gettext("Minimal value of X for cutting or for coordinate filling")); - xmax = new Fl_Input(165, 15, 75, 25); - xmax->tooltip(gettext("Maximal value of X for cutting or for coordinate filling")); - new Fl_Box(245, 15, 75, 25, gettext("Y-Range")); - ymin = new Fl_Input(320, 15, 75, 25); - ymin->tooltip(gettext("Minimal value of Y for cutting or for coordinate filling")); - ymax = new Fl_Input(400, 15, 75, 25); - ymax->tooltip(gettext("Maximal value of Y for cutting or for coordinate filling")); - new Fl_Box(10, 45, 75, 25, gettext("Z-Range")); - zmin = new Fl_Input(85, 45, 75, 25); - zmin->tooltip(gettext("Minimal value of Z for cutting or for coordinate filling")); - zmax = new Fl_Input(165, 45, 75, 25); - zmax->tooltip(gettext("Maximal value of Z for cutting or for coordinate filling")); - new Fl_Box(245, 45, 75, 25, gettext("C-Range")); - cmin = new Fl_Input(320, 45, 75, 25); - cmin->tooltip(gettext("Low border for determining color or alpha")); - cmax = new Fl_Input(400, 45, 75, 25); - cmax->tooltip(gettext("Upper border for determining color or alpha")); - { Fl_Box *o = new Fl_Box(15, 75, 460, 5); o->box(FL_UP_BOX); } - alpha = new Fl_Input(25, 105, 75, 25, "Alpha"); alpha->align(FL_ALIGN_TOP); - alpha->tooltip(gettext("Alpha value (transparency) of surface or cloud")); - amb = new Fl_Input(110, 105, 75, 25, gettext("Ambient")); amb->align(FL_ALIGN_TOP); - amb->tooltip(gettext("Own brightness of the surface")); - mesh = new Fl_Input(195, 105, 75, 25, gettext("Mesh Num")); mesh->align(FL_ALIGN_TOP); - mesh->tooltip(gettext("Approximate number of mesh lines in plot")); - font = new Fl_Input(280, 105, 75, 25, gettext("Font Size")); font->align(FL_ALIGN_TOP); - font->tooltip(gettext("Act as default value for font size")); - cut = new Fl_Choice(365, 105, 75, 25, gettext("Cutting")); cut->align(FL_ALIGN_TOP); - cut->add(gettext("on")); cut->add(gettext("off")); - cut->tooltip(gettext("Set cutting off/on for particular plot")); - - o = new Fl_Button(320, 145, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(405, 145, 75, 25, gettext("OK")); o->callback(option_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void OptionDlg::FillResult() -{ - double x1=0,y1=0,z1=0,x2=0,y2=0,z2=0; - bool u1,v1,w1,u2,v2,w2; - char str[64]; - result[0]=0; - - u1 = xmin->value()[0]; if(u1) x1 = atof(xmin->value()); - u2 = xmax->value()[0]; if(u2) x2 = atof(xmax->value()); - v1 = ymin->value()[0]; if(v1) y1 = atof(ymin->value()); - v2 = ymin->value()[0]; if(v2) y2 = atof(ymax->value()); - w1 = zmin->value()[0]; if(w1) z1 = atof(zmin->value()); - w2 = zmin->value()[0]; if(w2) z2 = atof(zmax->value()); - if(u1 && u2) {snprintf(str,64,"; xrange %g %g",x1,x2); strcat(result,str);} - if(v1 && v2) {snprintf(str,64,"; yrange %g %g",y1,y2); strcat(result,str);} - if(w1 && w2) {snprintf(str,64,"; zrange %g %g",z1,z2); strcat(result,str);} - - u1 = cmin->value()[0]; if(u1) x1 = atof(cmin->value()); - u2 = cmax->value()[0]; if(u2) x2 = atof(cmax->value()); - if(u1&&u2) {snprintf(str,64,"; crange %g %g",x1,x2); strcat(result,str);} - - if(alpha->value()[0]) - { snprintf(str,64,"; alpha %g",atof(alpha->value())); strcat(result,str);} - if(amb->value()[0]) - { snprintf(str,64,"; ambient %g",atof(amb->value())); strcat(result,str);} - if(mesh->value()[0]) - { snprintf(str,64,"; meshnum %g",atof(mesh->value()));strcat(result,str);} - if(font->value()[0]) - { snprintf(str,64,"; fontsize '%g'",atof(font->value())); strcat(result,str);} - if(cut->value()>=0) - {snprintf(str,64,"; cut %s",cut->value()==0?"on":"off"); strcat(result,str);} -} -//----------------------------------------------------------------------------- -void option_cb(Fl_Widget *, void *v) -{ - ScriptWindow* e = (ScriptWindow*)v; - OptionDlg *s = &option_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // insert at the end of string - { - long i=e->editor->insert_position(), j=textbuf->line_end(i); - s->FillResult(); - e->editor->insert_position(j); - e->editor->insert(s->result); - } -} -//----------------------------------------------------------------------------- -void option_in_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input*)v; - OptionDlg *s = &option_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) - { - s->FillResult(); - e->value(s->result); - } -} -//----------------------------------------------------------------------------- -Fl_Menu_Item arrows[] = { - {("none")}, //_ - {("arrow")}, //A - {("back arrow")}, //V - {("stop")}, //I - {("size")}, //K - {("triangle")}, //T - {("square")}, //S - {("rhomb")}, //D - {("circle")}, //O - {0}}; -//----------------------------------------------------------------------------- -Fl_Menu_Item dashing[] = { - {("solid")}, //- - {("dash")}, //| - {("dash dot")}, //j - {("small dash")}, //; - {("small dash dot")}, //i - {("dots")}, //: - {("none")}, // - {0}}; -//----------------------------------------------------------------------------- -Fl_Menu_Item markers[] = { - {("none")}, // - {("circle")}, //o - {("cross")}, //+ - {("skew cross")}, //x - {("square")}, //s - {("rhomb")}, //d - {("point")}, //. - {("triangle up")}, //^ - {("triangle down")}, //v - {0}}; -//----------------------------------------------------------------------------- -void style_set_cb(Fl_Widget *,void *) -{ - StyleDlg *s = &style_dlg; - Fl_Widget *t = s->tab->value(); - const char *cols = " wbgrcmylenuqphkWBGRCMYLENUQPH"; - char *r = s->result; - long i=0,j; - if(t==s->ltab) // line style - { - const char *aa = "_AVIKTSDO", *dd="-|j;i: ", *mm="#o+xsd.^v"; - if(s->cl->value()>0) r[i++]=cols[s->cl->value()]; - if(s->dash->value()>0) r[i++]=dd[s->dash->value()]; - if(s->mark->value()>0) r[i++]=mm[s->mark->value()]; - if(s->lw->value()>1 || s->lw->value()==0) - r[i++] = '0'+int(0.1+s->lw->value()); - if(s->as->value()>0) - { r[i++]=aa[s->ae->value()]; r[i++]=aa[s->as->value()]; } - else if(s->ae->value()>0) r[i++]=aa[s->ae->value()]; - } - else if(t==s->stab) // surf style - { - for(j=0;j<7;j++) - { - if(s->c[j]->value()>0) r[i++]=cols[s->c[j]->value()]; - else break; - } - if(s->d->value()) r[i++] = 'd'; - if(s->w->value()) r[i++] = '#'; - if(s->dir->value()>=0) r[i++] = 'x'+s->dir->value(); - if(s->text->value()>0) r[i++] = s->text->value()==1 ? 't':'T'; - } - else if(t==s->ftab) // text style - { - if(s->rm->value()) r[i++] = 'r'; - if(s->sc->value()) r[i++] = 's'; - if(s->it->value()) r[i++] = 'i'; - if(s->bf->value()) r[i++] = 'b'; - if(s->gt->value() && !s->rm->value()) r[i++] = 'g'; - if(s->rl->value()) r[i++] = 'L'; - else if(s->rc->value()) r[i++] = 'C'; - else if(s->rr->value()) r[i++] = 'R'; - if(s->cf->value()>0) - { r[i++]=':'; r[i++]=cols[s->cf->value()]; } - } - r[i]=0; - s->res->value(r); -} -//----------------------------------------------------------------------------- -void style_rdo_cb(Fl_Widget *,void *v) -{ - StyleDlg *s = &style_dlg; - s->rl->value(0); s->rc->value(0); s->rr->value(0); - ((Fl_Round_Button *)v)->value(1); - style_set_cb(0,0); -} -//----------------------------------------------------------------------------- -void StyleDlg::create_dlg() -{ - wnd = new Fl_Window(295, 337, gettext("String with line/surf/text style")); - tab = new Fl_Tabs(0, 0, 295, 255); tab->callback(style_set_cb); - tab->box(UDAV_UP_BOX); - - ltab = new Fl_Group(0, 25, 295, 230, gettext("Line style")); - as = new Fl_Choice(10, 50, 80, 25, gettext("Arrow at start")); - as->align(FL_ALIGN_TOP); as->copy(arrows); as->callback(style_set_cb); -// as->tooltip(gettext("Type of arrow at first point of line or curve")); - dash = new Fl_Choice(110, 50, 80, 25, gettext("Dashing")); - dash->align(FL_ALIGN_TOP); dash->copy(dashing);dash->callback(style_set_cb); -// dash->tooltip(gettext("Type dashing for line or curve")); - ae = new Fl_Choice(210, 50, 80, 25, gettext("Arrow at end")); - ae->align(FL_ALIGN_TOP); ae->copy(arrows); ae->callback(style_set_cb); -// ae->tooltip(gettext("Type of arrow at last point of line or curve")); - cl = new Fl_Choice(110, 85, 80, 25, gettext("Color")); cl->copy(colors); - cl->callback(style_set_cb); - mark = new Fl_Choice(110, 120, 80, 25, gettext("Marks")); - mark->copy(markers); mark->callback(style_set_cb); -// mark->tooltip(gettext("Type of marks at positions of data points")); - lw = new Fl_Spinner(110, 155, 80, 25, gettext("Line width")); - lw->range(0,9); lw->step(1); lw->callback(style_set_cb); -// lw->tooltip(gettext("Relative width of line or curve")); - ltab->end(); - - stab = new Fl_Group(0, 25, 295, 230, gettext("Color scheme")); stab->hide(); - c[0] = new Fl_Choice(15, 45, 75, 25, gettext("Color order")); - c[0]->align(FL_ALIGN_TOP); c[0]->copy(colors); c[0]->callback(style_set_cb); - c[1] = new Fl_Choice(15, 75, 75, 25); c[1]->copy(colors); c[1]->callback(style_set_cb); - c[2] = new Fl_Choice(15, 105, 75, 25); c[2]->copy(colors); c[2]->callback(style_set_cb); - c[3] = new Fl_Choice(15, 135, 75, 25); c[3]->copy(colors); c[3]->callback(style_set_cb); - c[4] = new Fl_Choice(15, 165, 75, 25); c[4]->copy(colors); c[4]->callback(style_set_cb); - c[5] = new Fl_Choice(15, 195, 75, 25); c[5]->copy(colors); c[5]->callback(style_set_cb); - c[6] = new Fl_Choice(15, 225, 75, 25); c[6]->copy(colors); c[6]->callback(style_set_cb); - d = new Fl_Check_Button(100, 45, 180, 25, gettext("Colors along coordinates")); -// w->tooltip(gettext("Set face color proportional to its position")); - d->callback(style_set_cb); - w = new Fl_Check_Button(100, 75, 180, 25, gettext("Wire or mesh plot")); - w->callback(style_set_cb); -// w->tooltip(gettext("Switch to draw wire isosurface or set to draw mesh on surface")); - dir = new Fl_Choice(210, 105, 75, 25, gettext("Axial direction")); - dir->add("x"); dir->add("y"); dir->add("z"); dir->callback(style_set_cb); - text = new Fl_Choice(210, 135, 75, 25, gettext("Text on contours")); -// text->tooltip("Draw contour values near contour lines")); - text->add(gettext("none")); text->add(gettext("under")); - text->add(gettext("above")); text->callback(style_set_cb); - stab->end(); - - ftab = new Fl_Group(0, 25, 295, 230, gettext("Text style")); ftab->hide(); - sc = new Fl_Check_Button(15, 40, 120, 25, gettext("Script font/style")); sc->callback(style_set_cb); - rm = new Fl_Check_Button(15, 70, 120, 25, gettext("Roman font")); rm->callback(style_set_cb); - gt = new Fl_Check_Button(15, 100, 120, 25, gettext("Gothic font")); gt->callback(style_set_cb); - it = new Fl_Check_Button(15, 130, 120, 25, gettext("Italic style")); it->callback(style_set_cb); - bf = new Fl_Check_Button(15, 160, 120, 25, gettext("Bold style")); bf->callback(style_set_cb); - cf = new Fl_Choice(200, 40, 80, 25, gettext("Text color")); cf->copy(colors);cf->callback(style_set_cb); - { Fl_Box* o = new Fl_Box(160, 90, 120, 90, gettext("Alignment")); - o->box(FL_DOWN_BOX); o->align(FL_ALIGN_TOP);} - rl = new Fl_Round_Button(170, 100, 100, 25, gettext("left")); rl->callback(style_rdo_cb,rl); - rc = new Fl_Round_Button(170, 125, 100, 25, gettext("at center")); rc->callback(style_rdo_cb,rc); - rr = new Fl_Round_Button(170, 150, 100, 25, gettext("right")); rr->callback(style_rdo_cb,rr); - ftab->end(); - - tab->end(); - res = new Fl_Output(50, 265, 235, 25, gettext("Result")); -// res->tooltip(gettext("Resulting string which will be used as argument of a command")); - Fl_Button *o; - o = new Fl_Button(125, 300, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(210, 300, 75, 25, gettext("OK")); o->callback(style_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void style_cb(Fl_Widget *, void *v) -{ - ScriptWindow* e = (ScriptWindow*)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - { - int p,q; - char str[20]; - snprintf(str,20,"'%s'",s->result); - textbuf->selection_position(&p, &q); - if(p==q) e->editor->insert(str); - else textbuf->replace_selection(str); - } -} -//----------------------------------------------------------------------------- -void style_in_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input*)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) e->value(s->result); -} -//----------------------------------------------------------------------------- -void font_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input *)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->tab->value(s->ftab); - s->ltab->deactivate(); - s->stab->deactivate(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - e->value(s->result); - s->ltab->activate(); - s->stab->activate(); -} -//----------------------------------------------------------------------------- -void line_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input *)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->tab->value(s->ltab); - s->ftab->deactivate(); - s->stab->deactivate(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - e->value(s->result); - s->ftab->activate(); - s->stab->activate(); -} -//----------------------------------------------------------------------------- -void face_cb(Fl_Widget *, void *v) -{ - Fl_Input* e = (Fl_Input *)v; - StyleDlg *s = &style_dlg; - s->OK = false; - s->wnd->set_modal(); - s->tab->value(s->stab); - s->ltab->deactivate(); - s->ftab->deactivate(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) // replace current selection - e->value(s->result); - s->ltab->activate(); - s->ftab->activate(); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/setup.cpp b/mgllab/setup.cpp deleted file mode 100644 index 44309ce..0000000 --- a/mgllab/setup.cpp +++ /dev/null @@ -1,422 +0,0 @@ -/* setup.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "mgl2/mgl.h" -#include -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -extern int auto_exec, plastic_scheme, internal_font; -//----------------------------------------------------------------------------- -void setup_dlg_cb(Fl_Widget *, void *v) -{ SetupDlg *s = (SetupDlg *)v; s->OK = true; s->wnd->hide(); } -//----------------------------------------------------------------------------- -void setup_sav_cb(Fl_Widget *, void *v) -{ - SetupDlg *e = (SetupDlg *)v; - char *buf = e->ToScript(); - const char *fname; - if(buf[0]) - { - fname = e->templ->value(); - if(fname[0]==0) fname = "template.mgl"; - FILE *fp = fopen(fname,"w"); - fputs(buf,fp); - fclose(fp); - } - free(buf); -} -//----------------------------------------------------------------------------- -void close_dlg_cb(Fl_Widget *, void *v) -{ ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void SetupDlg::CreateGen() -{ - xmin = new Fl_Input(105, 50, 75, 25); xmax = new Fl_Input(105, 80, 75, 25); - ymin = new Fl_Input(190, 50, 75, 25); ymax = new Fl_Input(190, 80, 75, 25); - zmin = new Fl_Input(275, 50, 75, 25); zmax = new Fl_Input(275, 80, 75, 25); - cmin = new Fl_Input(360, 50, 75, 25); cmax = new Fl_Input(360, 80, 75, 25); - - xorg = new Fl_Input(105, 110, 75, 25); - yorg = new Fl_Input(190, 110, 75, 25); - zorg = new Fl_Input(275, 110, 75, 25); - xlab = new Fl_Input(105, 140, 75, 25); - ylab = new Fl_Input(190, 140, 75, 25); - zlab = new Fl_Input(275, 140, 75, 25); - - xpos = new Fl_Choice(105, 170, 75, 25); xpos->add(gettext("at minumum")); - xpos->add("at center"); xpos->add(gettext("at maxumum")); xpos->value(1); - ypos = new Fl_Choice(190, 170, 75, 25); ypos->add(gettext("at minumum")); - ypos->add("at center"); ypos->add(gettext("at maxumum")); ypos->value(1); - zpos = new Fl_Choice(275, 170, 75, 25); zpos->add(gettext("at minumum")); - zpos->add("at center"); zpos->add(gettext("at maxumum")); zpos->value(1); - xtik = new Fl_Input(105, 200, 75, 25); - ytik = new Fl_Input(190, 200, 75, 25); - ztik = new Fl_Input(275, 200, 75, 25); - xsub = new Fl_Input(105, 230, 75, 25); - ysub = new Fl_Input(190, 230, 75, 25); - zsub = new Fl_Input(275, 230, 75, 25); - - { Fl_Box* o = new Fl_Box(10, 260, 470, 5); o->box(FL_DOWN_BOX); } - alphad = new Fl_Input(20, 285, 75, 25, gettext("AlphaDef")); alphad->align(FL_ALIGN_TOP); - ambient = new Fl_Input(105, 285, 75, 25, gettext("Ambient")); ambient->align(FL_ALIGN_TOP); - basew = new Fl_Input(190, 285, 75, 25, gettext("Base Width")); basew->align(FL_ALIGN_TOP); - mesh = new Fl_Input(275, 285, 75, 25, gettext("Mesh Num")); mesh->align(FL_ALIGN_TOP); - axial = new Fl_Choice(360, 285, 75, 25, gettext("Axial Dir")); axial->align(FL_ALIGN_TOP); - axial->add("x"); axial->add("y"); axial->add("z"); - font = new Fl_Input(20, 330, 50, 25, gettext("Font")); font->align(FL_ALIGN_TOP); - { Fl_Button* o = new Fl_Button(70, 330, 25, 25, ".."); o->callback(font_cb, font); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); } - size = new Fl_Input(105, 330, 75, 25, gettext("Font Size")); size->align(FL_ALIGN_TOP); - alpha = new Fl_Check_Button(190, 330, 75, 25, gettext("Alpha on")); - light = new Fl_Check_Button(275, 330, 75, 25, gettext("Light on")); - rotate = new Fl_Check_Button(360, 330, 90, 25, gettext("Rotate text")); -} -//----------------------------------------------------------------------------- -void SetupDlg::CreateLid() -{ - const char *str[10]={"0:", "1:", "2:", "3:", "4:", "5:", "6:", "7:", "8:", "9:"}; - int h; - for(long i=0;i<10;i++) - { - h = 55 + 30*i; - new Fl_Box(10, h, 25, 25, str[i]); - lid[i] = new Fl_Check_Button(35, h, 40, 25, gettext("on")); - xid[i] = new Fl_Input(85, h, 75, 25); - yid[i] = new Fl_Input(165, h, 75, 25); - zid[i] = new Fl_Input(245, h, 75, 25); - cid[i] = new Fl_Choice(325, h, 75, 25); - cid[i]->copy(colors); - bid[i] = new Fl_Input(405, h, 75, 25); - } -} -//----------------------------------------------------------------------------- -void SetupDlg::CreateDlg() -{ - OK = false; - wnd = new Fl_Window(490, 406, gettext("Setup graphics")); - Fl_Tabs* t = new Fl_Tabs(0, 0, 490, 360); t->box(UDAV_UP_BOX); - - Fl_Group *g = new Fl_Group(0, 25, 485, 330, gettext("General")); - new Fl_Box(105, 30, 75, 20, gettext("X axis")); - new Fl_Box(190, 30, 75, 20, gettext("Y axis")); - new Fl_Box(275, 30, 75, 20, gettext("Z axis")); - new Fl_Box(360, 30, 75, 20, gettext("Color")); - - new Fl_Box(25, 50, 75, 25, gettext("Minimal")); - new Fl_Box(25, 80, 75, 25, gettext("Maximal")); - new Fl_Box(25, 110, 75, 25, gettext("Origin")); - new Fl_Box(25, 140, 75, 25, gettext("Label")); - new Fl_Box(25, 170, 75, 25, gettext("Position")); - new Fl_Box(25, 200, 75, 25, gettext("Ticks")); - new Fl_Box(25, 230, 75, 25, gettext("SubTicks")); - CreateGen(); - g->end(); - - g = new Fl_Group(0, 25, 485, 330, gettext("Light")); g->hide(); - new Fl_Box(10, 30, 25, 25, gettext("ID")); - new Fl_Box(40, 30, 40, 25, gettext("State")); - new Fl_Box(85, 30, 75, 25, gettext("X position")); - new Fl_Box(165, 30, 75, 25, gettext("Y position")); - new Fl_Box(245, 30, 75, 25, gettext("Z position")); - new Fl_Box(325, 30, 75, 25, gettext("Color")); - new Fl_Box(405, 30, 75, 25, gettext("Brightness")); - CreateLid(); - g->end(); - - g = new Fl_Group(0, 25, 485, 330, gettext("Setup code")); g->hide(); - code = new Fl_Help_View(0, 25, 485, 330); - g->end(); - - t->end(); //Fl_Group::current()->resizable(t); - Fl_Button *o; - templ = new Fl_Input(120, 370, 110, 25, gettext("Template name")); - templ->value("template.mgl"); - o = new Fl_Button(230, 370, 80, 25, gettext("Save")); o->callback(setup_sav_cb, wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Save settings to file template.mgl.\nYou may use it later by 'call template.mgl'")); - - o = new Fl_Button(315, 370, 80, 25, gettext("Cancel")); o->callback(close_dlg_cb, wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(400, 370, 80, 25, gettext("OK")); o->callback(setup_dlg_cb, this); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -char *SetupDlg::ToScript() -{ - long i; - double x1=0,y1=0,z1=0,x2=0,y2=0,z2=0; - bool u1,v1,w1,u2,v2,w2; - const char *cols = " wbgrcmylenuqphkWBGRCMYLENUQPH"; - char *buf = (char *)malloc(1024*sizeof(char)), str[128]; - long num = 1024, cur = 0; - buf[0]=0; - if(!OK) return buf; - - for(i=0;i<10;i++) // set light sources - { -//fl_message("before %d lid:%d xid:%s yid:%s zid:%s",i,lid[i]->value(), xid[i]->value(),yid[i]->value(),zid[i]->value()); - if(!lid[i]->value()) continue; - if(!xid[i]->value()[0] || !yid[i]->value()[0] || !zid[i]->value()[0]) continue; - x1=atof(xid[i]->value()); y1=atof(yid[i]->value()); z1=atof(zid[i]->value()); - if(!bid[i]->value()[0]) - cur += snprintf(str,128,"light %ld %g %g %g '%c'\n",i,x1,y1,z1, - cols[cid[i]->value()]); - else - cur += snprintf(str,128,"light %ld %g %g %g '%c' %g\n",i,x1,y1,z1, - cols[cid[i]->value()],atof(bid[i]->value())); - strcat(buf,str); - } - u1 = xmin->value()[0]; if(u1) x1 = atof(xmin->value()); - u2 = xmax->value()[0]; if(u2) x2 = atof(xmax->value()); - v1 = ymin->value()[0]; if(v1) y1 = atof(ymin->value()); - v2 = ymin->value()[0]; if(v2) y2 = atof(ymax->value()); - w1 = zmin->value()[0]; if(w1) z1 = atof(zmin->value()); - w2 = zmin->value()[0]; if(w2) z2 = atof(zmax->value()); - if(u1&&v1&&w1&&u2&&v2&&w2) - { - cur+=snprintf(str,128,"axis %g %g %g %g %g %g\n",x1,y1,z1,x2,y2,z2); - strcat(buf,str); - } - else - { - if(u1 && u2) {cur+=snprintf(str,128,"xrange %g %g\n",x1,x2); strcat(buf,str);} - if(v1 && v2) {cur+=snprintf(str,128,"yrange %g %g\n",y1,y2); strcat(buf,str);} - if(w1 && w2) {cur+=snprintf(str,128,"zrange %g %g\n",z1,z2); strcat(buf,str);} - } - u1 = cmin->value()[0]; if(u1) x1 = atof(cmin->value()); - u2 = cmax->value()[0]; if(u2) x2 = atof(cmax->value()); - if(u1&&u2) {cur+=snprintf(str,128,"crange %g %g\n",x1,x2); strcat(buf,str);} - if(cur>num-256) { num+=512; buf = (char *)realloc(buf,num*sizeof(char)); } - - u1 = xorg->value()[0]; if(u1) x1 = atof(xorg->value()); - v1 = yorg->value()[0]; if(v1) y1 = atof(yorg->value()); - w1 = zorg->value()[0]; if(w1) z1 = atof(zorg->value()); - if(u1&&v1&&w1) {snprintf(str,128,"origin %g %g %g\n",x1,y1,z1); strcat(buf,str);} - - u1 = xtik->value()[0]; if(u1) x1 = atof(xtik->value()); - u2 = xsub->value()[0]; if(u2) x2 = atoi(xsub->value()); - v1 = ytik->value()[0]; if(v1) y1 = atof(ytik->value()); - v2 = ysub->value()[0]; if(v2) y2 = atoi(ysub->value()); - w1 = ztik->value()[0]; if(w1) z1 = atof(ztik->value()); - w2 = zsub->value()[0]; if(w2) z2 = atoi(zsub->value()); - if(u1 && u2) {cur+=snprintf(str,128,"xtick %g %g\n",x1,x2); strcat(buf,str);} - if(v1 && v2) {cur+=snprintf(str,128,"ytick %g %g\n",y1,y2); strcat(buf,str);} - if(w1 && w2) {cur+=snprintf(str,128,"ztick %g %g\n",z1,z2); strcat(buf,str);} - if(u1 && !u2) {cur+=snprintf(str,128,"xtick %g\n",x1); strcat(buf,str);} - if(v1 && !v2) {cur+=snprintf(str,128,"ytick %g\n",y1); strcat(buf,str);} - if(w1 && !w2) {cur+=snprintf(str,128,"ztick %g\n",z1); strcat(buf,str);} - - if(xlab->value()[0]) - { - cur+=snprintf(str,128,"xlabel '%s' %d\n",xlab->value(), xpos->value()-1); - strcat(buf,str); - } - if(ylab->value()[0]) - { - cur+=snprintf(str,128,"ylabel '%s' %d\n",ylab->value(), ypos->value()-1); - strcat(buf,str); - } - if(zlab->value()[0]) - { - cur+=snprintf(str,128,"zlabel '%s' %d\n",zlab->value(), zpos->value()-1); - strcat(buf,str); - } - if(alphad->value()[0]) - { - cur+=snprintf(str,128,"alphadef %g\n",atof(alphad->value())); - strcat(buf,str); - } - if(ambient->value()[0]) - { - cur+=snprintf(str,128,"ambient %g\n",atof(ambient->value())); - strcat(buf,str); - } - - if(basew->value()[0]) - { - cur+=snprintf(str,128,"baselinewidth %g\n",atof(basew->value())); - strcat(buf,str); - } - if(mesh->value()[0]) - { - cur+=snprintf(str,128,"meshnum %g\n",atof(mesh->value())); - strcat(buf,str); - } - if(axial->value()>=0) - { - cur+=snprintf(str,128,"axialdir '%c'\n",'x'+axial->value()); - strcat(buf,str); - } - - if(font->value()[0]) - { - cur+=snprintf(str,128,"font '%s'",font->value()); - strcat(buf,str); - if(size->value()) cur+=snprintf(str,128," %g\n",atof(size->value())); - else cur+=snprintf(str,128,"\n"); - strcat(buf,str); - } - if(rotate->value()) {cur+=snprintf(str,128,"rotatetext on\n"); strcat(buf,str);} - - if(alpha->value()) {cur+=snprintf(str,128,"alpha on\n"); strcat(buf,str);} - if(light->value()) {cur+=snprintf(str,128,"light on\n"); strcat(buf,str);} - - code->value(buf); - return buf; -} -//----------------------------------------------------------------------------- -void setup_cb(Fl_Widget *, void *d) -{ - if(d==0) return; - SetupDlg *s = ((ScriptWindow *)d)->setup_dlg; - s->OK = false; - s->wnd->set_modal(); - s->wnd->show(); - while(s->wnd->shown()) Fl::wait(); - if(s->OK) ((ScriptWindow *)d)->graph->update(); -} -//----------------------------------------------------------------------------- -Fl_Menu_Item colors[] = { - {"-----", 0,0,0,0,0,0,0, 0}, // - {("white"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,0)}, //w - {("blue"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,255)}, //b - {("lime"), 0,0,0,0,0,0,0, fl_rgb_color(0,255,0)}, //g - {("red"), 0,0,0,0,0,0,0, fl_rgb_color(255,0,0)}, //r - {("cyan"), 0,0,0,0,0,0,0, fl_rgb_color(0,255,255)}, //c - {("magenta"), 0,0,0,0,0,0,0, fl_rgb_color(255,0,255)}, //m - {("yellow"), 0,0,0,0,0,0,0, fl_rgb_color(255,255,0)}, //y - {("springgreen"), 0,0,0,0,0,0,0, fl_rgb_color(0,255,127)},//l - {("lawngreen"), 0,0,0,0,0,0,0, fl_rgb_color(127,255,0)}, //e - {("skyblue"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,255)}, //n - {("blueviolet"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,255)}, //u - {("orange"), 0,0,0,0,0,0,0, fl_rgb_color(255,127,0)}, //q - {("deeppink"), 0,0,0,0,0,0,0, fl_rgb_color(255,0,127)}, //p - {("gray"), 0,0,0,0,0,0,0, fl_rgb_color(127,127,127)}, //h - - {("black"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,0)}, //k - {("lightgray"), 0,0,0,0,0,0,0, fl_rgb_color(179,179,179)}, //W - {("navy"), 0,0,0,0,0,0,0, fl_rgb_color(0,0,127)}, //B - {("green"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,0)}, //G - {("maroon"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,0)}, //R - {("teal"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,127)}, //C - {("purple"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,127)}, //M - {("olive"), 0,0,0,0,0,0,0, fl_rgb_color(127,127,0)}, //Y - {("seagreen"), 0,0,0,0,0,0,0, fl_rgb_color(0,127,77)}, //L - {("darklawn"), 0,0,0,0,0,0,0, fl_rgb_color(77,127,0)}, //E - {("darkskyblue"), 0,0,0,0,0,0,0, fl_rgb_color(0,77,127)}, //N - {("indigo"), 0,0,0,0,0,0,0, fl_rgb_color(77,0,127)}, //U - {("brown"), 0,0,0,0,0,0,0, fl_rgb_color(127,77,0)}, //Q - {("darkpink"), 0,0,0,0,0,0,0, fl_rgb_color(127,0,77)}, //P - {("darkgray"), 0,0,0,0,0,0,0, fl_rgb_color(77,77,77)}, //H -{0, 0,0,0,0,0,0,0, 0}}; -//----------------------------------------------------------------------------- -struct PropDlg -{ - Fl_Window *wnd; - Fl_MGL *graph; - - Fl_Input *path, *locale, *font, *fpath; - Fl_Check_Button *plast, *aexec, *ifont; - PropDlg() { memset(this,0,sizeof(PropDlg)); create_dlg(); } - ~PropDlg() { delete wnd; } - void create_dlg(); - void finish(); - void init(); -} prop_dlg; -//----------------------------------------------------------------------------- -void PropDlg::init() -{ - int a, p; - char *buf; - pref.get("plastic_scheme",p,1); plast->value(p); - pref.get("auto_exec",a,1); aexec->value(a); - pref.get("internal_font",a,0); ifont->value(a); - path->value(docdir); - pref.get("font_dir",buf,""); fpath->value(buf); free(buf); - pref.get("font_name",buf,""); font->value(buf); free(buf); - pref.get("locale",buf,"ru_RU.cp1251"); locale->value(buf); free(buf); -} -//----------------------------------------------------------------------------- -void PropDlg::finish() -{ - int a, p; - p = plast->value(); - if(p!=plastic_scheme) - { - plastic_scheme = p; - pref.set("plastic_scheme",p); - Fl::scheme(p?"plastic":"none"); - } - a = aexec->value(); - if(a!=auto_exec) - { - auto_exec = a; - pref.set("auto_exec",a); - } - a = ifont->value(); - if(a!=internal_font) - { - internal_font = a; - pref.set("internal_font",a); - } - if(path->value()[0]) pref.set("help_dir",path->value()); - if(locale->value()[0]) - { - pref.set("locale", locale->value()); - setlocale(LC_CTYPE, locale->value()); - } - pref.set("font_dir",fpath->value()); - pref.set("font_name",font->value()); - if(graph) mgl_load_font(graph->FMGL->get_graph(), font->value(), fpath->value()); -} -//----------------------------------------------------------------------------- -void prop_dlg_cb(Fl_Widget *, void *v) -{ prop_dlg.finish(); ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void PropDlg::create_dlg() -{ - wnd = new Fl_Double_Window(320, 300, gettext("UDAV settings")); - path = new Fl_Input(10, 25, 305, 25, gettext("Path for help files")); path->align(FL_ALIGN_TOP_LEFT); - - font = new Fl_Input(10, 75, 305, 25, gettext("Font typeface")); font->align(FL_ALIGN_TOP_LEFT); - fpath = new Fl_Input(10, 125, 305, 25, gettext("Path for font files")); fpath->align(FL_ALIGN_TOP_LEFT); - locale = new Fl_Input(10, 175, 305, 25, gettext("Select locale")); locale->align(FL_ALIGN_TOP_LEFT); - - plast = new Fl_Check_Button(10, 210, 210, 25, gettext("Use plastic scheme")); - aexec = new Fl_Check_Button(10, 240, 210, 25, gettext("Execute after script loading")); - ifont = new Fl_Check_Button(10, 270, 210, 25, gettext("Use only internal font")); - - Fl_Button *o; - o = new Fl_Button(240, 210, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o = new Fl_Return_Button(240, 240, 75, 25, gettext("OK")); o->callback(prop_dlg_cb,wnd); - wnd->end(); -} -//----------------------------------------------------------------------------- -void settings_cb(Fl_Widget *, void *v) -{ - PropDlg *s = &prop_dlg; - s->graph = ((ScriptWindow *)v)->graph; - s->init(); - s->wnd->set_modal(); - s->wnd->show(); -} -//----------------------------------------------------------------------------- diff --git a/mgllab/table.cpp b/mgllab/table.cpp deleted file mode 100644 index 313706d..0000000 --- a/mgllab/table.cpp +++ /dev/null @@ -1,875 +0,0 @@ -/* table.cpp is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include -#include -#include "udav.h" -//----------------------------------------------------------------------------- -void addto_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *s = fl_input(gettext("Enter number for addition to data values"),0); - if(s) { mgl_data_add_num(e->var, atof(s)); e->refresh(); } -} -//----------------------------------------------------------------------------- -void subto_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *s = fl_input(gettext("Enter number for subtraction from data values"),0); - if(s) { mgl_data_sub_num(e->var, atof(s)); e->refresh(); } -} -//----------------------------------------------------------------------------- -void multo_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *s = fl_input(gettext("Enter number for multiplication of data values"),0); - if(s) { mgl_data_mul_num(e->var, atof(s)); e->refresh(); } -} -//----------------------------------------------------------------------------- -void divto_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *s = fl_input(gettext("Enter number for division of data values"),0); - if(s) { mgl_data_div_num(e->var, atof(s)); e->refresh(); } -} -//----------------------------------------------------------------------------- -struct XYZDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Box *box; - Fl_Check_Button *ch; - Fl_Spinner *mx, *my, *mz; - XYZDlg() { memset(this,0,sizeof(XYZDlg)); create_dlg(); } - ~XYZDlg() { delete wnd; } - void create_dlg(); -} xyz_dlg; -//----------------------------------------------------------------------------- -void xyz_dlg_cb(Fl_Widget *, void *v) -{ xyz_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void XYZDlg::create_dlg() -{ - wnd = new Fl_Double_Window(325, 125, gettext("Change data sizes")); - box = new Fl_Box(10, 10, 305, 40); - box->box(UDAV_THIN_UP_BOX); - box->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); - - mx = new Fl_Spinner(30, 55, 75, 25, "mx"); - mx->tooltip(gettext("New size of data on 1st dimension (x-direction)")); - my = new Fl_Spinner(135, 55, 75, 25, "my"); - my->tooltip(gettext("New size of data on 2nd dimension (y-direction)")); - mz = new Fl_Spinner(240, 55, 75, 25, "mz"); - mz->tooltip(gettext("New size of data on 3d dimension (z-direction)")); - ch = new Fl_Check_Button(15, 90, 95, 25); - - Fl_Button *o; - o = new Fl_Button(125, 90, 85, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Do nothing and close this window")); - o = new Fl_Return_Button(230, 90, 85, 25, gettext("Change"));o->callback(xyz_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Change (resize) data")); - wnd->end(); -} -//----------------------------------------------------------------------------- -void new_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - xyz_dlg.box->label(gettext("Specify new data size\nData will be zero filled")); - xyz_dlg.ch->label(gettext("not used")); xyz_dlg.OK = false; - xyz_dlg.wnd->set_modal(); xyz_dlg.wnd->show(); - while(xyz_dlg.wnd->shown()) Fl::wait(); - if(xyz_dlg.OK) - { - e->var->Create(int(xyz_dlg.mx->value()), - int(xyz_dlg.my->value()), int(xyz_dlg.mz->value())); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -void resize_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - xyz_dlg.box->label(gettext("Specify new data size\nData will be interpolated")); - xyz_dlg.ch->label(gettext("not used")); xyz_dlg.OK = false; - xyz_dlg.wnd->set_modal(); xyz_dlg.wnd->show(); - while(xyz_dlg.wnd->shown()) Fl::wait(); - if(xyz_dlg.OK) - { - mglData d = e->var->Resize(int(xyz_dlg.mx->value()), int(xyz_dlg.my->value()), int(xyz_dlg.mz->value())); - mgl_data_set(e->var, &d); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -void squeeze_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - xyz_dlg.box->label(gettext("Specify the skiping step\nEach m-th point will be skiped")); - xyz_dlg.ch->label(gettext("smoothed")); xyz_dlg.OK = false; - xyz_dlg.wnd->set_modal(); xyz_dlg.wnd->show(); - while(xyz_dlg.wnd->shown()) Fl::wait(); - if(xyz_dlg.OK) - { - e->var->Squeeze(int(xyz_dlg.mx->value()), int(xyz_dlg.my->value()), - int(xyz_dlg.mz->value()), xyz_dlg.ch->value()); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -struct ChngDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Check_Button *dx, *dy, *dz; - Fl_Choice *kind, *type; - ChngDlg() { memset(this,0,sizeof(ChngDlg)); create_dlg(); } - ~ChngDlg() { delete wnd; } - void create_dlg(); - void execute(mglData *d); -} chng_dlg; -//----------------------------------------------------------------------------- -void chng_dlg_cb(Fl_Widget *, void *v) -{ chng_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void ChngDlg::execute(mglData *d) -{ - char r[8]="3"; - if(dx->value()) strcat(r,"x"); - if(dy->value()) strcat(r,"y"); - if(dz->value()) strcat(r,"z"); - if(!r[0]) return; - if(type->value()==1) r[0] = '5'; - if(type->value()==2) r[0] = ' '; - switch(kind->value()) - { - case 0: d->Smooth(r); break; - case 1: d->CumSum(r); break; - case 2: d->Integral(r); break; - case 3: d->Diff(r); break; - case 4: d->Diff2(r); break; - case 5: d->Swap(r); break; - } -} -//----------------------------------------------------------------------------- -void ChngDlg::create_dlg() -{ - Fl_Menu_Item k[]={{gettext("Smooth")}, {gettext("CumSum")}, { gettext("Integrate")}, - { gettext("Difference")}, { gettext("Double diff.")}, { gettext("Swap parts")}, {0}}; - Fl_Menu_Item t[]={{gettext("Linear *3")}, {gettext("Linear *5")}, {gettext("Parabolic *5")},{0}}; - wnd = new Fl_Double_Window(165, 215, gettext("Change data")); - kind = new Fl_Choice(10, 25, 145, 25, gettext("Type of operation")); - kind->align(FL_ALIGN_TOP_LEFT); kind->copy(k); - dx = new Fl_Check_Button(10, 55, 140, 25, gettext("apply in x direction")); - dy = new Fl_Check_Button(10, 80, 140, 25, gettext("apply in y direction")); - dz = new Fl_Check_Button(10, 105, 140, 25, gettext("apply in z direction")); - type = new Fl_Choice(10, 145, 145, 25, gettext("Type of smoothing")); - type->align(FL_ALIGN_TOP_LEFT); type->copy(t); - - Fl_Button *o; - o = new Fl_Button(10, 180, 65, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(90, 180, 65, 25, gettext("Do"));o->callback(chng_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void smooth_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(0); - chng_dlg.type->activate(); chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void cumsum_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(1); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void integr_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(2); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void diff_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(3); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void diff2_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(4); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -void swap_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - chng_dlg.kind->value(5); - chng_dlg.type->deactivate();chng_dlg.OK = false; - chng_dlg.wnd->set_modal(); chng_dlg.wnd->show(); - while(chng_dlg.wnd->shown()) Fl::wait(); - if(chng_dlg.OK) - { chng_dlg.execute(e->var); e->refresh(); } -} -//----------------------------------------------------------------------------- -struct NwdtDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Check_Button *dx, *dy, *dz; - Fl_Choice *kind; - Fl_Input *name; - NwdtDlg() { memset(this,0,sizeof(NwdtDlg)); create_dlg(); } - ~NwdtDlg() { delete wnd; } - void create_dlg(); -} nwdt_dlg; -//----------------------------------------------------------------------------- -void nwdt_dlg_cb(Fl_Widget *, void *v) -{ nwdt_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void NwdtDlg::create_dlg() -{ - Fl_Menu_Item k[]={{gettext("Summation of")}, {gettext("Maximum of")}, { gettext("Minimum of")}, {0}}; - wnd = new Fl_Double_Window(165, 215, gettext("Extract data")); - kind = new Fl_Choice(10, 25, 145, 25, gettext("Type of operation")); - kind->align(FL_ALIGN_TOP_LEFT); kind->copy(k); - dx = new Fl_Check_Button(10, 55, 140, 25, gettext("apply in x direction")); - dy = new Fl_Check_Button(10, 80, 140, 25, gettext("apply in y direction")); - dz = new Fl_Check_Button(10, 105, 140, 25, gettext("apply in z direction")); - name = new Fl_Input(10, 145, 145, 25, gettext("Name for output")); - name->align(FL_ALIGN_TOP_LEFT); - - Fl_Button *o; - o = new Fl_Button(10, 180, 65, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o = new Fl_Return_Button(90, 180, 65, 25, gettext("Do"));o->callback(chng_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - wnd->end(); -} -//----------------------------------------------------------------------------- -void asum_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nwdt_dlg.kind->value(0); nwdt_dlg.OK = false; - nwdt_dlg.wnd->set_modal(); nwdt_dlg.wnd->show(); - while(nwdt_dlg.wnd->shown()) Fl::wait(); - if(nwdt_dlg.OK) - { - char r[8]=""; - if(nwdt_dlg.dx->value()) strcat(r,"x"); - if(nwdt_dlg.dy->value()) strcat(r,"y"); - if(nwdt_dlg.dz->value()) strcat(r,"z"); - if(!r[0]) return; - if(!nwdt_dlg.name->value()[0] || !strcmp(nwdt_dlg.name->value(),e->label())) - fl_alert(gettext("Name for output variable should be differ from this name")); - else - { - mglData d = e->var->Sum(r); - mgl_data_set(Parse->AddVar(nwdt_dlg.name->value()), &d); - } - } -} -//----------------------------------------------------------------------------- -void amax_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nwdt_dlg.kind->value(0); nwdt_dlg.OK = false; - nwdt_dlg.wnd->set_modal(); nwdt_dlg.wnd->show(); - while(nwdt_dlg.wnd->shown()) Fl::wait(); - if(nwdt_dlg.OK) - { - char r[8]=""; - if(nwdt_dlg.dx->value()) strcat(r,"x"); - if(nwdt_dlg.dy->value()) strcat(r,"y"); - if(nwdt_dlg.dz->value()) strcat(r,"z"); - if(!r[0]) return; - if(!nwdt_dlg.name->value()[0] || !strcmp(nwdt_dlg.name->value(),e->label())) - fl_alert(gettext("Name for output variable should be differ from this name")); - else - { - mglData d = e->var->Max(r); - mgl_data_set(Parse->AddVar(nwdt_dlg.name->value()), &d); - } - } -} -//----------------------------------------------------------------------------- -void amin_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nwdt_dlg.kind->value(0); nwdt_dlg.OK = false; - nwdt_dlg.wnd->set_modal(); nwdt_dlg.wnd->show(); - while(nwdt_dlg.wnd->shown()) Fl::wait(); - if(nwdt_dlg.OK) - { - char r[8]=""; - if(nwdt_dlg.dx->value()) strcat(r,"x"); - if(nwdt_dlg.dy->value()) strcat(r,"y"); - if(nwdt_dlg.dz->value()) strcat(r,"z"); - if(!r[0]) return; - if(!nwdt_dlg.name->value()[0] || !strcmp(nwdt_dlg.name->value(), e->label())) - fl_alert(gettext("Name for output variable should be differ from this name")); - else - { - mglData d = e->var->Min(r); - mgl_data_set(Parse->AddVar(nwdt_dlg.name->value()), &d); - } - } -} -//----------------------------------------------------------------------------- -void load_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - char *newfile = fl_file_chooser(gettext("Load Data?"), - gettext("DAT Files (*.{dat,csv})\tAll Files (*)"), 0); - if(newfile != NULL) - { e->var->Read(newfile); e->refresh(); } -} -//----------------------------------------------------------------------------- -void save_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - char *newfile = fl_file_chooser(gettext("Save Data?"), - gettext("DAT Files (*.{dat,csv})\tAll Files (*)"), 0); - if(newfile != NULL) e->var->Save(newfile); -} -//----------------------------------------------------------------------------- -void exp_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *scheme, *newfile = fl_file_chooser(gettext("Export Data?"), - gettext("PNG Files (*.png)\tAll Files (*)"), 0); - if(newfile != NULL) - { - scheme = fl_input(gettext("Enter color scheme"),MGL_DEF_SCH); - if(scheme) e->var->Export(newfile,scheme); - } -} -//----------------------------------------------------------------------------- -void imp_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *scheme, *newfile = fl_file_chooser(gettext("Import Data?"), - gettext("PNG Files (*.png)\tAll Files (*)"), 0); - if (newfile != NULL) - { - scheme = fl_input(gettext("Enter color scheme"),MGL_DEF_SCH); - if(scheme) - { e->var->Import(newfile,scheme); e->refresh(); } - } -} -//----------------------------------------------------------------------------- -void list_dat_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - mglData *d = e->var; - if(d->nx*d->ny+d->ny>1020) - { fl_message(gettext("Too many numbers (>1000) on slice")); return; } - if(d->nz>1) fl_message(gettext("Only current slice will be inserted")); - char *list = new char[16384]; - strcpy(list,"list\t"); - register long i,j; - char s[32]; - for(j=0;jny;j++) - { - for(i=0;inx;i++) - { - snprintf(s,32,"%g\t",d->a[i+d->nx*(j+e->get_slice()*d->ny)]); - strcat(list,s); - } - if(jny-1) strcat(list,"|\t"); - } - textbuf->insert(0,list); - delete []list; -} -//----------------------------------------------------------------------------- -void modify_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - const char *eq=fl_input(gettext("Enter formula for data modification\nHere x, y, z in range [0,1], u is data value"),0); - if (eq != NULL) { e->var->Modify(eq); e->refresh(); } -} -//----------------------------------------------------------------------------- -void plot_dat_cb(Fl_Widget *, void *v); -//----------------------------------------------------------------------------- -struct NrmDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Value_Input *min, *max; - Fl_Choice *dir; - Fl_Check_Button *sym; - NrmDlg() { memset(this,0,sizeof(NrmDlg)); create_dlg(); } - ~NrmDlg() { delete wnd; } - void create_dlg(); -} nrm_dlg; -//----------------------------------------------------------------------------- -void nrm_dlg_cb(Fl_Widget *, void *v) -{ nrm_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void NrmDlg::create_dlg() -{ - Fl_Menu_Item k[]={{"x"}, {"y"}, { "z"}, {0}}; - wnd = new Fl_Double_Window(135, 215); - min = new Fl_Value_Input(10, 25, 115, 25, gettext("Minimal value (v1)")); - min->align(FL_ALIGN_TOP_LEFT); - min->tooltip(gettext("Minimal value for resulting data values")); - max = new Fl_Value_Input(10, 70, 115, 25, gettext("Maximal value (v2)")); - max->align(FL_ALIGN_TOP_LEFT); - max->tooltip(gettext("Maximal value for resulting data values")); - dir = new Fl_Choice(10, 115, 115, 25, gettext("Direction")); - dir->align(FL_ALIGN_TOP_LEFT); dir->copy(k); - dir->tooltip(gettext("Direction along which data will be filled")); - sym = new Fl_Check_Button(10, 115, 115, 25, gettext("Symetrical range")); - sym->tooltip(gettext("Normalize in symmetrical range: -max(|v1|,|v2|) ... max(|v1|,|v2|)")); - - Fl_Button *o; - o = new Fl_Button(25, 150, 85, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Do nothing and close this window")); - o = new Fl_Return_Button(25, 180, 85, 25, gettext("Change"));o->callback(nrm_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Change data values and close this window")); - wnd->end(); -} -//----------------------------------------------------------------------------- -void fill_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nrm_dlg.OK = false; nrm_dlg.wnd->label(gettext("Fill in range")); - nrm_dlg.dir->show(); nrm_dlg.sym->hide(); - nrm_dlg.wnd->set_modal(); nrm_dlg.wnd->show(); - while(nrm_dlg.wnd->shown()) Fl::wait(); - if(nrm_dlg.OK) - { - char r='x'; - if(nrm_dlg.dir->value()==1) r='y'; - if(nrm_dlg.dir->value()==2) r='z'; - e->var->Fill(nrm_dlg.min->value(),nrm_dlg.max->value(),r); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -void normal_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - nrm_dlg.OK = false; nrm_dlg.wnd->label(gettext("Normalize data")); - nrm_dlg.dir->hide(); nrm_dlg.sym->show(); - nrm_dlg.wnd->set_modal(); nrm_dlg.wnd->show(); - while(nrm_dlg.wnd->shown()) Fl::wait(); - if(nrm_dlg.OK) - { - e->var->Norm(nrm_dlg.min->value(), nrm_dlg.max->value(), nrm_dlg.sym->value()); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -struct CropDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Input *x1,*x2, *y1,*y2, *z1,*z2; - CropDlg() { memset(this,0,sizeof(CropDlg)); create_dlg(); } - ~CropDlg() { delete wnd; } - void create_dlg(); -} crop_dlg; -//----------------------------------------------------------------------------- -void crop_dlg_cb(Fl_Widget *, void *v) -{ crop_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void CropDlg::create_dlg() -{ - wnd = new Fl_Double_Window(230, 155, gettext("Crop data")); - x1 = new Fl_Input(45, 25, 80, 25, gettext("Lower bound")); x1->align(FL_ALIGN_TOP); - x2 = new Fl_Input(140, 25, 80, 25, gettext("Upper bound")); x2->align(FL_ALIGN_TOP); - y1 = new Fl_Input(45, 55, 80, 25); - y2 = new Fl_Input(140, 55, 80, 25); - z1 = new Fl_Input(45, 85, 80, 25); - z2 = new Fl_Input(140, 85, 80, 25); - - new Fl_Box(15, 25, 25, 25, "X"); - new Fl_Box(15, 55, 25, 25, "Y"); - new Fl_Box(15, 85, 25, 25, "Z"); - Fl_Button *o; - o = new Fl_Button(45, 120, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Do nothing and close this window")); - o = new Fl_Return_Button(145, 120, 75, 25, gettext("Crop")); o->callback(crop_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Change data values and close this window")); - wnd->end(); -} -//----------------------------------------------------------------------------- -void crop_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - crop_dlg.OK = false; - crop_dlg.wnd->set_modal(); crop_dlg.wnd->show(); - while(crop_dlg.wnd->shown()) Fl::wait(); - if(crop_dlg.OK) - { - int n1,n2; - n1 = 0; n2 = e->var->nx; - if(crop_dlg.x1->value()[0]) n1 = atoi(crop_dlg.x1->value()); - if(crop_dlg.x2->value()[0]) n2 = atoi(crop_dlg.x2->value()); - e->var->Crop(n1, n2, 'x'); - n1 = 0; n2 = e->var->ny; - if(crop_dlg.y1->value()[0]) n1 = atoi(crop_dlg.y1->value()); - if(crop_dlg.y2->value()[0]) n2 = atoi(crop_dlg.y2->value()); - e->var->Crop(n1, n2, 'y'); - n1 = 0; n2 = e->var->nz; - if(crop_dlg.z1->value()[0]) n1 = atoi(crop_dlg.z1->value()); - if(crop_dlg.z2->value()[0]) n2 = atoi(crop_dlg.z2->value()); - e->var->Crop(n1, n2, 'z'); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -struct TrspDlg -{ - Fl_Window *wnd; - bool OK; - - Fl_Round_Button *xyz, *xzy, *yxz, *yzx, *zxy, *zyx; - TrspDlg() { memset(this,0,sizeof(TrspDlg)); create_dlg(); } - ~TrspDlg() { delete wnd; } - void create_dlg(); -} trsp_dlg; -//----------------------------------------------------------------------------- -void trsp_dlg_cb(Fl_Widget *, void *v) -{ trsp_dlg.OK = true; ((Fl_Window *)v)->hide(); } -//----------------------------------------------------------------------------- -void trsp_rad_cb(Fl_Widget *w, void *v) -{ - TrspDlg* e = (TrspDlg*)v; - e->xyz->value(0); e->xzy->value(0); - e->yxz->value(0); e->yzx->value(0); - e->zxy->value(0); e->zyx->value(0); - ((Fl_Round_Button *)w)->setonly(); -} -//----------------------------------------------------------------------------- -void TrspDlg::create_dlg() -{ - wnd = new Fl_Double_Window(220, 170, gettext("Transpose data")); - Fl_Group *g = new Fl_Group(10, 30, 200, 90, gettext("Select new order of dimensions")); - g->box(FL_DOWN_BOX); - yxz = new Fl_Round_Button(20, 40, 75, 25, "y - x - z"); yxz->callback(trsp_rad_cb,this); - zyx = new Fl_Round_Button(20, 65, 75, 25, "z - y - x"); zyx->callback(trsp_rad_cb,this); - zxy = new Fl_Round_Button(20, 90, 75, 25, "z - x - y"); zxy->callback(trsp_rad_cb,this); - yzx = new Fl_Round_Button(100, 40, 75, 25, "y - z - x");yzx->callback(trsp_rad_cb,this); - xzy = new Fl_Round_Button(100, 65, 75, 25, "x - z - y");xzy->callback(trsp_rad_cb,this); - xyz = new Fl_Round_Button(100, 90, 75, 25, "x - y - z");xyz->callback(trsp_rad_cb,this); - g->end(); - - Fl_Button *o; - o = new Fl_Button(25, 130, 75, 25, gettext("Cancel")); o->callback(close_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Do nothing and close this window")); - o = new Fl_Return_Button(125, 130, 75, 25, gettext("Do")); o->callback(trsp_dlg_cb,wnd); - o->box(UDAV_UP_BOX); o->down_box(UDAV_DOWN_BOX); - o->tooltip(gettext("Change data values and close this window")); - wnd->end(); -} -//----------------------------------------------------------------------------- -void transp_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - trsp_dlg.OK = false; - trsp_dlg.wnd->set_modal(); trsp_dlg.wnd->show(); - while(trsp_dlg.wnd->shown()) Fl::wait(); - if(trsp_dlg.OK) - { - if(trsp_dlg.xyz->value()) e->var->Transpose("xyz"); - if(trsp_dlg.xzy->value()) e->var->Transpose("xzy"); - if(trsp_dlg.yxz->value()) e->var->Transpose("yxz"); - if(trsp_dlg.yzx->value()) e->var->Transpose("yzx"); - if(trsp_dlg.zxy->value()) e->var->Transpose("zxy"); - if(trsp_dlg.zyx->value()) e->var->Transpose("zyx"); - e->refresh(); - } -} -//----------------------------------------------------------------------------- -void first_sl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - e->slice->value(0); - e->set_slice(0); - e->go_home(); -} -//----------------------------------------------------------------------------- -void last_sl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - e->slice->value(e->num_slice()-1); - e->set_slice(e->num_slice()-1); - e->go_home(); -} -//----------------------------------------------------------------------------- -void prev_sl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - int p = int(e->slice->value())-1; - if(p<0) p = 0; - e->slice->value(p); e->set_slice(p); - e->go_home(); -} -//----------------------------------------------------------------------------- -void next_sl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - int p = int(e->slice->value())+1; - if(p>=e->num_slice()) p = e->num_slice()-1; - e->slice->value(p); e->set_slice(p); - e->go_home(); -} -//----------------------------------------------------------------------------- -void first_cl_cb(Fl_Widget*, void*v) -{ - TableWindow* e = (TableWindow*)v; - e->go_home(); -} -//----------------------------------------------------------------------------- -void change_sl_cb(Fl_Widget*w, void*v) -{ - TableWindow* e = (TableWindow*)v; - e->set_slice(long(e->slice->value())); - e->go_home(); -} -//----------------------------------------------------------------------------- -Fl_Menu_Item tablemenu[60] = { - { gettext("General"), 0, 0, 0, FL_SUBMENU }, - { gettext("Load from file"), 0, load_dat_cb }, - { gettext("Import from PNG"),0, imp_dat_cb }, - { gettext("Save to file"), 0, save_dat_cb }, - { gettext("Export to PNG"), 0, exp_dat_cb, 0, FL_MENU_DIVIDER }, - { gettext("Insert as list"), 0, list_dat_cb }, - { gettext("Plot data"), 0, plot_dat_cb }, -// { gettext("Info for data"), 0, info_dat_cb }, - { 0 }, - { gettext("Sizes"), 0, 0, 0, FL_SUBMENU }, - { gettext("Create new"), 0, new_dat_cb }, - { gettext("Resize"), 0, resize_cb }, - { gettext("Squeeze"), 0, squeeze_cb }, - { gettext("Crop"), 0, crop_cb }, - { gettext("Transpose"), 0, transp_cb }, -// { gettext("Extend"), 0, extend_cb }, - { 0 }, - { gettext("Fill"), 0, 0, 0, FL_SUBMENU }, - { gettext("By formula"), 0, modify_cb }, - { gettext("In range"), 0, fill_cb }, - { gettext("Normalize"), 0, normal_cb }, - { 0 }, - { gettext("Change"), 0, 0, 0, FL_SUBMENU }, - { gettext("Smooth"), 0, smooth_cb }, - { gettext("CumSum"), 0, cumsum_cb }, - { gettext("Integrate"), 0, integr_cb }, - { gettext("Difference"), 0, diff_cb }, - { gettext("Double diff."), 0, diff2_cb }, - { gettext("Swap parts"), 0, swap_cb }, - { 0 }, - { gettext("Another"), 0, 0, 0, FL_SUBMENU }, -// { gettext("Histogram of"), 0, hist_cb }, - { gettext("Summation of"), 0, asum_cb }, - { gettext("Maximum of"), 0, amax_cb }, - { gettext("Minimum of"), 0, amin_cb }, - { 0 }, - { gettext("Operations"), 0, 0, 0, FL_SUBMENU }, - { gettext("Add to"), 0, addto_cb }, - { gettext("Subtract to"),0, subto_cb }, - { gettext("Multiply by"),0, multo_cb }, - { gettext("Divide by"), 0, divto_cb }, - { 0 }, - { gettext("Navigation"), 0, 0, 0, FL_SUBMENU }, - { gettext("First slice"), FL_CTRL + FL_F + 1, first_sl_cb }, - { gettext("Prev slice"), FL_CTRL + FL_F + 2, prev_sl_cb }, - { gettext("Next slice"), FL_CTRL + FL_F + 3, next_sl_cb }, - { gettext("Last slice"), FL_CTRL + FL_F + 4, last_sl_cb, 0, FL_MENU_DIVIDER }, - { gettext("First cell"), FL_ALT + FL_F + 1, first_cl_cb }, -// { gettext("Last cell"), FL_ALT + FL_F + 2, last_cl_cb }, -// { gettext("Center grid"), FL_ALT + FL_F + 3, center_cl_cb }, - { 0 }, - { 0 } -}; -//----------------------------------------------------------------------------- -#include "xpm/document-new.xpm" -#include "xpm/plot.xpm" -#include "xpm/document-open.xpm" -#include "xpm/document-save.xpm" -#include "xpm/document-import.xpm" -#include "xpm/document-export.xpm" -#include "xpm/format-indent-more.xpm" -#include "xpm/diff.xpm" -#include "xpm/func.xpm" -#include "xpm/size.xpm" -#include "xpm/tran.xpm" -#include "xpm/crop.xpm" -#include "xpm/go-first.xpm" -#include "xpm/go-last.xpm" -TableWindow::TableWindow(int x, int y, int w, int h, const char* t) : Fl_Window(x, y, w, h, t) -{ - var = 0; -// menu = new Fl_Menu_Bar(0, 0, w, 30); -// menu->copy(tablemenu, this); - Fl_Button *o; - Fl_Group *g; - - - g = new Fl_Group(0,0,30,350); - o = new Fl_Button(0, 0, 25, 25); o->image(new Fl_Pixmap(document_new_xpm)); - o->callback(new_dat_cb,this); o->tooltip(gettext("Create new data with zero filling")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 25, 25, 25); o->image(new Fl_Pixmap(document_open_xpm)); - o->callback(load_dat_cb,this); o->tooltip(gettext("Load data from file")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 50, 25, 25); o->image(new Fl_Pixmap(document_import_xpm)); - o->callback(imp_dat_cb,this); o->tooltip(gettext("Import data from PNG file")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 75, 25, 25); o->image(new Fl_Pixmap(document_save_xpm)); - o->callback(save_dat_cb,this); o->tooltip(gettext("Save data to file")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 100, 25, 25); o->image(new Fl_Pixmap(document_export_xpm)); - o->callback(exp_dat_cb,this); o->tooltip(gettext("Export data to PNG file")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - o = new Fl_Button(0, 130, 25, 25); o->image(new Fl_Pixmap(format_indent_more_xpm)); - o->callback(list_dat_cb,this); o->tooltip(gettext("Insert to script as 'list' command")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 155, 25, 25); o->image(new Fl_Pixmap(plot_xpm)); - o->callback(plot_dat_cb,this); o->tooltip(gettext("Plot data")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - - o = new Fl_Button(0, 185, 25, 25); o->image(new Fl_Pixmap(diff_xpm)); - o->callback(smooth_cb,this); o->tooltip(gettext("Apply operator (smoothing, integration, difference ...) to data")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 210, 25, 25); o->image(new Fl_Pixmap(func_xpm)); - o->callback(modify_cb,this); o->tooltip(gettext("Fill data by formula")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 235, 25, 25); o->image(new Fl_Pixmap(size_xpm)); - o->callback(resize_cb,this); o->tooltip(gettext("Resize data with smoothing")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 260, 25, 25); o->image(new Fl_Pixmap(crop_xpm)); - o->callback(crop_cb,this); o->tooltip(gettext("Crop (cut off edges) data")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(0, 285, 25, 25); o->image(new Fl_Pixmap(tran_xpm)); - o->callback(transp_cb,this); o->tooltip(gettext("Transpose data dimensions")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - g->end(); g->resizable(0); - - - g = new Fl_Group(30,0,200,30); - o = new Fl_Button(30, 0, 25, 25); o->image(new Fl_Pixmap(go_first_xpm)); - o->callback(first_sl_cb,this); o->tooltip(gettext("Go to first slice (Ctrl-F1)")); -// o->box(FL_PLASTIC_UP_BOX); o->down_box(FL_PLASTIC_DOWN_BOX); - slice = new Fl_Counter(55, 0, 90, 25, 0); slice->callback(change_sl_cb,this); - slice->lstep(10); slice->step(1); slice->tooltip(gettext("Id of slice on third (z-) dimension")); -// slice->box(FL_PLASTIC_UP_BOX);// slice->down_box(FL_PLASTIC_DOWN_BOX); - o = new Fl_Button(147, 0, 25, 25); o->image(new Fl_Pixmap(go_last_xpm)); - o->callback(last_sl_cb,this); o->tooltip(gettext("Go to last slice (Ctrl-F4)")); - g->end(); g->resizable(0); - - data = new Fl_Data_Table(30,30,w-30,h-30); - data->row_header(1); data->row_header_width(70); - data->row_resize(1); data->rows(1); - data->row_height_all(25); - data->col_header(1); data->col_header_height(25); - data->col_resize(1); data->cols(1); - data->col_width_all(70); - - end(); resizable(data); -// callback(close_table_cb, this); -} -//----------------------------------------------------------------------------- -TableWindow::~TableWindow() -{ parent()->deactivate(); - (parent()->parent())->remove(parent()); - parent()->remove(this); delete parent(); } -//----------------------------------------------------------------------------- -void delete_cb(void *v) { if(v) delete (TableWindow *)v; } -//----------------------------------------------------------------------------- -void TableWindow::update(mglVar *v) -{ - if(v==0) return; - char ss[1024]; - wcstombs(ss,v->s.c_str(),1024); - label(ss); v->func = delete_cb; -// if(var) var->o = 0; - var = v; v->o = this; - refresh(); -} -//----------------------------------------------------------------------------- -void TableWindow::refresh() -{ - if(var==0) return; - deactivate(); nz = var->nz; - sl = 0; slice->range(0,nz-1); - - data->rows(var->ny); data->cols(var->nx); - data->ny = var->ny; data->nx = var->nx; - data->data = var->a; - activate(); -// show(); -} -//----------------------------------------------------------------------------- -void TableWindow::set_slice(long s) -{ - if(s>=0 && sdata = var->a + var->nx * var->ny * sl; - refresh(); - } -} -//----------------------------------------------------------------------------- -void TableWindow::go_home() -{ -} -//----------------------------------------------------------------------------- diff --git a/mgllab/udav.h b/mgllab/udav.h deleted file mode 100644 index 83788f8..0000000 --- a/mgllab/udav.h +++ /dev/null @@ -1,291 +0,0 @@ -/* udav.h is part of UDAV - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -//----------------------------------------------------------------------------- -#ifndef _UDAV_H_ -#define _UDAV_H_ -//----------------------------------------------------------------------------- -#ifdef __MWERKS__ -# define FL_DLL -#endif -#ifdef USE_GETTEXT - #include -#else - #define gettext(x) (x) -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//----------------------------------------------------------------------------- -#ifdef USE_PLASTIC - #define UDAV_UP_BOX FL_PLASTIC_UP_BOX - #define UDAV_DOWN_BOX FL_PLASTIC_DOWN_BOX - #define UDAV_EDIT_BOX FL_PLASTIC_THIN_DOWN_BOX - #define UDAV_THIN_UP_BOX FL_PLASTIC_THIN_UP_BOX -#else - #define UDAV_UP_BOX FL_GTK_UP_BOX - #define UDAV_DOWN_BOX FL_GTK_DOWN_BOX - #define UDAV_EDIT_BOX FL_GTK_DOWN_BOX - #define UDAV_THIN_UP_BOX FL_GTK_THIN_UP_BOX -#endif -//----------------------------------------------------------------------------- -#include "mgl2/fltk.h" -//----------------------------------------------------------------------------- -extern mglParse *Parse; -extern Fl_Menu_Item colors[]; -extern Fl_Preferences pref; -extern char *docdir; -class Fl_MGL; -//----------------------------------------------------------------------------- -class Fl_Data_Table : public Fl_Table -{ -private: - int row, col; - Fl_Input* input; -protected: - void draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H); - static void event_callback(Fl_Widget*, void*v) - { ((Fl_Data_Table*)v)->cell_click(); } - void cell_click(); - -public: - mreal *data; - int nx, ny; - - Fl_Data_Table(int x, int y, int w, int h, const char *l=0); - ~Fl_Data_Table() { } - - void set_value(); - void rows(int val) { if (input->visible()) input->do_callback(); Fl_Table::rows(val); } - void cols(int val) { if (input->visible()) input->do_callback(); Fl_Table::cols(val); } - inline int rows() { return Fl_Table::rows(); } - inline int cols() { return Fl_Table::cols(); } -}; -//----------------------------------------------------------------------------- -struct AnimateDlg -{ - friend void animate_dlg_cb(Fl_Widget *, void *v); - friend void animate_rad_cb(Fl_Widget *, void *v); - friend void fill_animate(const char *text); - friend void animate_put_cb(Fl_Widget *, void *); -public: - Fl_Window* wnd; - int OK; - AnimateDlg() { memset(this,0,sizeof(AnimateDlg)); create_dlg(); } - ~AnimateDlg() { delete wnd; } - void FillResult(Fl_MGL* e); -protected: - bool swap; - Fl_Round_Button *rt, *rv; - Fl_Multiline_Input *txt; - Fl_Float_Input *x0, *x1, *dx, *dt; - Fl_Check_Button *save; - void create_dlg(); -}; -//----------------------------------------------------------------------------- -class Fl_MGL : public Fl_MGLView, public mglDraw -{ -friend class AnimateDlg; -public: - Fl_Widget *status; ///< StatusBar for mouse coordinates - const char *AnimBuf; ///< buffer for animation - const char **AnimS0; - int AnimNum; - mreal AnimDelay; - - Fl_MGL(int x, int y, int w, int h, const char *label=0); - ~Fl_MGL(); - - /// Drawing itself - int Draw(mglGraph *); - /// Update (redraw) plot - void update(); - /// Set main scr and optional pre scripts for execution - void scripts(char *scr, char *pre); - /// Clear scripts internally saved - void clear_scripts(); - /// Show next frame - void next_frame(); - /// Show prev frame - void prev_frame(); - -protected: - char *Args[1000], *ArgBuf; - int NArgs, ArgCur; - - char *script; ///< main script - char *script_pre; ///< script with settings -}; -//----------------------------------------------------------------------------- -struct TableWindow : public Fl_Window -{ -public: - TableWindow(int x, int y, int w, int h, const char* t=0); - ~TableWindow(); - void update(mglVar *v); - void refresh(); - void set_slice(long s); - inline long get_slice() { return sl; } - inline long num_slice() { return nz; } - void go_home(); - - Fl_Data_Table *data; - Fl_Menu_Bar *menu; -// Fl_Output *main; - Fl_Counter *slice; - mglData *var; -protected: -// long nx,ny,nz; - long nz; - long sl; // current slice - char sl_id[64]; // slice id -}; -//----------------------------------------------------------------------------- -class SetupDlg -{ -public: - Fl_Window *wnd; - bool OK; - Fl_Input *templ; - - SetupDlg() { memset(this,0,sizeof(SetupDlg)); } - ~SetupDlg() { delete wnd; } - void CreateDlg(); - char *ToScript(); -private: - Fl_Input *xmin, *ymin, *zmin, *cmin; - Fl_Input *xmax, *ymax, *zmax, *cmax; - Fl_Input *xorg, *yorg, *zorg; - Fl_Input *xlab, *ylab, *zlab, *font; - Fl_Choice *xpos, *ypos, *zpos, *axial, *cid[10]; - Fl_Input *xtik, *ytik, *ztik; - Fl_Input *xsub, *ysub, *zsub; - Fl_Input *alphad, *ambient, *basew, *mesh, *size; - Fl_Check_Button *alpha, *light, *rotate, *lid[10]; - Fl_Input *xid[10], *yid[10], *zid[10], *bid[10]; - Fl_Help_View *code; - - void CreateGen(); - void CreateLid(); -}; -//----------------------------------------------------------------------------- -class ScriptWindow : public Fl_Double_Window -{ -public: - ScriptWindow(int w, int h, const char* t); - ~ScriptWindow(); - - Fl_Window *replace_dlg; - Fl_Input *replace_find; - Fl_Input *replace_with; - Fl_Button *replace_all; - Fl_Return_Button *replace_next; - Fl_Button *replace_cancel; - Fl_Text_Editor *editor; - Fl_Menu_Bar *menu; - Fl_Tabs *ltab, *rtab; - Fl_Help_View *hd; - Fl_Input *link_cmd; - Fl_Group *ghelp; - Fl_Browser *var; - Fl_Box *status; - - void mem_init(); - void mem_pressed(int n); - SetupDlg *setup_dlg; - char search[256]; - Fl_MGL *graph; -}; -//----------------------------------------------------------------------------- -// Editor window functions -void find2_cb(Fl_Widget *, void *); -void replall_cb(Fl_Widget *, void *); -void replace2_cb(Fl_Widget *, void *); -void replcan_cb(Fl_Widget *, void *); -void insert_cb(Fl_Widget *, void *); -void paste_cb(Fl_Widget *, void *); -void replace_cb(Fl_Widget *, void *); -void copy_cb(Fl_Widget *, void *); -void cut_cb(Fl_Widget *, void *); -void find_cb(Fl_Widget *, void *); -void delete_cb(Fl_Widget *, void *); -void changed_cb(int, int nInserted, int nDeleted,int, const char*, void* v); -//----------------------------------------------------------------------------- -// General callback functions -void new_cb(Fl_Widget *, void *); -void open_cb(Fl_Widget *, void *); -void save_cb(Fl_Widget*, void*); -void saveas_cb(Fl_Widget*, void*); -void help_cb(Fl_Widget*, void*); -//----------------------------------------------------------------------------- -// Graphical callback functions -void setup_cb(Fl_Widget *, void *); -void style_cb(Fl_Widget *, void *); -void option_cb(Fl_Widget *, void *); -void argument_cb(Fl_Widget *, void *); -void variables_cb(Fl_Widget *, void *); -void settings_cb(Fl_Widget *, void *); -void command_cb(Fl_Widget *, void *); -//----------------------------------------------------------------------------- -// Dialogs callback functions -void close_dlg_cb(Fl_Widget *w, void *); -void font_cb(Fl_Widget *, void *v); -void line_cb(Fl_Widget *, void *v); -void face_cb(Fl_Widget *, void *v); -void data_cb(Fl_Widget *, void *v); -//----------------------------------------------------------------------------- -void style_init(void); -int check_save(void); -void load_file(char *newfile, int ipos); -void save_file(char *newfile); -Fl_Widget *add_editor(ScriptWindow *w); -Fl_Widget *add_mem(ScriptWindow *w); -void set_title(Fl_Window* w); -//----------------------------------------------------------------------------- -// Animation -void animate_cb(Fl_Widget *, void *v); -void fill_animate(const char *text); -//----------------------------------------------------------------------------- -Fl_Widget *add_help(ScriptWindow *w); -void help_cb(Fl_Widget*, void*v); -void example_cb(Fl_Widget*, void*v); -void about_cb(Fl_Widget*, void*); -//----------------------------------------------------------------------------- -void newcmd_cb(Fl_Widget*,void*); -//----------------------------------------------------------------------------- -extern Fl_Text_Buffer *textbuf; -extern char filename[256]; -extern int changed; -//----------------------------------------------------------------------------- -#endif -//----------------------------------------------------------------------------- diff --git a/mgllab/udav.rc b/mgllab/udav.rc deleted file mode 100644 index e557119..0000000 --- a/mgllab/udav.rc +++ /dev/null @@ -1,24 +0,0 @@ -/* udav.rc is part of UDAV - * Copyright (C) 2007 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -//----------------------------------------------------------------------------- -#include - -#define APPICON 1001 -#define APPICON48 1002 - -APPICON ICON "udav.ico" -APPICON48 ICON "udav48.ico" diff --git a/mgllab/udav48.ico b/mgllab/udav48.ico deleted file mode 100644 index a286d6d..0000000 Binary files a/mgllab/udav48.ico and /dev/null differ diff --git a/mgllab/write.cpp b/mgllab/write.cpp deleted file mode 100644 index ff461aa..0000000 --- a/mgllab/write.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/* write.cpp is part of Math Graphic Library - * Copyright (C) 2007-2014 Alexey Balakin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -//----------------------------------------------------------------------------- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 73b7eee..95c8580 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,6 @@ set(mgl_src addon.cpp axis.cpp base_cf.cpp base.cpp canvas_cf.cpp canvas.cpp cont.cpp crust.cpp - complex.cpp complex_io.cpp fft.cpp data_gr.cpp + complex.cpp complex_ex.cpp complex_io.cpp fft.cpp data_gr.cpp data.cpp data_io.cpp data_ex.cpp data_png.cpp def_font.cpp export_2d.cpp export_3d.cpp eval.cpp evalp.cpp exec.cpp export.cpp fit.cpp font.cpp obj.cpp other.cpp parser.cpp pde.cpp pixel.cpp @@ -13,7 +13,7 @@ set(mgl_hdr ../include/mgl2/base.h ../include/mgl2/prim.h ../include/mgl2/canvas_cf.h ../include/mgl2/font.h ../include/mgl2/canvas.h ../include/mgl2/surf.h ../include/mgl2/mgl_cf.h ../include/mgl2/type.h ${MathGL_BINARY_DIR}/include/mgl2/config.h -${MathGL_BINARY_DIR}/include/mgl2/dllexport.h +${MathGL_BINARY_DIR}/include/mgl2/dllexport.h cont.hpp ../include/mgl2/cont.h ../include/mgl2/mgl.h ../include/mgl2/vect.h ../include/mgl2/data.h ../include/mgl2/volume.h ../include/mgl2/data_cf.h ../include/mgl2/define.h ../include/mgl2/other.h ../include/mgl2/eval.h diff --git a/src/addon.cpp b/src/addon.cpp index ef6f932..5f96413 100644 --- a/src/addon.cpp +++ b/src/addon.cpp @@ -45,7 +45,7 @@ void MGL_EXPORT mgl_strcls(char *str) delete []tmp; } //----------------------------------------------------------------------------- -int MGL_EXPORT mgl_strpos(const char *str,char *fnd) +int MGL_EXPORT_PURE mgl_strpos(const char *str,char *fnd) { const char *p=strstr(str,fnd); int res; @@ -54,7 +54,7 @@ int MGL_EXPORT mgl_strpos(const char *str,char *fnd) return res; } //----------------------------------------------------------------------------- -int MGL_EXPORT mgl_chrpos(const char *str,char ch) +int MGL_EXPORT_PURE mgl_chrpos(const char *str,char ch) { const char *p=str?strchr(str,ch):0; int res; @@ -81,7 +81,7 @@ MGL_EXPORT char *mgl_fgetstr(FILE *fp) void MGL_EXPORT mgl_fgetpar(FILE *fp, const char *str, ...) { if(!str || !str[0]) return; - long len=strlen(str), *n; double *v; + long len=strlen(str); char *s, *t; va_list lst; va_start(lst,str); @@ -91,8 +91,8 @@ void MGL_EXPORT mgl_fgetpar(FILE *fp, const char *str, ...) if(str[i]=='%') { if(str[i+1]=='s') { s = va_arg(lst, char*); strcpy(s, t); } - if(strchr("efg",str[i+1])) { v = va_arg(lst, double*); *v = atof(t); } - if(strchr("ld",str[i+1])) { n = va_arg(lst, long*); *n = atol(t); } + if(strchr("efg",str[i+1])) { double *v = va_arg(lst, double*); *v = atof(t); } + if(strchr("ld",str[i+1])) { long *n = va_arg(lst, long*); *n = atol(t); } i++; } if(str[i]==':') @@ -104,7 +104,7 @@ void MGL_EXPORT mgl_fgetpar(FILE *fp, const char *str, ...) } } //----------------------------------------------------------------------------- -int MGL_EXPORT mgl_istrue(char ch) +int MGL_EXPORT_CONST mgl_istrue(char ch) { return (ch=='1' || ch=='t' || ch=='+' || ch=='v'); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_test(const char *str, ...) @@ -173,7 +173,6 @@ void MGL_EXPORT mgl_difr_grid_old(dual *a,int n,int step,dual q,int Border,dual else for(long i=0;i0;k--) // 3 iterations { -//#pragma omp parallel for for(long i=1;i0;k--) // kk iterations { d[ii] = a[ii] + adt*(b[ii+1]-b[ii])*(ff/k); -//#pragma omp parallel for for(long i=ii+1;i0) freq[nn-i] = -(double)(i); - } + freq[0] = 0; + for(long i=1;i<=nn/2;i++) + { freq[i] = i; freq[nn-i] = -i; } } //----------------------------------------------------------------------------- diff --git a/src/axis.cpp b/src/axis.cpp index c0a81e5..35776ce 100644 --- a/src/axis.cpp +++ b/src/axis.cpp @@ -22,21 +22,17 @@ #include "mgl2/data.h" #include "mgl2/canvas.h" #include "mgl2/prim.h" -//----------------------------------------------------------------------------- -#define islog(a, b) (((a)>0 && (b)>10*(a)) || ((b)<0 && (a)<10*(b))) -// NOTE: I use <=0 for proper tick labels rotation. But this mirror labels for central origin! -#define sign(a) ((a)<0 ? -1:1) -//#define sign(a) ((a)<0 ? -1:((a)>0 ? 1:0)) +std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt); //----------------------------------------------------------------------------- MGL_NO_EXPORT inline struct tm *mgl_localtime (const time_t *clock, tm *result, bool use_utc) { if (!clock || !result) return NULL; const tm *res = use_utc?gmtime(clock):localtime(clock); memcpy(result,res,sizeof(tm)); return result; } //----------------------------------------------------------------------------- -long MGL_EXPORT mgl_have_color(const char *stl) +long MGL_EXPORT_PURE mgl_have_color(const char *stl) { - register long i,j=0; - if(stl) for(i=0;stl[i];i++) + long j=0; + if(stl) for(long i=0;stl[i];i++) { if(strchr(MGL_COLORS,stl[i])) j++; if(stl[i]=='{' && stl[i+1]=='x') j++; @@ -54,7 +50,7 @@ void MGL_EXPORT mgl_wcstrim(wchar_t *str) str[i-k]=0; } //----------------------------------------------------------------------------- -size_t MGL_EXPORT mgl_wcslen(const wchar_t *str) +size_t MGL_EXPORT_PURE mgl_wcslen(const wchar_t *str) { long i=0; if(str) while(str[i]) i++; @@ -76,7 +72,7 @@ void mglCanvas::SetAxisStl(const char *stl, const char *tck, const char *sub) void mglCanvas::SetTickLen(mreal tlen, mreal stt) { TickLen = tlen?tlen:0.02; st_t=stt>0?stt:1; } //----------------------------------------------------------------------------- -void mglCanvas::SetTicks(char dir, mreal d, int ns, mreal org) +void mglCanvas::SetTicks(char dir, mreal d, int ns, mreal org, const wchar_t *lbl) { if(!strchr("xyzca",dir)) return; mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac))); @@ -84,16 +80,33 @@ void mglCanvas::SetTicks(char dir, mreal d, int ns, mreal org) if(aa.f==1) aa.t.clear(); aa.d=d; aa.f=0; aa.ns=ns; aa.o=org; aa.txt.clear(); + if(!lbl || *lbl==0) aa.fact.clear(); + else aa.fact = lbl; } //----------------------------------------------------------------------------- +void mglCanvas::AddTick(char dir, double v, const wchar_t *lbl) +{ + if(!strchr("xyzca",dir)) return; + mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac))); + bool ff = (dir=='x' ? fx : (dir=='y' ? fy : (dir=='z' ? fz : fa))); + + UpdateAxis(); AdjustTicks(aa,ff); + if(!v || !lbl || !lbl[0]) { aa.f = 0; return; } + aa.f = 2; aa.ns=0; aa.ds=0; + aa.AddLabel(lbl,v); +} +//----------------------------------------------------------------------------- +void mglCanvas::AddTick(char dir, double v, const char *lbl) +{ MGL_TO_WCS(lbl,AddTick(dir,v,wcs)); } +//----------------------------------------------------------------------------- void mglCanvas::SetTicksVal(char dir, HCDT v, const wchar_t *lbl, bool add) { if(!strchr("xyzca",dir)) return; mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac))); bool ff = (dir=='x' ? fx : (dir=='y' ? fy : (dir=='z' ? fz : fa))); - aa.txt.clear(); if(add) { UpdateAxis(); AdjustTicks(aa,ff); } + else aa.txt.clear(); if(!v || !lbl || !lbl[0]) { aa.f = 0; return; } aa.f = 2; aa.ns=0; aa.ds=0; register long i,j,l=0,n=v->GetNx(); @@ -114,9 +127,7 @@ void mglCanvas::SetTicksVal(char dir, HCDT v, const wchar_t *lbl, bool add) } //----------------------------------------------------------------------------- void mglCanvas::SetTicksVal(char dir, HCDT v, const char *lbl, bool add) -{ - MGL_TO_WCS(lbl,SetTicksVal(dir,v,wcs,add)); -} +{ MGL_TO_WCS(lbl,SetTicksVal(dir,v,wcs,add)); } //----------------------------------------------------------------------------- void mglCanvas::SetTicksVal(char dir, const wchar_t *lbl, bool add) { @@ -144,8 +155,8 @@ void mglCanvas::SetTicksVal(char dir, HCDT v, const wchar_t **lbl, bool add) mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac))); bool ff = (dir=='x' ? fx : (dir=='y' ? fy : (dir=='z' ? fz : fa))); - aa.txt.clear(); if(add) { UpdateAxis(); AdjustTicks(aa,ff); } + else aa.txt.clear(); if(!v || !lbl) { aa.f = 0; return; } aa.f = 2; aa.ns=0; aa.ds=0; register long i,n=v->GetNx(); @@ -171,7 +182,7 @@ void mglCanvas::SetTickTempl(char dir, const wchar_t *t) mglAxis &aa = (dir=='x' ? ax : (dir=='y' ? ay : (dir=='z' ? az : ac))); if(aa.f==1) aa.f = 0; // remove time ticks - if(!t) aa.t.clear(); else aa.t=t; + if(!t || !t[0]) aa.t.clear(); else aa.t=t; } //----------------------------------------------------------------------------- void mglCanvas::SetTickTempl(char dir, const char *t) @@ -253,7 +264,6 @@ void mglCanvas::SetTickTime(char dir, mreal d, const char *t) if(aa.ch=='y') aa.v0 = aa.org.y; if(aa.ch=='z') aa.v0 = aa.org.z; - wchar_t buf[64]; mreal v, v0 = mgl_isnan(aa.o) ? aa.v0 : aa.o, v1; if(aa.v2>aa.v1) { v1 = aa.v2; v0 = v0 - aa.dv*floor((v0-aa.v1)/aa.dv+1e-3); } @@ -261,30 +271,31 @@ void mglCanvas::SetTickTime(char dir, mreal d, const char *t) { v1 = aa.v1; v0 = v0 - aa.dv*floor((v0-aa.v2)/aa.dv+1e-3); } if(v0+aa.dv!=v0 && v1+aa.dv!=v1) for(v=v0;v<=v1;v+=aa.dv) { + wchar_t buf[64]; tt = v; tm tp; mgl_localtime(&tt, &tp, get(MGL_USE_GMTIME)); wcsftime(buf,64,aa.t.c_str(),&tp); aa.AddLabel(buf,v); } } //----------------------------------------------------------------------------- -void mglCanvas::AdjustTicks(const char *dir, bool force) +void mglCanvas::AdjustTicks(const char *dir, bool force, std::string stl) { if(force) SetTuneTicks(3); UpdateAxis(); if(strchr(dir,'x') || strchr(dir,'X')) // NOTE dir have to be non-NULL here !!! - { if(force) ax.d=0; AdjustTicks(ax,fx!=0); } + { if(force) ax.d=0; ax.stl=stl; AdjustTicks(ax,fx!=0); } if(strchr(dir,'y') || strchr(dir,'Y')) - { if(force) ay.d=0; AdjustTicks(ay,fy!=0); } + { if(force) ay.d=0; ay.stl=stl; AdjustTicks(ay,fy!=0); } if(strchr(dir,'z') || strchr(dir,'Z')) - { if(force) az.d=0; AdjustTicks(az,fz!=0); } + { if(force) az.d=0; az.stl=stl; AdjustTicks(az,fz!=0); } if(strchr(dir,'a') || strchr(dir,'c')) - { if(force) ac.d=0; AdjustTicks(ac,fa!=0); } + { if(force) ac.d=0; ac.stl=stl; AdjustTicks(ac,fa!=0); } } //----------------------------------------------------------------------------- void mglCanvas::AdjustTicks(mglAxis &aa, bool ff) { - double d = fabs(aa.v2-aa.v1), n; + double d = fabs(aa.v2-aa.v1); if(aa.f>0) return; - if(ff && islog(aa.v1,aa.v2)) + if(ff && mgl_islog(aa.v1,aa.v2)) { aa.dv = 0; aa.ds=0; } else if(aa.d>0) { aa.dv = aa.d; aa.ds = aa.d/(abs(aa.ns)+1); } @@ -292,7 +303,8 @@ void mglCanvas::AdjustTicks(mglAxis &aa, bool ff) { aa.dv = mgl_adj_val(d,&aa.ds); aa.o=0; } else { - d /= -aa.d; n = floor(log10(d)); + d /= -aa.d; + long n = floor(log10(d)); int k = int(d*pow(10.,-n)+0.5); aa.dv = pow(10.,n)*k; aa.o=0; aa.ds = pow(10.,n); @@ -353,32 +365,25 @@ std::wstring MGL_NO_EXPORT mgl_format(mreal v1, mreal v2, bool zero) return str; } //----------------------------------------------------------------------------- -void MGL_NO_EXPORT mgl_tick_text(mreal z, mreal z0, mreal d, std::wstring fmt, mreal v, int kind, wchar_t str[64]) +std::wstring MGL_NO_EXPORT mgl_tick_text(mreal z, mreal z0, mreal d, mreal v, int kind, const std::wstring &fact, mreal step, const char *stl) { + std::wstring str; + bool ff = step>0 && !fact.empty();// && mgl_wcslen(str)+fact.length()<62; + if(ff) z/=step; mreal u = fabs(z)z0) u = fabs(z-z0)z0)) u /= v; - if(kind&1) fmt = z>z0?L"@{(+"+fmt+L")}":L"%g"; - mglprintf(str,64,fmt.c_str(), u); - -/* mreal u = fabs(z)z0) u = fabs(z-z0)z0)) u /= v; - if((kind&1) && z>z0) + str = mgl_ftoa(u,stl?stl:""); + if((kind&1) && z>z0) str = L"@{(+"+str+L")}"; +// if(kind&1) fmt = z>z0?L"@{(+"+fmt+L")}":L"%g"; +// mglprintf(str,64,fmt.c_str(), u); + if(ff) { - size_t n1,n2; - mglprintf(str, 64, L"@{(+%.2g)}",u); - n1=mgl_wcslen(str); mglprintf(str, 64, L"@{(+%g)}",u); n2=mgl_wcslen(str); - if(n10) // positive log-scale { v0 = exp(M_LN10*floor(0.1+log10(aa.v1))); @@ -403,7 +409,8 @@ void mglCanvas::LabelTicks(mglAxis &aa) d = int(floor(0.1+log10(v))); if(d==0) wcscpy(buf,L"1"); else if(d==1) wcscpy(buf,L"10"); - else mglprintf(buf,64,L"10^{%d}",d); + else if(d>0) mglprintf(buf,64,L"10^{%d}",d); + else mglprintf(buf,64,minus?L"10^{-%d}":L"10^{−%d}",-d); if(d%ds!=0) *buf=0; // remove too often log ticks aa.AddLabel(buf,v); } @@ -415,9 +422,10 @@ void mglCanvas::LabelTicks(mglAxis &aa) for(v=v0;v>=aa.v1*MGL_EPSILON;v*=10) if(v*MGL_EPSILON<=aa.v2) { d = int(floor(0.1+log10(-v))); - if(d==0) wcscpy(buf,L"-1"); - else if(d==1) wcscpy(buf,L"-10"); - else mglprintf(buf,64,L"-10^{%d}",d); + if(d==0) wcscpy(buf,minus?L"-1":L"−1"); + else if(d==1) wcscpy(buf,minus?L"-10":L"−10"); + else if(d>0) mglprintf(buf,64,minus?L"-10^{%d}":L"−10^{%d}",d); + else mglprintf(buf,64,minus?L"-10^{-%d}":L"−10^{−%d}",-d); if(d%ds!=0) *buf=0; // remove too often log ticks aa.AddLabel(buf,v); } @@ -426,32 +434,27 @@ void mglCanvas::LabelTicks(mglAxis &aa) { int kind=0; wchar_t s[32]=L""; - if(aa.t.empty() && TuneTicks) kind = mgl_tick_ext(aa.v2, aa.v1, s, w); - if((TuneTicks&1)==0 && kind==2) kind=0; - if((TuneTicks&2)==0 && kind!=2) kind=0; + if(aa.t.empty() && TuneTicks && !strchr(aa.stl.c_str(),'!')) + kind = mgl_tick_ext(aa.v2, aa.v1, s, w); + if(((TuneTicks&1)==0 && kind==2) || ((TuneTicks&2)==0 && kind!=2)) + kind=0; v0 = mgl_isnan(aa.o) ? aa.v0 : aa.o; + if(mgl_isnan(v0)) v0=0; if(aa.v2>aa.v1) { v1 = aa.v2; v0 = v0 - aa.dv*floor((v0-aa.v1)/aa.dv+1e-3); } else { v1 = aa.v1; v0 = v0 - aa.dv*floor((v0-aa.v2)/aa.dv+1e-3); } - std::wstring fmt; - switch(kind) - { - case 1: fmt=mgl_format(0,v1-v0,TuneTicks&4); break; - case 2: fmt=mgl_format(v0/w,v1/w,TuneTicks&4); break; - case 3: fmt=mgl_format(0,(v1-v0)/w,TuneTicks&4);break; - default:fmt=mgl_format(v0,v1,TuneTicks&4); break; - } - - if(v0+aa.dv!=v0 && v1+aa.dv!=v1) for(v=v0;v<=v1;v+=aa.dv) + if(v0+aa.dv!=v0 && v1+aa.dv!=v1) { - if(aa.t.empty()) - mgl_tick_text(v,v0,aa.dv/100,fmt,w,kind,buf); - else + if(aa.t.empty()) for(v=v0;v<=v1;v+=aa.dv) + aa.AddLabel(mgl_tick_text(v,v0,aa.dv/100,w,kind,aa.fact,aa.d,aa.stl.c_str()),v); + else for(v=v0;v<=v1;v+=aa.dv) + { mglprintf(buf, 64, aa.t.c_str(), fabs(v)0 ? 't':'T'; if(ts>0 && tet && nn.x==0) pos[2]='R'; - text_plot(kk[i], aa.txt[i].text.c_str(), pos, -1, aa.sh+0.07,CDef,tet?false:true); + text_plot(kk[i], aa.txt[i].text.c_str(), pos, -1, aa.sh+0.1,CDef,tet?false:true); } delete []w; delete []kk; } @@ -646,7 +655,7 @@ char mglCanvas::GetLabelPos(mreal c, long kk, mglAxis &aa) mglPnt &qq = Pnt[kk]; if(aa.ch=='c') qq.u = qq.v = NAN; - if(!get(MGL_DISABLE_SCALE)) ts = sign(qq.v*nn.x-qq.u*nn.y)*sign(aa.v2-aa.v1); + if(!get(MGL_DISABLE_SCALE)) ts = mgl_sign(qq.v*nn.x-qq.u*nn.y)*mgl_sign(aa.v2-aa.v1); if(aa.ch=='T') ts *= -1; if(aa.pos=='T') ts *= -1; return ts>0 ? 't':'T'; @@ -672,18 +681,42 @@ void mglCanvas::tick_draw(mglPoint o, mglPoint d1, mglPoint d2, int f) void mglCanvas::Grid(const char *dir, const char *pen, const char *opt) { SaveState(opt); - if(!dir || !dir[0]) dir="xyz"; + bool at_tick=mglchr(dir,'!'); + if(!mglchrs(dir,"xyz")) dir="xyz"; AdjustTicks(dir,false); SetPenPal(pen); static int cgid=1; StartGroup("AxisGrid",cgid++); - if(strchr(dir,'x')) DrawGrid(ax); - if(strchr(dir,'y')) DrawGrid(ay); - if(strchr(dir,'z')) DrawGrid(az); + if(strchr(dir,'x')) DrawGrid(ax,at_tick); + if(strchr(dir,'y')) DrawGrid(ay,at_tick); + if(strchr(dir,'z')) DrawGrid(az,at_tick); EndGroup(); } //----------------------------------------------------------------------------- -void mglCanvas::DrawGrid(mglAxis &aa) +void MGL_NO_EXPORT mgl_drw_grid(HMGL gr, double val, const mglPoint &d, const mglPoint &oa, const mglPoint &ob, const mglPoint &da1, const mglPoint &db1, const mglPoint &da2, const mglPoint &db2) +{ + gr->Reserve(62); + mglPoint q,p; + q = oa+d*val; p = q+da1; // lines along 'a' + long k1 = gr->AddPnt(p), k2; + for(long j=1;j<31;j++) + { + mreal v = j/30.; + p = q+da1*(1-v)+da2*v; + k2 = k1; k1 = gr->AddPnt(p); + gr->line_plot(k2,k1); + } + q = ob+d*val; p = q+db1; // lines along 'b' + k1 = gr->AddPnt(p); + for(long j=1;j<31;j++) + { + mreal v = j/30.; + p = q+db1*(1-v)+db2*v; + k2 = k1; k1 = gr->AddPnt(p); + gr->line_plot(k2,k1); + } +} +void mglCanvas::DrawGrid(mglAxis &aa, bool at_tick) { mglPoint pp[8]={Min,Min,Min,Min,Max,Max,Max,Max},nan=mglPoint(NAN), oo[8], org=Min; pp[1].x=Max.x; pp[2].y=Max.y; pp[3].z=Max.z; @@ -695,37 +728,38 @@ void mglCanvas::DrawGrid(mglAxis &aa) ScalePoint(&B,pp[i],nan,false); if(pp[i].z0) for(i=0;i0 && !get(MGL_NOSUBTICKS)) { - q = oa+d*aa.txt[i].val; p = q+da1; // lines along 'a' - k1 = AddPnt(&B, p,CDef); - for(j=1;j<31;j++) - { - v = j/30.; - p = q+da1*(1-v)+da2*v; - k2 = k1; k1 = AddPnt(&B, p,CDef); - line_plot(k2,k1); - } - q = ob+d*aa.txt[i].val; p = q+db1; // lines along 'b' - k1 = AddPnt(&B, p,CDef); - for(j=1;j<31;j++) + mreal v0 = mgl_isnan(aa.o) ? aa.v0 : aa.o; + if(aa.v2>aa.v1) v0 = v0 - aa.ds*floor((v0-aa.v1)/aa.ds+1e-3); + else v0 = v0 - aa.ds*floor((v0-aa.v2)/aa.ds+1e-3); + if(v0+aa.ds!=v0 && aa.v2+aa.ds!=aa.v2) + for(mreal v=v0;(v-aa.v2)*(v-aa.v1)<=0;v+=aa.ds) + mgl_drw_grid(this, v, d, oa, ob, da1, db1, da2, db2); + } + if(aa.dv) at_tick = false; + long n=aa.txt.size(); + if(n>0) for(long i=0;iaa.v1 && fabs(u-exp(M_LN10*floor(0.1+log10(u))))<0.01*u) + for(long j=2;j<10 && v*jGetNx()]; if(!mgl_have_color(sch)) sch = MGL_DEF_PAL; long s = AddTexture(sch); @@ -970,8 +1012,7 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m { static int cgid=1; StartGroup("Colorbar",cgid++); long n=vv->GetNx(); - long n1,n2,n3,n4; - mreal d,s3=B.pf,ss=1/s3; // NOTE: colorbar was wider ss=0.9; + mreal s3=B.pf,ss=1/s3; // NOTE: colorbar was wider ss=0.9; mglPoint p1,p2; mglMatrix M=B1; M.pf=s3; M.norot=true; @@ -980,7 +1021,7 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m mask = MGL_SOLID_MASK; for(long i=0;iv(i))*2-1; + mreal d = GetA(vv->v(i))*2-1; p1 = p2 = mglPoint((ss*d+1)*w+x, (ss*d+1)*h+y, s3); switch(where) { @@ -989,7 +1030,7 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m case 3: p1.y = y; p2.y = y+0.1*h; break; default:p1.x = x-0.1*w; p2.x = x; break; } - n1 = AddPnt(&M, p1,c[i]); n2 = AddPnt(&M, p2,c[i]); + long n1 = AddPnt(&M, p1,c[i]), n2 = AddPnt(&M, p2,c[i]); d = GetA(vv->v(i+1))*2-1; p1 = p2 = mglPoint((ss*d+1)*w+x, (ss*d+1)*h+y, s3); switch(where) @@ -999,17 +1040,26 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m case 3: p1.y = y; p2.y = y+0.1*h; break; default:p1.x = x-0.1*w; p2.x = x; break; } - n3 = AddPnt(&M, p1,c[i]); n4 = AddPnt(&M, p2,c[i]); - quad_plot(n1,n2,n3,n4); + quad_plot(n1,n2, AddPnt(&M, p1,c[i]), AddPnt(&M, p2,c[i])); } if(n<64) { - wchar_t buf[64]; ac.txt.clear(); - for(long i=0;iv(i); + ac.AddLabel(mgl_ftoa(d,ac.stl.c_str()),d); + } + else { - d = vv->v(i); - mglprintf(buf,64,ac.t.empty()?(fabs(d)<1 ? L"%.2g" : L"%.3g"):ac.t.c_str(),d); - ac.AddLabel(buf,d); + wchar_t buf[64]; + for(long i=0;iv(i); + mglprintf(buf,64,ac.t.c_str(),d); + ac.AddLabel(buf,d); + } } } else { UpdateAxis(); AdjustTicks(ac,fa!=0); } @@ -1017,7 +1067,7 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m SetPenPal(TickStl); for(size_t i=0;igr = this; PrevState=NAN; } -mglBase::~mglBase() { ClearEq(); delete fnt; } +mglBase::~mglBase() +{ + ClearEq(); ClearPrmInd(); delete fnt; +#if MGL_HAVE_OMP + omp_destroy_lock(&lockClf); +#endif +} //----------------------------------------------------------------------------- void mglBase::RestoreFont() { fnt->Restore(); } void mglBase::LoadFont(const char *name, const char *path) @@ -145,7 +161,7 @@ void mglBase::AddActive(long k,int n) } //----------------------------------------------------------------------------- mreal mglBase::GetRatio() const { return 1; } -int mglBase::GetWidth() const { return 1; } +int mglBase::GetWidth() const { return 1; } int mglBase::GetHeight() const { return 1; } //----------------------------------------------------------------------------- void mglBase::StartGroup(const char *name, int id) @@ -177,17 +193,20 @@ const char *mglWarn[mglWarnEnd] = {"data dimension(s) is incompatible", //mglWar "There are too long string in script", //mglScrLong "There are unbalanced ' in script"}; //mglScrStr //----------------------------------------------------------------------------- +extern bool mglPrintWarn; void mglBase::SetWarn(int code, const char *who) { + std::string warn; WarnCode = code>0 ? code:0; if(code>0 && code0?new short[6*nt]:0; - if(line) delete []line; - line = nl>0?new short[2*nl]:0; +#pragma omp critical(glf_create) + { + if(trig) delete []trig; + trig = nt>0?new short[6*nt]:0; + if(line) delete []line; + line = nl>0?new short[2*nl]:0; + } } //----------------------------------------------------------------------------- bool mglGlyph::operator==(const mglGlyph &g) @@ -219,7 +241,8 @@ long mglBase::AddGlyph(int s, long j) memcpy(g.trig, fnt->GetTr(s,j), 6*g.nt*sizeof(short)); memcpy(g.line, fnt->GetLn(s,j), 2*g.nl*sizeof(short)); // now let find the similar glyph - for(size_t i=0;iMax.z) {z=Max.z; n=mglPoint(0,0,1);} } - x1=x; y1=y; z1=z; x2=y2=z2=1; - if(fx) { x1 = fx->Calc(x,y,z); x2 = fx->CalcD('x',x,y,z); } - if(fy) { y1 = fy->Calc(x,y,z); y2 = fy->CalcD('y',x,y,z); } - if(fz) { z1 = fz->Calc(x,y,z); z2 = fz->CalcD('z',x,y,z); } + x1=x; y1=y; z1=z; + register mreal xx=1,xy=0,xz=0,yx=0,yy=1,yz=0,zx=0,zy=0,zz=1; + if(fx) { x1 = fx->Calc(x,y,z); xx = fx->CalcD('x',x,y,z); xy = fx->CalcD('y',x,y,z); xz = fx->CalcD('z',x,y,z); } + if(fy) { y1 = fy->Calc(x,y,z); yx = fy->CalcD('x',x,y,z); yy = fy->CalcD('y',x,y,z); yz = fy->CalcD('z',x,y,z); } + if(fz) { z1 = fz->Calc(x,y,z); zx = fz->CalcD('x',x,y,z); zy = fz->CalcD('y',x,y,z); zz = fz->CalcD('z',x,y,z); } if(mgl_isnan(x1) || mgl_isnan(y1) || mgl_isnan(z1)) { x=NAN; return false; } - register mreal d; // TODO: should I update normale for infinite light source (x=NAN)?!? - d = 1/(FMax.x - FMin.x); x = (2*x1 - FMin.x - FMax.x)*d; x2 *= 2*d; - d = 1/(FMax.y - FMin.y); y = (2*y1 - FMin.y - FMax.y)*d; y2 *= 2*d; - d = 1/(FMax.z - FMin.z); z = (2*z1 - FMin.z - FMax.z)*d; z2 *= 2*d; - n.x *= y2*z2; n.y *= x2*z2; n.z *= x2*y2; + register mreal d; + d = 1/(FMax.x - FMin.x); x = (2*x1 - FMin.x - FMax.x)*d; xx /= d; xy /= d; xz /= d; + d = 1/(FMax.y - FMin.y); y = (2*y1 - FMin.y - FMax.y)*d; yx /= d; yy /= d; yz /= d; + d = 1/(FMax.z - FMin.z); z = (2*z1 - FMin.z - FMax.z)*d; zx /= d; zy /= d; zz /= d; + register mreal nx=n.x, ny=n.y, nz=n.z; + n.x = nx*xx+ny*xy+nz*xz; + n.y = nx*yx+ny*yy+nz*yz; + n.z = nx*zx+ny*zy+nz*zz; if((TernAxis&3)==1) // usual ternary axis { if(x+y>0) @@ -533,8 +560,8 @@ void mglBase::CRange(mreal v1,mreal v2,bool add) if(v1==v2 && !add) return; if(!add) { - if(v1==v1) Min.c = v1; - if(v2==v2) Max.c = v2; + if(mgl_isnum(v1)) Min.c = v1; + if(mgl_isnum(v2)) Max.c = v2; } else if(Min.c=0 && !strchr(s,'|'); // Use mapping, smoothed colors - for(i=0;i=0 && s[i]==':' && j<1) break; - if(s[i]=='[') j++; if(s[i]==']') j--; + if(s[i]=='{' && strchr(MGL_COLORS"x",s[i+1]) && j<1) n++; + if(s[i]=='[' || s[i]=='{') j++; if(s[i]==']' || s[i]=='}') j--; if(strchr(MGL_COLORS,s[i]) && j<1) n++; - if(s[i]=='x' && i>0 && s[i-1]=='{' && j<1) n++; // if(smooth && s[i]==':') break; // NOTE: should use [] } if(!n) { - if((strchr(s,'|') || strchr(s,'!')) && !smooth) // sharp colors + if(strchr(s,'|') && !smooth) // sharp colors { n=l=6; s=MGL_DEF_SCH; sm = false; } else if(smooth==0) // none colors but color scheme { n=l=6; s=MGL_DEF_SCH; } - else return; } + if(n<=0) return; bool man=sm; mglColor *c = new mglColor[2*n]; // Colors itself mreal *val = new mreal[n]; @@ -826,20 +858,18 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha) if(m>0 && s[i+1]>'0' && s[i+1]<='9')// ext color { c[2*n] = mglColor(s[i],(s[i+1]-'0')/5.f); i++; } else c[2*n] = mglColor(s[i]); // usual color - val[n]=-1; n++; + val[n]=-1; c[2*n].a = -1; n++; } if(s[i]=='x' && i>0 && s[i-1]=='{' && j<1) // {xRRGGBB,val} format, where val in [0,1] { - if(strchr(dig,s[i+1]) && strchr(dig,s[i+2]) && strchr(dig,s[i+3]) && strchr(dig,s[i+4]) && strchr(dig,s[i+5]) && strchr(dig,s[i+6])) - { - char ss[3]="00"; c[2*n].a = 1; - ss[0] = s[i+1]; ss[1] = s[i+2]; c[2*n].r = strtol(ss,0,16)/255.; - ss[0] = s[i+3]; ss[1] = s[i+4]; c[2*n].g = strtol(ss,0,16)/255.; - ss[0] = s[i+5]; ss[1] = s[i+6]; c[2*n].b = strtol(ss,0,16)/255.; - if(strchr(dig,s[i+7]) && strchr(dig,s[i+8])) - { ss[0] = s[i+7]; ss[1] = s[i+8]; c[2*n].a = strtol(ss,0,16)/255.; i+=2; } - val[n]=-1; i+=6; n++; - } + uint32_t id = strtoul(s+1+i,0,16); + if(memchr(s+i+1,'}',8) || memchr(s+i+1,',',8)) c[2*n].a = -1; + else { c[2*n].a = (id%256)/255.; id /= 256; } + c[2*n].b = (id%256)/255.; id /= 256; + c[2*n].g = (id%256)/255.; id /= 256; + c[2*n].r = (id%256)/255.; + while(strchr("0123456789abcdefABCDEFx",s[i])) i++; + val[n]=-1; n++; i--; } if(s[i]==',' && m>0 && j<1 && n>0) val[n-1] = atof(s+i+1); @@ -848,7 +878,11 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha) { man=false; alpha = 0.1*(s[i+1]-'0'); i++; } } for(long i=0;i=0) { p=(p+1)%n; id = 256*i+p; } - mglColor c = Txt[i].col[int(MGL_TEXTURE_COLOURS*(p+0.5)/n)]; - mreal dif, dmin=1; - // try to find closest color - for(long j=0;mglColorIds[j].id;j++) for(long k=1;k<10;k++) - { - mglColor cc; cc.Set(mglColorIds[j].col,k/5.); - dif = (c-cc).NormS(); - if(dif0 ? (p+0.5)/n : 0); CurrPal++; + sprintf(last_style+11,"{&%g}",CDef); if(!leg_str.empty()) { AddLegend(leg_str.c_str(),last_style); leg_str.clear(); } - CDef = i + (n>0 ? (p+0.5)/n : 0); CurrPal++; return CDef; } //----------------------------------------------------------------------------- @@ -987,10 +1001,12 @@ mreal mglBase::NextColor(long id, long sh) { long i=abs(id)/256, n=Txt[i].n, p=abs(id)&0xff; if(id>=0) p=(p+sh)%n; - return i + (n>0 ? (p+0.5)/n : 0); + mreal cc = i + (n>0 ? (p+0.5)/n : 0); + sprintf(last_style+11,"{&%g}",cc); + return cc; } //----------------------------------------------------------------------------- -const char *mglchrs(const char *str, const char *chr) +MGL_EXPORT_PURE const char *mglchrs(const char *str, const char *chr) { if(!str || !str[0] || !chr || !chr[0]) return NULL; size_t l=strlen(chr); @@ -1002,7 +1018,7 @@ const char *mglchrs(const char *str, const char *chr) return NULL; } //----------------------------------------------------------------------------- -const char *mglchr(const char *str, char ch) +MGL_EXPORT_PURE const char *mglchr(const char *str, char ch) { if(!str || !str[0]) return NULL; size_t l=strlen(str),k=0; @@ -1020,50 +1036,67 @@ char mglBase::SetPenPal(const char *p, long *Id, bool pal) { char mk=0; PDef = 0xffff; // reset to solid line - memcpy(last_style,"{k5}-1\0",8); + strcpy(last_style,"__1 {dFFFF}k\0"); + const char *s; Arrow1 = Arrow2 = 0; PenWidth = 1; if(p && *p) { // const char *col = "wkrgbcymhRGBCYMHWlenuqpLENUQP"; unsigned val[8] = {0x0000, 0xffff, 0x00ff, 0x0f0f, 0x1111, 0x087f, 0x2727, 0x3333}; - const char *stl = " -|;:ji=", *s; + const char *stl = " -|;:ji="; const char *mrk = "*o+xsd.^v<>"; const char *MRK = "YOPXSDCTVLR"; const char *wdh = "123456789"; - const char *arr = "AKDTVISO_"; + const char *arr = "AKDTVISOX_"; long m=0; size_t l=strlen(p); for(size_t i=0;i0 && p[i]=='d') PDef = strtol(p+i+1,0,16); if(m>0) continue; s = mglchr(stl,p[i]); - if(s) { PDef = val[s-stl]; last_style[4]=p[i]; } - else if(mglchr(mrk,p[i])) mk = p[i]; + if(s) + { PDef = val[s-stl]; sprintf(last_style+6,"%04x",PDef); last_style[10]='}'; } + else if(mglchr(mrk,p[i])) + { mk = p[i]; last_style[3] = mk; } else if(mglchr(wdh,p[i])) - { last_style[5] = p[i]; PenWidth = p[i]-'0'; } + { PenWidth = p[i]-'0'; last_style[2] = p[i]; } else if(mglchr(arr,p[i])) { if(!Arrow2) Arrow2 = p[i]; else Arrow1 = p[i]; } } - if(Arrow1=='_') Arrow1=0; if(Arrow2=='_') Arrow2=0; + if(!Arrow1) Arrow1='_'; if(!Arrow2) Arrow2='_'; if(mglchr(p,'#')) { s = mglchr(mrk,mk); - if(s) mk = MRK[s-mrk]; + if(s) + { mk = MRK[s-mrk]; last_style[3] = mk; } } + if((s=strstr(p,"{&"))!=0) + { mk = last_style[3] = p[3]; strcpy(last_style+11,s); } + last_style[0] = Arrow1; last_style[1] = Arrow2; } if(pal) { - last_style[6]=mk; - long tt, n; - tt = AddTexture(p,-1); n=Txt[tt].n; - CDef = tt+((n+CurrPal-1)%n+0.5)/n; - if(Id) *Id=long(tt)*256+(n+CurrPal-1)%n; + if((s=strstr(p,"{&"))!=0) + { + CDef = atof(s+2); +// if(Id) *Id=long(tt)*256+(n+CurrPal-1)%n; + } + else + { + long tt, n; + tt = AddTexture(p,-1); n=Txt[tt].n; + CDef = tt+((n+CurrPal-1)%n+0.5)/n; + if(Id) *Id=long(tt)*256+(n+CurrPal-1)%n; + sprintf(last_style+11,"{&%g}",CDef); + } } + if(Arrow1=='_') Arrow1=0; if(Arrow2=='_') Arrow2=0; return mk; } //----------------------------------------------------------------------------- @@ -1088,6 +1121,7 @@ void mglBase::SetMask(const char *p) for(long i=0;i0 && p[i]=='s') mask = strtoull(p+i+1,0,16); if(m>0) continue; if(p[i]==':') break; s = mglchr(msk, p[i]); @@ -1156,7 +1190,7 @@ void mglBase::vect_plot(long p1, long p2, mreal s) line_plot(p1,p2); line_plot(n1,p2); line_plot(p2,n2); } //----------------------------------------------------------------------------- -int mglFindArg(const char *str) +int MGL_LOCAL_PURE mglFindArg(const char *str) { long l=0,k=0,len=strlen(str); for(long i=0;i0) { s[n]=0; s=s+n+1; } - mgl_strtrim(a); b=s; + mgl_strtrim(s); char *a=s; + long n=mglFindArg(s); if(n>0) { s[n]=0; s=s+n+1; } + mgl_strtrim(a); char *b=s; n=mglFindArg(s); if(n>0) { s[n]=0; s=s+n+1; } mgl_strtrim(b); @@ -1205,7 +1238,7 @@ mreal mglBase::SaveState(const char *opt) if(!strcmp(b,"on")) ff=1; if(!strcmp(a+1,"range")) { - n=mglFindArg(s); c=s; + n=mglFindArg(s); char *c=s; if(n>0) { s[n]=0; s=s+n+1; } mgl_strtrim(c); ss = atof(c); if(a[0]=='x') { Min.x=ff; Max.x=ss; } @@ -1254,7 +1287,7 @@ bool MGL_EXPORT mgl_check_dim2(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const ch // if(!gr || !x || !y || !z) return true; // if data is absent then should be segfault!!! register long n=z->GetNx(),m=z->GetNy(); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,name); return true; } - if(a && n*m*z->GetNz()!=a->GetNx()*a->GetNy()*a->GetNz()) + if(a && z->GetNN()!=a->GetNN()) { gr->SetWarn(mglWarnDim,name); return true; } if(less) { @@ -1318,9 +1351,9 @@ bool MGL_EXPORT mgl_check_dim3(HMGL gr, bool both, HCDT x, HCDT y, HCDT z, HCDT register long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); if(n<2 || m<2 || l<2) { gr->SetWarn(mglWarnLow,name); return true; } - if(!(both || (x->GetNx()==n && y->GetNx()==m && z->GetNx()==l))) + if(!both && (x->GetNx()!=n || y->GetNx()!=m || z->GetNx()!=l)) { gr->SetWarn(mglWarnDim,name); return true; } - if(b && b->GetNx()*b->GetNy()*b->GetNz()!=n*m*l) + if(b && b->GetNN()!=n*m*l) { gr->SetWarn(mglWarnDim,name); return true; } return false; } @@ -1335,20 +1368,26 @@ bool MGL_EXPORT mgl_check_trig(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT return false; } //----------------------------------------------------------------------------- +bool MGL_EXPORT mgl_isnboth(HCDT x, HCDT y, HCDT z, HCDT a) +{ + register long n=a->GetNN(); + return x->GetNN()!=n || y->GetNN()!=n || z->GetNN()!=n; +} +//----------------------------------------------------------------------------- bool MGL_EXPORT mgl_isboth(HCDT x, HCDT y, HCDT z, HCDT a) { - register long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); - return x->GetNx()*x->GetNy()*x->GetNz()==n*m*l && y->GetNx()*y->GetNy()*y->GetNz()==n*m*l && z->GetNx()*z->GetNy()*z->GetNz()==n*m*l; + register long n=a->GetNN(); + return x->GetNN()==n && y->GetNN()==n && z->GetNN()==n; } //----------------------------------------------------------------------------- bool MGL_EXPORT mgl_check_vec3(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *name) { // if(!gr || !x || !y || !z || !ax || !ay || !az) return true; // if data is absent then should be segfault!!! - register long n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(); - if(n*m*l!=ay->GetNx()*ay->GetNy()*ay->GetNz() || n*m*l!=az->GetNx()*az->GetNy()*az->GetNz()) + register long n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(), nn=n*m*l; + if(nn!=ay->GetNN() || nn!=az->GetNN()) { gr->SetWarn(mglWarnDim,name); return true; } if(n<2 || m<2 || l<2) { gr->SetWarn(mglWarnLow,name); return true; } - bool both = x->GetNx()*x->GetNy()*x->GetNz()==n*m*l && y->GetNx()*y->GetNy()*y->GetNz()==n*m*l && z->GetNx()*z->GetNy()*z->GetNz()==n*m*l; + bool both = x->GetNN()==nn && y->GetNN()==nn && z->GetNN()==nn; if(!(both || (x->GetNx()==n && y->GetNx()==m && z->GetNx()==l))) { gr->SetWarn(mglWarnDim,name); return true; } return false; @@ -1382,18 +1421,18 @@ void mglBase::ClearUnused() } // now add proper indexes l=Pnt.size(); - std::vector pnt; + mglStack pnt; pnt.reserve(l); for(size_t i=0;iSetQuality(qual); } void MGL_EXPORT mgl_set_quality_(uintptr_t *gr, int *qual) { _GR_->SetQuality(*qual); } -int MGL_EXPORT mgl_get_quality(HMGL gr) { return gr->GetQuality(); } -int MGL_EXPORT mgl_get_quality_(uintptr_t *gr) { return _GR_->GetQuality(); } -int MGL_EXPORT mgl_is_frames(HMGL gr) +int MGL_EXPORT_PURE mgl_get_quality(HMGL gr) { return gr->GetQuality(); } +int MGL_EXPORT_PURE mgl_get_quality_(uintptr_t *gr) { return _GR_->GetQuality(); } +int MGL_EXPORT_PURE mgl_is_frames(HMGL gr) { return gr->get(MGL_VECT_FRAME) && !(gr->GetQuality()&MGL_DRAW_LMEM); } void MGL_EXPORT mgl_set_draw_reg(HMGL gr, long nx, long ny, long m) { gr->SetDrawReg(nx,ny,m); } void MGL_EXPORT mgl_set_draw_reg_(uintptr_t *gr, int *nx, int *ny, int *m) { _GR_->SetDrawReg(*nx,*ny,*m); } //----------------------------------------------------------------------------- -int MGL_EXPORT mgl_get_flag(HMGL gr, uint32_t flag) { return gr->get(flag); } -int MGL_EXPORT mgl_get_flag_(uintptr_t *gr, unsigned long *flag) { return _GR_->get(*flag); } +int MGL_EXPORT_PURE mgl_get_flag(HMGL gr, uint32_t flag) { return gr->get(flag); } +int MGL_EXPORT_PURE mgl_get_flag_(uintptr_t *gr, unsigned long *flag) { return _GR_->get(*flag); } void MGL_EXPORT mgl_set_flag(HMGL gr, int val, uint32_t flag) { gr->set(val,flag); } void MGL_EXPORT mgl_set_flag_(uintptr_t *gr, int *val, unsigned long *flag) { _GR_->set(*val,*flag); } //----------------------------------------------------------------------------- @@ -55,10 +58,22 @@ void MGL_EXPORT mgl_set_plotid(HMGL gr, const char *id) { gr->PlotId = id; } void MGL_EXPORT mgl_set_plotid_(uintptr_t *gr, const char *id,int l) { char *s=new char[l+1]; memcpy(s,id,l); s[l]=0; _GR_->PlotId = s; delete []s; } -MGL_EXPORT const char *mgl_get_plotid(HMGL gr) { return gr->PlotId.c_str(); } +MGL_EXPORT_PURE const char *mgl_get_plotid(HMGL gr) { return gr->PlotId.c_str(); } +int MGL_EXPORT mgl_get_plotid_(uintptr_t *gr, char *out, int len) +{ + const char *res = mgl_get_plotid(_GR_); + if(out) strncpy(out,res,len); + return strlen(res); +} //----------------------------------------------------------------------------- -MGL_EXPORT const char *mgl_get_mess(HMGL gr) { return gr->Mess.c_str(); } -int MGL_EXPORT mgl_get_warn(HMGL gr) { return gr->GetWarn(); } +MGL_EXPORT_PURE const char *mgl_get_mess(HMGL gr) { return gr->Mess.c_str(); } +int MGL_EXPORT mgl_get_mess_(uintptr_t *gr, char *out, int len) +{ + const char *res = mgl_get_mess(_GR_); + if(out) strncpy(out,res,len); + return strlen(res); +} +int MGL_EXPORT_PURE mgl_get_warn(HMGL gr) { return gr->GetWarn(); } void MGL_EXPORT mgl_set_warn(HMGL gr, int code, const char *txt) { gr->SetWarn(code,txt); } void MGL_EXPORT mgl_set_origin(HMGL gr, double x0, double y0, double z0) @@ -119,7 +134,7 @@ void MGL_EXPORT mgl_set_rdc_acc_(uintptr_t *gr, int *reduce) void MGL_EXPORT mgl_highlight_(uintptr_t *gr, int *id) { _GR_->Highlight(*id); } void MGL_EXPORT mgl_set_origin_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0) { _GR_->SetOrigin(*x0,*y0,*z0); } -int MGL_EXPORT mgl_get_warn_(uintptr_t *gr) { return _GR_->GetWarn(); } +int MGL_EXPORT_PURE mgl_get_warn_(uintptr_t *gr) { return _GR_->GetWarn(); } void MGL_EXPORT mgl_set_warn_(uintptr_t *gr, int *code, const char *txt, int l) { char *s=new char[l+1]; memcpy(s,txt,l); s[l]=0; _GR_->SetWarn(*code, s); delete []s; } @@ -201,6 +216,13 @@ void MGL_EXPORT mgl_def_font_(const char *name, const char *path,int l,int n) char *d=new char[n+1]; memcpy(d,path,n); d[n]=0; mglDefFont.Load(name,path); delete []s; delete []d; } //----------------------------------------------------------------------------- +int MGL_EXPORT mgl_check_version(const char *ver) +{ double v=0; int r = sscanf(ver,"2.%lg",&v); + return r<1 || v>MGL_VER2; } +int MGL_EXPORT mgl_check_version_(const char *ver, int l) +{ char *s=new char[l+1]; memcpy(s,ver,l); s[l]=0; + int r=mgl_check_version(s); delete []s; return r; } +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_start_group(HMGL gr, const char *s) { gr->StartAutoGroup(s); } void MGL_EXPORT mgl_end_group(HMGL gr) { gr->EndGroup(); } void MGL_EXPORT mgl_start_group_(uintptr_t *gr, const char *name,int l) @@ -265,3 +287,10 @@ void MGL_EXPORT mgl_set_mask_val_(const char *id, uint64_t *mask,int) void MGL_EXPORT mgl_set_mask_angle(HMGL gr, int angle) { gr->SetMaskAngle(angle); } void MGL_EXPORT mgl_set_mask_angle_(uintptr_t *gr, int *angle) { _GR_->SetMaskAngle(*angle); } //--------------------------------------------------------------------------- +void MGL_EXPORT mgl_ask_stop(HMGL gr, int stop) { gr->AskStop(stop); } +void MGL_EXPORT mgl_ask_stop_(uintptr_t *gr, int *stop){ _GR_->AskStop(*stop); } +int MGL_EXPORT mgl_need_stop(HMGL gr) { return gr->NeedStop(); } +int MGL_EXPORT mgl_need_stop_(uintptr_t *gr) { return _GR_->NeedStop();} +void MGL_EXPORT mgl_set_event_func(HMGL gr, void (*func)(void *), void *par) +{ gr->SetEventFunc(func,par); } +//--------------------------------------------------------------------------- diff --git a/src/canvas.cpp b/src/canvas.cpp index bbe7fb2..7a7a332 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -27,10 +27,11 @@ mglCanvas::mglCanvas(int w, int h) : mglBase() { clr(MGL_DISABLE_SCALE); set(MGL_VECT_FRAME); // NOTE: require a lot of memory! - Z=0; C=G=G4=0; OI=0; gif=0; + Z=0; C=G=G4=GB=0; OI=0; gif=0; CurFrameId=0; Delay=0.5; Width=Height=Depth=0; ObjId=-1; fscl=ftet=0; PlotId = "frame"; + pnt_col = 0; ac.ch='c'; ax.dir = mglPoint(1,0,0); ax.a = mglPoint(0,1,0); ax.b = mglPoint(0,0,1); ax.ch='x'; @@ -42,7 +43,8 @@ mglCanvas::mglCanvas(int w, int h) : mglBase() //----------------------------------------------------------------------------- mglCanvas::~mglCanvas() { - if(G) { delete []G; delete []C; delete []Z; delete []G4;delete []OI; } + if(G) { delete []G; delete []C; delete []Z; delete []G4;delete []GB;delete []OI; } + if(pnt_col) delete []pnt_col; } //----------------------------------------------------------------------------- long mglCanvas::PushDrwDat() @@ -78,7 +80,7 @@ void mglCanvas::SetFrame(long i) void mglCanvas::GetFrame(long k) { if(k<0 || (size_t)k>=DrwDat.size()) return; - Clf(); + ClearFrame(); const mglDrawDat &d=DrwDat[k]; #if MGL_HAVE_PTHREAD pthread_mutex_lock(&mutexPnt); @@ -88,7 +90,7 @@ void mglCanvas::GetFrame(long k) pthread_mutex_lock(&mutexTxt); #endif #pragma omp critical - { Pnt=d.Pnt; Prm=d.Prm; Glf=d.Glf; Ptx=d.Ptx; Txt=d.Txt; } + { Pnt=d.Pnt; Prm=d.Prm; Glf=d.Glf; Ptx=d.Ptx; Txt=d.Txt; ClearPrmInd(); } #if MGL_HAVE_PTHREAD pthread_mutex_unlock(&mutexTxt); pthread_mutex_unlock(&mutexPtx); @@ -98,6 +100,44 @@ void mglCanvas::GetFrame(long k) #endif } //----------------------------------------------------------------------------- +void mglCanvas::ClearFrame() +{ +#if MGL_HAVE_PTHREAD + pthread_mutex_lock(&mutexPnt); + pthread_mutex_lock(&mutexPrm); + pthread_mutex_lock(&mutexGlf); + pthread_mutex_lock(&mutexPtx); + pthread_mutex_lock(&mutexTxt); + pthread_mutex_lock(&mutexSub); + pthread_mutex_lock(&mutexLeg); + pthread_mutex_lock(&mutexGrp); + pthread_mutex_lock(&mutexAct); +#endif + +#pragma omp critical(txt) + { + StartAutoGroup(NULL); + Sub.clear(); Leg.clear(); Grp.clear(); Act.clear(); + Pnt.clear(); Prm.clear(); Ptx.clear(); Glf.clear(); ClearPrmInd(); + Txt.clear(); Txt.reserve(3); + mglTexture t1(MGL_DEF_PAL,-1), t2(MGL_DEF_SCH,1); + MGL_PUSH(Txt,t1,mutexTxt); + MGL_PUSH(Txt,t2,mutexTxt); + } +#if MGL_HAVE_PTHREAD + pthread_mutex_unlock(&mutexAct); + pthread_mutex_unlock(&mutexGrp); + pthread_mutex_unlock(&mutexLeg); + pthread_mutex_unlock(&mutexSub); + pthread_mutex_unlock(&mutexTxt); + pthread_mutex_unlock(&mutexPtx); + pthread_mutex_unlock(&mutexGlf); + pthread_mutex_unlock(&mutexPrm); + pthread_mutex_unlock(&mutexPnt); +#endif + ClfZB(true); +} +//----------------------------------------------------------------------------- void mglCanvas::ShowFrame(long k) { if(k<0 || (size_t)k>=DrwDat.size()) return; @@ -116,7 +156,7 @@ void mglCanvas::ShowFrame(long k) Glf.reserve(d.Glf.size()); for(size_t i=0;i 16*8 + ax.Clear(); ay.Clear(); az.Clear(); ac.Clear(); mgl_clear_fft(); DefMaskAn=0; ResetMask(); SetTickRotate(true); SetTickSkip(true); SetWarn(mglWarnNone,""); mglGlobalMess = ""; ObjId = -1; HighId = INT_MIN; - SetFunc(0,0); Stop=false; CutOff(0); Ternary(0); + SetFunc(0,0); CutOff(0); Ternary(0); + Stop=false; event_cb = NULL; event_par=NULL; SetRanges(mglPoint(-1,-1,-1,-1), mglPoint(1,1,1,1)); SetOrigin(NAN,NAN,NAN,NAN); SetBarWidth(0.7); SetMarkSize(1); SetArrowSize(1); @@ -197,7 +239,6 @@ GifFileType *gif;*/ SetDifLight(false); SetReduceAcc(false); SetDefScheme(MGL_DEF_SCH); SetPalette(MGL_DEF_PAL); SetPenPal("k-1"); Alpha(false); - SetTicks('x'); SetTicks('y'); SetTicks('z'); SetTicks('c'); stack.clear(); Restore(); DefColor('k'); SetPlotFactor(0); InPlot(0,1,0,1,false); SetTickLen(0); SetCut(true); @@ -220,7 +261,6 @@ mreal mglCanvas::FindOptOrg(char dir, int ind) const if(B!=bb) { bb = B; -#pragma omp parallel for for(long i=0;i<8;i++) PostScale(&B,pp[i]); // find point with minimal y long j=0; @@ -245,7 +285,7 @@ mreal mglCanvas::FindOptOrg(char dir, int ind) const { if(pp[1].x>pp[2].x) pz.y=1-pz.y; else pz.x=1-pz.x; } else if(typp[3].x) py.z=1-py.z; else py.x=1-py.x; } - else if(txpp[2].x) px.y=1-px.y; else px.z=1-px.z; } } // return to normal variables @@ -299,19 +339,16 @@ mreal mglCanvas::GetOrgZ(char dir, bool inv) const //----------------------------------------------------------------------------- // Put primitives //----------------------------------------------------------------------------- -#define MGL_MARK_PLOT if(Quality&MGL_DRAW_LMEM) mark_draw(Pnt[p],type,size,&d);else \ - { mglPrim a; a.w = pw; a.s = size; \ +#define MGL_MARK_PLOT if(Quality&MGL_DRAW_LMEM) \ + { mglDrawReg d; d.set(this,dr_x,dr_y,dr_p); d.PenWidth=pw; \ + d.PDef = PDef; d.pPos = pPos; mark_draw(Pnt[p],type,size,&d); }\ + else{ mglPrim a; a.w = pw; a.s = size; \ a.n1 = p; a.n4 = type; a.angl=0; add_prim(a); } void mglCanvas::mark_plot(long p, char type, mreal size) { if(p<0 || mgl_isnan(Pnt[p].x) || mgl_isnan(size)) return; long pp=p; -// mreal pw = fabs(PenWidth)*0.15/sqrt(font_factor); mreal pw = 0.15/sqrt(font_factor); - mglDrawReg d; d.set(this,dr_x,dr_y,dr_p); - d.PDef = PDef; d.pPos = pPos; d.PenWidth=pw; -// if(size>=0) size *= MarkSize; -// if(size==0) size = MarkSize; size = size?fabs(size):1; size *= MarkSize*0.35*font_factor; if(type=='.') size = fabs(PenWidth)*sqrt(font_factor/400); @@ -320,8 +357,10 @@ void mglCanvas::mark_plot(long p, char type, mreal size) else { MGL_MARK_PLOT } } //----------------------------------------------------------------------------- -#define MGL_LINE_PLOT if(Quality&MGL_DRAW_LMEM) line_draw(Pnt[p1],Pnt[p2],&dd);else \ - { mglPrim a(1); a.n3=PDef; a.s = pPos; \ +#define MGL_LINE_PLOT if(Quality&MGL_DRAW_LMEM) \ + { mglDrawReg d; d.set(this,dr_x,dr_y,dr_p); d.PenWidth=pw; \ + d.PDef = PDef; d.pPos = pPos; line_draw(Pnt[p1],Pnt[p2],&d); }\ + else { mglPrim a(1); a.n3=PDef; a.s = pPos; \ a.n1 = p1; a.n2 = p2; a.w = pw; a.angl=0; add_prim(a); } void mglCanvas::line_plot(long p1, long p2) { @@ -329,36 +368,35 @@ void mglCanvas::line_plot(long p1, long p2) if(p1<0 || p2<0 || mgl_isnan(Pnt[p1].x) || mgl_isnan(Pnt[p2].x)) return; if(p1>p2) { long kk=p1; p1=p2; p2=kk; } // rearrange start/end for proper dashing long pp1=p1,pp2=p2; - mreal pw = fabs(PenWidth)*sqrt(font_factor/400), d; - d = hypot(Pnt[p1].x-Pnt[p2].x, Pnt[p1].y-Pnt[p2].y); - - mglDrawReg dd; dd.set(this,dr_x,dr_y,dr_p); - dd.PDef = PDef; dd.pPos = pPos; dd.PenWidth=pw; - + mreal pw = fabs(PenWidth)*sqrt(font_factor/400); if(TernAxis&4) for(int i=0;i<4;i++) { p1 = ProjScale(i, pp1); p2 = ProjScale(i, pp2); MGL_LINE_PLOT } else { MGL_LINE_PLOT } + register mreal d = hypot(Pnt[p1].x-Pnt[p2].x, Pnt[p1].y-Pnt[p2].y); pPos = fmod(pPos+d/pw/1.5, 16); } //----------------------------------------------------------------------------- -#define MGL_TRIG_PLOT if(Quality&MGL_DRAW_LMEM) trig_draw(Pnt[p1],Pnt[p2],Pnt[p3],true,&d);else \ - { mglPrim a(2); a.n1 = p1; a.n2 = p2; a.n3 = p3; \ +#define MGL_TRIG_PLOT if(Quality&MGL_DRAW_LMEM) \ + { mglDrawReg d; d.set(this,dr_x,dr_y,dr_p); d.PenWidth=pw; \ + trig_draw(Pnt[p1],Pnt[p2],Pnt[p3],true,&d); }\ + else{ mglPrim a(2); a.n1 = p1; a.n2 = p2; a.n3 = p3; \ a.m=mask; a.angl=MaskAn; a.w = pw; add_prim(a);} void mglCanvas::trig_plot(long p1, long p2, long p3) { if(p1<0 || p2<0 || p3<0 || mgl_isnan(Pnt[p1].x) || mgl_isnan(Pnt[p2].x) || mgl_isnan(Pnt[p3].x)) return; long pp1=p1,pp2=p2,pp3=p3; mreal pw = fabs(PenWidth)*sqrt(font_factor/400); - mglDrawReg d; d.set(this,dr_x,dr_y,dr_p); d.PenWidth=pw; if(TernAxis&4) for(int i=0;i<4;i++) { p1 = ProjScale(i, pp1); p2 = ProjScale(i, pp2); p3 = ProjScale(i, pp3); MGL_TRIG_PLOT } else { MGL_TRIG_PLOT } } //----------------------------------------------------------------------------- -#define MGL_QUAD_PLOT if(Quality&MGL_DRAW_LMEM) quad_draw(Pnt[p1],Pnt[p2],Pnt[p3],Pnt[p4],&d);else \ - { mglPrim a(3); a.n1 = p1; a.n2 = p2; a.n3 = p3; a.n4 = p4; \ +#define MGL_QUAD_PLOT if(Quality&MGL_DRAW_LMEM) \ + { mglDrawReg d; d.set(this,dr_x,dr_y,dr_p); d.PenWidth=pw; \ + quad_draw(Pnt[p1],Pnt[p2],Pnt[p3],Pnt[p4],&d); }\ + else{ mglPrim a(3); a.n1 = p1; a.n2 = p2; a.n3 = p3; a.n4 = p4; \ a.m=mask; a.angl=MaskAn; a.w = pw; add_prim(a); } void mglCanvas::quad_plot(long p1, long p2, long p3, long p4) { @@ -368,7 +406,6 @@ void mglCanvas::quad_plot(long p1, long p2, long p3, long p4) if(p4<0 || mgl_isnan(Pnt[p4].x)) { trig_plot(p1,p2,p3); return; } long pp1=p1,pp2=p2,pp3=p3,pp4=p4; mreal pw = fabs(PenWidth)*sqrt(font_factor/400); - mglDrawReg d; d.set(this,dr_x,dr_y,dr_p); d.PenWidth=pw; if(TernAxis&4) for(int i=0;i<4;i++) { p1 = ProjScale(i, pp1); p2 = ProjScale(i, pp2); p3 = ProjScale(i, pp3); p4 = ProjScale(i, pp4); @@ -387,7 +424,7 @@ mreal mglCanvas::text_plot(long p,const wchar_t *text,const char *font,mreal siz mreal res; TernAxis = TernAxis&(~4); for(int i=0;i<4;i++) - res = text_plot(ProjScale(i,p,true),text,font,size/2,sh,col); + res = text_plot(ProjScale(i,p,true),text,font,size/2,sh,col,rot); TernAxis = TernAxis|4; return res; } @@ -395,8 +432,8 @@ mreal mglCanvas::text_plot(long p,const wchar_t *text,const char *font,mreal siz mglPnt q=Pnt[p]; mreal ll = q.u*q.u+q.v*q.v; bool inv=false; - if(rot && (q.u<0 || (q.u==0 && q.v<0))) - { q.u=-q.u; q.v=-q.v; q.w=-q.w; inv=true; } +// if(rot && (q.u<0 || (q.u==0 && q.v<0))) // NOTE this is 1st part of rotation changes (see also GetGlyphPhi()) +// { q.u=-q.u; q.v=-q.v; q.w=-q.w; inv=true; } mreal fsize=size/6.5*font_factor, h = fnt->Height(font)*fsize, w, shift = -(sh+0.02)*h; // text drawing itself @@ -412,9 +449,17 @@ pthread_mutex_lock(&mutexPtx); shift += 0.015*h; // Correction for glyph rotation around proper point // shift *= h; - int align; - char cc = mglGetStyle(font,0,&align); align = align&3; - if(cc) col = -cc; + int align; + mreal col1=col, col2=col; + if(mglGetStyle(font,0,&align)) + { + col1 = AddTexture(font); + col2 = col1+1/MGL_FEPSILON; + } + else if(col<0) + col1 = col2 = AddTexture(char(0.5-col)); + align = align&3; + Bt.x = q.x; Bt.y = q.y - shift; Bt.z = q.z; if(ll>0) { @@ -429,10 +474,7 @@ pthread_mutex_lock(&mutexPtx); if(!(Quality&MGL_DRAW_LMEM)) // add text itself { - char ch = mglGetStyle(font,0,0); - mglColor mc(ch); - if(!ch) mc = col<0 ? mglColor(char(0.5-col)):Txt[long(col)].GetC(col); - + mglColor mc = Txt[long(col1)].GetC(col1); mglPrim a(6); a.n1 = p; a.n2 = int(255*mc.r) + 256*(int(255*mc.g) + 256*int(255*mc.b)); mglText txt(text,font); @@ -441,9 +483,8 @@ pthread_mutex_lock(&mutexPtx); add_prim(a); } - col = col<0 ? AddTexture(char(0.5-col)):col; - q.c=col; q.t=0; Txt[long(col)].GetC(col,0,q); - q.u = q.v = NAN; + q.c=col1; q.t=0; Txt[long(col1)].GetC(col1,0,q); + q.u = q.v = NAN; q.a=q.t=q.ta=1; memset(Bt.b,0,9*sizeof(mreal)); Bt.b[0] = Bt.b[4] = Bt.b[8] = fscl; register mreal opf = Bt.pf; @@ -452,7 +493,6 @@ pthread_mutex_lock(&mutexPtx); { long k1,k2,k3,k4; mglPnt pt; mglPoint pp; w = fnt->Width(text,font); h = fnt->Height(font); -// int align; mglGetStyle(font,0,&align); align = align&3; mreal d=-w*align/2.-h*0.2; w+=h*0.4; pt = q; pp = mglPoint(d,-h*0.4); PostScale(&Bt,pp); pt.x=pt.xx=pp.x; pt.y=pt.yy=pp.y; @@ -477,7 +517,9 @@ pthread_mutex_lock(&mutexPtx); k3 = CopyNtoC(k3,bl); k4 = CopyNtoC(k4,bl); quad_plot(k1,k2,k3,k4); } - fsize *= fnt->Puts(text,font,col)/2; + const char *ffont = font; + while(*ffont && *ffont!=':') ffont++; + fsize *= fnt->Puts(text,ffont,col1,col2)/2; } #if MGL_HAVE_PTHREAD pthread_mutex_unlock(&mutexPtx); @@ -497,10 +539,12 @@ void mglCanvas::Glyph(mreal x, mreal y, mreal f, int s, long j, mreal col) a.n2 = forg; a.n3 = s; a.n4 = AddGlyph(s,j); if(a.n1<0) return; - mglDrawReg d; d.set(this,dr_x,dr_y,dr_p); - d.PDef = s; d.pPos = a.s; d.PenWidth=a.w; - - if(Quality&MGL_DRAW_LMEM) glyph_draw(a,&d); + if(Quality&MGL_DRAW_LMEM) + { + mglDrawReg d; d.set(this,dr_x,dr_y,dr_p); + d.PDef = s; d.pPos = a.s; d.PenWidth=a.w; + glyph_draw(a,&d); + } else add_prim(a); } //----------------------------------------------------------------------------- @@ -681,15 +725,14 @@ int mglCanvas::GetSplId(long x,long y) const return id; } //----------------------------------------------------------------------------- -#define islog(a, b) (((a)>0 && (b)>10*(a)) || ((b)<0 && (a)<10*(b))) void mglCanvas::Aspect(mreal Ax,mreal Ay,mreal Az) { if(mgl_isnan(Ax)) { mreal dy = (Max.y-Min.y), dx = (Max.x-Min.x), dz = (Max.z-Min.z); - if(islog(Min.x,Max.x) && fx) dx = log10(Max.x/Min.x); - if(islog(Min.y,Max.y) && fy) dy = log10(Max.y/Min.y); - if(islog(Min.z,Max.z) && fz) dz = log10(Max.z/Min.z); + if(mgl_islog(Min.x,Max.x) && fx) dx = log10(Max.x/Min.x); + if(mgl_islog(Min.y,Max.y) && fy) dy = log10(Max.y/Min.y); + if(mgl_islog(Min.z,Max.z) && fz) dz = log10(Max.z/Min.z); mreal fy=exp(M_LN10*floor(0.5+log10(fabs(dy/dx)))); mreal fz=exp(M_LN10*floor(0.5+log10(fabs(dz/dx)))); if(Ay>0) fy*=Ay; @@ -725,7 +768,7 @@ void mglCanvas::AddLight(int n, mglPoint r, mglPoint d, char col, mreal br, mrea //----------------------------------------------------------------------------- void mglCanvas::arrow_plot(long n1, long n2, char st) { - if(n1<0 || n2<0 || !strchr("AVKSDTIO",st)) return; + if(n1<0 || n2<0 || !strchr("AVKSDTIOX",st)) return; float ll = PenWidth*ArrowSize*0.35*font_factor; uint64_t m=mask; int ma=MaskAn; ResetMask(); @@ -736,6 +779,74 @@ void mglCanvas::arrow_plot(long n1, long n2, char st) mask=m; MaskAn=ma; } //----------------------------------------------------------------------------- +std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt) +{ + char se[64], sf[64], ff[8]="%.3f", ee[8]="%.3e"; + int dig=3; + for(const char *s="0123456789";*s;s++) if(mglchr(fmt,*s)) dig = *s-'0'; + if(mglchr(fmt,'E')) ee[3] = 'E'; + bool plus = mglchr(fmt,'+'); + bool tex = mglchr(fmt,'F'); + int fdig = int(log10(v)); fdig = fdig>0?(fdig=lf-fdig && sf[i]=='0';i--) sf[i]=0; + if(sf[i]=='.') sf[i]=0; lf = strlen(sf); + // parse -nan numbers + if(!strcmp(sf,"-nan")) memcpy(sf,"nan",4); + + + // clear exp format + int st = se[0]=='-'?1:0; + if(plus || se[3+st+dig]=='-') // first remove zeros after 'e' + { + for(i=(dig>0?4:3)+st+dig;i0?4:3)+st+dig,se+i,le-i+1); + } + else + { + for(i=(dig>0?3:2)+st+dig;i0?3:2)+st+dig,se+i,le-i+1); + } + le=strlen(se); + // don't allow '+' at the end + if(se[le-1]=='+') se[--le]=0; + // remove single 'e' + if(se[le-1]=='e' || se[le-1]=='E') se[--le]=0; + for(i=1+st+dig;i>st && se[i]=='0';i--); // remove final '0' + if(se[i]=='.') i--; + memmove(se+i+1,se+2+st+dig,le-dig); le=strlen(se); + // add '+' sign if required + if(plus && !strchr("-0niNI",se[0])) + { memmove(se+1,se,le+1); se[0]='+'; + memmove(sf+1,sf,lf+1); sf[0]='+'; } + if((lf>le && !mglchr(fmt,'f')) || !strcmp(sf,"0") || !strcmp(sf,"-0")) strcpy(sf,se); lf = strlen(sf); + std::wstring res; res.reserve(lf+8); + + if(mglchr(fmt,'-') && !(plus||tex)) // replace '-' by "\minus" + for(i=0;i "\cdot 10^{...}" + { + if(res[0]=='1' && (res[1]=='e' || res[1]=='E')) + { res.replace(0,2,L"10^{"); res += L'}'; } + else if(wcschr(L"+-−",res[0]) && res[1]=='1' && (res[2]=='e' || res[2]=='E')) + { res.replace(1,2,L"10^{"); res += L'}'; } + else + { + size_t p; + for(p=1;p &leg, mreal x, mreal y, const char *font, const char *opt) { long n=leg.size(); @@ -750,7 +861,8 @@ void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const // setup font and parse absolute coordinates if(!font) font="#"; char *pA, *ff = new char[strlen(font)+3]; - strcpy(ff,font); strcat(ff,":L"); Push(); + const char *fmt = strchr(font,':'); + strcpy(ff,fmt?fmt:""); strcat(ff,":L"); Push(); if((pA=strchr(ff,'A'))) { *pA = ' '; InPlot(0,1,0,1,false); iw=B1.b[0]; ih=B1.b[4]; } else { iw=B1.b[0]/B1.pf; ih=B1.b[4]/B1.pf; } @@ -785,29 +897,28 @@ void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const } x += B.x-iw/2+dx; y += B.y-ih/2+dy; // draw it - long k1=0,k2=0,k3=0,k4=0; mglPoint p,q=mglPoint(NAN,NAN,NAN); - for(i=0;ff[i] && ff[i]!=':';i++) if(strchr(MGL_COLORS,ff[i])) + mreal cc = AddTexture(font); + mreal c1,c2; //=AddTexture(char(k1?k1:'w')), c2=AddTexture(char(k2?k2:'k')); + if(cc<2 || Txt[long(cc+0.5)].n==0) + { c1 = AddTexture('w'); cc = c2 = AddTexture('k'); } + else switch(Txt[long(cc+0.5)].n) { - - if(k1 && k2) { k3=ff[i]; k4++; } // NOTE: keep k3 for future usage - if(k1 && !k2) { k2=ff[i]; k4++; } - if(!k1) { k1=ff[i]; k4++; } - } - if(k4==2) k2=0; - if(k4==1) k1=k2=0; - mreal c1=AddTexture(char(k1?k1:'w')), c2=AddTexture(char(k2?k2:'k')); - if((Flag&3)==2) { mreal cc=c1; c2=c1; c1=cc; } + case 1: c1 = AddTexture('w'); c2 = AddTexture('k'); break; + case 2: c1 = cc; cc+=1/MGL_FEPSILON; c2 = AddTexture('k'); break; + default: c1 = cc; c2 = cc+0.5; cc += 1/MGL_FEPSILON; break; + } + if((Flag&3)==2) { mreal tt=c1; c2=c1; c1=tt; } mglMatrix M=B; M.norot=true; - if(strchr(ff,'#')) // draw bounding box + if(strchr(font,'#')) // draw bounding box { SetPenPal("k-"); - k1=AddPnt(&M,mglPoint(x,y,Depth/MGL_FEPSILON),c1,q,-1,0); - k2=AddPnt(&M,mglPoint(x+w*ncol,y,Depth/MGL_FEPSILON),c1,q,-1,0); - k3=AddPnt(&M,mglPoint(x,y+h*nrow,Depth/MGL_FEPSILON),c1,q,-1,0); - k4=AddPnt(&M,mglPoint(x+w*ncol,y+h*nrow,Depth/MGL_FEPSILON),c1,q,-1,0); + long k1=AddPnt(&M,mglPoint(x,y,Depth/MGL_FEPSILON),c1,q,1,0); + long k2=AddPnt(&M,mglPoint(x+w*ncol,y,Depth/MGL_FEPSILON),c1,q,1,0); + long k3=AddPnt(&M,mglPoint(x,y+h*nrow,Depth/MGL_FEPSILON),c1,q,1,0); + long k4=AddPnt(&M,mglPoint(x+w*ncol,y+h*nrow,Depth/MGL_FEPSILON),c1,q,1,0); quad_plot(k1,k2,k3,k4); k1=CopyNtoC(k1,c2); k2=CopyNtoC(k2,c2); k3=CopyNtoC(k3,c2); k4=CopyNtoC(k4,c2); @@ -818,8 +929,8 @@ void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const { register long iy=nrow-(i%nrow)-1,ix=i/nrow; char m=SetPenPal(leg[i].stl.c_str()); - k1=AddPnt(&M,mglPoint(x+ix*w+0.1*ll,y+iy*h+0.45*h,Depth),CDef,q,-1,0); - k2=AddPnt(&M,mglPoint(x+ix*w+0.9*ll,y+iy*h+0.45*h,Depth),CDef,q,-1,0); pPos=0; + long k1=AddPnt(&M,mglPoint(x+ix*w+0.1*ll,y+iy*h+0.45*h,Depth),CDef,q,-1,0); + long k2=AddPnt(&M,mglPoint(x+ix*w+0.9*ll,y+iy*h+0.45*h,Depth),CDef,q,-1,0); pPos=0; if(!leg[i].stl.empty()) line_plot(k1,k2); if(m) for(j=0;j &leg, mreal x, mreal y, const mark_plot(AddPnt(&M,p,CDef,q,-1,0),m); } p = mglPoint(x+ix*w+((!leg[i].stl.empty())?ll:0.01*iw), y+iy*h+0.15*h, Depth); - text_plot(AddPnt(&M,p,-1,q,-1,0), leg[i].text.c_str(), ff, size); + text_plot(AddPnt(&M,p,-1,q,-1,0), leg[i].text.c_str(), ff, size,0,cc); } Pop(); EndGroup(); delete []ff; } @@ -845,20 +956,19 @@ void mglCanvas::Table(mreal x, mreal y, HCDT val, const wchar_t *text, const cha if(x<0) x=0; if(y<0) y=0; if(y>1) y=1; // if(vw>1-x) vw=1-x; - wchar_t *buf = new wchar_t[m*32], sng[32]; + char fmt[8]="3",ss[2]=" "; + for(const char *s="0123456789";*s;s++) if(mglchr(frm,*s)) fmt[0]=*s; + for(const char *s="f+E-F";*s;s++) if(mglchr(frm,*s)) + { ss[0] = *s; strcat(fmt,ss); } std::vector str; for(i=0;iv(i,j)); - wcscat(buf,sng); - } - mglprintf(sng,32,L"%.3g",val->v(i,m-1)); - wcscat(buf,sng); str.push_back(buf); + buf += mgl_ftoa(val->v(i,j),fmt)+L'\n'; + buf += mgl_ftoa(val->v(i,m-1),fmt); + str.push_back(buf); } - delete []buf; mreal sp=2*TextWidth(" ",frm,-1), w=*text ? sp+TextWidth(text,frm,-1):0, w1=0, ww, h; for(i=0;i0 ? size/FontSize:-size, h=TextHeight(stl,size)*s/2; if(h>=inH) { SetWarn(mglWarnSpc,"Title"); return; } static int cgid=1; StartGroup("Title",cgid++); - bool box=mglchr(stl,'#'); int align; - char col = mglGetStyle(stl,0,&align); align = align&3; - if(col==0) col = 'k'; + bool box=mglchr(stl,'#'), col = mglGetStyle(stl,0,&align); + align = align&3; mreal y=inY+inH-h; mglPoint p(inX + inW*align/2.,y,3*Depth),q(NAN,NAN,NAN); mglMatrix M=B; M.norot=true; if(title) text_plot(AddPnt(&M,p,-1,q,-1,0),title,stl,size); if(box) // draw boungind box { - mreal c1=AddTexture('w'), c2=AddTexture(col); - if((Flag&3)==2) { mreal cc=c1; c2=c1; c1=cc; } + mreal c1=AddTexture('w'), c2=col?AddTexture(stl):AddTexture('k'); + if((Flag&3)==2 && !col) { mreal cc=c1; c2=c1; c1=cc; } + else if((Flag&3)==2) c1=AddTexture('k'); long k1,k2,k3,k4; k1=AddPnt(&M,mglPoint(inX,y-h*0.4,3*Depth),c1,q,-1,0); k2=AddPnt(&M,mglPoint(inX+inW,y-h*0.4,3*Depth),c1,q,-1,0); @@ -981,8 +1091,8 @@ void mglCanvas::EndGroup() LoadState(); if(Quality&MGL_DRAW_LMEM) { - Pnt.clear(); Prm.clear(); Ptx.clear(); - Glf.clear(); Act.clear(); Grp.clear(); + Pnt.clear(); Prm.clear(); Ptx.clear(); ClearPrmInd(); + Glf.clear(); Act.clear(); Grp.clear(); } if(grp_counter>0) grp_counter--; } diff --git a/src/canvas_cf.cpp b/src/canvas_cf.cpp index 7cc3a29..07ef15d 100644 --- a/src/canvas_cf.cpp +++ b/src/canvas_cf.cpp @@ -29,6 +29,8 @@ MGL_EXPORT const unsigned char *mgl_get_rgb(HMGL gr) { mglCanvas *g = dynamic_cast(gr); return g?g->GetBits():0; } MGL_EXPORT const unsigned char *mgl_get_rgba(HMGL gr) { mglCanvas *g = dynamic_cast(gr); return g?g->GetRGBA():0; } +MGL_EXPORT const unsigned char* mgl_get_background(HMGL gr) +{ mglCanvas *g = dynamic_cast(gr); return g?g->GetBackground():0; } int MGL_EXPORT mgl_get_width(HMGL gr) { mglCanvas *g = dynamic_cast(gr); return g?g->GetWidth():0; } int MGL_EXPORT mgl_get_height(HMGL gr) @@ -41,12 +43,12 @@ void MGL_EXPORT mgl_calc_scr(HMGL gr, double x, double y, double z, int *xs, int { mglCanvas *g = dynamic_cast(gr); if(g) g->CalcScr(mglPoint(x,y,z),xs,ys); } void MGL_EXPORT mgl_set_obj_id(HMGL gr, int id) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetObjId(id); } -int MGL_EXPORT mgl_get_obj_id(HMGL gr, int x, int y) +int MGL_EXPORT_PURE mgl_get_obj_id(HMGL gr, int x, int y) { mglCanvas *g = dynamic_cast(gr); return g?g->GetObjId(x,y):-1; } -int MGL_EXPORT mgl_get_spl_id(HMGL gr, int x, int y) +int MGL_EXPORT_PURE mgl_get_spl_id(HMGL gr, int x, int y) { mglCanvas *g = dynamic_cast(gr); return g?g->GetSplId(x,y):-1; } //----------------------------------------------------------------------------- -long MGL_EXPORT mgl_is_active(HMGL gr, int xs, int ys, int d) +long MGL_EXPORT_PURE mgl_is_active(HMGL gr, int xs, int ys, int d) { if(d<=0) d=1; for(size_t i=0;iAct.size();i++) @@ -56,14 +58,14 @@ long MGL_EXPORT mgl_is_active(HMGL gr, int xs, int ys, int d) } return -1; } -long MGL_EXPORT mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d) +long MGL_EXPORT_PURE mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d) { return mgl_is_active(_GR_, *xs, *ys, *d); } //----------------------------------------------------------------------------- int MGL_EXPORT mgl_new_frame(HMGL gr) { mglCanvas *g = dynamic_cast(gr); return g?g->NewFrame():-1; } void MGL_EXPORT mgl_end_frame(HMGL gr) { mglCanvas *g = dynamic_cast(gr); if(g) g->EndFrame(); } -int MGL_EXPORT mgl_get_num_frame(HMGL gr) +int MGL_EXPORT_PURE mgl_get_num_frame(HMGL gr) { mglCanvas *g = dynamic_cast(gr); return g?g->GetNumFrame():0; } void MGL_EXPORT mgl_reset_frames(HMGL gr) { mglCanvas *g = dynamic_cast(gr); if(g) g->ResetFrames(); } @@ -75,6 +77,8 @@ void MGL_EXPORT mgl_show_frame(HMGL gr, int i) { mglCanvas *g = dynamic_cast(gr); if(g) g->ShowFrame(i); } void MGL_EXPORT mgl_del_frame(HMGL gr, int i) { mglCanvas *g = dynamic_cast(gr); if(g) g->DelFrame(i); } +void MGL_EXPORT mgl_clear_frame(HMGL gr) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->ClearFrame(); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_set_transp_type(HMGL gr, int type) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetTranspType(type); } @@ -103,6 +107,10 @@ void MGL_EXPORT mgl_clf_chr(HMGL gr, char ch) { mglCanvas *g = dynamic_cast(gr); if(g) g->Clf(mglColor(ch)); } void MGL_EXPORT mgl_clf_rgb(HMGL gr, double r, double g, double b) { mglCanvas *gg = dynamic_cast(gr); if(gg) gg->Clf(mglColor(r,g,b)); } +void MGL_EXPORT mgl_clf_str(HMGL gr, const char *col) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->Clf(col); } +void MGL_EXPORT mgl_load_background(HMGL gr, const char *fn, double alpha) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->LoadBackground(fn,alpha); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_subplot_d(HMGL gr, int nx,int ny,int m,const char *style,double dx,double dy) { @@ -139,7 +147,7 @@ void MGL_EXPORT mgl_columnplot(HMGL gr, int num, int i, double dd) { register double w = 1./num; mglCanvas *g = dynamic_cast(gr); - if(g) g->InPlot(0,1,1-w*(i+1-dd),1-i*w,true); + if(g) g->InPlot(0,1,1-w*(i+1-dd/2),1-(i+dd/2)*w,true); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_gridplot(HMGL gr, int nx, int ny, int i, double dd) @@ -147,10 +155,8 @@ void MGL_EXPORT mgl_gridplot(HMGL gr, int nx, int ny, int i, double dd) register int ix=i%nx, iy=i/nx; register double wx = 1./nx, wy = 1./ny; mglCanvas *g = dynamic_cast(gr); - if(g) g->InPlot(ix*wx,wx*(ix+1-dd),1-wy*(iy+1-dd),1-iy*wy,true); + if(g) g->InPlot((ix+dd/2)*wx,wx*(ix+1-dd/2),1-wy*(iy+1-dd/2),1-(iy+dd/2)*wy,true); } -void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d) -{ mgl_gridplot(_GR_,*nx,*ny,*m,*d); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int i, double tet, double phi) { mglCanvas *g = dynamic_cast(gr); if(g) g->StickPlot(num, i, tet, phi); } @@ -167,19 +173,22 @@ void MGL_EXPORT mgl_rotate_vector(HMGL gr, double Tet,double x,double y,double z { mglCanvas *g = dynamic_cast(gr); if(g) g->RotateN(Tet,x,y,z); } void MGL_EXPORT mgl_perspective(HMGL gr, double val) { mglCanvas *g = dynamic_cast(gr); if(g) g->Perspective(val); } +void MGL_EXPORT mgl_ask_perspective(HMGL gr, double val) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->Perspective(val,false); } void MGL_EXPORT mgl_title(HMGL gr, const char *title, const char *stl, double size) { mglCanvas *g = dynamic_cast(gr); if(g) g->Title(title,stl,size); } void MGL_EXPORT mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, double size) { mglCanvas *g = dynamic_cast(gr); if(g) g->Title(title,stl,size); } //----------------------------------------------------------------------------- -int MGL_EXPORT mgl_new_frame_(uintptr_t *gr) { return _GR_->NewFrame(); } -void MGL_EXPORT mgl_end_frame_(uintptr_t *gr) { _GR_->EndFrame(); } -int MGL_EXPORT mgl_get_num_frame_(uintptr_t *gr) { return _GR_->GetNumFrame(); } +int MGL_EXPORT mgl_new_frame_(uintptr_t *gr) { return _GR_->NewFrame(); } +void MGL_EXPORT mgl_end_frame_(uintptr_t *gr) { _GR_->EndFrame(); } +int MGL_EXPORT_PURE mgl_get_num_frame_(uintptr_t *gr) { return _GR_->GetNumFrame(); } void MGL_EXPORT mgl_reset_frames_(uintptr_t *gr) { _GR_->ResetFrames(); } void MGL_EXPORT mgl_get_frame_(uintptr_t *gr, int *i) { _GR_->GetFrame(*i); } void MGL_EXPORT mgl_set_frame_(uintptr_t *gr, int *i) { _GR_->SetFrame(*i); } -void MGL_EXPORT mgl_show_frame_(uintptr_t *gr, int *i) { _GR_->ShowFrame(*i); } +void MGL_EXPORT mgl_show_frame_(uintptr_t *gr, int *i) { _GR_->ShowFrame(*i);} void MGL_EXPORT mgl_del_frame_(uintptr_t *gr, int *i) { _GR_->DelFrame(*i); } +void MGL_EXPORT mgl_clear_frame_(uintptr_t *gr) { _GR_->ClearFrame(); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_set_transp_type_(uintptr_t *gr, int *type) { _GR_->SetTranspType(*type); } void MGL_EXPORT mgl_set_alpha_(uintptr_t *gr, int *enable) { _GR_->Alpha(*enable); } @@ -196,12 +205,17 @@ void MGL_EXPORT mgl_add_light_loc_(uintptr_t *gr, int *n, mreal *x, mreal *y, mr //----------------------------------------------------------------------------- void MGL_EXPORT mgl_mat_push_(uintptr_t *gr) { _GR_->Push(); } void MGL_EXPORT mgl_mat_pop_(uintptr_t *gr) { _GR_->Pop(); } -void MGL_EXPORT mgl_clf_(uintptr_t *gr) -{ _GR_->Clf(); } +void MGL_EXPORT mgl_clf_(uintptr_t *gr) { _GR_->Clf(); } void MGL_EXPORT mgl_clf_chr_(uintptr_t *gr, const char *ch, int) { _GR_->Clf(mglColor(*ch)); } void MGL_EXPORT mgl_clf_rgb_(uintptr_t *gr, mreal *r, mreal *g, mreal *b) { _GR_->Clf(mglColor(*r,*g,*b)); } +void MGL_EXPORT mgl_clf_str_(uintptr_t *gr, const char *col, int l) +{ char *s=new char[l+1]; memcpy(s,col,l); s[l]=0; + mgl_clf_str(_GR_,s); delete []s; } +void MGL_EXPORT mgl_load_background_(uintptr_t *gr, const char *fn, mreal *a, int l) +{ char *s=new char[l+1]; memcpy(s,fn,l); s[l]=0; + mgl_load_background(_GR_,s,*a); delete []s; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_subplot_d_(uintptr_t *gr, int *nx,int *ny,int *m,const char *st, mreal *dx, mreal *dy,int l) { char *s=new char[l+1]; memcpy(s,st,l); s[l]=0; @@ -218,7 +232,7 @@ void MGL_EXPORT mgl_relplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mre { _GR_->InPlot(*x1,*x2,*y1,*y2,true); } void MGL_EXPORT mgl_columnplot_(uintptr_t *gr, int *num, int *i, mreal *d) { mgl_columnplot(_GR_,*num,*i,*d); } -void MGL_EXPORT mgl_columnplot_d_(uintptr_t *gr, int *nx, int *ny, int *i, mreal *d) +void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *i, mreal *d) { mgl_gridplot(_GR_,*nx,*ny,*i,*d); } void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi) { _GR_->StickPlot(*num, *i, *tet, *phi); } @@ -237,11 +251,14 @@ void MGL_EXPORT mgl_zoom_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *x2, mreal { _GR_->Zoom(*x1,*y1,*x2,*y2); } void MGL_EXPORT mgl_rotate_vector_(uintptr_t *gr, mreal *Tet, mreal *x, mreal *y, mreal *z) { _GR_->RotateN(*Tet,*x,*y,*z); } -void MGL_EXPORT mgl_perspective_(uintptr_t *gr, double val) -{ _GR_->Perspective(val); } +void MGL_EXPORT mgl_perspective_(uintptr_t *gr, mreal *val) +{ _GR_->Perspective(*val); } +void MGL_EXPORT mgl_ask_perspective_(uintptr_t *gr, mreal *val) +{ mgl_ask_perspective(_GR_,*val); } //----------------------------------------------------------------------------- MGL_EXPORT const unsigned char *mgl_get_rgb_(uintptr_t *gr) { return gr ? _GR_->GetBits():0; } MGL_EXPORT const unsigned char *mgl_get_rgba_(uintptr_t *gr){ return gr ? _GR_->GetRGBA():0; } +MGL_EXPORT const unsigned char* mgl_get_background_(uintptr_t* gr) { return gr ? _GR_->GetBackground():0; } int MGL_EXPORT mgl_get_width_(uintptr_t *gr) { return gr ? _GR_->GetWidth():0; } int MGL_EXPORT mgl_get_height_(uintptr_t *gr) { return gr ? _GR_->GetHeight():0;} void MGL_EXPORT mgl_calc_xyz_(uintptr_t *gr, int *xs, int *ys, mreal *x, mreal *y, mreal *z) @@ -249,8 +266,8 @@ void MGL_EXPORT mgl_calc_xyz_(uintptr_t *gr, int *xs, int *ys, mreal *x, mreal * void MGL_EXPORT mgl_calc_scr_(uintptr_t *gr, mreal *x, mreal *y, mreal *z, int *xs, int *ys) { _GR_->CalcScr(mglPoint(*x,*y,*z),xs,ys); } void MGL_EXPORT mgl_set_obj_id_(uintptr_t *gr, int *id) { _GR_->SetObjId(*id); } -int MGL_EXPORT mgl_get_obj_id_(uintptr_t *gr, int *x, int *y) { return _GR_->GetObjId(*x,*y); } -int MGL_EXPORT mgl_get_spl_id_(uintptr_t *gr, int *x, int *y) { return _GR_->GetSplId(*x,*y); } +int MGL_EXPORT_PURE mgl_get_obj_id_(uintptr_t *gr, int *x, int *y) { return _GR_->GetObjId(*x,*y); } +int MGL_EXPORT_PURE mgl_get_spl_id_(uintptr_t *gr, int *x, int *y) { return _GR_->GetSplId(*x,*y); } //----------------------------------------------------------------------------- HMGL MGL_EXPORT mgl_create_graph(int width, int height) { return new mglCanvas(width,height); } @@ -270,9 +287,15 @@ void MGL_EXPORT mgl_set_axis_stl(HMGL gr, const char *stl, const char *tck, cons void MGL_EXPORT mgl_tune_ticks(HMGL gr, int tune, double pos) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetTuneTicks(tune,pos); } void MGL_EXPORT mgl_adjust_ticks(HMGL gr, const char *dir) -{ mglCanvas *g = dynamic_cast(gr); if(g) g->AdjustTicks(dir,true); } +{ mgl_adjust_ticks_ext(gr,dir,""); } +void MGL_EXPORT mgl_adjust_ticks_ext(HMGL gr, const char *dir, const char *stl) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->AdjustTicks(dir,true,stl); } void MGL_EXPORT mgl_set_ticks(HMGL gr, char dir, double d, int ns, double org) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetTicks(dir,d,ns,org); } +void MGL_EXPORT mgl_set_ticks_factw(HMGL gr, char dir, double d, int ns, double org, const wchar_t *fact) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->SetTicks(dir,d,ns,org,fact); } +void MGL_EXPORT mgl_set_ticks_fact(HMGL gr, char dir, double d, int ns, double org, const char *fact) +{ MGL_TO_WCS(fact,mgl_set_ticks_factw(gr,dir,d,ns,org,wcs)); } void MGL_EXPORT mgl_set_ticks_str(HMGL gr, char dir, const char *lbl, int add) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetTicksVal(dir,lbl,add); } void MGL_EXPORT mgl_set_ticks_wcs(HMGL gr, char dir, const wchar_t *lbl, int add) @@ -281,6 +304,10 @@ void MGL_EXPORT mgl_set_ticks_val(HMGL gr, char dir, HCDT val, const char *lbl, { mglCanvas *g = dynamic_cast(gr); if(g) g->SetTicksVal(dir,val,lbl,add); } void MGL_EXPORT mgl_set_ticks_valw(HMGL gr, char dir, HCDT val, const wchar_t *lbl, int add) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetTicksVal(dir,val,lbl,add); } +void MGL_EXPORT mgl_add_tick(HMGL gr, char dir, double val, const char *lbl) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->AddTick(dir,val,lbl); } +void MGL_EXPORT mgl_add_tickw(HMGL gr, char dir, double val, const wchar_t *lbl) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->AddTick(dir,val,lbl); } void MGL_EXPORT mgl_set_tick_templ(HMGL gr, char dir, const char *templ) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetTickTempl(dir,templ); } void MGL_EXPORT mgl_set_tick_templw(HMGL gr, char dir, const wchar_t *templ) @@ -332,6 +359,9 @@ void MGL_EXPORT mgl_set_def_param_(uintptr_t *gr) { _GR_->DefaultPlotParam(); } void MGL_EXPORT mgl_combine_gr_(uintptr_t *gr, uintptr_t *in) { _GR_->Combine((mglCanvas *)in); } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_set_ticks_fact_(uintptr_t *gr, char *dir, double *d, int *ns, double *org, const char *fact,int,int l) +{ char *s=new char[l+1]; memcpy(s,fact,l); s[l]=0; + mgl_set_ticks_fact(_GR_,*dir,*d,*ns,*org,s); delete []s; } void MGL_EXPORT mgl_set_tick_len_(uintptr_t *gr, mreal *len, mreal *stt) { _GR_->SetTickLen(*len, *stt); } void MGL_EXPORT mgl_set_axis_stl_(uintptr_t *gr, const char *stl, const char *tck, const char *sub, int l,int m,int n) @@ -341,7 +371,11 @@ void MGL_EXPORT mgl_set_axis_stl_(uintptr_t *gr, const char *stl, const char *tc _GR_->SetAxisStl(a,t,s); delete []a; delete []s; delete []t; } void MGL_EXPORT mgl_adjust_ticks_(uintptr_t *gr, const char *dir, int l) { char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; - _GR_->AdjustTicks(s); delete []s; } + _GR_->AdjustTicks(s,true); delete []s; } +void MGL_EXPORT mgl_adjust_ticks_(uintptr_t *gr, const char *dir, const char *stl, int l, int m) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + char *f=new char[m+1]; memcpy(f,stl,m); f[m]=0; + _GR_->AdjustTicks(s,true,f); delete []s; delete []f; } void MGL_EXPORT mgl_set_ticks_(uintptr_t *gr, char *dir, mreal *d, int *ns, mreal *org, int) { _GR_->SetTicks(*dir, *d, *ns, *org); } void MGL_EXPORT mgl_set_ticks_str_(uintptr_t *gr, const char *dir, const char *lbl, int *add,int,int l) @@ -350,6 +384,9 @@ void MGL_EXPORT mgl_set_ticks_str_(uintptr_t *gr, const char *dir, const char *l void MGL_EXPORT mgl_set_ticks_val_(uintptr_t *gr, const char *dir, uintptr_t *val, const char *lbl, int *add,int,int l) { char *s=new char[l+1]; memcpy(s,lbl,l); s[l]=0; _GR_->SetTicksVal(*dir,_DA_(val),s,*add); delete []s; } +void MGL_EXPORT mgl_add_tick_(uintptr_t *gr, const char *dir, mreal *val, const char *lbl, int *add,int,int l) +{ char *s=new char[l+1]; memcpy(s,lbl,l); s[l]=0; + mgl_add_tick(_GR_,*dir,*val,s); delete []s; } void MGL_EXPORT mgl_tune_ticks_(uintptr_t *gr, int *tune, mreal *fact_pos) { _GR_->SetTuneTicks(*tune, *fact_pos); } void MGL_EXPORT mgl_set_tick_templ_(uintptr_t *gr, const char *dir, const char *templ,int,int l) @@ -409,10 +446,10 @@ void MGL_EXPORT mgl_set_legend_marks_(uintptr_t *gr, int *num) //----------------------------------------------------------------------------- void MGL_EXPORT mgl_wnd_set_delay(HMGL gr, double dt) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetDelay(dt); } -double MGL_EXPORT mgl_wnd_get_delay(HMGL gr) +double MGL_EXPORT_PURE mgl_wnd_get_delay(HMGL gr) { mglCanvas *g = dynamic_cast(gr); return g?g->GetDelay():0; } void MGL_EXPORT mgl_wnd_set_delay_(uintptr_t *gr, mreal *dt) { _GR_->SetDelay(*dt); } -double MGL_EXPORT mgl_wnd_get_delay_(uintptr_t *gr) { return _GR_->GetDelay(); } +double MGL_EXPORT_PURE mgl_wnd_get_delay_(uintptr_t *gr) { return _GR_->GetDelay(); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_set_plotfactor(HMGL gr, double val) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetPlotFactor(val); } @@ -435,3 +472,7 @@ void MGL_EXPORT mgl_finish(HMGL gr) { mglCanvas *g = dynamic_cast(gr); if(g) g->Finish(); } void MGL_EXPORT mgl_finish_(uintptr_t *gr) { _GR_->Finish(); } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_rasterize(HMGL gr) +{ mglCanvas *g = dynamic_cast(gr); if(g) g->Rasterize(); } +void MGL_EXPORT mgl_rasterize_(uintptr_t *gr) { _GR_->Rasterize(); } +//----------------------------------------------------------------------------- diff --git a/src/complex.cpp b/src/complex.cpp index 8b43c3c..46f77bb 100644 --- a/src/complex.cpp +++ b/src/complex.cpp @@ -85,7 +85,11 @@ void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, dual *a, const vo } } //----------------------------------------------------------------------------- -dual MGL_EXPORT mgl_expi(dual a) { return exp(dual(0,1)*a); } +mdual MGL_EXPORT_CONST mgl_expi(dual a) +{ + dual r = exp(dual(0,1)*dual(a)); + return r.real()+r.imag()*_Complex_I; +} //----------------------------------------------------------------------------- MGL_NO_EXPORT void *mgl_csmth_x(void *par) { @@ -637,45 +641,49 @@ void MGL_EXPORT mgl_datac_mirror_(uintptr_t *d, const char *dir,int l) { char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; mgl_datac_mirror(_DC_,s); delete []s; } //----------------------------------------------------------------------------- -dual mglSpline3C(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,dual *dx, dual *dy, dual *dz) +dual MGL_EXPORT_PURE mglSpline3Cs(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) +{ return mglSpline3st(a,nx,ny,nz,x,y,z); } +//----------------------------------------------------------------------------- +dual MGL_EXPORT_PURE mglSpline3C(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,dual *dx, dual *dy, dual *dz) { return mglSpline3t(a,nx,ny,nz,x,y,z,dx,dy,dz); } //----------------------------------------------------------------------------- -dual mglLinearC(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) +dual MGL_EXPORT_PURE mglLinearC(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) { return mglLineart(a,nx,ny,nz,x,y,z); } //----------------------------------------------------------------------------- -dual MGL_EXPORT mgl_datac_spline(HCDT d, mreal x,mreal y,mreal z) +mdual MGL_EXPORT_PURE mgl_datac_spline(HCDT d, mreal x,mreal y,mreal z) { const mglDataC *dd=dynamic_cast(d); - if(!dd) return mgl_data_spline(d,x,y,z); - return dd->ny*dd->nz==1?mglSpline1st(dd->a,dd->nx,x):mglSpline3st(dd->a,dd->nx,dd->ny,dd->nz,x,y,z); + dual r = dd ? mglSpline3st(dd->a,dd->nx,dd->ny,dd->nz,x,y,z) : mgl_data_spline(d,x,y,z); + return r.real()+r.imag()*_Complex_I; } //----------------------------------------------------------------------------- -dual MGL_EXPORT mgl_datac_spline_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz) +mdual MGL_EXPORT_PURE mgl_datac_spline_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz) { const mglDataC *dd=dynamic_cast(d); if(!dd) { - mreal rx,ry,rz,res; + mreal rx=0,ry=0,rz=0,res; res=mgl_data_spline_ext(d,x,y,z,&rx,&ry,&rz); if(dx) *dx=rx; if(dy) *dy=ry; if(dz) *dz=rz; return res; } - return mglSpline3t(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz); + dual r = mglSpline3t(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz); + return r.real()+r.imag()*_Complex_I; } //----------------------------------------------------------------------------- -dual MGL_EXPORT mgl_datac_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +mdual MGL_EXPORT_PURE mgl_datac_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) { return mgl_datac_spline(_DA_(d),*x,*y,*z); } -dual MGL_EXPORT mgl_datac_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz) +mdual MGL_EXPORT_PURE mgl_datac_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz) { return mgl_datac_spline_ext(_DA_(d),*x,*y,*z,dx,dy,dz); } //----------------------------------------------------------------------------- -dual MGL_EXPORT mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz) +mdual MGL_EXPORT_PURE mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz) { long kx=long(x), ky=long(y), kz=long(z); dual b0,b1; const mglDataC *dd=dynamic_cast(d); if(!dd) { - mreal rx,ry,rz,res; + mreal rx=0,ry=0,rz=0,res; res=mgl_data_linear_ext(d,x,y,z,&rx,&ry,&rz); if(dx) *dx=rx; if(dy) *dy=ry; if(dz) *dz=rz; return res; @@ -710,15 +718,15 @@ dual MGL_EXPORT mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,d if(dx) *dx = kx>=0?aa[1]-aa[0]:0; if(dy) *dy = ky>=0?aa[dn]-aa[0]:0; if(dz) *dz = b1-b0; - - return b0 + z*(b1-b0); + dual r = b0 + z*(b1-b0); + return r.real()+r.imag()*_Complex_I; } -dual MGL_EXPORT mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z) +mdual MGL_EXPORT_PURE mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z) { return mgl_datac_linear_ext(d, x,y,z, 0,0,0); } //----------------------------------------------------------------------------- -dual MGL_EXPORT mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +mdual MGL_EXPORT_PURE mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) { return mgl_datac_linear(_DA_(d),*x,*y,*z); } -dual MGL_EXPORT mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz) +mdual MGL_EXPORT_PURE mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz) { return mgl_datac_linear_ext(_DA_(d),*x,*y,*z,dx,dy,dz); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_datac_crop(HADT d, long n1, long n2, char dir) @@ -801,7 +809,7 @@ void MGL_EXPORT mgl_datac_insert(HADT d, char dir, long at, long num) if(ata+nx*ny*at,(nz-at)*nx*ny*sizeof(dual)); #pragma omp parallel for for(long i=0;ia+nx*ny*at,nx*ny*sizeof(dual)); - d->Set(b); nz+=num; + d->Set(b); } } //----------------------------------------------------------------------------- @@ -840,7 +848,7 @@ void MGL_EXPORT mgl_datac_delete(HADT d, char dir, long at, long num) b.Create(nx,ny,nz-num); if(at>0) memcpy(b.a, d->a,at*nx*ny*sizeof(dual)); memcpy(b.a+nx*ny*at, d->a+nx*ny*(at+num),(nz-at-num)*nx*ny*sizeof(dual)); - d->Set(b); nz-=num; + d->Set(b); } } //----------------------------------------------------------------------------- @@ -857,17 +865,19 @@ void MGL_EXPORT mgl_datac_set_value(HADT dat, dual v, long i, long j, long k) void MGL_EXPORT mgl_datac_set_value_(uintptr_t *d, dual *v, int *i, int *j, int *k) { mgl_datac_set_value(_DC_,*v,*i,*j,*k); } //----------------------------------------------------------------------------- -dual MGL_EXPORT mgl_datac_get_value(HCDT dat, long i, long j, long k) +mdual MGL_EXPORT mgl_datac_get_value(HCDT dat, long i, long j, long k) { - if(i<0 || i>=dat->GetNx() || j<0 || j>=dat->GetNy() || k<0 || k>=dat->GetNz()) + register long nx=dat->GetNx(), ny=dat->GetNy(), i0=i+nx*(j+ny*k); + if(i<0 || i>=nx || j<0 || j>=ny || k<0 || k>=dat->GetNz()) return NAN; const mglDataC *d = dynamic_cast(dat); - return d ? d->a[i+d->nx*(j+d->nz*k)] : dual(dat->v(i,j,k),0); + dual r = d ? d->a[i0] : dual(dat->vthr(i0),0); + return r.real()+r.imag()*_Complex_I; } -dual MGL_EXPORT mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k) +mdual MGL_EXPORT mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k) { return mgl_datac_get_value(_DA_(d),*i,*j,*k); } //----------------------------------------------------------------------------- -MGL_EXPORT dual *mgl_datac_data(HADT dat) { return dat->a; } +MGL_EXPORT_PURE dual *mgl_datac_data(HADT dat) { return dat->a; } //----------------------------------------------------------------------------- MGL_EXPORT dual *mgl_datac_value(HADT dat, long i,long j,long k) { register long ii=i*dat->nx*(j+dat->ny*k); @@ -1123,3 +1133,55 @@ void MGL_EXPORT mgl_datac_diffr_(uintptr_t *d, const char *how, double q,int l) { char *s=new char[l+1]; memcpy(s,how,l); s[l]=0; mgl_datac_diffr(_DC_,s,q); delete []s; } //----------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_gsplinec_init(HCDT x, HCDT v) +{ + long n = v->GetNx(); + if(!x || x->GetNx()!=n) return 0; + mglDataC *res = new mglDataC(5*(n-1)); + mreal *xx=0; + dual *vv=0; + const mglData *dx = dynamic_cast(x); + if(!dx) + { + xx = new mreal[n]; + for(long i=0;iv(i); + } + const mglDataC *dv = dynamic_cast(v); + if(!dv) + { + vv = new dual[n]; + for(long i=0;iv(i); + } + mgl_gspline_init(n,dx?dx->a:xx,dv?dv->a:vv,res->a); + if(xx) delete []xx; + if(vv) delete []vv; + return res; +} +uintptr_t MGL_EXPORT mgl_gsplinec_init_(uintptr_t *x, uintptr_t *v) +{ return uintptr_t(mgl_gspline_init(_DA_(x),_DA_(v))); } +//----------------------------------------------------------------------------- +mdual MGL_EXPORT mgl_gsplinec(HCDT c, mreal dx, dual *d1, dual *d2) +{ + long i=0, n = c->GetNx(); + if(n%5) return NAN; // not the table of coefficients + while(dx>c->v(5*i) && iv(5*i); i++; } + dual res; + const mglDataC *d = dynamic_cast(c); + if(c) + { + const dual *a = d->a+5*i; + if(d1) *d1 = a[2]+dx*(mreal(2)*a[3]+(3*dx)*a[4]); + if(d2) *d2 = mreal(2)*a[3]+(6*dx)*a[4]; + res = a[1]+dx*(a[2]+dx*(a[3]+dx*a[4])); + } + else + { + if(d1) *d1 = c->v(5*i+2)+dx*(2*c->v(5*i+3)+3*dx*c->v(5*i+4)); + if(d2) *d2 = 2*c->v(5*i+3)+6*dx*c->v(5*i+4); + res = c->v(5*i+1)+dx*(c->v(5*i+2)+dx*(c->v(5*i+3)+dx*c->v(5*i+4))); + } + return res.real()+res.imag()*_Complex_I; +} +mdual MGL_EXPORT mgl_gsplinec_(uintptr_t *c, mreal *dx, dual *d1, dual *d2) +{ return mgl_gsplinec(_DA_(c),*dx,d1,d2); } +//----------------------------------------------------------------------------- diff --git a/src/complex_ex.cpp b/src/complex_ex.cpp new file mode 100644 index 0000000..16bae00 --- /dev/null +++ b/src/complex_ex.cpp @@ -0,0 +1,480 @@ +/*************************************************************************** + * data_new.cpp is part of Math Graphic Library + * Copyright (C) 2007-2014 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program 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 Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include +#include "mgl2/datac.h" +#include "mgl2/evalc.h" +#include "mgl2/thread.h" +#include "interp.hpp" +mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector &head); +//----------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_datac_trace(HCDT d) +{ + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(); + const mglDataC *dc = dynamic_cast(d); + mglDataC *r=new mglDataC(nx); + if(dc) + { + if(ny>=nx && nz>=nx) +#pragma omp parallel for + for(long i=0;ia[i] = dc->a[i+nx*(i+ny*i)]; + else if(ny>=nx) +#pragma omp parallel for + for(long i=0;ia[i] = dc->a[i+nx*i]; + else +#pragma omp parallel for + for(long i=0;ia[i] = dc->a[i]; + } + else if(ny>=nx && nz>=nx) +#pragma omp parallel for + for(long i=0;ia[i] = d->v(i,i,i); + else if(ny>=nx) +#pragma omp parallel for + for(long i=0;ia[i] = d->v(i,i); + else +#pragma omp parallel for + for(long i=0;ia[i] = d->v(i); + return r; +} +uintptr_t MGL_EXPORT mgl_datac_trace_(uintptr_t *d) +{ return uintptr_t(mgl_datac_trace(_DT_)); } +//----------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_datac_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz) +{ + if(!xx || !yy || !zz) + { + mglData tmp; tmp.a[0]=-1; + return mgl_datac_subdata_ext(d,xx?xx:&tmp,yy?yy:&tmp,zz?zz:&tmp); + } + + long n=0,m=0,l=0,j,k; + bool ix=false, iy=false, iz=false; + if(xx->GetNz()>1) // 3d data + { + n = xx->GetNx(); m = xx->GetNy(); l = xx->GetNz(); + j = yy->GetNN(); if(j>1 && j!=n*m*l) return 0; // wrong sizes + k = zz->GetNN(); if(k>1 && k!=n*m*l) return 0; // wrong sizes + ix = true; iy = j>1; iz = k>1; + } + else if(yy->GetNz()>1) + { + n = yy->GetNx(); m = yy->GetNy(); l = yy->GetNz(); + j = xx->GetNN(); if(j>1 && j!=n*m*l) return 0; // wrong sizes + k = zz->GetNN(); if(k>1 && k!=n*m*l) return 0; // wrong sizes + iy = true; ix = j>1; iz = k>1; + } + else if(zz->GetNz()>1) + { + n = zz->GetNx(); m = zz->GetNy(); l = zz->GetNz(); + j = yy->GetNN(); if(j>1 && j!=n*m*l) return 0; // wrong sizes + k = xx->GetNN(); if(k>1 && k!=n*m*l) return 0; // wrong sizes + iz = true; iy = j>1; ix = k>1; + } + else if(xx->GetNy()>1) // 2d data + { + n = xx->GetNx(); m = xx->GetNy(); l = 1; + j = yy->GetNx()*yy->GetNy(); if(j>1 && j!=n*m) return 0; // wrong sizes + k = zz->GetNx()*zz->GetNy(); if(k>1 && k!=n*m) return 0; // wrong sizes + ix = true; iy = j>1; iz = k>1; + } + else if(yy->GetNy()>1) + { + n = yy->GetNx(); m = yy->GetNy(); l = 1; + j = xx->GetNx()*xx->GetNy(); if(j>1 && j!=n*m) return 0; // wrong sizes + k = zz->GetNx()*zz->GetNy(); if(k>1 && k!=n*m) return 0; // wrong sizes + iy = true; ix = j>1; iz = k>1; + } + else if(zz->GetNy()>1) + { + n = zz->GetNx(); m = zz->GetNy(); l = 1; + j = yy->GetNx()*yy->GetNy(); if(j>1 && j!=n*m) return 0; // wrong sizes + k = xx->GetNx()*xx->GetNy(); if(k>1 && k!=n*m) return 0; // wrong sizes + iz = true; iy = j>1; ix = k>1; + } + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(); + long vx=long(xx->v(0)), vy=long(yy->v(0)), vz=long(zz->v(0)); + const mglDataC *dd = dynamic_cast(d); + if(n*m*l>1) // this is 2d or 3d data + { + mglDataV tx(n,m,l),ty(n,m,l),tz(n,m,l); + if(!ix) { xx = &tx; if(vx>=0) tx.Fill(vx); else tx.All(); } + if(!iy) { yy = &ty; if(vy>=0) ty.Fill(vy); else ty.All(); } + if(!iz) { zz = &tz; if(vz>=0) tz.Fill(vz); else tz.All(); } + mglDataC *r=new mglDataC(n,m,l); + if(dd) +#pragma omp parallel for + for(long i0=0;i0vthr(i0)), y=long(0.5+yy->vthr(i0)), z=long(0.5+zz->vthr(i0)); + r->a[i0] = (x>=0 && x=0 && y=0 && za[x+nx*(y+ny*z)]:NAN; + } + else +#pragma omp parallel for + for(long i0=0;i0vthr(i0)), y=long(0.5+yy->vthr(i0)), z=long(0.5+zz->vthr(i0)); + r->a[i0] = (x>=0 && x=0 && y=0 && zv(x,y,z):NAN; + } + return r; + } + // this is 1d data -> try as normal SubData() + mglDataV tx(nx),ty(ny),tz(nz); tx.Fill(0,nx-1); ty.Fill(0,ny-1); tz.Fill(0,nz-1); + if(xx->GetNx()>1 || vx>=0) n=xx->GetNx(); else { n=nx; xx = &tx; } + if(yy->GetNx()>1 || vy>=0) m=yy->GetNx(); else { m=ny; yy = &ty; } + if(zz->GetNx()>1 || vz>=0) l=zz->GetNx(); else { l=nz; zz = &tz; } + mglDataC *r=new mglDataC(n,m,l); + if(dd) +#pragma omp parallel for collapse(3) + for(long k=0;kv(i)), y=long(0.5+yy->v(j)), z=long(0.5+zz->v(k)); + r->a[i+n*(j+m*k)] = (x>=0 && x=0 && y=0 && za[x+nx*(y+ny*z)]:NAN; + } + else +#pragma omp parallel for collapse(3) + for(long k=0;kv(i)), y=long(0.5+yy->v(j)), z=long(0.5+zz->v(k)); + r->a[i+n*(j+m*k)] = (x>=0 && x=0 && y=0 && zv(x,y,z):NAN; + } + if(m==1) { r->ny=r->nz; r->nz=1; }// "squeeze" dimensions + if(n==1) { r->nx=r->ny; r->ny=r->nz; r->nz=1; r->NewId();} + return r; +} +//----------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_datac_subdata(HCDT d, long xx,long yy,long zz) +{ + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(), n=1,m=1,l=1; + int dx=0,dy=0,dz=0; + if(xx<0) { xx=0; dx=1; n=nx; } + if(yy<0) { yy=0; dy=1; m=ny; } + if(zz<0) { zz=0; dz=1; l=nz; } + const mglDataC *dd = dynamic_cast(d); + mglDataC *r=new mglDataC(n,m,l); + if(xx>=nx || yy>=ny || zz>=nz) +#pragma omp parallel for + for(long i=0;ia[i] = NAN; + else if(dd) +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+n*(j+m*k)] = dd->a[xx+dx*i + nx*(yy+dy*j + ny*(zz+dz*k))]; + else +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+n*(j+m*k)] = d->v(xx+dx*i, yy+dy*j, zz+dz*k); + if(m==1) { r->ny=r->nz; r->nz=1; }// "squeeze" dimensions + if(n==1) { r->nx=r->ny; r->ny=r->nz; r->nz=1; r->NewId();} + return r; +} +//----------------------------------------------------------------------------- +uintptr_t MGL_EXPORT mgl_datac_subdata_(uintptr_t *d, int *xx,int *yy,int *zz) +{ return uintptr_t(mgl_datac_subdata(_DT_,*xx,*yy,*zz)); } +uintptr_t MGL_EXPORT mgl_datac_subdata_ext_(uintptr_t *d, uintptr_t *xx, uintptr_t *yy, uintptr_t *zz) +{ return uintptr_t(mgl_datac_subdata_ext(_DT_,_DA_(xx),_DA_(yy),_DA_(zz))); } +//----------------------------------------------------------------------------- +MGL_NO_EXPORT void *mgl_cresize(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + long nx=t->p[0]+0.1, ny=t->p[1]+0.1; + long n1=t->p[3]+0.1,n2=t->p[4]+0.1,n3=t->p[5]+0.1; + dual *b=t->a; + const dual *a=t->b; + const mreal *c=(const mreal *)t->v; +#if !MGL_HAVE_PTHREAD +#pragma omp parallel for +#endif + for(long i0=t->id;i0n;i0+=mglNumThr) + { + register mreal i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny); + b[i0] = mglSpline3Cs(a,n1,n2,n3, c[0]+i*c[1], c[2]+j*c[3], c[4]+k*c[5]); + } + return 0; +} +HADT MGL_EXPORT mgl_datac_resize_box(HCDT dat, long mx,long my,long mz, mreal x1,mreal x2, mreal y1,mreal y2, mreal z1,mreal z2) +{ // NOTE: only for mglDataC + const mglDataC *d=dynamic_cast(dat); + if(!d) return 0; + register long nx = d->nx-1, ny = d->ny-1, nz = d->nz-1; + mx = mx<1 ? nx+1:mx; my = my<1 ? ny+1:my; mz = mz<1 ? nz+1:mz; + mglDataC *r=new mglDataC(mx,my,mz); + + mreal par[6]={nx*x1,0,ny*y1,0,nz*z1,0}; + long nn[6]={mx,my,mz,nx+1,ny+1,nz+1}; + if(mx>1) par[1] = nx*(x2-x1)/(mx-1); + if(my>1) par[3] = ny*(y2-y1)/(my-1); + if(mz>1) par[5] = nz*(z2-z1)/(mz-1); + mglStartThreadC(mgl_cresize,0,mx*my*mz,r->a,d->a,0,nn,par); + return r; +} +HADT MGL_EXPORT mgl_datac_resize(HCDT d, long mx,long my,long mz) +{ return mgl_datac_resize_box(d, mx,my,mz,0,1,0,1,0,1); } +uintptr_t MGL_EXPORT mgl_datac_resize_(uintptr_t *d, int *mx,int *my,int *mz) +{ return uintptr_t(mgl_datac_resize(_DT_,*mx,*my,*mz)); } +uintptr_t MGL_EXPORT mgl_datac_resize_box_(uintptr_t *d, int *mx,int *my,int *mz, mreal *x1,mreal *x2, mreal *y1,mreal *y2, mreal *z1,mreal *z2) +{ return uintptr_t(mgl_datac_resize_box(_DT_,*mx,*my,*mz,*x1,*x2,*y1,*y2,*z1,*z2)); } +//----------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_datac_combine(HCDT d1, HCDT d2) +{ + long n1=d1->GetNy(),n2=d2->GetNx(),nx=d1->GetNx(); + if(d1->GetNz()>1 || (n1>1 && d2->GetNy()>1) || d2->GetNz()>1) return 0; // wrong dimensions + mglDataC *r=new mglDataC; + bool dim2=true; + if(n1==1) { n1=n2; n2=d2->GetNy(); dim2 = false; } + r->Create(nx,n1,n2); + if(dim2) n1*=nx; else { n2*=n1; n1=nx; } + + const mglDataC *c1=dynamic_cast(d1); + const mglDataC *c2=dynamic_cast(d2); + if(c1 && c2) +#pragma omp parallel for collapse(2) + for(long j=0;ja[i+n1*j] = c1->a[i]*c2->a[j]; + else if(c1) +#pragma omp parallel for collapse(2) + for(long j=0;ja[i+n1*j] = c1->a[i]*d2->vthr(j); + else if(c2) +#pragma omp parallel for collapse(2) + for(long j=0;ja[i+n1*j] = d1->vthr(i)*c2->a[j]; + else +#pragma omp parallel for collapse(2) + for(long j=0;ja[i+n1*j] = d1->vthr(i)*d2->vthr(j); + return r; +} +uintptr_t MGL_EXPORT mgl_datac_combine_(uintptr_t *a, uintptr_t *b) +{ return uintptr_t(mgl_datac_combine(_DA_(a),_DA_(b))); } +//----------------------------------------------------------------------------- +MGL_NO_EXPORT void *mgl_sumc_z(void *par) +{ + mglThreadC *t=(mglThreadC *)par; + long nz=t->p[2], nn=t->n; + dual *b=t->a; + const dual *a=t->b; +#if !MGL_HAVE_PTHREAD +#pragma omp parallel for +#endif + for(long i=t->id;ip[0], ny=t->p[1], nn=t->n; + dual *b=t->a; + const dual *a=t->b; +#if !MGL_HAVE_PTHREAD +#pragma omp parallel for +#endif + for(long i=t->id;ip[0], nn=t->n; + dual *b=t->a; + const dual *a=t->b; +#if !MGL_HAVE_PTHREAD +#pragma omp parallel for +#endif + for(long i=t->id;iGetNx(),ny=dat->GetNy(),nz=dat->GetNz(); + long p[3]={nx,ny,nz}; + dual *b = new dual[nx*ny*nz]; + dual *c = new dual[nx*ny*nz]; + + const mglDataC *d=dynamic_cast(dat); + if(d) memcpy(c,d->a,nx*ny*nz*sizeof(dual)); + else +#pragma omp parallel for + for(long i=0;ivthr(i); + + if(strchr(dir,'z') && nz>1) + { + mglStartThreadC(mgl_sumc_z,0,nx*ny,b,c,0,p); + memcpy(c,b,nx*ny*sizeof(mreal)); p[2] = 1; + } + if(strchr(dir,'y') && ny>1) + { + mglStartThreadC(mgl_sumc_y,0,nx*p[2],b,c,0,p); + memcpy(c,b,nx*p[2]*sizeof(mreal)); p[1] = p[2]; p[2] = 1; + } + if(strchr(dir,'x') && nx>1) + { + mglStartThreadC(mgl_sumc_x,0,p[1]*p[2],b,c,0,p); + p[0] = p[1]; p[1] = p[2]; p[2] = 1; + } + mglDataC *r=new mglDataC(p[0],p[1],p[2]); + memcpy(r->a,b,p[0]*p[1]*p[2]*sizeof(dual)); + delete []b; delete []c; return r; +} +uintptr_t MGL_EXPORT mgl_datac_sum_(uintptr_t *d, const char *dir,int l) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + uintptr_t r=uintptr_t(mgl_datac_sum(_DT_,s)); delete []s; return r; } +//----------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how) +{ + if(!how || !(*how) || !strchr("xyz",dir)) return 0; + long nx=dat->GetNx(),ny=dat->GetNy(),nz=dat->GetNz(); + mglDataV x(nx,ny,nz, 0,1,'x'); x.s=L"x"; + mglDataV y(nx,ny,nz, 0,1,'y'); y.s=L"y"; + mglDataV z(nx,ny,nz, 0,1,'z'); z.s=L"z"; + mglDataC u(dat); u.s=L"u"; // NOTE slow !!! + std::vector list; + list.push_back(&x); list.push_back(&y); list.push_back(&z); list.push_back(&u); + mglDataC res=mglFormulaCalcC(how,list); + + mglDataC *b=0; + if(dir=='x') + { + b=new mglDataC(nx); +#pragma omp parallel for + for(long i=0;ivthr(i+nx*j); + i0 += u; i1 += u*res.a[i+nx*j]; + } + b->a[i] = i0!=mreal(0) ? i1/i0 : 0; + } + } + if(dir=='y') + { + b=new mglDataC(ny); +#pragma omp parallel for + for(long i=0;iv(j,i,k); + i0 += u; i1 += u*res.a[j+nx*(i+ny*k)]; + } + b->a[i] = i0!=mreal(0) ? i1/i0 : 0; + } + } + if(dir=='z') + { + long nn=nx*ny; + b=new mglDataC(nz); +#pragma omp parallel for + for(long i=0;ivthr(j+nn*i); + i0 += u; i1 += u*res.a[j+nn*i]; + } + b->a[i] = i0!=mreal(0) ? i1/i0 : 0; + } + } + return b; +} +uintptr_t MGL_EXPORT mgl_datac_momentum_(uintptr_t *d, char *dir, const char *how, int,int l) +{ char *s=new char[l+1]; memcpy(s,how,l); s[l]=0; + uintptr_t r=uintptr_t(mgl_datac_momentum(_DT_,*dir, s)); delete []s; return r; } +//----------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_datac_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm) +{ + if(!idat || (jdat && jdat->GetNN()!=idat->GetNN()) || (kdat && kdat->GetNN()!=idat->GetNN())) return 0; + const mglData *dd=dynamic_cast(dat); + const mglDataC *dc=dynamic_cast(dat); + long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz(); + mglDataC *r=new mglDataC(idat->GetNx(),idat->GetNy(),idat->GetNz()); + if(dd) +#pragma omp parallel for + for(long i=0;iGetNN();i++) + { + mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + r->a[i] = mgl_isnum(x*y*z)?mglSpline3st(dd->a,nx,ny,nz, x,y,z):NAN; + } + else if(dc) +#pragma omp parallel for + for(long i=0;iGetNN();i++) + { + mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + r->a[i] = mgl_isnum(x*y*z)?mglSpline3st(dc->a,nx,ny,nz, x,y,z):NAN; + } + else +#pragma omp parallel for + for(long i=0;iGetNN();i++) + { + mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + r->a[i] = mgl_isnum(x*y*z)?mgl_data_linear(dat, x,y,z):NAN;; + } + return r; +} +uintptr_t MGL_EXPORT mgl_datac_evaluate_(uintptr_t *d, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm) +{ return uintptr_t(mgl_datac_evaluate(_DT_,_DA_(idat),_DA_(jdat),_DA_(kdat),*norm)); } +//----------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_datac_column(HCDT dat, const char *eq) +{ + const mglData *dd=dynamic_cast(dat); + std::vector list; + if(dd && dd->id.length()>0) for(size_t i=0;iid.length();i++) + { + mglDataT *col = new mglDataT(*dat); + col->SetInd(i,dd->id[i]); + list.push_back(col); + } + const mglDataC *dc=dynamic_cast(dat); + if(dc && dc->id.length()>0) for(size_t i=0;iid.length();i++) + { + mglDataT *col = new mglDataT(*dat); + col->SetInd(i,dc->id[i]); + list.push_back(col); + } + if(list.size()==0) return 0; // no named columns + mglDataV *t = new mglDataV(dat->GetNy(),dat->GetNz()); + t->s=L"#$mgl"; list.push_back(t); + mglDataC *r = new mglDataC; + r->Set(mglFormulaCalcC(eq,list)); + for(size_t i=0;i #endif -#define isn(ch) ((ch)=='\n') +inline bool isn(char ch) {return ch=='\n';} MGL_NO_EXPORT char *mgl_read_gz(gzFile fp); +mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector &head); //----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_create_datac() { return new mglDataC; } HADT MGL_EXPORT mgl_create_datac_size(long nx, long ny, long nz){ return new mglDataC(nx,ny,nz); } @@ -56,38 +57,52 @@ void mglFromStr(HADT d,char *buf,long NX,long NY,long NZ) // TODO: add multithre mgl_datac_create(d, NX,NY,NZ); long nb = strlen(buf); register long i=0, j=0; - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); while(j0 || buf[j+1]!='#') // this is columns id - while(!isn(buf[j]) && j='a' && buf[j]<='z') d->id.push_back(buf[j]); j++; } } - while(buf[j]<=' ' && j=' ' && buf[j]!=';' && j=' ' && buf[j]!=';') j++; buf[j]=0; double re=0,im=0; size_t ll=strlen(s); + while(s[ll]<=' ') ll--; if(*s=='(') sscanf(s,"(%lg,%lg)",&re,&im); else if(*s=='[') sscanf(s,"[%lg,%lg]",&re,&im); else if(*s=='{') sscanf(s,"{%lg,%lg}",&re,&im); - else if(s[ll]=='i') { s[ll] = 0; sscanf(s,"%lg+%lg)",&re,&im); } - else sscanf(s,"%lg+i%lg",&re,&im); + else if(s[ll]=='i') + { + double a,b; s[ll] = 0; + int s1=sscanf(s,"%lg+%lg",&re,&im); + int s2=sscanf(s,"%lg-%lg",&a,&b); + if(s2==2 && s1<2) { re=a; im=-b; } + + } + else + { + double a,b; + int s1=sscanf(s,"%lg+i%lg",&re,&im); + int s2=sscanf(s,"%lg-i%lg",&a,&b); + if(s2==2 && s1<2) { re=a; im=-b; } + } d->a[i] = dual(re,im); i++; if(i>=NX*NY*NZ) break; } - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_datac_set(HADT d, HCDT a) @@ -186,35 +201,40 @@ void MGL_EXPORT mgl_datac_set_id_(uintptr_t *d, const char *eq,int l) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; mgl_datac_set_id(_DC_, s); delete []s; } //----------------------------------------------------------------------------- +void MGL_NO_EXPORT mgl_cprint(FILE *fp, mreal re, mreal im, char ch) +{ + if(im>0) fprintf(fp,"%g+i%g%c",re,im,ch); + else if(im<0) fprintf(fp,"%g-i%g%c",re,-im,ch); + else fprintf(fp,"%g%c",re,ch); +} void MGL_EXPORT mgl_datac_save(HCDT d, const char *fname,long ns) { const mglDataC *dd = dynamic_cast(d); if(!dd) { mgl_data_save(d,fname,ns); return; } FILE *fp = fopen(fname,"w"); if(!fp) return; - register long i,j,k; long nx=dd->nx, ny=dd->ny, nz=dd->nz; - setlocale(LC_NUMERIC, "C"); - if(ns<0 || (ns>=nz && nz>1)) for(k=0;k=nz && nz>1)) for(long k=0;ka[j+nx*(i+ny*k)]), imag(dd->a[j+nx*(i+ny*k)])); - fprintf(fp,"%g+i%g\n", real(dd->a[nx-1+nx*(i+ny*k)]), imag(dd->a[nx-1+nx*(i+ny*k)])); + for(long j=0;ja[j+nx*(i+ny*k)]), imag(dd->a[j+nx*(i+ny*k)]),'\t'); + mgl_cprint(fp, real(dd->a[nx-1+nx*(i+ny*k)]), imag(dd->a[nx-1+nx*(i+ny*k)]),'\n'); } fprintf(fp,"\n"); } else { // save selected slice - if(nz>1) for(i=0;i1) for(long i=0;ia[j+nx*(i+ny*ns)]), imag(dd->a[j+nx*(i+ny*ns)])); - fprintf(fp,"%g+i%g\n", real(dd->a[nx-1+nx*(i+ny*ns)]), imag(dd->a[nx-1+nx*(i+ny*ns)])); + for(long j=0;ja[j+nx*(i+ny*ns)]), imag(dd->a[j+nx*(i+ny*ns)]),'\t'); + mgl_cprint(fp, real(dd->a[nx-1+nx*(i+ny*ns)]), imag(dd->a[nx-1+nx*(i+ny*ns)]),'\n'); } - else if(nsa[j+nx*ns]), imag(dd->a[j+nx*ns])); + else if(nsa[j+nx*ns]), imag(dd->a[j+nx*ns]),'\t'); } - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); fclose(fp); } void MGL_EXPORT mgl_datac_save_(uintptr_t *d, const char *fname,int *ns,int l) @@ -322,24 +342,25 @@ int MGL_EXPORT mgl_datac_read_mat(HADT d, const char *fname, long dim) char *buf = mgl_read_gz(fp); long nb = strlen(buf); gzclose(fp); - register long j=0,i,l; + long j=0; while(j' ') j++; } else if(dim==2) { sscanf(buf+j,"%ld%ld",&nx,&ny); - while(buf[j]!='\n' && j' ' && !first) first=true; if(first && (ch=='\t' || ch==';') && b[i+1]!='\t') nx++; } @@ -361,7 +382,7 @@ int MGL_EXPORT mgl_datac_read_mat(HADT d, const char *fname, long dim) else if(dim==3) { sscanf(buf+j,"%ld%ld%ld",&nx,&ny,&nz); - while(buf[j]!='\n' && jnx, ny=d->ny, nz=d->nz, par[3]={nx,ny,nz}; + if(dim<=0) mgl_datac_modify_vw(d,eq,0,0); // fastes variant for whole array mglFormulaC f(eq); - if(dim<0) dim=0; if(nz>1) // 3D array { par[2] -= dim; if(par[2]<0) par[2]=0; @@ -566,38 +587,18 @@ void MGL_EXPORT mgl_datac_modify_(uintptr_t *d, const char *eq,int *dim,int l) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; mgl_datac_modify(_DC_,s,*dim); delete []s; } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_cmodify_gen(void *par) -{ - mglThreadV *t=(mglThreadV *)par; - const mglFormulaC *f = (const mglFormulaC *)(t->v); - long nx=t->p[0],ny=t->p[1],nz=t->p[2]; - dual *b=t->aa; - mreal dx,dy,dz; - HCDT v=(HCDT)t->b, w=(HCDT)t->c; - dx=nx>1?1/(nx-1.):0; dy=ny>1?1/(ny-1.):0; dz=nz>1?1/(nz-1.):0; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) - { - register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny); - b[i0] = f->Calc(i*dx, j*dy, k*dz, b[i0], v?v->vthr(i0):0, w?w->vthr(i0):0); - } - return 0; -} void MGL_EXPORT mgl_datac_modify_vw(HADT d, const char *eq,HCDT vdat,HCDT wdat) { - const mglDataC *v = dynamic_cast(vdat); - const mglDataC *w = dynamic_cast(wdat); - long nn = d->nx*d->ny*d->nz, par[3]={d->nx,d->ny,d->nz}; - if(vdat && vdat->GetNN()!=nn) return; - if(wdat && wdat->GetNN()!=nn) return; - mglFormulaC f(eq); - if(v && w) mglStartThreadC(mgl_cmodify,0,nn,d->a,v->a,w->a,par,&f); - else if(vdat && wdat) mglStartThreadV(mgl_cmodify_gen,nn,d->a,vdat,wdat,par,&f); - else if(v) mglStartThreadC(mgl_cmodify,0,nn,d->a,v->a,0,par,&f); - else if(vdat) mglStartThreadV(mgl_cmodify_gen,nn,d->a,vdat,0,par,&f); - else mglStartThreadC(mgl_cmodify,0,nn,d->a,0,0,par,&f); + std::wstring s = d->s; d->s = L"u"; + mglDataV x(d->nx,d->ny,d->nz); x.Fill(0,1,'x'); x.s=L"x"; + mglDataV y(d->nx,d->ny,d->nz); y.Fill(0,1,'y'); y.s=L"y"; + mglDataV z(d->nx,d->ny,d->nz); z.Fill(0,1,'z'); z.s=L"z"; + mglDataV r(d->nx,d->ny,d->nz); r.s=L"#$mgl"; + mglData v(vdat), w(wdat); v.s = L"v"; w.s = L"w"; + std::vector list; + list.push_back(&x); list.push_back(&y); list.push_back(&z); list.push_back(d); + list.push_back(&v); list.push_back(&w); list.push_back(&r); + d->Set(mglFormulaCalcC(eq,list)); d->s = s; } void MGL_EXPORT mgl_datac_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w,int l) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; @@ -793,7 +794,7 @@ void MGL_EXPORT mgl_datac_set_ap_(uintptr_t *d, uintptr_t *a, uintptr_t *p) #if MGL_HAVE_HDF5 void MGL_EXPORT mgl_datac_save_hdf(HCDT dat,const char *fname,const char *data,int rewrite) { - const mglDataC *d = dynamic_cast(dat); // NOTE: only for mglDataC + const mglDataC *d = dynamic_cast(dat); if(!d) { mgl_data_save_hdf(dat,fname,data,rewrite); return; } hid_t hf,hd,hs; hsize_t dims[4]; diff --git a/src/cont.cpp b/src/cont.cpp index 31f0e92..e86454f 100644 --- a/src/cont.cpp +++ b/src/cont.cpp @@ -25,6 +25,7 @@ #else #include #endif +#include #include "mgl2/surf.h" #include "mgl2/cont.h" @@ -39,21 +40,26 @@ //----------------------------------------------------------------------------- void MGL_NO_EXPORT mgl_string_curve(mglBase *gr,long f,long ,const long *ff,const long *nn,const wchar_t *text, const char *font, mreal size) { - if(f<0 || nn[f]==-1) return; // do nothing since there is no curve + if(f<0 || nn[f]<0) return; // do nothing since there is no curve if(!font) font=""; int pos = strchr(font,'T') ? 1:-1, align; - char cc=mglGetStyle(font,0,&align); align = align&3; - mreal c=cc ? -cc : gr->GetClrC(ff[f]); + bool cc=mglGetStyle(font,0,&align); align = align&3; mreal h=gr->TextHeight(font,size)/2, tet, tt; wchar_t L[2]=L"a"; register long i,j,k,m; std::vector qa, qb; // curves above and below original - mglPoint p=gr->GetPntP(ff[f]), q=p, s=gr->GetPntP(ff[nn[f]]), l=!(s-q), t=l; + if(ff[f]<0) for(i=nn[f];i>=0 && i!=f;i=nn[i]) // find first real point + if(ff[i]>=0) { f=i; break; } + if(ff[f]<0) return; + mreal c=cc?gr->AddTexture(font) : gr->GetClrC(ff[f]); + mglPoint p=gr->GetPntP(ff[f]), q=p, s; + for(i=nn[f];i>=0 && i!=f;i=nn[i]) // find second real point + if(ff[i]>=0) { s=gr->GetPntP(ff[i]); break; } + mglPoint l=!(s-q), t=l; qa.push_back(q+l*h); qb.push_back(q-l*h); for(i=nn[f];i>=0 && i!=f;i=nn[i]) // construct curves { - if(gr->Stop) return; p=q; q=s; l=t; if(nn[i]>=0 && ff[nn[i]]>=0) { s=gr->GetPntP(ff[nn[i]]); t=!(s-q); } tet = t.x*l.y-t.y*l.x; @@ -68,13 +74,16 @@ void MGL_NO_EXPORT mgl_string_curve(mglBase *gr,long f,long ,const long *ff,cons if(pos>0) qa=qb; // adjust text direction bool rev = align==2; - char *fnt = new char[strlen(font)+3]; strcpy(fnt,font); + const char *ffont=mglchr(font,':'); + char *fnt = new char[strlen(font)+5]; + if(ffont) strcpy(fnt,ffont); else *fnt=0; if(qa[0].x>qa[1].x) { if(align==0){ strcat(fnt,":R"); align=2; } else if(align==1) rev = true; else { strcat(fnt,":L"); align=0; } } + if(mglchr(font,'T')) strcat(fnt,":T"); if(rev) reverse(qa.begin(),qa.end()); long len = mgl_wcslen(text); mreal *wdt=new mreal[len+1]; @@ -88,7 +97,6 @@ void MGL_NO_EXPORT mgl_string_curve(mglBase *gr,long f,long ,const long *ff,cons mreal a,b,d,w,t1,t2; for(i=j=0,tt=0;jStop) { delete []wdt; delete []pt; delete []fnt; return; } w = align==1 ? wdt[j] : (wdt[j]+wdt[j+1])/2; p = pt[j]; for(k=i+1;kw) break; if(k>i+1 && k1)?1/MGL_FEPSILON/(len-1):0; for(j=0;jtext_plot(gr->AddPnt(pt[j]+(pos*h)*l,c,s,-1,-1),L,font,size,0.05,c); + gr->text_plot(gr->AddPnt(pt[j]+(pos*h)*l,c+dc*i,s,-1,-1),L,fnt,size,0.05,c+dc*j); } delete []wdt; delete []pt; delete []fnt; } @@ -119,18 +128,8 @@ void MGL_EXPORT mgl_textw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z,const wchar_t *tex static int cgid=1; gr->StartGroup("TextC",cgid++); long *nn = new long[n], *ff = new long[n]; - const mglData *mdx = dynamic_cast(x); - const mglData *mdy = dynamic_cast(y); - const mglData *mdz = dynamic_cast(z); - if(mdx && mdy && mdz) -#pragma omp parallel for - for(long i=0;iAddPnt(mglPoint(mdx->a[i],mdy->a[i],mdz->a[i]),-1); - else -#pragma omp parallel for - for(long i=0;iAddPnt(mglPoint(x->v(i),y->v(i),z->v(i)),-1); -#pragma omp parallel for + for(long i=0;iAddPnt(mglPoint(x->v(i),y->v(i),z->v(i)),-1); for(long i=1;iSaveState(opt); - mglData z(y->GetNx()); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV z(y->GetNx()); z.Fill(gr->AdjustZMin()); mgl_textw_xyz(gr,x,y,&z,text,font,0); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_textw_y(HMGL gr, HCDT y, const wchar_t *text, const char *font, const char *opt) { gr->SaveState(opt); - mglData x(y->GetNx()), z(y->GetNx()); - x.Fill(gr->Min.x,gr->Max.x); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV x(y->GetNx()), z(y->GetNx()); + x.Fill(gr->Min.x,gr->Max.x); z.Fill(gr->AdjustZMin()); mgl_textw_xyz(gr,&x,y,&z,text,font,0); } //----------------------------------------------------------------------------- @@ -162,16 +159,14 @@ void MGL_EXPORT mgl_text_xyz(HMGL gr, HCDT x, HCDT y, HCDT z,const char *text, c //----------------------------------------------------------------------------- void MGL_EXPORT mgl_text_xy(HMGL gr, HCDT x, HCDT y, const char *text, const char *font, const char *opt) { - mglData z(y->GetNx()); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV z(y->GetNx()); z.Fill(gr->AdjustZMin()); mgl_text_xyz(gr,x,y,&z,text,font,opt); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_text_y(HMGL gr, HCDT y, const char *text, const char *font, const char *opt) { - mglData x(y->GetNx()), z(y->GetNx()); - x.Fill(gr->Min.x,gr->Max.x); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV x(y->GetNx()), z(y->GetNx()); + x.Fill(gr->Min.x,gr->Max.x); z.Fill(gr->AdjustZMin()); mgl_text_xyz(gr,&x,y,&z,text,font,opt); } //----------------------------------------------------------------------------- @@ -199,194 +194,193 @@ mgl_text_y(_GR_, _DA_(y),s,f,o); delete []o; delete []s; delete []f; } // Cont series // //----------------------------------------------------------------------------- -struct mglSegment -{ - long next,prev; - mglPoint p1,p2; - mglSegment(mglPoint q1,mglPoint q2) {p1=q1;p2=q2;next=prev=-1;} -}; -// function for connecting arbitrary line segments -/*void MGL_NO_EXPORT mgl_connect(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z, mreal c, int text,long ak) +#include "cont.hpp" +//----------------------------------------------------------------------------- +std::vector MGL_EXPORT mgl_get_lines(mreal val, HCDT a, HCDT x, HCDT y, HCDT z, long ak) { long n=a->GetNx(), m=a->GetNy(); - if(n<2 || m<2 || x->GetNx()*x->GetNy()!=n*m || y->GetNx()*y->GetNy()!=n*m || z->GetNx()*z->GetNy()!=n*m) - { gr->SetWarn(mglWarnDim,"ContGen"); return; } - std::vector ss,cc; - - register long i,j; - mreal d1,d2,d3,d4; - bool o1,o2,o3,o4; - mglPoint p1,p2,p3,p4,q1,q2,q3,q4; - for(i=0;iStop) return; - d1 = mgl_d(val,a->v(i,j,ak),a->v(i+1,j,ak)); o1 = d1>=0 && d1<1; - d2 = mgl_d(val,a->v(i,j,ak),a->v(i,j+1,ak)); o2 = d2>=0 && d2<1; - d3 = mgl_d(val,a->v(i+1,j+1,ak),a->v(i+1,j,ak)); o3 = d3>=0 && d3<1; - d4 = mgl_d(val,a->v(i+1,j+1,ak),a->v(i,j+1,ak)); o4 = d4>=0 && d4<1; - p1 = mglPoint(x->v(i,j), y->v(i,j),z->v(i,j)); - p2 = mglPoint(x->v(i+1,j), y->v(i+1,j),z->v(i+1,j)); - p3 = mglPoint(x->v(i,j+1), y->v(i,j+1),z->v(i,j+1)); - p4 = mglPoint(x->v(i+1,j+1), y->v(i+1,j+1),z->v(i+1,j+1)); - q1 = p1*(1-d1)+p2*d1; q2 = p1*(1-d2)+p3*d1; - q3 = p4*(1-d3)+p2*d3; q4 = p4*(1-d4)+p3*d4; - if(o1 && o2) { o1 = o2 = false; ss.push_back(mglSegment(q1,q2)); } - if(o1 && o3) { o1 = o3 = false; ss.push_back(mglSegment(q1,q3)); } - if(o1 && o4) { o1 = o4 = false; ss.push_back(mglSegment(q1,q4)); } - if(o2 && o3) { o2 = o3 = false; ss.push_back(mglSegment(q2,q3)); } - if(o2 && o4) { o2 = o4 = false; ss.push_back(mglSegment(q2,q4)); } - if(o3 && o4) { o3 = o4 = false; ss.push_back(mglSegment(q3,q4)); } - } - // connect it - if(ss.size()==0) return; - for(i=0;i lines; + // first add all possible lines + for(long j=0;jv(i,j,ak),v2=a->v(i+1,j,ak),v3=a->v(i,j+1,ak),v4=a->v(i+1,j+1,ak); + register mreal dl=mgl_d(val,v1,v3),dr=mgl_d(val,v2,v4),dp=mgl_d(val,v1,v2),dn=mgl_d(val,v3,v4); + bool added=false; + if(v1>val || v4>val) { - mglSegment &s2=ss[j]; - if(s2.prev<0 && s1.p2==s2.p1) { s1.next = j; s2.prev=i; continue; } - if(s2.next<0 && s1.p1==s2.p2) { s1.prev = j; s2.next=i; continue; } - // if(s2.prev<0 && s1.p2==s2.p1) - // { s1.next = j; s2.prev=i; continue; } + mglSegment line; + if(line.set(0,dl,dn,1,i,j,ak,x,y,z)) { lines.push_back(line); added=true; } + if(line.set(1,dr,dp,0,i,j,ak,x,y,z)) { lines.push_back(line); added=true; } + } + else + { + mglSegment line; + if(line.set(0,dl,dp,0,i,j,ak,x,y,z)) { lines.push_back(line); added=true; } + if(line.set(1,dr,dn,1,i,j,ak,x,y,z)) { lines.push_back(line); added=true; } + } + if(!added) // try to add any other variants + { + mglSegment line; + if(line.set(0,dl,1,dr,i,j,ak,x,y,z)) lines.push_back(line); + else if(line.set(dp,0,dn,1,i,j,ak,x,y,z)) lines.push_back(line); + else if(line.set(0,dl,dn,1,i,j,ak,x,y,z)) lines.push_back(line); + else if(line.set(1,dr,dp,0,i,j,ak,x,y,z)) lines.push_back(line); + else if(line.set(0,dl,dp,0,i,j,ak,x,y,z)) lines.push_back(line); + else if(line.set(1,dr,dn,1,i,j,ak,x,y,z)) lines.push_back(line); } } -}*/ + return lines; +} //----------------------------------------------------------------------------- -// NOTE! returned must be deleted!!! -struct mglPnt2 { mreal x,y; mglPnt2(mreal xx=0,mreal yy=0) {x=xx;y=yy;} }; -long *mgl_cont_prep(mreal val, HCDT a,long ak, std::vector &kk) +std::vector MGL_EXPORT mgl_get_curvs(HMGL gr, std::vector lines) { - long n=a->GetNx(), m=a->GetNy(); - mreal d, r, kx, ky; - register long i,j,k, pc=0; - kk.clear(); - // add intersection point of isoline and Y axis - const mglData *ma = dynamic_cast(a); - if(ma) + long n = lines.size(), m = n; + const long nsl=(n>0 && n*n>100)?sqrt(double(n)):10; + mreal dxsl = nsl/((gr->Max.x-gr->Min.x)*MGL_FEPSILON), x0 = gr->Min.x; + mreal dysl = nsl/((gr->Max.y-gr->Min.y)*MGL_FEPSILON), y0 = gr->Min.y; + std::vector *xsl, *ysl; + xsl = new std::vector[nsl+1]; + ysl = new std::vector[nsl+1]; + for(long i=0;insl) i1=nsl; + if(i2<0) i2=0; if(i2>nsl) i2=nsl; + if(i1==i2 && i1*(i1-nsl)<=0) xsl[i1].push_back(i); + else { - d = mgl_d(val,ma->a[i+n*(j+m*ak)],ma->a[i+1+n*(j+m*ak)]); - if(d>=0 && d<1) kk.push_back(mglPnt2(i+d,j)); + if(i1*(i1-nsl)<=0) xsl[i1].push_back(i); + if(i2*(i2-nsl)<=0) xsl[i2].push_back(i); } - // add intersection point of isoline and X axis - for(j=0;jnsl) i1=nsl; + if(i2<0) i2=0; if(i2>nsl) i2=nsl; + if(i1==i2 && i1*(i1-nsl)<=0) ysl[i1].push_back(i); + else { - d = mgl_d(val,ma->a[i+n*(j+m*ak)],ma->a[i+n*(j+1+m*ak)]); - if(d>=0 && d<1) kk.push_back(mglPnt2(i,j+d)); + if(i1*(i1-nsl)<=0) ysl[i1].push_back(i); + if(i2*(i2-nsl)<=0) ysl[i2].push_back(i); } } - else for(j=0;jv(i,j,ak); - d = (iv(i+1,j,ak)):-1; - if(d>=0 && d<1) kk.push_back(mglPnt2(i+d,j)); - d = (jv(i,j+1,ak)):-1; - if(d>=0 && d<1) kk.push_back(mglPnt2(i,j+d)); + if(xm=0) + std::vector curvs; + char *used = new char[n]; memset(used,0,n); + // create curves from lines + while(m>0) // NOTE! This algorithm can be *very* slow!!! + { + mglSegment curv; + bool added = false; + for(long i=0;i0) { - for(k=0;knsl) i1=nsl; + if(i2<0) i2=0; if(i2>nsl) i2=nsl; + const std::vector &isl1=(xm<=ym)?xsl[i1]:ysl[i1]; + for(size_t i=0;i &isl2=(xm<=ym)?xsl[i2]:ysl[i2]; + if(m>0) for(size_t i=0;i=0); - delete []ff; return nn; + curvs.push_back(curv); + } + delete []used; delete []xsl; delete []ysl; + return curvs; } //----------------------------------------------------------------------------- -// NOTE! All data MUST have the same size! Only first slice is used! -void MGL_EXPORT mgl_cont_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z, mreal c, int text,long ak) +void MGL_NO_EXPORT mgl_draw_curvs(HMGL gr, mreal val, mreal c, int text, const std::vector &curvs) { - long n=a->GetNx(), m=a->GetNy(); - if(n<2 || m<2 || x->GetNx()*x->GetNy()!=n*m || y->GetNx()*y->GetNy()!=n*m || z->GetNx()*z->GetNy()!=n*m) - { gr->SetWarn(mglWarnDim,"ContGen"); return; } - - std::vector kk; - long *nn = mgl_cont_prep(val, a, ak, kk), *ff; - if(!nn) return; // nothing to do - register long i, pc=kk.size(); - register mreal xx, yy; - ff = new long[pc]; gr->Reserve(pc); - for(i=0;iReserve(pc); + // fill arguments for other functions + long *ff = new long[pc], *nn = new long[pc], m=0; + for(size_t i=0;iAddPnt(mglPoint(mgl_data_linear(x,xx,yy,ak), mgl_data_linear(y,xx,yy,ak), mgl_data_linear(z,xx,yy,ak)), c); + const std::list &pp=curvs[i].pp; + for(std::list::const_iterator it=pp.begin(); it != pp.end(); ++it) + { + ff[m] = gr->AddPnt(*it, c); + nn[m] = m+1; m++; + } + nn[m-1]=-1; } - if(text && pc>1) { wchar_t wcs[64]; mglprintf(wcs,64,L"%4.3g",val); - mglPoint t; mreal del = 2*gr->TextWidth(wcs,"",-0.5); // find width and height of drawing area mreal ar=gr->GetRatio(), w=gr->FontFactor(), h; if(delGetPntP(ff[k]); - i = long(t.x/del); t.x -= i*del; - j = long(t.y/del); t.y -= j*del; + mglPoint t = gr->GetPntP(ff[k]); + long i = long(t.x/del); t.x -= i*del; + long j = long(t.y/del); t.y -= j*del; if(i<0 || i>=m || j<0 || j>=n) continue; // never should be here! - xx = t.x*t.x+t.y*t.y; i += m*j; + mreal xx = t.x*t.x+t.y*t.y; i += m*j; if(rr[i]>xx) { rr[i]=xx; oo[i]=k; } } - for(i=0;i=0) - mgl_string_curve(gr,oo[i],pc,ff,nn,wcs,"t:C",-0.5); + for(long i=0;i=0) + mgl_string_curve(gr,oo[i],pc,ff,nn,wcs,text==1?"t:C":"T:C",-0.5); delete []oo; delete []rr; } - for(i=0;i=0) gr->line_plot(ff[i], ff[nn[i]]); + for(long i=0;i=0) gr->line_plot(ff[i], ff[nn[i]]); delete []nn; delete []ff; } //----------------------------------------------------------------------------- +// NOTE! All data MUST have the same size! Only first slice is used! +void MGL_EXPORT mgl_cont_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z, mreal c, int text,long ak) +{ + long n=a->GetNx(), m=a->GetNy(); + if(n<2 || m<2 || x->GetNx()*x->GetNy()!=n*m || y->GetNx()*y->GetNy()!=n*m || z->GetNx()*z->GetNy()!=n*m) + { gr->SetWarn(mglWarnDim,"ContGen"); return; } + + mgl_draw_curvs(gr,val,c,text,mgl_get_curvs(gr,mgl_get_lines(val,a,x,y,z,ak))); +} +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_cont_gen(HMGL gr, double val, HCDT a, HCDT x, HCDT y, HCDT z, const char *sch) { - bool text=(mglchr(sch,'t')); + int text=0; + if(mglchr(sch,'t')) text=1; + if(mglchr(sch,'T')) text=2; gr->SetPenPal(sch); mgl_cont_gen(gr,val,a,x,y,z,gr->CDef,text,0); } @@ -399,7 +393,9 @@ void MGL_EXPORT mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const c gr->SaveState(opt); static int cgid=1; gr->StartGroup("Cont",cgid++); - bool text=(mglchr(sch,'t')); + int text=0; + if(mglchr(sch,'t')) text=1; + if(mglchr(sch,'T')) text=2; bool fixed=(mglchr(sch,'_')) || (gr->Min.z==gr->Max.z); long s=gr->AddTexture(sch); gr->SetPenPal(sch); @@ -408,32 +404,22 @@ void MGL_EXPORT mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const c if(x->GetNx()*x->GetNy()!=m*n || y->GetNx()*y->GetNy()!=m*n) // make { xx.Create(n, m); yy.Create(n, m); - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - if(mx && my) -#pragma omp parallel for collapse(2) - for(long i=0;ia[i]; yy.a[i+n*j] = my->a[j]; } - else -#pragma omp parallel for collapse(2) - for(long i=0;iv(i); yy.a[i+n*j] = y->v(j); } + for(long i=0;iv(i); + for(long j=1;jv(j); for(long i=0;iGetNx();i++) for(long j=0;jGetNz();j++) { - mglData zz(n, m); -#pragma omp for collapse(2) - for(long j=0;jGetNz();j++) for(long i=0;iGetNx();i++) - { - if(gr->Stop) continue; - mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; - if(z->GetNz()>1) - z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); - zz.Fill(z0,z0); - mgl_cont_gen(gr,v0,z,x,y,&zz,gr->GetC(s,v0),text,j); - } + if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } + mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; + if(z->GetNz()>1) + z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); + zz.Fill(z0,z0); + mgl_cont_gen(gr,v0,z,x,y,&zz,gr->GetC(s,v0),text,j); } gr->EndGroup(); } @@ -443,7 +429,7 @@ void MGL_EXPORT mgl_cont_val(HMGL gr, HCDT v, HCDT z, const char *sch, const cha register long n = z->GetNx(), m = z->GetNy(); if(m<2 || n<2) { gr->SetWarn(mglWarnLow,"Cont"); return; } gr->SaveState(opt); - mglData x(n, m), y(n, m); + mglDataV x(n, m), y(n, m); x.Fill(gr->Min.x,gr->Max.x,'x'); y.Fill(gr->Min.y,gr->Max.y,'y'); mgl_cont_xy_val(gr,v,&x,&y,z,sch,0); @@ -499,16 +485,15 @@ long MGL_NO_EXPORT mgl_add_pnt(HMGL gr, mreal d, HCDT x, HCDT y, HCDT z, long i1 long res=-1; if(edge || (d>0 && d<1)) { - mglPoint p,u,v; - p = mglPoint(x->v(i1,j1)*(1-d)+x->v(i2,j2)*d, - y->v(i1,j1)*(1-d)+y->v(i2,j2)*d, - z->v(i1,j1)*(1-d)+z->v(i2,j2)*d); - u = mglPoint(x->dvx(i1,j1)*(1-d)+x->dvx(i2,j2)*d, - y->dvx(i1,j1)*(1-d)+y->dvx(i2,j2)*d, - z->dvx(i1,j1)*(1-d)+z->dvx(i2,j2)*d); - v = mglPoint(x->dvy(i1,j1)*(1-d)+x->dvy(i2,j2)*d, - y->dvy(i1,j1)*(1-d)+y->dvy(i2,j2)*d, - z->dvy(i1,j1)*(1-d)+z->dvy(i2,j2)*d); + mglPoint p(x->v(i1,j1)*(1-d)+x->v(i2,j2)*d, + y->v(i1,j1)*(1-d)+y->v(i2,j2)*d, + z->v(i1,j1)*(1-d)+z->v(i2,j2)*d); + mglPoint u(x->dvx(i1,j1)*(1-d)+x->dvx(i2,j2)*d, + y->dvx(i1,j1)*(1-d)+y->dvx(i2,j2)*d, + z->dvx(i1,j1)*(1-d)+z->dvx(i2,j2)*d); + mglPoint v(x->dvy(i1,j1)*(1-d)+x->dvy(i2,j2)*d, + y->dvy(i1,j1)*(1-d)+y->dvy(i2,j2)*d, + z->dvy(i1,j1)*(1-d)+z->dvy(i2,j2)*d); res = gr->AddPnt(p,c,u^v); } return res; @@ -517,25 +502,22 @@ long MGL_NO_EXPORT mgl_add_pnt(HMGL gr, mreal d, HCDT x, HCDT y, HCDT z, long i1 void MGL_NO_EXPORT mgl_add_range(HMGL gr, HCDT a, HCDT x, HCDT y, HCDT z, long i1, long j1, long di, long dj, mreal c, long &u1, long &u2, long ak, mreal v1, mreal v2) { long i2=i1+di, j2=j1+dj; - mreal f1 = a->v(i1,j1,ak), f2 = a->v(i2,j2,ak), d1, d2; d1 = mgl_d(v1,f1,f2); u1 = mgl_add_pnt(gr,d1,x,y,z,i1,j1,i2,j2,c,false); d2 = mgl_d(v2,f1,f2); u2 = mgl_add_pnt(gr,d2,x,y,z,i1,j1,i2,j2,c,false); if(d1>d2) { j2=u1; u1=u2; u2=j2; } + if(u1<0) { u1=u2; u2=-1; } } //----------------------------------------------------------------------------- void MGL_NO_EXPORT mgl_add_edges(HMGL gr, HCDT a, HCDT x, HCDT y, HCDT z, long i1, long j1, long di, long dj, mreal c, long &u1, long &u2, long ak, mreal v1, mreal v2) { long i2=i1+di, j2=j1+dj; u1 = u2 = -1; - mreal f1 = a->v(i1,j1,ak), f2 = a->v(i2,j2,ak); - if(f1<=v2 && f1>=v1) - u1 = mgl_add_pnt(gr,0,x,y,z,i1,j1,i2,j2,c,true); - if(f2<=v2 && f2>=v1) - u2 = mgl_add_pnt(gr,1,x,y,z,i1,j1,i2,j2,c,true); + if(f1<=v2 && f1>=v1) u1 = mgl_add_pnt(gr,0,x,y,z,i1,j1,i2,j2,c,true); + if(f2<=v2 && f2>=v1) u2 = mgl_add_pnt(gr,1,x,y,z,i1,j1,i2,j2,c,true); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT y, HCDT z, mreal c, long ak) @@ -545,12 +527,11 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT { gr->SetWarn(mglWarnDim,"ContFGen"); return; } register long i,j; - gr->Reserve(n*m); + gr->Reserve(8*n*m); long *kk = new long[4*n], l1,l2, r1,r2, t1,t2, u1,u2, b1,b2, d1,d2, p[8],num; memset(kk,-1,2*n*sizeof(long)); for(i=0;iStop) { delete []kk; return; } mgl_add_range(gr,a,x,y,z, i,0,1,0, c,u1,u2, ak,v1,v2); kk[4*i]=u1; kk[4*i+1]=u2; mgl_add_edges(gr,a,x,y,z, i,0,1,0, c,d1,d2, ak,v1,v2); @@ -561,7 +542,6 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT mgl_add_range(gr,a,x,y,z, 0,j-1,0,1, c,r1,r2, ak,v1,v2); for(i=0;iStop) { delete []kk; return; } l1 = r1; l2 = r2; num=0; t1 = kk[4*i]; t2 = kk[4*i+1]; b1 = kk[4*i+2]; b2 = kk[4*i+3]; @@ -579,7 +559,17 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT if(d2>=0) p[num++] = d2; if(u2>=0) p[num++] = u2; if(u1>=0) p[num++] = u1; if(d1>=0) p[num++] = d1; if(l2>=0) p[num++] = l2; if(l1>=0) p[num++] = l1; + + // d1 u1 u2 d2 + // l2 r2 + // l1 r1 + // b1 t1 t2 b2 + // draw it + bool b1d2 = a->v(i+1,j,ak)>v2 && a->v(i,j-1,ak)>v2; + bool b2d1 = a->v(i,j,ak)>v2 && a->v(i+1,j-1,ak)>v2; + mreal vv = mgl_data_linear(a,i+0.5,j-0.5,ak); + vv = (vv-v1)*(vv-v2); if(num<3) continue; if(num==4) gr->quad_plot(p[0],p[1],p[3],p[2]); else if(num==3) gr->trig_plot(p[0],p[1],p[2]); @@ -590,8 +580,74 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT } else if(num==6) { - gr->quad_plot(p[0],p[1],p[3],p[2]); - gr->quad_plot(p[0],p[3],p[5],p[4]); + if(b1>=0 && b2>=0) + { + gr->quad_plot(b1,b2,l1,r1); + gr->quad_plot(l1,r1,u1,u2); + } + else if(d1>=0 && d2>=0) + { + gr->quad_plot(d1,d2,l1,r1); + gr->quad_plot(l1,r1,t1,t2); + } + else if(b1>=0 && d2>=0) + { + if(b2d1) + { gr->trig_plot(b1,t1,l1); gr->trig_plot(r1,u1,d2); } + else + { gr->quad_plot(b1,t1,l1,r1); gr->quad_plot(l1,r1,u1,d2); } + } + else if(d1>=0 && b2>=0) + { + if(b1d2) + { gr->trig_plot(t1,b2,r1); gr->trig_plot(l1,d1,u1); } + else + { gr->quad_plot(t1,b2,l1,r1); gr->quad_plot(l1,r1,d1,u1); } + } + else if(b1>=0 && d1>=0) + { + gr->quad_plot(b1,d1,t1,u1); + gr->quad_plot(t1,u1,r1,r2); + } + else if(d2>=0 && b2>=0) + { + gr->quad_plot(d2,b2,u1,t1); + gr->quad_plot(t1,u1,l1,l2); + } + } + else if(num==7) + { + if(b1>=0) + { + gr->trig_plot(b1,l1,t1); gr->quad_plot(r1,r2,u1,u2); + if(!b2d1) gr->quad_plot(l1,t1,u1,r1); + } + else if(b2>=0) + { + gr->trig_plot(b2,r1,t1); gr->quad_plot(l1,l2,u2,u1); + if(!b1d2) gr->quad_plot(r1,t1,u2,l1); + } + else if(d2>=0) + { + gr->trig_plot(d2,r1,u1); gr->quad_plot(l1,l2,t1,t2); + if(!b2d1) gr->quad_plot(r1,u1,t2,l2); + } + else if(d1>=0) + { + gr->trig_plot(d1,l1,u1); gr->quad_plot(r1,r2,t2,t1); + if(!b1d2) gr->quad_plot(l1,u1,t1,r2); + } + } + else if(num==8) + { + if(b2d1) + { if(l2<0) { l2=l1; l1=b1; } if(r2<0) r2=d2; + if(t2<0) { t2=t1; t1=b1; } if(u2<0) u2=d2; + gr->quad_plot(r1,r2,u1,u2); gr->quad_plot(l1,l2,t1,t2); } + else + { if(l2<0) l2=d1; if(r2<0) { r2=r1; r1=b2; } + if(t2<0) t2=b2; if(u2<0) { u2=u1; u1=d1; } + gr->quad_plot(r1,r2,t2,t1); gr->quad_plot(l1,l2,u2,u1); } } } } @@ -618,32 +674,22 @@ void MGL_EXPORT mgl_contf_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const if(x->GetNx()*x->GetNy()!=m*n || y->GetNx()*y->GetNy()!=m*n) // make { xx.Create(n, m); yy.Create(n, m); - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - if(mx && my) -#pragma omp parallel for collapse(2) - for(long j=0;ja[i]; yy.a[i+n*j] = my->a[j]; } - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(i); yy.a[i+n*j] = y->v(j); } + for(long i=0;iv(i); + for(long j=1;jv(j); for(long i=0;iGetNx()-1;i++) for(long j=0;jGetNz();j++) { - mglData zz(n, m); -#pragma omp for collapse(2) - for(long j=0;jGetNz();j++) for(long i=0;iGetNx()-1;i++) - { - if(gr->Stop) continue; - mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; - if(z->GetNz()>1) - z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); - zz.Fill(z0,z0); - mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,gr->GetC(s,v0),j); - } + if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } + mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; + if(z->GetNz()>1) + z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); + zz.Fill(z0,z0); + mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,gr->GetC(s,v0),j); } gr->EndGroup(); } @@ -653,7 +699,7 @@ void MGL_EXPORT mgl_contf_val(HMGL gr, HCDT v, HCDT z, const char *sch, const ch register long n = z->GetNx(), m = z->GetNy(); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"Cont"); return; } gr->SaveState(opt); - mglData x(n, m), y(n, m); + mglDataV x(n, m), y(n, m); x.Fill(gr->Min.x,gr->Max.x,'x'); y.Fill(gr->Min.y,gr->Max.y,'y'); mgl_contf_xy_val(gr,v,&x,&y,z,sch,0); @@ -664,7 +710,7 @@ void MGL_EXPORT mgl_contf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, c mreal r = gr->SaveState(opt); long Num = mgl_isnan(r)?7:long(r+0.5); if(Num<1) { gr->SetWarn(mglWarnCnt,"Cont"); return; } - mglData v(Num+2); v.Fill(gr->Min.c, gr->Max.c); + mglDataV v(Num+2); v.Fill(gr->Min.c, gr->Max.c); mgl_contf_xy_val(gr,&v,x,y,z,sch,0); } //----------------------------------------------------------------------------- @@ -673,7 +719,7 @@ void MGL_EXPORT mgl_contf(HMGL gr, HCDT z, const char *sch, const char *opt) mreal r = gr->SaveState(opt); long Num = mgl_isnan(r)?7:long(r+0.5); if(Num<1) { gr->SetWarn(mglWarnCnt,"Cont"); return; } - mglData v(Num+2); v.Fill(gr->Min.c, gr->Max.c); + mglDataV v(Num+2); v.Fill(gr->Min.c, gr->Max.c); mgl_contf_val(gr,&v,z,sch,0); } //----------------------------------------------------------------------------- @@ -705,22 +751,22 @@ void MGL_EXPORT mgl_contf_(uintptr_t *gr, uintptr_t *a, const char *sch, const c //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgl_get_ncol(const char *sch, char *res) { - register long i,j=0; - if(sch) for(i=0;sch[i]&&sch[i]!=':';i++) if(strchr(MGL_COLORS,sch[i])) + long j=0; + if(sch) for(long i=0;sch[i]&&sch[i]!=':';i++) if(strchr(MGL_COLORS,sch[i])) { if(res) res[j]=sch[i]; j++; } return j?j:strlen(MGL_DEF_PAL); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) { - long i,j=0,n=z->GetNx(),m=z->GetNy(); + long j=0,n=z->GetNx(),m=z->GetNy(); if(mgl_check_dim2(gr,x,y,z,0,"ContD")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("ContD",cgid++); bool fixed=(mglchr(sch,'_')) || (gr->Min.z==gr->Max.z); - if(sch) for(i=0;sch[i];i++) if(strchr(MGL_COLORS,sch[i])) j++; + if(sch) for(long i=0;sch[i];i++) if(strchr(MGL_COLORS,sch[i])) j++; if(j==0) sch = MGL_DEF_PAL; long s = gr->AddTexture(sch,1); int nc = gr->GetNumPal(s*256); @@ -728,33 +774,23 @@ void MGL_EXPORT mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const if(x->GetNx()*x->GetNy()!=m*n || y->GetNx()*y->GetNy()!=m*n) // make { xx.Create(n, m); yy.Create(n, m); - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - if(mx && my) -#pragma omp parallel for collapse(2) - for(long j=0;ja[i]; yy.a[i+n*j] = my->a[j]; } - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(i); yy.a[i+n*j] = y->v(j); } + for(long i=0;iv(i); + for(long j=1;jv(j); for(long i=0;i1 ? 1/(MGL_FEPSILON*(nc-1)) : 0; -#pragma omp parallel + mglDataV zz(n, m); + for(long i=0;iGetNx()-1;i++) for(long j=0;jGetNz();j++) { - mglData zz(n, m); -#pragma omp for collapse(2) - for(long j=0;jGetNz();j++) for(long i=0;iGetNx()-1;i++) - { - if(gr->Stop) continue; - mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; - if(z->GetNz()>1) - z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); - zz.Fill(z0,z0); - mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,s+i*dc,j); - } + if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } + mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; + if(z->GetNz()>1) + z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); + zz.Fill(z0,z0); + mgl_contf_gen(gr,v0,v->v(i+1),z,x,y,&zz,s+i*dc,j); } gr->EndGroup(); } @@ -764,7 +800,7 @@ void MGL_EXPORT mgl_contd_val(HMGL gr, HCDT v, HCDT z, const char *sch, const ch register long n = z->GetNx(), m = z->GetNy(); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContD"); return; } gr->SaveState(opt); - mglData x(n, m), y(n, m); + mglDataV x(n, m), y(n, m); x.Fill(gr->Min.x,gr->Max.x,'x'); y.Fill(gr->Min.y,gr->Max.y,'y'); mgl_contd_xy_val(gr,v,&x,&y,z,sch,0); @@ -773,7 +809,7 @@ void MGL_EXPORT mgl_contd_val(HMGL gr, HCDT v, HCDT z, const char *sch, const ch void MGL_EXPORT mgl_contd_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) { gr->SaveState(opt); - mglData v(mgl_get_ncol(sch,0)+1); + mglDataV v(mgl_get_ncol(sch,0)+1); v.Fill(gr->Min.c, gr->Max.c); mgl_contd_xy_val(gr,&v,x,y,z,sch,0); } @@ -781,7 +817,7 @@ void MGL_EXPORT mgl_contd_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, c void MGL_EXPORT mgl_contd(HMGL gr, HCDT z, const char *sch, const char *opt) { gr->SaveState(opt); - mglData v(mgl_get_ncol(sch,0)+1); + mglDataV v(mgl_get_ncol(sch,0)+1); v.Fill(gr->Min.c, gr->Max.c); mgl_contd_val(gr,&v,z,sch,0); } @@ -818,23 +854,19 @@ void MGL_EXPORT mgl_contv_gen(HMGL gr, mreal val, mreal dval, HCDT a, HCDT x, HC if(n<2 || m<2 || x->GetNx()*x->GetNy()!=n*m || y->GetNx()*y->GetNy()!=n*m || z->GetNx()*z->GetNy()!=n*m) { gr->SetWarn(mglWarnDim,"ContGen"); return; } - std::vector kk; - long *nn = mgl_cont_prep(val, a, ak, kk), *ff; - if(!nn) return; // nothing to do - register long i, pc=kk.size(); - register mreal xx, yy; - ff = new long[2*pc]; gr->Reserve(2*pc); - mglPoint p,q; - for(i=0;i curvs = mgl_get_curvs(gr,mgl_get_lines(val,a,x,y,z,ak)); + for(size_t i=0;iAddPnt(p, c, q); - ff[i+pc] = gr->AddPnt(mglPoint(p.x, p.y, p.z+dval), c, q); + const std::list &pp=curvs[i].pp; + long f2=-1,g2=-1; + for(std::list::const_iterator it=pp.begin(); it != pp.end(); ++it) + { + mglPoint p=*it,q(p.y,-p.x); + long f1 = f2; f2 = gr->AddPnt(p,c,q); p.z+=dval; + long g1 = g2; g2 = gr->AddPnt(p,c,q); + gr->quad_plot(f1,g1,f2,g2); + } } - - for(i=0;i=0) gr->quad_plot(ff[i], ff[nn[i]], ff[i+pc], ff[nn[i]+pc]); - delete []nn; delete []ff; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) @@ -852,35 +884,25 @@ void MGL_EXPORT mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const if(x->GetNx()*x->GetNy()!=m*n || y->GetNx()*y->GetNy()!=m*n) // make { xx.Create(n, m); yy.Create(n, m); - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - if(mx && my) -#pragma omp parallel for collapse(2) - for(long j=0;ja[i]; yy.a[i+n*j] = my->a[j]; } - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(i); yy.a[i+n*j] = y->v(j); } + for(long i=0;iv(i); + for(long j=1;jv(j); for(long i=0;iGetNx();i++) for(long j=0;jGetNz();j++) { - mglData zz(n, m); -#pragma omp for collapse(2) - for(long j=0;jGetNz();j++) for(long i=0;iGetNx();i++) - { - if(gr->Stop) continue; - mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; - if(z->GetNz()>1) z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); - zz.Fill(z0,z0); - mreal dv = (gr->Max.c-gr->Min.c)/8; - if(i>0) dv = v->v(i-1)-v->v(i); - else if(iGetNx()-1) dv = v->v(i)-v->v(i+1); - if(fixed) dv=-dv; - mgl_contv_gen(gr,v0,dv,z,x,y,&zz,gr->GetC(s,v0),j); - } + if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } + mreal v0 = v->v(i), z0 = fixed ? gr->Min.z : v0; + if(z->GetNz()>1) z0 = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(j)/(z->GetNz()-1); + zz.Fill(z0,z0); + mreal dv = (gr->Max.c-gr->Min.c)/8; + if(i>0) dv = v->v(i-1)-v->v(i); + else if(iGetNx()-1) dv = v->v(i)-v->v(i+1); + if(fixed) dv=-dv; + mgl_contv_gen(gr,v0,dv,z,x,y,&zz,gr->GetC(s,v0),j); } gr->EndGroup(); } @@ -890,7 +912,7 @@ void MGL_EXPORT mgl_contv_val(HMGL gr, HCDT v, HCDT z, const char *sch, const ch register long n = z->GetNx(), m = z->GetNy(); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"Cont"); return; } gr->SaveState(opt); - mglData x(n, m), y(n, m); + mglDataV x(n, m), y(n, m); x.Fill(gr->Min.x,gr->Max.x,'x'); y.Fill(gr->Min.y,gr->Max.y,'y'); mgl_contv_xy_val(gr,v,&x,&y,z,sch,0); @@ -945,84 +967,7 @@ struct _mgl_slice { mglData x,y,z,a; }; //----------------------------------------------------------------------------- void MGL_NO_EXPORT mgl_get_slice(_mgl_slice &s, HCDT x, HCDT y, HCDT z, HCDT a, char dir, mreal d, bool both) { - register long i,j,i0,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(), nx=1,ny=1,p; - - if(dir=='x') { nx = m; ny = l; if(d<0) d = n/2.; } - if(dir=='y') { nx = n; ny = l; if(d<0) d = m/2.; } - if(dir=='z') { nx = n; ny = m; if(d<0) d = l/2.; } - s.x.Create(nx,ny); s.y.Create(nx,ny); - s.z.Create(nx,ny); s.a.Create(nx,ny); - p = long(d); d -= p; - if(dir=='x' && p>=n-1) { d+=p-n+2; p=n-2; } - if(dir=='y' && p>=m-1) { d+=p-m+2.; p=m-2; } - if(dir=='z' && p>=l-1) { d+=p-l+2; p=l-2; } - mreal v; - - if(both) - { - if(dir=='x') for(j=0;jv(p,i,j)*(1-d) + x->v(p+1,i,j)*d; - s.y.a[i0] = y->v(p,i,j)*(1-d) + y->v(p+1,i,j)*d; - s.z.a[i0] = z->v(p,i,j)*(1-d) + z->v(p+1,i,j)*d; - s.a.a[i0] = a->v(p,i,j)*(1-d) + a->v(p+1,i,j)*d; - } - if(dir=='y') for(j=0;jv(i,p,j)*(1-d) + x->v(i,p+1,j)*d; - s.y.a[i0] = y->v(i,p,j)*(1-d) + y->v(i,p+1,j)*d; - s.z.a[i0] = z->v(i,p,j)*(1-d) + z->v(i,p+1,j)*d; - s.a.a[i0] = a->v(i,p,j)*(1-d) + a->v(i,p+1,j)*d; - } - if(dir=='z') for(j=0;jv(i,j,p)*(1-d) + x->v(i,j,p+1)*d; - s.y.a[i0] = y->v(i,j,p)*(1-d) + y->v(i,j,p+1)*d; - s.z.a[i0] = z->v(i,j,p)*(1-d) + z->v(i,j,p+1)*d; - s.a.a[i0] = a->v(i,j,p)*(1-d) + a->v(i,j,p+1)*d; - } - } - else // x, y, z -- vectors - { - if(dir=='x') - { - v = x->v(p)*(1-d)+x->v(p+1)*d; - for(j=0;jv(i); s.z.a[i0] = z->v(j); - s.a.a[i0] = a->v(p,i,j)*(1-d) + a->v(p+1,i,j)*d; - } - } - if(dir=='y') - { - v = y->v(p)*(1-d)+y->v(p+1)*d; - for(j=0;jv(i); s.z.a[i0] = z->v(j); - s.a.a[i0] = a->v(i,p,j)*(1-d) + a->v(i,p+1,j)*d; - } - } - if(dir=='z') - { - v = z->v(p)*(1-d)+z->v(p+1)*d; - for(j=0;jv(i); s.y.a[i0] = y->v(j); - s.a.a[i0] = a->v(i,j,p)*(1-d) + a->v(i,j,p+1)*d; - } - } - } -} -//----------------------------------------------------------------------------- -void MGL_NO_EXPORT mgl_get_slice_md(_mgl_slice &s, const mglData *x, const mglData *y, const mglData *z, const mglData *a, char dir, mreal d, bool both) -{ - long n=a->nx,m=a->ny,l=a->nz, nx=1,ny=1,p; + register long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(), nx=1,ny=1,p; if(dir=='x') { nx = m; ny = l; if(d<0) d = n/2.; } if(dir=='y') { nx = n; ny = l; if(d<0) d = m/2.; } @@ -1041,66 +986,66 @@ void MGL_NO_EXPORT mgl_get_slice_md(_mgl_slice &s, const mglData *x, const mglDa #pragma omp parallel for collapse(2) for(long j=0;ja[i1]*(1-d) + x->a[i1+1]*d; - s.y.a[i0] = y->a[i1]*(1-d) + y->a[i1+1]*d; - s.z.a[i0] = z->a[i1]*(1-d) + z->a[i1+1]*d; - s.a.a[i0] = a->a[i1]*(1-d) + a->a[i1+1]*d; + register long i0 = i+nx*j; + s.x.a[i0] = x->v(p,i,j)*(1-d) + x->v(p+1,i,j)*d; + s.y.a[i0] = y->v(p,i,j)*(1-d) + y->v(p+1,i,j)*d; + s.z.a[i0] = z->v(p,i,j)*(1-d) + z->v(p+1,i,j)*d; + s.a.a[i0] = a->v(p,i,j)*(1-d) + a->v(p+1,i,j)*d; } if(dir=='y') #pragma omp parallel for collapse(2) for(long j=0;ja[i1]*(1-d) + x->a[i1+n]*d; - s.y.a[i0] = y->a[i1]*(1-d) + y->a[i1+n]*d; - s.z.a[i0] = z->a[i1]*(1-d) + z->a[i1+n]*d; - s.a.a[i0] = a->a[i1]*(1-d) + a->a[i1+n]*d; + register long i0 = i+nx*j; + s.x.a[i0] = x->v(i,p,j)*(1-d) + x->v(i,p+1,j)*d; + s.y.a[i0] = y->v(i,p,j)*(1-d) + y->v(i,p+1,j)*d; + s.z.a[i0] = z->v(i,p,j)*(1-d) + z->v(i,p+1,j)*d; + s.a.a[i0] = a->v(i,p,j)*(1-d) + a->v(i,p+1,j)*d; } if(dir=='z') #pragma omp parallel for collapse(2) for(long j=0;ja[i1]*(1-d) + x->a[i1+n*m]*d; - s.y.a[i0] = y->a[i1]*(1-d) + y->a[i1+n*m]*d; - s.z.a[i0] = z->a[i1]*(1-d) + z->a[i1+n*m]*d; - s.a.a[i0] = a->a[i1]*(1-d) + a->a[i1+n*m]*d; + register long i0 = i+nx*j; + s.x.a[i0] = x->v(i,j,p)*(1-d) + x->v(i,j,p+1)*d; + s.y.a[i0] = y->v(i,j,p)*(1-d) + y->v(i,j,p+1)*d; + s.z.a[i0] = z->v(i,j,p)*(1-d) + z->v(i,j,p+1)*d; + s.a.a[i0] = a->v(i,j,p)*(1-d) + a->v(i,j,p+1)*d; } } else // x, y, z -- vectors { if(dir=='x') { - v = x->a[p]*(1-d)+x->a[p+1]*d; + v = x->v(p)*(1-d)+x->v(p+1)*d; #pragma omp parallel for collapse(2) for(long j=0;ja[i]; s.z.a[i0] = z->a[j]; - s.a.a[i0] = a->a[i1]*(1-d) + a->a[i1+1]*d; + register long i0 = i+nx*j; s.x.a[i0] = v; + s.y.a[i0] = y->v(i); s.z.a[i0] = z->v(j); + s.a.a[i0] = a->v(p,i,j)*(1-d) + a->v(p+1,i,j)*d; } } if(dir=='y') { - v = y->a[p]*(1-d)+y->a[p+1]*d; + v = y->v(p)*(1-d)+y->v(p+1)*d; #pragma omp parallel for collapse(2) for(long j=0;ja[i]; s.y.a[i0] = v; s.z.a[i0] = z->a[j]; - s.a.a[i0] = a->a[i1]*(1-d) + a->a[i1+n]*d; + register long i0 = i+nx*j; s.y.a[i0] = v; + s.x.a[i0] = x->v(i); s.z.a[i0] = z->v(j); + s.a.a[i0] = a->v(i,p,j)*(1-d) + a->v(i,p+1,j)*d; } } if(dir=='z') { - v = z->a[p]*(1-d)+z->a[p+1]*d; + v = z->v(p)*(1-d)+z->v(p+1)*d; #pragma omp parallel for collapse(2) for(long j=0;ja[i]; s.y.a[i0] = y->a[j]; s.z.a[i0] = v; - s.a.a[i0] = a->a[i1]*(1-d) + a->a[i1+n*m]*d; + register long i0 = i+nx*j; s.z.a[i0] = v; + s.x.a[i0] = x->v(i); s.y.a[i0] = y->v(j); + s.a.a[i0] = a->v(i,j,p)*(1-d) + a->v(i,j,p+1)*d; } } } @@ -1117,18 +1062,14 @@ void MGL_EXPORT mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT if(mglchr(sch,'x')) dir='x'; if(mglchr(sch,'z')) dir='z'; - bool text=(mglchr(sch,'t')); + int text=0; + if(mglchr(sch,'t')) text=1; + if(mglchr(sch,'T')) text=2; long ss=gr->AddTexture(sch); gr->SetPenPal(sch); _mgl_slice s; - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - const mglData *mz = dynamic_cast(z); - const mglData *ma = dynamic_cast(a); - if(mx&&my&&mz&&ma) mgl_get_slice_md(s,mx,my,mz,ma,dir,sVal,both); - else mgl_get_slice(s,x,y,z,a,dir,sVal,both); -#pragma omp parallel for + mgl_get_slice(s,x,y,z,a,dir,sVal,both); for(long i=0;iGetNx();i++) { register mreal v0 = v->v(i); @@ -1140,7 +1081,7 @@ void MGL_EXPORT mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT void MGL_EXPORT mgl_cont3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -1205,12 +1146,7 @@ void MGL_EXPORT mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha if(mglchr(sch,'z')) dir='z'; _mgl_slice s; - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - const mglData *mz = dynamic_cast(z); - const mglData *ma = dynamic_cast(a); - if(mx&&my&&mz&&ma) mgl_get_slice_md(s,mx,my,mz,ma,dir,sVal,both); - else mgl_get_slice(s,x,y,z,a,dir,sVal,both); + mgl_get_slice(s,x,y,z,a,dir,sVal,both); mgl_surfc_xy(gr,&s.x,&s.y,&s.z,&s.a,sch,0); gr->EndGroup(); } @@ -1218,7 +1154,7 @@ void MGL_EXPORT mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha void MGL_EXPORT mgl_dens3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -1252,12 +1188,7 @@ void MGL_EXPORT mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha if(mglchr(sch,'z')) dir='z'; _mgl_slice s; - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - const mglData *mz = dynamic_cast(z); - const mglData *ma = dynamic_cast(a); - if(mx&&my&&mz&&ma) mgl_get_slice_md(s,mx,my,mz,ma,dir,sVal,both); - else mgl_get_slice(s,x,y,z,a,dir,sVal,both); + mgl_get_slice(s,x,y,z,a,dir,sVal,both); mgl_mesh_xy(gr,&s.x,&s.y,&s.z,sch,0); gr->EndGroup(); } @@ -1265,7 +1196,7 @@ void MGL_EXPORT mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha void MGL_EXPORT mgl_grid3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()), z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()), z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -1300,13 +1231,7 @@ void MGL_EXPORT mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT long ss=gr->AddTexture(sch); _mgl_slice s; - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - const mglData *mz = dynamic_cast(z); - const mglData *ma = dynamic_cast(a); - if(mx&&my&&mz&&ma) mgl_get_slice_md(s,mx,my,mz,ma,dir,sVal,both); - else mgl_get_slice(s,x,y,z,a,dir,sVal,both); -#pragma omp parallel for + mgl_get_slice(s,x,y,z,a,dir,sVal,both); for(long i=0;iGetNx()-1;i++) { register mreal v0 = v->v(i); @@ -1318,7 +1243,7 @@ void MGL_EXPORT mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT void MGL_EXPORT mgl_contf3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -1330,7 +1255,7 @@ void MGL_EXPORT mgl_contf3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const ch mreal r = gr->SaveState(opt); long Num = mgl_isnan(r)?7:long(r+0.5); if(Num<1) { gr->SetWarn(mglWarnCnt,"ContF3"); return; } - mglData v(Num+2); v.Fill(gr->Min.c, gr->Max.c); + mglDataV v(Num+2); v.Fill(gr->Min.c, gr->Max.c); mgl_contf3_xyz_val(gr,&v,x,y,z,a,sch,sVal,0); } //----------------------------------------------------------------------------- @@ -1339,7 +1264,7 @@ void MGL_EXPORT mgl_contf3(HMGL gr, HCDT a, const char *sch, double sVal, const mreal r = gr->SaveState(opt); long Num = mgl_isnan(r)?7:long(r+0.5); if(Num<1) { gr->SetWarn(mglWarnCnt,"ContF3"); return; } - mglData v(Num+2); v.Fill(gr->Min.c, gr->Max.c); + mglDataV v(Num+2); v.Fill(gr->Min.c, gr->Max.c); mgl_contf3_val(gr,&v,a,sch,sVal,0); } //----------------------------------------------------------------------------- @@ -1371,7 +1296,7 @@ delete []o; delete []s; } // Axial series // //----------------------------------------------------------------------------- -long MGL_NO_EXPORT mgl_find_prev(long i, long pc, long *nn) +long MGL_LOCAL_PURE mgl_find_prev(long i, long pc, long *nn) { for(long k=0;kReserve(pc*82); - for(i=0;iStop) return; - k = mgl_find_prev(i,pc,nn); if(nn[i]<0) continue; + register long k = mgl_find_prev(i,pc,nn); q1 = k<0 ? ff[nn[i]]-ff[i] : (ff[nn[i]]-ff[k])*0.5; q2 = nn[nn[i]]<0 ? ff[nn[i]]-ff[i] : (ff[nn[nn[i]]]-ff[i])*0.5; @@ -1401,7 +1324,7 @@ void MGL_NO_EXPORT mgl_axial_plot(mglBase *gr,long pc, mglPoint *ff, long *nn,ch if(wire==1) gr->line_plot(p1,p2); else if(wire) { gr->mark_plot(p1,'.'); gr->mark_plot(p2,'.'); } - for(j=1;j<41;j++) + for(long j=1;j<41;j++) { p3 = p1; p4 = p2; register float co = mgl_cos[(j*18)%360], si = mgl_cos[(270+j*18)%360]; @@ -1427,8 +1350,7 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal { gr->SetWarn(mglWarnDim,"ContGen"); return; } mglPoint *kk = new mglPoint[2*n*m],*pp = new mglPoint[2*n*m],p; - mreal d, kx, ky; - register long i,j,k, pc=0,i0; + long pc=0; // Usually number of points is much smaller. So, there is no reservation. // gr->Reserve(2*n*m); @@ -1436,11 +1358,10 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal const mglData *mx = dynamic_cast(x); const mglData *my = dynamic_cast(y); const mglData *ma = dynamic_cast(a); - if(mx&&my&&ma) for(j=0;jStop) { delete []kk; delete []pp; return; } - i0 = i+n*j; - d = (ia[i0+n*m*ak],ma->a[i0+1+n*m*ak]):-1; + register long i0 = i+n*j; + mreal d = (ia[i0+n*m*ak],ma->a[i0+1+n*m*ak]):-1; if(d>=0 && d<1) { pp[pc] = mglPoint(mx->a[i0]*(1-d)+mx->a[i0+1]*d, my->a[i0]*(1-d)+my->a[i0+1]*d); @@ -1453,11 +1374,10 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal kk[pc] = mglPoint(i,j+d); pc++; } } - else for(j=0;jStop) { delete []kk; delete []pp; return; } register mreal va=a->v(i,j,ak),vx=x->v(i,j),vy=y->v(i,j); - d = (iv(i+1,j,ak)):-1; + mreal d = (iv(i+1,j,ak)):-1; if(d>=0 && d<1) { pp[pc] = mglPoint(vx*(1-d)+x->v(i+1,j)*d, vy*(1-d)+y->v(i+1,j)*d); @@ -1474,22 +1394,20 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal if(pc==0) { delete []kk; delete []pp; return; } // allocate arrays for curve long *nn = new long[pc], *ff = new long[pc]; - for(i=0;iStop) { delete []kk; delete []pp; delete []nn; delete []ff; return; } if(j>=0) { - kx = kk[j].x; ky = kk[j].y; i = -1; - i11 = long(kx+1e-5); i12 = long(kx-1e-5); - j11 = long(ky+1e-5); j12 = long(ky-1e-5); - for(k=0;k=0); @@ -1529,25 +1447,18 @@ void MGL_EXPORT mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const if(x->GetNx()*x->GetNy()!=m*n || y->GetNx()*y->GetNy()!=m*n) // make { xx.Create(n, m); yy.Create(n, m); - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - if(mx && my) -#pragma omp parallel for collapse(2) - for(long i=0;ia[i]; yy.a[i+n*j] = my->a[j]; } - else -#pragma omp parallel for collapse(2) - for(long i=0;iv(i); yy.a[i+n*j] = y->v(j); } + for(long i=0;iv(i); + for(long j=1;jv(j); for(long i=0;iGetNz();j++) for(long i=0;iGetNx();i++) + for(long i=0;iGetNx();i++) for(long j=0;jGetNz();j++) { - if(gr->Stop) continue; + if(gr->NeedStop()) { i = v->GetNx(); j = z->GetNz(); continue; } register mreal v0 = v->v(i); mgl_axial_gen(gr,v0,z,x,y,gr->GetC(s,v0),dir,j,wire); } @@ -1559,7 +1470,7 @@ void MGL_EXPORT mgl_axial_val(HMGL gr, HCDT v, HCDT a, const char *sch, const ch register long n=a->GetNx(), m=a->GetNy(); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"Axial"); return; } gr->SaveState(opt); - mglData x(n, m), y(n, m); + mglDataV x(n, m), y(n, m); if(gr->Max.x*gr->Min.x>=0) x.Fill(gr->Min.x,gr->Max.x,'x'); else x.Fill(0,gr->Max.x,'x'); y.Fill(gr->Min.y,gr->Max.y,'y'); diff --git a/src/cont.hpp b/src/cont.hpp new file mode 100644 index 0000000..8315684 --- /dev/null +++ b/src/cont.hpp @@ -0,0 +1,42 @@ +/*************************************************************************** + * cont.cpp is part of Math Graphic Library + * Copyright (C) 2007-2014 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program 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 Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +//----------------------------------------------------------------------------- +struct mglSegment +{ + mglPoint p1,p2; // edges + std::list pp; + bool set(mreal u1,mreal v1,mreal u2,mreal v2,long i,long j,long k,HCDT x, HCDT y, HCDT z) + { + bool res=(v1>=0 && v1<=MGL_FEPSILON && u1>=0 && u1<=MGL_FEPSILON && v2>=0 && v2<=MGL_FEPSILON && u2>=0 && u2<=MGL_FEPSILON); + if(v1==v2 && u1==u2) res=false; // NOTE: shouldn't be here never + if(res) + { + p1 = mglPoint(mgl_data_linear(x,i+u1,j+v1,k), mgl_data_linear(y,i+u1,j+v1,k), mgl_data_linear(z,i+u1,j+v1,k)); + p2 = mglPoint(mgl_data_linear(x,i+u2,j+v2,k), mgl_data_linear(y,i+u2,j+v2,k), mgl_data_linear(z,i+u2,j+v2,k)); + } + return res; + } + void before(const mglPoint &p) { p1 = p; pp.push_front(p); } + void after(const mglPoint &p) { p2 = p; pp.push_back(p); } +}; +//----------------------------------------------------------------------------- +std::vector MGL_EXPORT mgl_get_curvs(HMGL gr, std::vector lines); +void MGL_NO_EXPORT mgl_draw_curvs(HMGL gr, mreal val, mreal c, int text, const std::vector &curvs); +//----------------------------------------------------------------------------- diff --git a/src/crust.cpp b/src/crust.cpp index 95f4c44..f97453b 100644 --- a/src/crust.cpp +++ b/src/crust.cpp @@ -18,6 +18,8 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include +#include +#include #include "mgl2/other.h" #include "mgl2/data.h" #include "mgl2/thread.h" @@ -35,17 +37,15 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD long ss=gr->AddTexture(sch); gr->SaveState(opt); gr->SetPenPal("-"); static int cgid=1; gr->StartGroup("TriPlot",cgid++); - mglPoint p1,p2,p3,q; bool wire = mglchr(sch,'#'); long nc = a->GetNx(); if(nc!=n && nc>=m) // colors per triangle { + mglPoint p1,p2,p3,q; gr->Reserve(m*3); -#pragma omp parallel for private(p1,p2,p3,q) for(long i=0;iStop) continue; register long k1 = long(nums->v(0,i)+0.5); p1 = mglPoint(x->v(k1), y->v(k1), z->v(k1)); register long k2 = long(nums->v(1,i)+0.5); @@ -64,10 +64,8 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD gr->Reserve(n); long *kk = new long[n]; mglPoint *pp = new mglPoint[n]; -#pragma omp parallel for for(long i=0;iStop) continue; register long k1 = long(nums->v(0,i)+0.5); register long k2 = long(nums->v(1,i)+0.5); register long k3 = long(nums->v(2,i)+0.5); @@ -78,21 +76,14 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD q.Normalize(); // try be sure that in the same direction ... if(q.z<0) q *= -1; -#pragma omp critical(quadplot) - {pp[k1] += q; pp[k2] += q; pp[k3] += q;} + pp[k1] += q; pp[k2] += q; pp[k3] += q; } else pp[k1]=pp[k2]=pp[k3]=mglPoint(NAN,NAN); } -#pragma omp parallel for for(long i=0;iStop) continue; kk[i] = gr->AddPnt(mglPoint(x->v(i), y->v(i), z->v(i)), gr->GetC(ss,a->v(i)), pp[i]); - } -#pragma omp parallel for for(long i=0;iStop) continue; register long k1 = long(nums->v(0,i)+0.5); register long k2 = long(nums->v(1,i)+0.5); register long k3 = long(nums->v(2,i)+0.5); @@ -155,10 +146,8 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC if(nc!=n && nc>=m) // colors per triangle { gr->Reserve(m*4); -#pragma omp parallel for private(p1,p2,p3,p4) for(long i=0;iStop) continue; register long k1 = long(nums->v(0,i)+0.5); p1 = mglPoint(x->v(k1), y->v(k1), z->v(k1)); register long k2 = long(nums->v(1,i)+0.5); @@ -180,10 +169,8 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC gr->Reserve(n); long *kk = new long[n]; mglPoint *pp = new mglPoint[n]; -#pragma omp parallel for private(p1,p2,p3,p4) for(long i=0;iStop) continue; register long k1 = long(nums->v(0,i)+0.5); p1 = mglPoint(x->v(k1), y->v(k1), z->v(k1)); register long k2 = long(nums->v(1,i)+0.5); @@ -200,20 +187,13 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC mglPoint q2 = (p2-p4) ^ (p3-p4); if(q2.z<0) q2*=-1; mglPoint q3 = (p1-p2) ^ (p4-p2); if(q3.z<0) q3*=-1; mglPoint q4 = (p1-p4) ^ (p4-p3); if(q4.z<0) q4*=-1; -#pragma omp critical(quadplot) - {pp[k1] += q1; pp[k2] += q2; pp[k3] += q3; pp[k4] += q4;} + pp[k1] += q1; pp[k2] += q2; pp[k3] += q3; pp[k4] += q4; } } -#pragma omp parallel for for(long i=0;iStop) continue; kk[i] = gr->AddPnt(mglPoint(x->v(i), y->v(i), z->v(i)),gr->GetC(ss,a->v(i)), pp[i]); - } -#pragma omp parallel for for(long i=0;iStop) continue; register long k1 = floor(nums->v(0,i)+0.5); register long k2 = floor(nums->v(1,i)+0.5); register long k3 = floor(nums->v(2,i)+0.5); @@ -261,49 +241,59 @@ void MGL_EXPORT mgl_quadplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, u // TriCont series // //----------------------------------------------------------------------------- -void MGL_EXPORT mgl_tricont_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt) +#include "cont.hpp" +//----------------------------------------------------------------------------- +std::vector MGL_NO_EXPORT mgl_tri_lines(mreal val, HCDT nums, HCDT a, HCDT x, HCDT y, HCDT z) { long n = x->GetNx(), m = nums->GetNy(); - if(mgl_check_trig(gr,nums,x,y,z,a,"TriCont")) return; - - long ss=gr->AddTexture(sch); - gr->SaveState(opt); - static int cgid=1; gr->StartGroup("TriCont",cgid++); - bool zVal = !(mglchr(sch,'_')); - mglPoint p1,p2,p3; -#pragma omp parallel for private(p1,p2,p3) collapse(2) - for(long k=0;kGetNx();k++) for(long i=0;i lines; + for(long i=0;iStop) continue; register long k1 = long(nums->v(0,i)+0.1); if(k1<0 || k1>=n) continue; register long k2 = long(nums->v(1,i)+0.1); if(k2<0 || k2>=n) continue; register long k3 = long(nums->v(2,i)+0.1); if(k3<0 || k3>=n) continue; - register mreal val = v->v(k), c = gr->GetC(ss,val), d1,d2,d3; - - d1 = mgl_d(val,a->v(k1),a->v(k2)); - p1 = mglPoint(x->v(k1)*(1-d1)+x->v(k2)*d1, y->v(k1)*(1-d1)+y->v(k2)*d1, - zVal?z->v(k1)*(1-d1)+z->v(k2)*d1:gr->Min.z); - d2 = mgl_d(val,a->v(k1),a->v(k3)); - p2 = mglPoint(x->v(k1)*(1-d2)+x->v(k3)*d2, y->v(k1)*(1-d2)+y->v(k3)*d2, - zVal?z->v(k1)*(1-d2)+z->v(k3)*d2:gr->Min.z); - d3 = mgl_d(val,a->v(k2),a->v(k3)); - p3 = mglPoint(x->v(k2)*(1-d3)+x->v(k3)*d3, y->v(k2)*(1-d3)+y->v(k3)*d3, - zVal?z->v(k2)*(1-d3)+z->v(k3)*d3:gr->Min.z); + register mreal v1 = a->v(k1), v2 = a->v(k2), v3 = a->v(k3); + register mreal d1 = mgl_d(val,v1,v2), d2 = mgl_d(val,v1,v3), d3 = mgl_d(val,v2,v3); + mglSegment line; if(d1>=0 && d1<=1 && d2>=0 && d2<=1) { - k1 = gr->AddPnt(p1,c); k2 = gr->AddPnt(p2,c); - gr->line_plot(k1,k2); + line.p1 = mglPoint(x->v(k1)*(1-d1)+x->v(k2)*d1, y->v(k1)*(1-d1)+y->v(k2)*d1, z->v(k1)*(1-d1)+z->v(k2)*d1); + line.p2 = mglPoint(x->v(k1)*(1-d2)+x->v(k3)*d2, y->v(k1)*(1-d2)+y->v(k3)*d2, z->v(k1)*(1-d2)+z->v(k3)*d2); } else if(d1>=0 && d1<=1 && d3>=0 && d3<=1) { - k1 = gr->AddPnt(p1,c); k2 = gr->AddPnt(p3,c); - gr->line_plot(k1,k2); + line.p1 = mglPoint(x->v(k1)*(1-d1)+x->v(k2)*d1, y->v(k1)*(1-d1)+y->v(k2)*d1, z->v(k1)*(1-d1)+z->v(k2)*d1); + line.p2 = mglPoint(x->v(k2)*(1-d3)+x->v(k3)*d3, y->v(k2)*(1-d3)+y->v(k3)*d3, z->v(k2)*(1-d3)+z->v(k3)*d3); } else if(d3>=0 && d3<=1 && d2>=0 && d2<=1) { - k1 = gr->AddPnt(p3,c); k2 = gr->AddPnt(p2,c); - gr->line_plot(k1,k2); + line.p1 = mglPoint(x->v(k1)*(1-d2)+x->v(k3)*d2, y->v(k1)*(1-d2)+y->v(k3)*d2, z->v(k1)*(1-d2)+z->v(k3)*d2); + line.p2 = mglPoint(x->v(k2)*(1-d3)+x->v(k3)*d3, y->v(k2)*(1-d3)+y->v(k3)*d3, z->v(k2)*(1-d3)+z->v(k3)*d3); } + if(line.p1!=line.p2) lines.push_back(line); + } + return lines; +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_tricont_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt) +{ + mglDataV zz(x->GetNx(),x->GetNy()); + if(!z) z = &zz; + if(mgl_check_trig(gr,nums,x,y,z,a,"TriCont")) return; + + gr->SaveState(opt); + static int cgid=1; gr->StartGroup("TriCont",cgid++); + int text=0; + if(mglchr(sch,'t')) text=1; + if(mglchr(sch,'T')) text=2; + bool fixed=(mglchr(sch,'_')) || (gr->Min.z==gr->Max.z); + long s=gr->AddTexture(sch); + gr->SetPenPal(sch); + + for(long k=0;kGetNx();k++) + { + mreal v0 = v->v(k); zz.Fill(fixed ? gr->Min.z : v0); + mgl_draw_curvs(gr,v0,gr->GetC(s,v0),text,mgl_get_curvs(gr,mgl_tri_lines(v0,nums,a,x,y,fixed?&zz:z))); } } //----------------------------------------------------------------------------- @@ -317,10 +307,10 @@ void MGL_EXPORT mgl_tricont_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_tricont_xyc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) -{ mgl_tricont_xyzc(gr,nums,x,y,z,z,sch,opt); } +{ mgl_tricont_xyzc(gr,nums,x,y,0,z,sch,opt); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_tricont_xycv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) -{ mgl_tricont_xyzcv(gr,v,nums,x,y,z,z,sch,opt); } +{ mgl_tricont_xyzcv(gr,v,nums,x,y,0,z,sch,opt); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_tricont_xyzcv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int l,int lo) { char *s=new char[l+1]; memcpy(s,sch,l); s[l]=0; @@ -347,6 +337,85 @@ void MGL_EXPORT mgl_tricont_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, u delete []o; delete []s; } //----------------------------------------------------------------------------- // +// TriContV series +// +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_tricontv_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt) +{ + mglDataV zz(x->GetNx(),x->GetNy()); + if(!z) z = &zz; + if(mgl_check_trig(gr,nums,x,y,z,a,"TriContV")) return; + + gr->SaveState(opt); + static int cgid=1; gr->StartGroup("TriContV",cgid++); + bool fixed=(mglchr(sch,'_')) || (gr->Min.z==gr->Max.z); + long s=gr->AddTexture(sch); + gr->SetPenPal(sch); + + for(long k=0;kGetNx();k++) + { + mreal v0 = v->v(k); zz.Fill(fixed ? gr->Min.z : v0); + mreal dv = (gr->Max.c-gr->Min.c)/8, c = gr->GetC(s,v0); + if(k>0) dv = v->v(k-1)-v->v(k); + else if(kGetNx()-1) dv = v->v(k)-v->v(k+1); + if(fixed) dv=-dv; + + const std::vector curvs = mgl_get_curvs(gr,mgl_tri_lines(v0,nums,a,x,y,fixed?&zz:z)); + for(size_t i=0;i &pp=curvs[i].pp; + long f2=-1,g2=-1; + for(std::list::const_iterator it=pp.begin(); it != pp.end(); ++it) + { + mglPoint p=*it,q(p.y,-p.x); + long f1 = f2; f2 = gr->AddPnt(p,c,q); p.z+=dv; + long g1 = g2; g2 = gr->AddPnt(p,c,q); + gr->quad_plot(f1,g1,f2,g2); + } + } + } +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_tricontv_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt) +{ + mreal r = gr->SaveState(opt); + long n = (mgl_isnan(r) || r<=0) ? 7:long(r+0.5); + mglData v(n); + for(long i=0;iMin.c + (gr->Max.c-gr->Min.c)*mreal(i+1)/(n+1); + mgl_tricontv_xyzcv(gr,&v,nums,x,y,z,a,sch,0); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_tricontv_xyc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) +{ mgl_tricontv_xyzc(gr,nums,x,y,0,z,sch,opt); } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_tricontv_xycv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) +{ mgl_tricontv_xyzcv(gr,v,nums,x,y,0,z,sch,opt); } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_tricontv_xyzcv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int l,int lo) +{ char *s=new char[l+1]; memcpy(s,sch,l); s[l]=0; + char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; + mgl_tricontv_xyzcv(_GR_, _DA_(v), _DA_(nums), _DA_(x), _DA_(y), _DA_(z), _DA_(c), s, o); + delete []o; delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_tricontv_xycv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int l,int lo) +{ char *s=new char[l+1]; memcpy(s,sch,l); s[l]=0; + char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; + mgl_tricontv_xycv(_GR_, _DA_(v), _DA_(nums), _DA_(x), _DA_(y), _DA_(z), s, o); + delete []o; delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_tricontv_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt, int l,int lo) +{ char *s=new char[l+1]; memcpy(s,sch,l); s[l]=0; + char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; + mgl_tricontv_xyzc(_GR_, _DA_(nums), _DA_(x), _DA_(y), _DA_(z), _DA_(c), s, o); + delete []o; delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_tricontv_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt, int l,int lo) +{ char *s=new char[l+1]; memcpy(s,sch,l); s[l]=0; + char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; + mgl_tricontv_xyc(_GR_, _DA_(nums), _DA_(x), _DA_(y), _DA_(z), s, o); + delete []o; delete []s; } +//----------------------------------------------------------------------------- +// // Dots series // //----------------------------------------------------------------------------- @@ -368,10 +437,8 @@ void MGL_EXPORT mgl_dots_ca(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, con if(mk==0) mk='.'; gr->Reserve(n); -#pragma omp parallel for for(long i=0;iStop) continue; mglPoint p = mglPoint(x->vthr(i),y->vthr(i),z->vthr(i)); long pp = gr->AddPnt(p,gr->GetC(ss,c->vthr(i)),mglPoint(NAN),a?gr->GetA(a->vthr(i)):-1); gr->mark_plot(pp, mk); @@ -406,20 +473,18 @@ void MGL_EXPORT mgl_dots_ca_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_ //----------------------------------------------------------------------------- long MGL_NO_EXPORT mgl_crust(long n,mglPoint *pp,long **nn,mreal ff); HMDT MGL_EXPORT mgl_triangulation_3d(HCDT x, HCDT y, HCDT z) -{ // TODO: should be used s-hull or q-hull +{ mglData *nums=0; long n = x->GetNx(), m; if(y->GetNx()!=n || z->GetNx()!=n) return nums; mglPoint *pp = new mglPoint[n]; long *nn=0; -#pragma omp parallel for for(long i=0;iv(i), y->v(i), z->v(i)); m = mgl_crust(n,pp,&nn,0); if(m>0) { nums=new mglData(3,m); -#pragma omp parallel for for(long i=0;i<3*m;i++) nums->a[i]=nn[i]; } delete []pp; free(nn); return nums; @@ -433,18 +498,32 @@ HMDT MGL_EXPORT mgl_triangulation_2d(HCDT x, HCDT y) if(y->GetNN()!=n) return nums; // use s-hull here std::vector pts; - std::vector out; + std::vector out; Shx pt; + double mx = 0, my = 0; for(long i=0;ivthr(i); pt.c = y->vthr(i); pt.id = i; pts.push_back(pt); } + { + register double t; + t = fabs(x->vthr(i)); if(t>mx) mx=t; + t = fabs(y->vthr(i)); if(t>my) my=t; + } + mx *= 1e-15; my *= 1e-15; + for(long i=0;ivthr(i); pt.c = y->vthr(i); + if(mgl_isbad(pt.r) || mgl_isbad(pt.c)) continue; + if(fabs(pt.r) triads; if(de_duplicate(pts, out)) mglGlobalMess += "There are duplicated points for triangulation.\n"; s_hull_pro(pts, triads); long m = triads.size(); nums=new mglData(3,m); -#pragma omp parallel for for(long i=0;ia[3*i] = triads[i].a; @@ -468,15 +547,17 @@ MGL_NO_EXPORT void *mgl_grid_t(void *par) mglThreadD *t=(mglThreadD *)par; long nx=t->p[0],ny=t->p[1]; mreal *b=t->a; - const mreal *x=t->b, *y=t->c, *d=t->d, *z=t->e; + const mreal *x=t->b, *y=t->c, *d=t->d; + HCDT zdat = (HCDT) t->v; #if !MGL_HAVE_PTHREAD #pragma omp parallel for #endif for(long i0=t->id;i0n;i0+=mglNumThr) - { // TODO check if rounding needed - register long k1 = long(d[3*i0]), k2 = long(d[3*i0+1]), k3 = long(d[3*i0+2]); + { + register long k1 = long(d[3*i0]+0.5), k2 = long(d[3*i0+1]+0.5), k3 = long(d[3*i0+2]+0.5); mreal dxu,dxv,dyu,dyv; - mglPoint d1=mglPoint(x[k2]-x[k1],y[k2]-y[k1],z[k2]-z[k1]), d2=mglPoint(x[k3]-x[k1],y[k3]-y[k1],z[k3]-z[k1]), p; + mreal z1=zdat->vthr(k1), z2=zdat->vthr(k2), z3=zdat->vthr(k3); + mglPoint d1=mglPoint(x[k2]-x[k1],y[k2]-y[k1],z2-z1), d2=mglPoint(x[k3]-x[k1],y[k3]-y[k1],z3-z1), p; dxu = d2.x*d1.y - d1.x*d2.y; if(fabs(dxu)<1e-5) continue; // points lies on the same line @@ -484,10 +565,10 @@ MGL_NO_EXPORT void *mgl_grid_t(void *par) dyu = d2.x/dxu; dxu =-d2.y/dxu; long x1,y1,x2,y2; - x1 = long(fmin(fmin(x[k1],x[k2]),x[k3])); // bounding box - y1 = long(fmin(fmin(y[k1],y[k2]),y[k3])); - x2 = long(fmax(fmax(x[k1],x[k2]),x[k3])); - y2 = long(fmax(fmax(y[k1],y[k2]),y[k3])); + x1 = long(mgl_min(mgl_min(x[k1],x[k2]),x[k3])); // bounding box + y1 = long(mgl_min(mgl_min(y[k1],y[k2]),y[k3])); + x2 = long(mgl_max(mgl_max(x[k1],x[k2]),x[k3])); + y2 = long(mgl_max(mgl_max(y[k1],y[k2]),y[k3])); x1 = x1>0 ? x1:0; x2 = x20 ? y1:0; y2 = y2x2) | (y1>y2)) continue; @@ -499,7 +580,7 @@ MGL_NO_EXPORT void *mgl_grid_t(void *par) xx = (i-x0); yy = (j-y0); u = dxu*xx+dyu*yy; v = dxv*xx+dyv*yy; if((u<0) | (v<0) | (u+v>1)) continue; - b[i+nx*j] = z[k1] + d1.z*u + d2.z*v; + b[i+nx*j] = z1 + d1.z*u + d2.z*v; } } return 0; @@ -509,25 +590,28 @@ void MGL_EXPORT mgl_data_grid_xy(HMDT d, HCDT xdat, HCDT ydat, HCDT zdat, mreal { // NOTE: only for mglData const mglData *x = dynamic_cast(xdat); const mglData *y = dynamic_cast(ydat); - const mglData *z = dynamic_cast(zdat); - if(!x || !y || !z) return; - long n=x->GetNN(); - if((n<3) || (y->GetNN()!=n) || (z->GetNN()!=n)) return; + long n=xdat->GetNN(); + if((n<3) || (ydat->GetNN()!=n) || (zdat->GetNN()!=n)) return; - mglData *nums = mgl_triangulation_2d(x,y); + mglData *nums = mgl_triangulation_2d(xdat,ydat); if(nums->nx<3) { delete nums; return; } long nn = nums->ny, par[3]={d->nx,d->ny,d->nz}; - mreal xx[4]={x1,0, y1,0}; - if(d->nx>1) xx[1] = (d->nx-1.)/(x2-x1); - if(d->ny>1) xx[3] = (d->ny-1.)/(y2-y1); + mreal xx[4]={x1,(d->nx-1.)/(x2-x1), y1,(d->ny-1.)/(y2-y1)}; mreal *xc=new mreal[n], *yc=new mreal[n]; + if(x && y) +#pragma omp parallel for + for(long i=0;ia[i]-xx[0]); yc[i]=xx[3]*(y->a[i]-xx[2]); } + else #pragma omp parallel for - for(long i=0;ia[i]-xx[0]); yc[i]=xx[3]*(y->a[i]-xx[2]); } + for(long i=0;ivthr(i)-xx[0]); yc[i]=xx[3]*(ydat->vthr(i)-xx[2]); } + long tmp = d->nx*d->ny*d->nz; #pragma omp parallel for - for(long i=0;inx*d->ny*d->nz;i++) d->a[i] = NAN; + for(long i=0;ia[i] = NAN; - mglStartThread(mgl_grid_t,0,nn,d->a,xc,yc,par,0,nums->a,z->a); + mglStartThread(mgl_grid_t,0,nn,d->a,xc,yc,par,zdat,nums->a); delete nums; delete []xc; delete []yc; } void MGL_EXPORT mgl_data_grid_xy_(uintptr_t *d, uintptr_t *x, uintptr_t *y, uintptr_t *z, mreal *x1, mreal *x2, mreal *y1, mreal *y2) diff --git a/src/data.cpp b/src/data.cpp index b886cd8..b2cdb26 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -19,6 +19,7 @@ ***************************************************************************/ #include #include "mgl2/data.h" +#include "mgl2/datac.h" #include "mgl2/eval.h" #include "mgl2/thread.h" #include "interp.hpp" @@ -115,13 +116,16 @@ void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, mreal *a, const v } } //----------------------------------------------------------------------------- -mreal mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx, mreal *dy, mreal *dz) +mreal MGL_EXPORT_PURE mglSpline3s(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) +{ return mglSpline3st(a,nx,ny,nz,x,y,z); } +//----------------------------------------------------------------------------- +mreal MGL_EXPORT_PURE mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx, mreal *dy, mreal *dz) { return mglSpline3t(a,nx,ny,nz,x,y,z,dx,dy,dz); } //----------------------------------------------------------------------------- -mreal mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) +mreal MGL_EXPORT_PURE mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) { return mglLineart(a,nx,ny,nz,x,y,z); } //----------------------------------------------------------------------------- -double mgl_ipow(double x,int n) +double MGL_EXPORT_CONST mgl_ipow(double x,int n) { double t; if(n==2) return x*x; @@ -132,7 +136,7 @@ double mgl_ipow(double x,int n) if(n%2==1) t *= x; return t; } -double mgl_ipow_(mreal *x,int *n) { return mgl_ipow(*x,*n); } +double MGL_EXPORT_PURE mgl_ipow_(mreal *x,int *n) { return mgl_ipow(*x,*n); } //----------------------------------------------------------------------------- double mgl_get_time(const char *time, const char *fmt) { @@ -896,35 +900,37 @@ HMDT MGL_EXPORT mgl_data_solve(HCDT dat, mreal val, char dir, HCDT i0, int norm) const mglData *d = dynamic_cast(dat); long p[4]={dat->GetNx(), dat->GetNy(), dat->GetNz(), norm}; const mreal *ii=0; - mglData *r=new mglData; + mglData *r=new mglData, id0; + if(i0 && !i) { id0.Set(i0); i=&id0; } // <-- slow but should work if(dir=='x' && p[0]>1) { r->Create(p[1],p[2]); - if(i && i->nx*i->ny==p[1]*p[2]) ii = i->a; + ii = (i && i->nx*i->ny==p[1]*p[2])?i->a:0; mglStartThread(mgl_solve_x,0,p[1]*p[2],r->a,d?d->a:0,ii,p,dat,&val); } if(dir=='y' && p[1]>1) { r->Create(p[0],p[2]); - if(i && i->nx*i->ny==p[0]*p[2]) ii = i->a; + ii = (i && i->nx*i->ny==p[0]*p[2])?i->a:0; mglStartThread(mgl_solve_y,0,p[0]*p[2],r->a,d?d->a:0,ii,p,dat,&val); } if(dir=='z' && p[2]>1) { r->Create(p[0],p[1]); - if(i && i->nx*i->ny==p[0]*p[1]) ii = i->a; + ii = (i && i->nx*i->ny==p[0]*p[1])?i->a:0; mglStartThread(mgl_solve_z,0,p[0]*p[1],r->a,d?d->a:0,ii,p,dat,&val); } return r; } //----------------------------------------------------------------------------- -mreal MGL_EXPORT mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0) +mreal MGL_EXPORT_PURE mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0) { mreal x=0, y1, y2, a, a0, dx=0, da = 1e-5*(val?fabs(val):1); long nx = d->GetNx(); if(i0<0 || i0>=nx) i0=0; if(val==d->v(i0+1)) return i0+1; const mglData *dd=dynamic_cast(d); + const mglDataC *dc=dynamic_cast(d); if(dd) for(long i=i0+1;ia[i-1]; y2=dd->a[i]; @@ -942,6 +948,25 @@ mreal MGL_EXPORT mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0) return x; } } + else if(dc) for(long i=i0+1;ia[i-1]); y2=abs(dc->a[i]); + if((y1-val)*(y2-val)<=0) + { + x = i-1 + (val-y1)/(y2-y1); + dual cx, ca = mglSpline1t(dc->a,nx,x,&cx); + a0 = a = abs(ca); dx = a?(cx.real()*ca.real()+cx.imag()*ca.imag())/a:0; + if(spl) for(unsigned k=0;fabs(a-val)>da || dx==0;) + { + x += (val-a)/dx; k++; + ca = mglSpline1t(dc->a,nx,x,&cx); + a = abs(ca); dx = a?(cx.real()*ca.real()+cx.imag()*ca.imag())/a:0; + if(k>=10) + return fabs(a-val)v(i-1); y2=d->v(i); @@ -951,8 +976,9 @@ mreal MGL_EXPORT mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0) return NAN; } //----------------------------------------------------------------------------- -mreal MGL_EXPORT mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz) +mreal MGL_EXPORT_PURE mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz) { + if(!d) return NAN; long kx=long(x), ky=long(y), kz=long(z); mreal b0,b1; const mglData *dd=dynamic_cast(d); @@ -1023,32 +1049,52 @@ mreal MGL_EXPORT mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx, return b0 + z*(b1-b0); } //----------------------------------------------------------------------------- -mreal MGL_EXPORT mgl_data_linear(HCDT d, mreal x,mreal y,mreal z) +mreal MGL_EXPORT_PURE mgl_data_linear(HCDT d, mreal x,mreal y,mreal z) { return mgl_data_linear_ext(d, x,y,z, 0,0,0); } //----------------------------------------------------------------------------- -mreal MGL_EXPORT mgl_data_spline(HCDT d, mreal x,mreal y,mreal z) +mreal MGL_EXPORT_PURE mgl_data_spline(HCDT d, mreal x,mreal y,mreal z) { + if(mgl_isbad(x) || mgl_isbad(y) || mgl_isbad(z)) return NAN; const mglData *dd=dynamic_cast(d); - if(!d) return 0; // NOTE: don't support general arrays - return dd->ny*dd->nz==1?mglSpline1st(dd->a,dd->nx,x):mglSpline3st(dd->a,dd->nx,dd->ny,dd->nz,x,y,z); + if(dd) return dd->ny*dd->nz==1?mglSpline1st(dd->a,dd->nx,x):mglSpline3st(dd->a,dd->nx,dd->ny,dd->nz,x,y,z); + const mglDataC *dc=dynamic_cast(d); + if(dc) return abs(dc->ny*dc->nz==1?mglSpline1st(dc->a,dc->nx,x):mglSpline3st(dc->a,dc->nx,dc->ny,dc->nz,x,y,z)); + const mglDataV *dv=dynamic_cast(d); + if(dv) return dv->value(x,y,z); + const mglDataF *df=dynamic_cast(d); + if(df) return df->value(x,y,z); + return 0; // TODO non-mglData: spline mglDataT, mglDataR } //----------------------------------------------------------------------------- -mreal MGL_EXPORT mgl_data_spline_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz) +mreal MGL_EXPORT_PURE mgl_data_spline_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz) { + if(mgl_isbad(x) || mgl_isbad(y) || mgl_isbad(z)) return NAN; const mglData *dd=dynamic_cast(d); - if(!d) return 0; // NOTE: don't support general arrays - return mglSpline3t(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz); + if(dd) return mglSpline3t(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz); + const mglDataC *dc=dynamic_cast(d); + if(dc) + { dual a,ax,ay,az; mreal res; + a = mglSpline3t(dc->a,dc->nx,dc->ny,dc->nz,x,y,z,&ax,&ay,&az); res = abs(a); + if(dx) *dx = res?(real(a)*real(ax)+imag(a)*imag(ax))/res:0; + if(dy) *dy = res?(real(a)*real(ay)+imag(a)*imag(ay))/res:0; + if(dz) *dz = res?(real(a)*real(az)+imag(a)*imag(az))/res:0; + return res; } + const mglDataV *dv=dynamic_cast(d); + if(dv) return dv->value(x,y,z,dx,dy,dz); + const mglDataF *df=dynamic_cast(d); + if(df) return df->value(x,y,z,dx,dy,dz); + return 0; // TODO non-mglData: spline mglDataT, mglDataR } //----------------------------------------------------------------------------- -mreal MGL_EXPORT mgl_data_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +mreal MGL_EXPORT_PURE mgl_data_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) { return mgl_data_spline(_DA_(d),*x,*y,*z); } -mreal MGL_EXPORT mgl_data_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +mreal MGL_EXPORT_PURE mgl_data_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) { return mgl_data_linear(_DA_(d),*x,*y,*z); } -mreal MGL_EXPORT mgl_data_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz) +mreal MGL_EXPORT_PURE mgl_data_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz) { return mgl_data_spline_ext(_DA_(d),*x,*y,*z,dx,dy,dz); } -mreal MGL_EXPORT mgl_data_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz) +mreal MGL_EXPORT_PURE mgl_data_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz) { return mgl_data_linear_ext(_DA_(d),*x,*y,*z,dx,dy,dz); } -mreal MGL_EXPORT mgl_data_solve_1d_(uintptr_t *d, mreal *val, int *spl, int *i0) +mreal MGL_EXPORT_PURE mgl_data_solve_1d_(uintptr_t *d, mreal *val, int *spl, int *i0) { return mgl_data_solve_1d(_DA_(d),*val, *spl, *i0); } uintptr_t MGL_EXPORT mgl_data_solve_(uintptr_t *d, mreal *val, const char *dir, uintptr_t *i0, int *norm,int) { return uintptr_t(mgl_data_solve(_DA_(d),*val, *dir, _DA_(i0), *norm)); } @@ -1180,47 +1226,7 @@ mreal MGL_EXPORT mgl_data_momentum_val(HCDT dd, char dir, mreal *x, mreal *w, mr { long nx=dd->GetNx(),ny=dd->GetNy(),nz=dd->GetNz(); mreal i0=0,i1=0,i2=0,i3=0,i4=0; - const mglData *md = dynamic_cast(dd); - if(dd) switch(dir) - { - case 'x': -#pragma omp parallel for reduction(+:i0,i1,i2,i3,i4) - for(long i=0;ia[i]; - i0+= v; i1+= v*d; i2+= v*t; - i3+= v*d*t; i4+= v*t*t; - } - break; - case 'y': -#pragma omp parallel for reduction(+:i0,i1,i2,i3,i4) - for(long i=0;ia[i]; - i0+= v; i1+= v*d; i2+= v*t; - i3+= v*d*t; i4+= v*t*t; - } - break; - case 'z': -#pragma omp parallel for reduction(+:i0,i1,i2,i3,i4) - for(long i=0;ia[i]; - i0+= v; i1+= v*d; i2+= v*t; - i3+= v*d*t; i4+= v*t*t; - } - break; - default: // "self-dispersion" - i0 = nx*ny*nz; -#pragma omp parallel for reduction(+:i1,i2,i3,i4) - for(long i=0;ia[i], t = v*v; - i1+= v; i2+= t; - i3+= v*t; i4+= t*t; - } - } - else switch(dir) + switch(dir) { case 'x': #pragma omp parallel for reduction(+:i0,i1,i2,i3,i4) @@ -1268,7 +1274,7 @@ mreal MGL_EXPORT mgl_data_momentum_val(HCDT dd, char dir, mreal *x, mreal *w, mr return i0; } mreal MGL_EXPORT mgl_data_momentum_val_(uintptr_t *d, char *dir, mreal *m, mreal *w, mreal *s, mreal *k,int) -{ mreal mm,ww,ss,kk,aa; +{ mreal mm=0,ww=0,ss=0,kk=0,aa=0; aa = mgl_data_momentum_val(_DT_,*dir,&mm,&ww,&ss,&kk); *m=mm; *w=ww; *s=ss; *k=kk; return aa; } //----------------------------------------------------------------------------- @@ -1368,12 +1374,18 @@ MGL_EXPORT const char *mgl_data_info(HCDT d) // NOTE: Not thread safe function! snprintf(s,128,"Widths are:\nWa = %g\tWx = %g\tWy = %g\tWz = %g\n", Wa,Wx,Wy,Wz); strcat(buf,s); return buf; } +int MGL_EXPORT mgl_data_info_(uintptr_t *d, char *out, int len) +{ + const char *res = mgl_data_info(_DA_(d)); + if(out) strncpy(out,res,len); + return strlen(res); +} //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_insert(HMDT d, char dir, long at, long num) { if(num<1) return; at = at<0 ? 0:at; - long nn, nx=d->nx, ny=d->ny, nz=d->nz; + long nn, nx=d->nx, ny=d->ny, nz=d->nz, nxy=nx*ny; mglData b; if(dir=='x') { @@ -1384,7 +1396,8 @@ void MGL_EXPORT mgl_data_insert(HMDT d, char dir, long at, long num) { if(at>0) memcpy(b.a+nn*k, d->a+nx*k,at*sizeof(mreal)); if(ata+at+nx*k,(nx-at)*sizeof(mreal)); - for(long i=0;ia[nx*k+at]; // copy values + if(ata[nx*k+at]; // copy values + else for(long i=0;ia[nx*k+nx-1]; // copy values } d->Set(b); nx+=num; } @@ -1395,9 +1408,12 @@ void MGL_EXPORT mgl_data_insert(HMDT d, char dir, long at, long num) #pragma omp parallel for for(long k=0;k0) memcpy(b.a+nx*nn*k, d->a+nx*ny*k,at*nx*sizeof(mreal)); + if(at>0) memcpy(b.a+nx*nn*k, d->a+nxy*k,at*nx*sizeof(mreal)); if(ata+nx*(at+ny*k),(ny-at)*nx*sizeof(mreal)); - for(long i=0;ia+nx*(ny*k+at),nx*sizeof(mreal)); + if(ata+nx*(ny*k+at),nx*sizeof(mreal)); + else for(long i=0;ia+nx*(ny*k+ny-1),nx*sizeof(mreal)); } d->Set(b); ny+=num; } @@ -1405,10 +1421,14 @@ void MGL_EXPORT mgl_data_insert(HMDT d, char dir, long at, long num) { if(at>nz) at=nz; b.Create(nx,ny,nz+num); - if(at>0) memcpy(b.a, d->a,at*nx*ny*sizeof(mreal)); - if(ata+nx*ny*at,(nz-at)*nx*ny*sizeof(mreal)); + if(at>0) memcpy(b.a, d->a,at*nxy*sizeof(mreal)); + if(ata+nxy*at,(nz-at)*nxy*sizeof(mreal)); + if(ata+nx*ny*at,nx*ny*sizeof(mreal)); + for(long i=0;ia+nxy*at,nxy*sizeof(mreal)); + else +#pragma omp parallel for + for(long i=0;ia+nxy*(nz-1),nxy*sizeof(mreal)); d->Set(b); } } @@ -1457,70 +1477,14 @@ void MGL_EXPORT mgl_data_insert_(uintptr_t *d, const char *dir, int *at, int *nu void MGL_EXPORT mgl_data_delete_(uintptr_t *d, const char *dir, int *at, int *num, int) { mgl_data_delete(_DT_,*dir,*at,*num); } //----------------------------------------------------------------------------- -mreal MGL_EXPORT mgl_spline5(mreal y1[5], mreal y2[5], long n1, long n2, mreal d, mreal &dy) -{ - mreal a1[4], a2[4], f0,d0,t0,f1,d1,t1, b[6]; - a1[0] = -(3*y1[4]-16*y1[3]+36*y1[2]-48*y1[1]+25*y1[0])/12; - a1[1] = (11*y1[4]-56*y1[3]+114*y1[2]-104*y1[1]+35*y1[0])/12; - a1[2] = -(3*y1[4]-14*y1[3]+24*y1[2]-18*y1[1]+5*y1[0])/4; - a1[3] = (y1[4]-4*y1[3]+6*y1[2]-4*y1[1]+y1[0])/6; - a2[0] = -(3*y2[4]-16*y2[3]+36*y2[2]-48*y2[1]+25*y2[0])/12; - a2[1] = (11*y2[4]-56*y2[3]+114*y2[2]-104*y2[1]+35*y2[0])/12; - a2[2] = -(3*y2[4]-14*y2[3]+24*y2[2]-18*y2[1]+5*y2[0])/4; - a2[3] = (y2[4]-4*y2[3]+6*y2[2]-4*y2[1]+y2[0])/6; - n2++; - f0 = y1[n1]; d0 = a1[0]+n1*(a1[1]+n1*(a1[2]+n1*a1[3])); t0 = a1[1]/2+a1[2]*n1+1.5*n2*n2*a2[3]; - f1 = y2[n2]; d1 = a2[0]+n2*(a2[1]+n2*(a2[2]+n2*a2[3])); t1 = a2[1]/2+a2[2]*n2+1.5*n2*n2*a2[3]; - b[0] = f0; b[1] = d0; b[2] = t0; - b[3] = 10*(f1-f0)+t1-3*t0-4*d1-6*d0; - b[4] = 15*(f0-f1)-2*t1+3*t0+7*d1+8*d0; - b[5] = 6*(f1-f0)+t1-t0-3*d1-3*d0; - dy = b[1] + d*(2*b[2]+d*(3*b[3]+d*(4*b[4]+d*5*b[5]))); - return b[0] + d*(b[1]+d*(b[2]+d*(b[3]+d*(b[4]+d*b[5])))); -} -//----------------------------------------------------------------------------- -mreal MGL_EXPORT mgl_spline3(mreal y1[3], mreal y2[3], long n1, long n2, mreal d, mreal &dy) -{ - mreal a1[2], a2[2], f0,d0,d1,f1, b[4]; - a1[0] = -(y1[2]-4*y1[1]+3*y1[0])/2; - a1[1] = y1[2]-2*y1[1]+y1[0]; - a2[0] = -(y2[2]-4*y2[1]+3*y2[0])/2; - a2[1] = y2[2]-2*y2[1]+y2[0]; - n2++; - f0 = y1[n1]; d0 = a1[0]+a1[1]*n1; - f1 = y2[n2]; d1 = a2[0]+a2[1]*n2; - b[0] = f0; b[1] = d0; - b[2] = 3*(f1-f0)-d1-2*d0; - b[3] = 2*(f0-f1)+d1+d0; - dy = b[1] + d*(2*b[2]+d*3*b[3]); - return b[0] + d*(b[1]+d*(b[2]+d*b[3])); -} -//----------------------------------------------------------------------------- -/*mreal mglData::Spline5(mreal x,mreal y,mreal z,mreal &dx,mreal &dy,mreal &dz) const -{ - mreal res=0; - if(nx<5) return 0; // not interpolation for points < 5 !!! - dx = dy = dz = 0; x*=nx-1; y*=ny-1; z*=nz-1; - if(ny==1 && nz==1) // 1D case - { - long n = long(x), n1 = n>1 ? 2:n, n2 = n0?int((x)/(y)+0.5):int((x)/(y)-0.5)) void MGL_NO_EXPORT mgl_omod(mreal *a, mreal da, int nx, int n) { - register long i,ii; bool qq=true; register mreal q; - for(i=1;ip[0], ny=t->p[1], nz=t->p[2], nn=t->n; + long nx=t->p[0], ny=t->p[1], nz=t->p[2], nn=t->n, n2=nx*ny; mreal *b=t->a,au,av,aw,xu,xv,xw,yu,yv,yw,zu,zv,zw; - const mreal *a=t->b, *x=t->c, *y=t->d, *z=t->e; + HCDT x=(HCDT)(t->c),y=(HCDT)(t->d),z=(HCDT)(t->e); + const mreal *a=t->b; #if !MGL_HAVE_PTHREAD #pragma omp parallel for private(au,av,aw,xu,xv,xw,yu,yv,yw,zu,zv,zw) #endif @@ -1739,65 +1704,65 @@ MGL_NO_EXPORT void *mgl_diff_3(void *par) if(i==0) { au = 3*a[i0]-4*a[i0+1]+a[i0+2]; - xu = 3*x[i0]-4*x[i0+1]+x[i0+2]; - yu = 3*y[i0]-4*y[i0+1]+y[i0+2]; - zu = 3*z[i0]-4*z[i0+1]+z[i0+2]; + xu = 3*x->vthr(i0)-4*x->vthr(i0+1)+x->vthr(i0+2); + yu = 3*y->vthr(i0)-4*y->vthr(i0+1)+y->vthr(i0+2); + zu = 3*z->vthr(i0)-4*z->vthr(i0+1)+z->vthr(i0+2); } else if(i==nx-1) { au = 3*a[i0]-4*a[i0-1]+a[i0-2]; - xu = 3*x[i0]-4*x[i0-1]+x[i0-2]; - yu = 3*y[i0]-4*y[i0-1]+y[i0-2]; - zu = 3*z[i0]-4*z[i0-1]+z[i0-2]; + xu = 3*x->vthr(i0)-4*x->vthr(i0-1)+x->vthr(i0-2); + yu = 3*y->vthr(i0)-4*y->vthr(i0-1)+y->vthr(i0-2); + zu = 3*z->vthr(i0)-4*z->vthr(i0-1)+z->vthr(i0-2); } else { au = a[i0+1]-a[i0-1]; - xu = x[i0+1]-x[i0-1]; - yu = y[i0+1]-y[i0-1]; - zu = z[i0+1]-z[i0-1]; + xu = x->vthr(i0+1)-x->vthr(i0-1); + yu = y->vthr(i0+1)-y->vthr(i0-1); + zu = z->vthr(i0+1)-z->vthr(i0-1); } if(j==0) { av = 3*a[i0]-4*a[i0+nx]+a[i0+2*nx]; - xv = 3*x[i0]-4*x[i0+nx]+x[i0+2*nx]; - yv = 3*y[i0]-4*y[i0+nx]+y[i0+2*nx]; - zv = 3*z[i0]-4*z[i0+nx]+z[i0+2*nx]; + xv = 3*x->vthr(i0)-4*x->vthr(i0+nx)+x->vthr(i0+2*nx); + yv = 3*y->vthr(i0)-4*y->vthr(i0+nx)+y->vthr(i0+2*nx); + zv = 3*z->vthr(i0)-4*z->vthr(i0+nx)+z->vthr(i0+2*nx); } else if(j==ny-1) { av = 3*a[i0]-4*a[i0-nx]+a[i0+(ny-3)*nx]; - xv = 3*x[i0]-4*x[i0-nx]+x[i0-2*nx]; - yv = 3*y[i0]-4*y[i0-nx]+y[i0-2*nx]; - zv = 3*z[i0]-4*z[i0-nx]+z[i0-2*nx]; + xv = 3*x->vthr(i0)-4*x->vthr(i0-nx)+x->vthr(i0-2*nx); + yv = 3*y->vthr(i0)-4*y->vthr(i0-nx)+y->vthr(i0-2*nx); + zv = 3*z->vthr(i0)-4*z->vthr(i0-nx)+z->vthr(i0-2*nx); } else { av = a[i0+nx]-a[i0-nx]; - xv = x[i0+nx]-x[i0-nx]; - yv = y[i0+nx]-y[i0-nx]; - zv = z[i0+nx]-z[i0-nx]; + xv = x->vthr(i0+nx)-x->vthr(i0-nx); + yv = y->vthr(i0+nx)-y->vthr(i0-nx); + zv = z->vthr(i0+nx)-z->vthr(i0-nx); } if(k==0) { - aw = 3*a[i0]-4*a[i0+nn]+a[i0+2*nn]; - xw = 3*x[i0]-4*x[i0+nn]+x[i0+2*nn]; - yw = 3*y[i0]-4*y[i0+nn]+y[i0+2*nn]; - zw = 3*z[i0]-4*z[i0+nn]+z[i0+2*nn]; + aw = 3*a[i0]-4*a[i0+n2]+a[i0+2*n2]; + xw = 3*x->vthr(i0)-4*x->vthr(i0+n2)+x->vthr(i0+2*n2); + yw = 3*y->vthr(i0)-4*y->vthr(i0+n2)+y->vthr(i0+2*n2); + zw = 3*z->vthr(i0)-4*z->vthr(i0+n2)+z->vthr(i0+2*n2); } else if(k==nz-1) { - aw = 3*a[i0]-4*a[i+(nz-2)*nx*ny]+a[i-2*nn]; - xw = 3*x[i0]-4*x[i-nn]+x[i-2*nn]; - yw = 3*y[i0]-4*y[i-nn]+y[i-2*nn]; - zw = 3*z[i0]-4*z[i-nn]+z[i-2*nn]; + aw = 3*a[i0]-4*a[i0-n2]+a[i0-2*n2]; + xw = 3*x->vthr(i0)-4*x->vthr(i0-n2)+x->vthr(i0-2*n2); + yw = 3*y->vthr(i0)-4*y->vthr(i0-n2)+y->vthr(i0-2*n2); + zw = 3*z->vthr(i0)-4*z->vthr(i0-n2)+z->vthr(i0-2*n2); } else { - aw = a[i0+nn]-a[i0-nn]; - xw = x[i0+nn]-x[i0-nn]; - yw = y[i0+nn]-y[i0-nn]; - zw = z[i0+nn]-z[i0-nn]; + aw = a[i0+n2]-a[i0-n2]; + xw = x->vthr(i0+n2)-x->vthr(i0-n2); + yw = y->vthr(i0+n2)-y->vthr(i0-n2); + zw = z->vthr(i0+n2)-z->vthr(i0-n2); } b[i0] = (au*yv*zw-av*yu*zw-au*yw*zv+aw*yu*zv+av*yw*zu-aw*yv*zu) / (xu*yv*zw-xv*yu*zw-xu*yw*zv+xw*yu*zv+xv*yw*zu-xw*yv*zu); } @@ -1808,7 +1773,8 @@ MGL_NO_EXPORT void *mgl_diff_2(void *par) mglThreadD *t=(mglThreadD *)par; register long nx=t->p[0], ny=t->p[1], nn=t->n, same=t->p[2]; mreal *b=t->a,au,av,xu,xv,yu,yv; - const mreal *a=t->b, *x=t->c, *y=t->d; + HCDT x=(HCDT)(t->c),y=(HCDT)(t->d); + const mreal *a=t->b; #if !MGL_HAVE_PTHREAD #pragma omp parallel for private(au,av,xu,xv,yu,yv) #endif @@ -1818,38 +1784,38 @@ MGL_NO_EXPORT void *mgl_diff_2(void *par) if(i==0) { au = 3*a[i0]-4*a[i0+1]+a[i0+2]; - xu = 3*x[i1]-4*x[i1+1]+x[i1+2]; - yu = 3*y[i1]-4*y[i1+1]+y[i1+2]; + xu = 3*x->vthr(i1)-4*x->vthr(i1+1)+x->vthr(i1+2); + yu = 3*y->vthr(i1)-4*y->vthr(i1+1)+y->vthr(i1+2); } else if(i==nx-1) { au = 3*a[i0]-4*a[i0-1]+a[i0-2]; - xu = 3*x[i1]-4*x[i1-1]+x[i1-2]; - yu = 3*y[i1]-4*y[i1-1]+y[i1-2]; + xu = 3*x->vthr(i1)-4*x->vthr(i1-1)+x->vthr(i1-2); + yu = 3*y->vthr(i1)-4*y->vthr(i1-1)+y->vthr(i1-2); } else { au = a[i0+1]-a[i0-1]; - xu = x[i1+1]-x[i1-1]; - yu = y[i1+1]-y[i1-1]; + xu = x->vthr(i1+1)-x->vthr(i1-1); + yu = y->vthr(i1+1)-y->vthr(i1-1); } if(j==0) { av = 3*a[i0]-4*a[i0+nx]+a[i0+2*nx]; - xv = 3*x[i1]-4*x[i1+nx]+x[i1+2*nx]; - yv = 3*y[i1]-4*y[i1+nx]+y[i1+2*nx]; + xv = 3*x->vthr(i1)-4*x->vthr(i1+nx)+x->vthr(i1+2*nx); + yv = 3*y->vthr(i1)-4*y->vthr(i1+nx)+y->vthr(i1+2*nx); } else if(j==ny-1) { av = 3*a[i0]-4*a[i0-nx]+a[i0-2*nx]; - xv = 3*x[i1]-4*x[i1-nx]+x[i1-2*nx]; - yv = 3*y[i1]-4*y[i1-nx]+y[i1-2*nx]; + xv = 3*x->vthr(i1)-4*x->vthr(i1-nx)+x->vthr(i1-2*nx); + yv = 3*y->vthr(i1)-4*y->vthr(i1-nx)+y->vthr(i1-2*nx); } else { av = a[i0+nx]-a[i0-nx]; - xv = x[i1+nx]-x[i1-nx]; - yv = y[i1+nx]-y[i1-nx]; + xv = x->vthr(i1+nx)-x->vthr(i1-nx); + yv = y->vthr(i1+nx)-y->vthr(i1-nx); } b[i0] = (av*yu-au*yv)/(xv*yu-xu*yv); } @@ -1860,7 +1826,8 @@ MGL_NO_EXPORT void *mgl_diff_1(void *par) mglThreadD *t=(mglThreadD *)par; long nx=t->p[0], nn=t->n, same=t->p[1]; mreal *b=t->a,au,xu; - const mreal *a=t->b, *x=t->c; + HCDT x=(HCDT)(t->c); + const mreal *a=t->b; #if !MGL_HAVE_PTHREAD #pragma omp parallel for private(au,xu) #endif @@ -1870,43 +1837,40 @@ MGL_NO_EXPORT void *mgl_diff_1(void *par) if(i==0) { au = 3*a[i0]-4*a[i0+1]+a[i0+2]; - xu = 3*x[i1]-4*x[i1+1]+x[i1+2]; + xu = 3*x->vthr(i1)-4*x->vthr(i1+1)+x->vthr(i1+2); } else if(i==nx-1) { au = 3*a[i0]-4*a[i0-1]+a[i0-2]; - xu = 3*x[i1]-4*x[i1-1]+x[i1-2]; + xu = 3*x->vthr(i1)-4*x->vthr(i1-1)+x->vthr(i1-2); } else { au = a[i0+1]-a[i0-1]; - xu = x[i1+1]-x[i1-1]; + xu = x->vthr(i1+1)-x->vthr(i1-1); } b[i0] = au/xu; } return 0; } -void MGL_EXPORT mgl_data_diff_par(HMDT d, HCDT v1, HCDT v2, HCDT v3) -{ // NOTE: only for mglData!!! - const mglData *x = dynamic_cast(v1); - const mglData *y = dynamic_cast(v2); - const mglData *z = dynamic_cast(v3); - long nx=d->nx,ny=d->ny,nz=d->nz, nn=nx*ny*nz; +void MGL_EXPORT mgl_data_diff_par(HMDT d, HCDT x, HCDT y, HCDT z) +{ + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(), nn=nx*ny*nz; if(nx<2 || ny<2) return; mreal *b = new mreal[nn]; memset(b,0,nn*sizeof(mreal)); long p[3]={nx,ny,nz}; - if(x&&y&&z && x->nx*x->ny*x->nz==nn && y->nx*y->ny*y->nz==nn && z->nx*z->ny*z->nz==nn) - mglStartThread(mgl_diff_3,0,nn,b,d->a,x->a,p,0,y->a,z->a); - else if(x&&y && x->nx*x->ny==nx*ny && y->nx*y->ny==nx*ny) + if(x&&y&&z && x->GetNN()==nn && y->GetNN()==nn && z->GetNN()==nn) + mglStartThread(mgl_diff_3,0,nn,b,d->a,(const mreal *)x,p,0,(const mreal *)y,(const mreal *)z); + else if(x&&y && x->GetNx()*x->GetNy()==nx*ny && y->GetNx()*y->GetNy()==nx*ny) { - p[2]=(x->nz==nz && y->nz==nz); - mglStartThread(mgl_diff_2,0,nn,b,d->a,x->a,p,0,y->a); + p[2]=(x->GetNz()==nz && y->GetNz()==nz); + mglStartThread(mgl_diff_2,0,nn,b,d->a,(const mreal *)x,p,0,(const mreal *)y); } - else if(x && x->nx==nx) + else if(x && x->GetNx()==nx) { - p[1]=(x->ny*x->nz==ny*nz); - mglStartThread(mgl_diff_1,0,nn,b,d->a,x->a,p,0,0); + p[1]=(x->GetNy()*x->GetNz()==ny*nz); + mglStartThread(mgl_diff_1,0,nn,b,d->a,(const mreal *)x,p,0,0); } memcpy(d->a,b,nn*sizeof(mreal)); delete []b; } @@ -1919,11 +1883,12 @@ void MGL_EXPORT mgl_data_set_value_(uintptr_t *d, mreal *v, int *i, int *j, int { mgl_data_set_value(_DT_,*v,*i,*j,*k); } //----------------------------------------------------------------------------- mreal MGL_EXPORT mgl_data_get_value(HCDT dat, long i, long j, long k) -{ return (i>=0 && iGetNx() && j>=0 && jGetNy() && k>=0 && kGetNz()) ? dat->v(i,j,k):NAN; } +{ register long nx = dat->GetNx(), ny = dat->GetNy(); + return (i>=0 && i=0 && j=0 && kGetNz()) ? dat->vthr(i+nx*(j+ny*k)):NAN; } mreal MGL_EXPORT mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k) { return mgl_data_get_value(_DA_(d),*i,*j,*k); } //----------------------------------------------------------------------------- -MGL_EXPORT mreal *mgl_data_data(HMDT dat) { return dat->a; } +MGL_EXPORT_PURE mreal *mgl_data_data(HMDT dat) { return dat->a; } //----------------------------------------------------------------------------- MGL_EXPORT mreal *mgl_data_value(HMDT dat, long i,long j,long k) { register long ii=i*dat->nx*(j+dat->ny*k); @@ -1984,131 +1949,126 @@ void MGL_EXPORT mgl_data_join(HMDT d, HCDT v) void MGL_EXPORT mgl_data_join_(uintptr_t *d, uintptr_t *val) { mgl_data_join(_DT_,_DA_(val)); } //----------------------------------------------------------------------------- -mreal MGL_NO_EXPORT mgl_index_1(mreal v, const mglData *dat, mreal acx) +void MGL_EXPORT mgl_data_refill_gs(HMDT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl) +{ + HMDT coef = mgl_gspline_init(xdat, vdat); + if(!coef) return; // incompatible dimensions + const long nx = dat->nx, nn=dat->ny*dat->nz; + mreal x0 = x1-xdat->v(0), dx = (x2-x1)/(nx-1); +#pragma omp parallel for + for(long i=0;ia[i+j*nx] = d; + else dat->a[i+sl*nx] = d; + } + mgl_delete_data(coef); +} +//----------------------------------------------------------------------------- +mreal MGL_NO_EXPORT mgl_index_1(mreal v, HCDT dat) { - long mx=dat->nx; + long mx=dat->GetNx(); mreal d,d1=0,d2=mx-1,v1,v2; - v1 = mglSpline1t(dat->a,mx,d1); - v2 = mglSpline1t(dat->a,mx,d2); + v1 = mgl_data_spline(dat,d1,0,0); + v2 = mgl_data_spline(dat,d2,0,0); long count=0; - if(v1==v) return d1; - if(v2==v) return d2; + const mreal eps = MGL_EPSILON-1.; + if(fabs(v-v1)0) return NAN; do { d = count<10?(d2-d1)*(v-v1)/(v2-v1)+d1:(d1+d2)/2; count++; - register mreal val = mglSpline1st(dat->a,mx,d); - if(fabs(val-v)1e-3); + } while(fabs(d2-d1)>1e-5); return d; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_refill_x(HMDT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl) { long nx=dat->nx,mx=vdat->GetNx(),nn=dat->ny*dat->nz; - mreal acx=1e-6*fabs(x2-x1); - const mglData *xxd=dynamic_cast(xdat); - const mglData *vvd=dynamic_cast(vdat); - if(!xxd || !vvd || mx!=xxd->nx) return; // incompatible dimensions and for mglData only + if(mx!=xdat->GetNx()) return; // incompatible dimensions + mreal dx = (x2-x1)/(nx-1); #pragma omp parallel for for(long i=0;i(vvd->a,mx,u); + register mreal u = mgl_index_1(x1+dx*i,xdat); + register mreal d = mgl_data_spline(vdat,u,0,0); if(sl<0) for(long j=0;ja[i+j*nx] = d; else dat->a[i+sl*nx] = d; } } //----------------------------------------------------------------------------- -mglPoint MGL_NO_EXPORT mgl_index_2(mreal x, mreal y, const mglData *xdat, const mglData *ydat, mreal acx, mreal acy) -{ - long mx=xdat->nx, my=xdat->ny; - mreal u=fabs(x),u1=0,u2=mx-1, v=fabs(y),v1=0,v2=my-1; - mreal x11 = mgl_data_spline(xdat,u1,v1,0), y11 = mgl_data_spline(ydat,u1,v1,0); - mreal x21 = mgl_data_spline(xdat,u2,v1,0), y21 = mgl_data_spline(ydat,u2,v1,0); - mreal x12 = mgl_data_spline(xdat,u1,v2,0), y12 = mgl_data_spline(ydat,u1,v2,0); - mreal x22 = mgl_data_spline(xdat,u2,v2,0), y22 = mgl_data_spline(ydat,u2,v2,0); - long count=0; - - if(fabs(x11-x)0 && (x11-x)*(x12-x)*(x21-x)>0) return mglPoint(NAN,NAN); - if((y11-y)*(y12-y)*(y21-y)*(y22-y)>0 && (y11-y)*(y12-y)*(y21-y)>0) return mglPoint(NAN,NAN); - - do - { - if(count<10) - { - register mreal dx0=x-x11, dx1=x21-x11, dx2=x12-x11, dx3=x22+x11-x12-x21; - register mreal dy0=y-y11, dy1=y21-y11, dy2=y12-y11, dy3=y22+y11-y12-y21; - register mreal t1 = dx0*dx0*dy3*dy3 + 2*dx0*dx1*dy2*dy3 + 2*dx0*dx2*dy1*dy3 - - 2*dx0*dx3*dy0*dy3 - 4*dx1*dx2*dy0*dy3 + dx1*dx1*dy2*dy2 - - 4*dx0*dx3*dy1*dy2 - 2*dx1*dx2*dy1*dy2 + 2*dx1*dx3*dy0*dy2 + - dx2*dx2*dy1*dy1 + 2*dx2*dx3*dy0*dy1 + dx3*dx3*dy0*dy0, - t2 = dx2*dy1+dx3*dy0-dx0*dy3-dx1*dy2, t3 = 2*(dx2*dy3-dx3*dy2); - if(t1<0 || t3==0) { count=10; continue; } - t1 = sqrt(t1); v = (t2-t1)/t3; - if(v<0 || v>1) v = (t2+t1)/t3; - u = (dx0-dx2*v)/(dx1+dx3*v); - if(u<0 || v<0 || u>1 || v>1) { count=10; continue; } - u = u1+(u2-u1)*u; v = v1+(v2-v1)*v; count++; - } - else { u = (u1+u2)/2; v = (v1+v2)/2; } - - mreal tx = mgl_data_spline(xdat,u,v,0), ty = mgl_data_spline(ydat,u,v,0); - if(fabs(tx-x)0 || (x11-x)*(sx1-x)*(tx1-x)>0) && ((y11-y)*(sy1-y)*(ty1-y)*(ty-y)>0 && (y11-y)*(sy1-y)*(ty1-y)>0) ) - { x12 = tx1; y12 = ty1; x21 = sx1; y21 = sy1; x22 = tx; y22 = ty; u2 = u; v2 = v; } - if( ((tx1-x)*(tx-x)*(x12-x)*(sx2-x)>0 || (tx1-x)*(tx-x)*(x12-x)>0) && ((ty1-y)*(ty-y)*(y12-y)*(sy2-y)>0 && (ty1-y)*(ty-y)*(y12-y)>0) ) - { x11 = tx1; y11 = ty1; x21 = tx; y21 = ty; x22 = sx2; y22 = sy2; u2 = u; v1 = v; } - if( ((tx-x)*(sx2-x)*(tx2-x)*(x22-x)>0 || (tx-x)*(sx2-x)*(tx2-x)>0) && ((ty-y)*(sy2-y)*(ty2-y)*(y22-y)>0 && (ty-y)*(sy2-y)*(ty2-y)>0) ) - { x11 = tx; y11 = ty; x12 = sx2; y12 = sy2; x21 = tx2; y21 = ty2; u1 = u; v1 = v; } - if( ((sx1-x)*(tx-x)*(x21-x)*(tx2-x)>0 || (sx1-x)*(tx-x)*(x21-x)>0) && ((sy1-y)*(ty-y)*(y21-y)*(ty2-y)>0 && (sy1-y)*(ty-y)*(y21-y)>0) ) - { x11 = sx1; y11 = sy1; x12 = tx; y12 = ty; x22 = tx2; y22 = ty2; u1 = u; v2 = v; } - } while(fabs(u2-u1)>1e-3 || fabs(v2-v1)>1e-3); - return mglPoint(u,v); -} -//----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_refill_xy(HMDT dat, HCDT xdat, HCDT ydat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, long sl) { long nx=dat->nx,ny=dat->ny,nz=dat->nz,mx=vdat->GetNx(),my=vdat->GetNy(),nn=nx*ny; - const mglData *xxd=dynamic_cast(xdat); - const mglData *yyd=dynamic_cast(ydat); - const mglData *vvd=dynamic_cast(vdat); - if(!xxd || !vvd || !yyd) return; // for mglData only bool both=(xdat->GetNN()==vdat->GetNN() && ydat->GetNN()==vdat->GetNN()); if(!both && (xdat->GetNx()!=mx || ydat->GetNx()!=my)) return; // incompatible dimensions - mreal acx=1e-6*fabs(x2-x1), acy=1e-6*fabs(y2-y1); + mreal dx = (x2-x1)/(nx-1), dy = (y2-y1)/(ny-1); if(both) - mgl_data_grid_xy(dat,xdat,ydat,vdat,x1,x2,y1,y2); -/*#pragma omp parallel for collapse(2) - for(long j=0;ja[i]=NAN; +#pragma omp parallel for collapse(2) + for(long j=0;ja[i0+k*nn] = d; - else dat->a[i0+sl*nn] = d; - }*/ + long i0 = i+mx*j; + mreal vx0 = (xdat->vthr(i0)-x1)/dx, vy0 = (ydat->vthr(i0)-y1)/dy; + mreal vx1 = (xdat->vthr(i0+1)-x1)/dx, vy1 = (ydat->vthr(i0+1)-y1)/dy; + mreal vx2 = (xdat->vthr(i0+mx)-x1)/dx, vy2 = (ydat->vthr(i0+mx)-y1)/dy; + mreal vx3 = (xdat->vthr(i0+mx+1)-x1)/dx, vy3 = (ydat->vthr(i0+mx+1)-y1)/dy; + long xx1 = long(mgl_min( mgl_min(vx0,vx1), mgl_min(vx2,vx3) )); // bounding box + long yy1 = long(mgl_min( mgl_min(vy0,vy1), mgl_min(vy2,vy3) )); + long xx2 = long(mgl_max( mgl_max(vx0,vx1), mgl_max(vx2,vx3) )); + long yy2 = long(mgl_max( mgl_max(vy0,vy1), mgl_max(vy2,vy3) )); + xx1=mgl_max(xx1,0); xx2=mgl_min(xx2,nx-1); + yy1=mgl_max(yy1,0); yy2=mgl_min(yy2,ny-1); + if(xx1>xx2 || yy1>yy2) continue; + + mreal d1x = vx1-vx0, d1y = vy1-vy0; + mreal d2x = vx2-vx0, d2y = vy2-vy0; + mreal d3x = vx3+vx0-vx1-vx2, d3y = vy3+vy0-vy1-vy2; + mreal dd = d1x*d2y-d1y*d2x; + mreal dsx =-4*(d2y*d3x - d2x*d3y)*d1y; + mreal dsy = 4*(d2y*d3x - d2x*d3y)*d1x; + + for(long jj=yy1;jj<=yy2;jj++) for(long ii=xx1;ii<=xx2;ii++) + { + mreal xx = (ii-vx0), yy = (jj-vy0); + mreal s = dsx*xx + dsy*yy + (dd+d3y*xx-d3x*yy)*(dd+d3y*xx-d3x*yy); + if(s>=0) + { + s = sqrt(s); + mreal qu = d3x*yy - d3y*xx + dd + s; + mreal qv = d3y*xx - d3x*yy + dd + s; + mreal u = 2.f*(d2y*xx - d2x*yy)/qu; + mreal v = 2.f*(d1x*yy - d1y*xx)/qv; + if(u*(1.f-u)<0.f || v*(1.f-v)<0.f) // first root bad + { + qu = d3x*yy - d3y*xx + dd - s; + qv = d3y*xx - d3x*yy + dd - s; + u = 2.f*(d2y*xx - d2x*yy)/qu; + v = 2.f*(d1x*yy - d1y*xx)/qv; + if(u*(1.f-u)<0.f || v*(1.f-v)<0.f) continue; // second root bad + } + i0 = ii+nx*jj; s = mgl_data_spline(vdat,i+u,j+v,0); + if(sl<0) for(long k=0;ka[i0+k*nn] = s; + else dat->a[i0+sl*nn] = s; + } + } + } + } else { mglData u(nx), v(ny); #pragma omp parallel for - for(long i=0;inx,ny=dat->ny,nz=dat->nz,mx=vdat->GetNx(),my=vdat->GetNy(),mz=vdat->GetNz(); - const mglData *xxd=dynamic_cast(xdat); - const mglData *yyd=dynamic_cast(ydat); - const mglData *zzd=dynamic_cast(zdat); - const mglData *vvd=dynamic_cast(vdat); - if(!xxd || !vvd || !yyd || !zzd) return; // for mglData only bool both=(xdat->GetNN()==vdat->GetNN() && ydat->GetNN()==vdat->GetNN() && zdat->GetNN()==vdat->GetNN()); if(!both && (xdat->GetNx()!=mx || ydat->GetNx()!=my || zdat->GetNx()!=mz)) return; // incompatible dimensions - mreal acx=1e-6*fabs(x2-x1), acy=1e-6*fabs(y2-y1), acz=1e-6*fabs(z2-z1); + const mreal acx=1e-6*fabs(x2-x1), acy=1e-6*fabs(y2-y1), acz=1e-6*fabs(z2-z1); if(both) #pragma omp parallel for collapse(3) for(long k=0;ka[i+nx*(j+ny*k)] = mgl_data_spline(vdat,u.a[i],v.a[j],w.a[k]); } } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_eval(void *par) +HMDT MGL_EXPORT mgl_data_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm) { - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0], ny=t->p[1], nz=t->p[2], n1=t->p[3], nn=t->n; - const mreal *a=t->b, *ii=t->c, *jj=t->d, *kk=t->e; - mreal *b=t->a; -#if !MGL_HAVE_PTHREAD + if(!idat || (jdat && jdat->GetNN()!=idat->GetNN()) || (kdat && kdat->GetNN()!=idat->GetNN())) return 0; + const mglData *dd=dynamic_cast(dat); + long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz(); + mglData *r=new mglData(idat->GetNx(),idat->GetNy(),idat->GetNz()); + if(dd) #pragma omp parallel for -#endif - for(long i=t->id;i(a,nx,ny,nz,x,y,z):NAN; - } - return 0; + for(long i=0;iGetNN();i++) + { + mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + r->a[i] = mgl_isnum(x*y*z)?mglSpline3st(dd->a,nx,ny,nz, x,y,z):NAN; + } + else +#pragma omp parallel for + for(long i=0;iGetNN();i++) + { + mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; + r->a[i] = mgl_isnum(x*y*z)?mgl_data_linear(dat, x,y,z):NAN;; + } + return r; } -MGL_NO_EXPORT void *mgl_eval_s(void *par) +uintptr_t MGL_EXPORT mgl_data_evaluate_(uintptr_t *d, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm) +{ return uintptr_t(mgl_data_evaluate(_DT_,_DA_(idat),_DA_(jdat),_DA_(kdat),*norm)); } +//----------------------------------------------------------------------------- +HMDT MGL_EXPORT mgl_gspline_init(HCDT x, HCDT v) { - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0], ny=t->p[1], nz=t->p[2], n1=t->p[3], nn=t->n; - const mreal *ii=t->c, *jj=t->d, *kk=t->e; - HCDT a = (HCDT)t->v; - mreal *b=t->a; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i=t->id;iGetNx(); + if(!x || x->GetNx()!=n) return 0; + mglData *res = new mglData(5*(n-1)); + mreal *xx=0, *vv=0; + const mglData *dx = dynamic_cast(x); + if(!dx) { - register mreal x=ii?ii[i]:0, y=jj?jj[i]:0, z=kk?kk[i]:0; - if(n1) { x*=nx-1; y*=ny-1; z*=nz-1; } - b[i] = x*y*z==x*y*z ? mgl_data_linear(a, x,y,z):NAN; + xx = new mreal[n]; + for(long i=0;iv(i); } - return 0; + const mglData *dv = dynamic_cast(v); + if(!dv) + { + vv = new mreal[n]; + for(long i=0;iv(i); + } + mgl_gspline_init(n,dx?dx->a:xx,dv?dv->a:vv,res->a); + if(xx) delete []xx; + if(vv) delete []vv; + return res; } -HMDT MGL_EXPORT mgl_data_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm) +uintptr_t MGL_EXPORT mgl_gspline_init_(uintptr_t *x, uintptr_t *v) +{ return uintptr_t(mgl_gspline_init(_DA_(x),_DA_(v))); } +//----------------------------------------------------------------------------- +mreal MGL_EXPORT mgl_gspline(HCDT c, mreal dx, mreal *d1, mreal *d2) { - const mglData *d=dynamic_cast(dat); - const mglData *i=dynamic_cast(idat); - const mglData *j=dynamic_cast(jdat); - const mglData *k=dynamic_cast(kdat); - if(!i) return 0; - - long p[4]={dat->GetNx(), dat->GetNy(), dat->GetNz(),norm}; - register long n=i->nx*i->ny*i->nz; - if(j && j->nx*j->ny*j->nz!=n) return 0; - if(k && k->nx*k->ny*k->nz!=n) return 0; - mglData *r=new mglData(i->nx,i->ny,i->nz); - if(d) mglStartThread(mgl_eval,0,n,r->a,d->a,i->a,p,0,j?j->a:0,k?k->a:0); - else mglStartThread(mgl_eval_s,0,n,r->a,0,i->a,p,dat,j?j->a:0,k?k->a:0); - return r; + long i=0, n = c->GetNx(); + if(n%5 || dx<0) return NAN; // not the table of coefficients + while(dx>c->v(5*i)) + { + dx-=c->v(5*i); i++; + if(5*i>=n) return NAN; + } + if(d1) *d1 = c->v(5*i+2)+dx*(2*c->v(5*i+3)+3*dx*c->v(5*i+4)); + if(d2) *d2 = 2*c->v(5*i+3)+6*dx*c->v(5*i+4); + return c->v(5*i+1)+dx*(c->v(5*i+2)+dx*(c->v(5*i+3)+dx*c->v(5*i+4))); } -uintptr_t MGL_EXPORT mgl_data_evaluate_(uintptr_t *d, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm) -{ return uintptr_t(mgl_data_evaluate(_DT_,_DA_(idat),_DA_(jdat),_DA_(kdat),*norm)); } +mreal MGL_EXPORT mgl_gspline_(uintptr_t *c, mreal *dx, mreal *d1, mreal *d2) +{ return mgl_gspline(_DA_(c),*dx,d1,d2); } //----------------------------------------------------------------------------- diff --git a/src/data_ex.cpp b/src/data_ex.cpp index d112516..193b55d 100644 --- a/src/data_ex.cpp +++ b/src/data_ex.cpp @@ -21,6 +21,7 @@ #include "mgl2/data.h" #include "mgl2/eval.h" #include "mgl2/thread.h" +mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_data_trace(HCDT d) { @@ -42,27 +43,33 @@ uintptr_t MGL_EXPORT mgl_data_trace_(uintptr_t *d) //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_data_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz) { + if(!xx || !yy || !zz) + { + mglData tmp; tmp.a[0]=-1; + return mgl_data_subdata_ext(d,xx?xx:&tmp,yy?yy:&tmp,zz?zz:&tmp); + } + long n=0,m=0,l=0,j,k; bool ix=false, iy=false, iz=false; if(xx->GetNz()>1) // 3d data { n = xx->GetNx(); m = xx->GetNy(); l = xx->GetNz(); - j = yy->GetNx()*yy->GetNy()*yy->GetNz(); if(j>1 && j!=n*m*l) return 0; // wrong sizes - k = zz->GetNx()*zz->GetNy()*zz->GetNz(); if(k>1 && k!=n*m*l) return 0; // wrong sizes + j = yy->GetNN(); if(j>1 && j!=n*m*l) return 0; // wrong sizes + k = zz->GetNN(); if(k>1 && k!=n*m*l) return 0; // wrong sizes ix = true; iy = j>1; iz = k>1; } else if(yy->GetNz()>1) { n = yy->GetNx(); m = yy->GetNy(); l = yy->GetNz(); - j = xx->GetNx()*xx->GetNy()*xx->GetNz(); if(j>1 && j!=n*m*l) return 0; // wrong sizes - k = zz->GetNx()*zz->GetNy()*zz->GetNz(); if(k>1 && k!=n*m*l) return 0; // wrong sizes + j = xx->GetNN(); if(j>1 && j!=n*m*l) return 0; // wrong sizes + k = zz->GetNN(); if(k>1 && k!=n*m*l) return 0; // wrong sizes iy = true; ix = j>1; iz = k>1; } else if(zz->GetNz()>1) { n = zz->GetNx(); m = zz->GetNy(); l = zz->GetNz(); - j = yy->GetNx()*yy->GetNy()*yy->GetNz(); if(j>1 && j!=n*m*l) return 0; // wrong sizes - k = xx->GetNx()*xx->GetNy()*xx->GetNz(); if(k>1 && k!=n*m*l) return 0; // wrong sizes + j = yy->GetNN(); if(j>1 && j!=n*m*l) return 0; // wrong sizes + k = xx->GetNN(); if(k>1 && k!=n*m*l) return 0; // wrong sizes iz = true; iy = j>1; ix = k>1; } else if(xx->GetNy()>1) // 2d data @@ -87,34 +94,33 @@ HMDT MGL_EXPORT mgl_data_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz) iz = true; iy = j>1; ix = k>1; } long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(); - mreal vx=xx->v(0), vy=yy->v(0), vz=zz->v(0); - mglData *r=new mglData; + long vx=long(xx->v(0)), vy=long(yy->v(0)), vz=long(zz->v(0)); if(n*m*l>1) // this is 2d or 3d data { - r->Create(n,m,l); + mglDataV tx(n,m,l),ty(n,m,l),tz(n,m,l); + if(!ix) { xx = &tx; if(vx>=0) tx.Fill(vx); else tx.All(); } + if(!iy) { yy = &ty; if(vy>=0) ty.Fill(vy); else ty.All(); } + if(!iz) { zz = &tz; if(vz>=0) tz.Fill(vz); else tz.All(); } + mglData *r=new mglData(n,m,l); #pragma omp parallel for for(long i0=0;i0vthr(i0):vx; - register mreal y = iy?yy->vthr(i0):vy; - register mreal z = iz?zz->vthr(i0):vz; - r->a[i0] = mgl_data_linear(d,x,y,z); + register long x=long(0.5+xx->vthr(i0)), y=long(0.5+yy->vthr(i0)), z=long(0.5+zz->vthr(i0)); + r->a[i0] = (x>=0 && x=0 && y=0 && zv(x,y,z):NAN; } return r; } // this is 1d data -> try as normal SubData() - if(xx->GetNx()>1 || vx>=0) { n=xx->GetNx(); ix=true; } - else { n=nx; ix=false; } - if(yy->GetNx()>1 || vy>=0) { m=yy->GetNx(); iy=true; } - else { m=ny; iy=false; } - if(zz->GetNx()>1 || vz>=0) { l=zz->GetNx(); iz=true; } - else { l=nz; iz=false; } - r->Create(n,m,l); + mglDataV tx(nx),ty(ny),tz(nz); tx.All(); ty.All(); tz.All(); + if(xx->GetNx()>1 || vx>=0) n=xx->GetNx(); else { n=nx; xx = &tx; } + if(yy->GetNx()>1 || vy>=0) m=yy->GetNx(); else { m=ny; yy = &ty; } + if(zz->GetNx()>1 || vz>=0) l=zz->GetNx(); else { l=nz; zz = &tz; } + mglData *r=new mglData(n,m,l); #pragma omp parallel for collapse(3) for(long k=0;kv(i):i, y = iy?yy->v(j):j, z = iz?zz->v(k):k; - r->a[i+n*(j+m*k)] = mgl_data_linear(d,x,y,z); + register long x=long(0.5+xx->v(i)), y=long(0.5+yy->v(j)), z=long(0.5+zz->v(k)); + r->a[i+n*(j+m*k)] = (x>=0 && x=0 && y=0 && zv(x,y,z):NAN; } if(m==1) { r->ny=r->nz; r->nz=1; }// "squeeze" dimensions if(n==1) { r->nx=r->ny; r->ny=r->nz; r->nz=1; r->NewId();} @@ -123,9 +129,22 @@ HMDT MGL_EXPORT mgl_data_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz) //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_data_subdata(HCDT d, long xx,long yy,long zz) { - mglData x,y,z; - x.a[0]=xx; y.a[0]=yy; z.a[0]=zz; - return mgl_data_subdata_ext(d,&x,&y,&z); + long nx=d->GetNx(),ny=d->GetNy(),nz=d->GetNz(), n=1,m=1,l=1; + int dx=0,dy=0,dz=0; + if(xx<0) { xx=0; dx=1; n=nx; } + if(yy<0) { yy=0; dy=1; m=ny; } + if(zz<0) { zz=0; dz=1; l=nz; } + mglData *r=new mglData(n,m,l); + if(xxa[i+n*(j+m*k)] = d->v(xx+dx*i, yy+dy*j, zz+dz*k); + else +#pragma omp parallel for + for(long i=0;ia[i] = NAN; + if(m==1) { r->ny=r->nz; r->nz=1; }// "squeeze" dimensions + if(n==1) { r->nx=r->ny; r->ny=r->nz; r->nz=1; r->NewId();} + return r; } //----------------------------------------------------------------------------- uintptr_t MGL_EXPORT mgl_data_subdata_(uintptr_t *d, int *xx,int *yy,int *zz) @@ -133,71 +152,35 @@ uintptr_t MGL_EXPORT mgl_data_subdata_(uintptr_t *d, int *xx,int *yy,int *zz) uintptr_t MGL_EXPORT mgl_data_subdata_ext_(uintptr_t *d, uintptr_t *xx, uintptr_t *yy, uintptr_t *zz) { return uintptr_t(mgl_data_subdata_ext(_DT_,_DA_(xx),_DA_(yy),_DA_(zz))); } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_column(void *par) -{ - mglThreadD *t=(mglThreadD *)par; - const mglFormula *f = (const mglFormula *)t->v; - long nx=t->p[0]; - mreal *b=t->a, var[MGL_VS]; - const mreal *a=t->b; - memset(var,0,('z'-'a')*sizeof(mreal)); -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i=t->id;in;i+=mglNumThr) - { - for(long j=0;js[j]>='a' && t->s[j]<='z') - var[t->s[j]-'a'] = a[j+nx*i]; - b[i] = f->Calc(var); - } - return 0; -} -HMDT MGL_EXPORT mgl_data_column(HCDT dat, const char *eq) -{ // NOTE: only for mglData (for speeding up) - long nx=dat->GetNx(),ny=dat->GetNy(),nz=dat->GetNz(); - mglFormula f(eq); - mglData *r=new mglData(ny,nz); - const mglData *d=dynamic_cast(dat); - if(d) mglStartThread(mgl_column,0,ny*nz,r->a,d->a,0,&nx,&f,0,0,d->id.c_str()); - return r; -} -uintptr_t MGL_EXPORT mgl_data_column_(uintptr_t *d, const char *eq,int l) -{ char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; - uintptr_t r = uintptr_t(mgl_data_column(_DT_,s)); - delete []s; return r; } -//----------------------------------------------------------------------------- MGL_NO_EXPORT void *mgl_resize(void *par) { mglThreadD *t=(mglThreadD *)par; long nx=t->p[0]+0.1, ny=t->p[1]+0.1; - long n1=t->p[3]+0.1,n2=t->p[4]+0.1,n3=t->p[5]+0.1; mreal *b=t->a; - const mreal *a=t->b, *c=t->c; + const mreal *c=t->c; + HCDT dat = (HCDT)(t->v); #if !MGL_HAVE_PTHREAD #pragma omp parallel for #endif for(long i0=t->id;i0n;i0+=mglNumThr) { register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny); - b[i0] = mglSpline3(a,n1,n2,n3, c[0]+i*c[1], c[2]+j*c[3], c[4]+k*c[5]); + b[i0] = mgl_data_spline(dat, c[0]+i*c[1], c[2]+j*c[3], c[4]+k*c[5]); } return 0; } HMDT MGL_EXPORT mgl_data_resize_box(HCDT dat, long mx,long my,long mz, mreal x1,mreal x2, mreal y1,mreal y2, mreal z1,mreal z2) -{ // NOTE: only for mglData (for speeding up) - const mglData *d=dynamic_cast(dat); - if(!d) return 0; - register long nx = d->nx-1, ny = d->ny-1, nz = d->nz-1; - mx = mx<1 ? nx+1:mx; my = my<1 ? ny+1:my; mz = mz<1 ? nz+1:mz; +{ + register long nx = dat->GetNx(), ny = dat->GetNy(), nz = dat->GetNz(); + mx = mx<1 ? nx:mx; my = my<1 ? ny:my; mz = mz<1 ? nz:mz; mglData *r=new mglData(mx,my,mz); mreal par[6]={nx*x1,0,ny*y1,0,nz*z1,0}; - long nn[6]={mx,my,mz,nx+1,ny+1,nz+1}; - if(mx>1) par[1] = nx*(x2-x1)/(mx-1); - if(my>1) par[3] = ny*(y2-y1)/(my-1); - if(mz>1) par[5] = nz*(z2-z1)/(mz-1); - mglStartThread(mgl_resize,0,mx*my*mz,r->a,d->a,par,nn); + long nn[6]={mx,my,mz,nx,ny,nz}; + if(mx>1) par[1] = (nx-1)*(x2-x1)/(mx-1); + if(my>1) par[3] = (ny-1)*(y2-y1)/(my-1); + if(mz>1) par[5] = (nz-1)*(z2-z1)/(mz-1); + mglStartThread(mgl_resize,0,mx*my*mz,r->a,0,par,nn,dat); return r; } HMDT MGL_EXPORT mgl_data_resize(HCDT d, long mx,long my,long mz) @@ -207,31 +190,18 @@ uintptr_t MGL_EXPORT mgl_data_resize_(uintptr_t *d, int *mx,int *my,int *mz) uintptr_t MGL_EXPORT mgl_data_resize_box_(uintptr_t *d, int *mx,int *my,int *mz, mreal *x1,mreal *x2, mreal *y1,mreal *y2, mreal *z1,mreal *z2) { return uintptr_t(mgl_data_resize_box(_DT_,*mx,*my,*mz,*x1,*x2,*y1,*y2,*z1,*z2)); } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_combine(void *par) -{ - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0]; - mreal *b=t->a; - const mreal *c=t->b, *d=t->c; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) b[i0] = c[i0%nx]*d[i0/nx]; - return 0; -} HMDT MGL_EXPORT mgl_data_combine(HCDT d1, HCDT d2) -{ // NOTE: only for mglData (for speeding up) - const mglData *a=dynamic_cast(d1); - const mglData *b=dynamic_cast(d2); - - if(!a || !b || a->nz>1 || (a->ny>1 && b->ny>1) || b->nz>1) return 0; +{ + long n1=d1->GetNy(),n2=d2->GetNx(),nx=d1->GetNx(); + if(d1->GetNz()>1 || (n1>1 && d2->GetNy()>1) || d2->GetNz()>1) return 0; // wrong dimensions mglData *r=new mglData; - long n1=a->ny,n2=b->nx; bool dim2=true; - if(a->ny==1) { n1=b->nx; n2=b->ny; dim2 = false; } - r->Create(a->nx,n1,n2); - if(dim2) n1=a->nx*a->ny; else { n1=a->nx; n2=b->nx*b->ny; } - mglStartThread(mgl_combine,0,n1*n2,r->a,a->a,b->a,&n1); + if(n1==1) { n1=n2; n2=d2->GetNy(); dim2 = false; } + r->Create(nx,n1,n2); + if(dim2) n1*=nx; else { n2*=n1; n1=nx; } +#pragma omp parallel for collapse(2) + for(long j=0;ja[i+n1*j] = d1->vthr(i)*d2->vthr(j); return r; } uintptr_t MGL_EXPORT mgl_data_combine_(uintptr_t *a, uintptr_t *b) @@ -495,125 +465,91 @@ uintptr_t MGL_EXPORT mgl_data_min_dir_(uintptr_t *d, const char *dir,int l) { char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; uintptr_t r=uintptr_t(mgl_data_min_dir(_DT_,s)); delete []s; return r; } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_mom_z(void *par) +HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how) { - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0], ny=t->p[1], nz=t->p[2], nn=t->n; - mreal *b=t->a; - const mreal *a=t->b; - const mglFormula *eq = (const mglFormula *)t->v; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i=t->id;iGetNx(),ny=dat->GetNy(),nz=dat->GetNz(); + mglDataV x(nx,ny,nz, 0,1,'x'); x.s=L"x"; + mglDataV y(nx,ny,nz, 0,1,'y'); y.s=L"y"; + mglDataV z(nx,ny,nz, 0,1,'z'); z.s=L"z"; + mglData u(dat); u.s=L"u"; // NOTE slow !!! + std::vector list; + list.push_back(&x); list.push_back(&y); list.push_back(&z); list.push_back(&u); + mglData res=mglFormulaCalc(how,list); + + mglData *b=0; + if(dir=='x') { - register mreal i0 = 0, i1 = 0; - for(long k=0;kCalc(x,y,z,a[ii]); + register mreal i1=0,i0=0; + for(long j=0;jvthr(i+nx*j); + i0 += u; i1 += u*res.a[i+nx*j]; + } + b->a[i] = i0>0 ? i1/i0 : 0; } - b[i] = i0>0 ? i1/i0 : 0; } - return 0; -} -MGL_NO_EXPORT void *mgl_mom_y(void *par) -{ - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0], ny=t->p[1], nz=t->p[2], nn=t->n; - mreal *b=t->a; - const mreal *a=t->b; - const mglFormula *eq = (const mglFormula *)t->v; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i=t->id;iCalc(x,y,z,a[ii]); + register mreal i1=0,i0=0; + for(long k=0;kv(j,i,k); + i0 += u; i1 += u*res.a[j+nx*(i+ny*k)]; + } + b->a[i] = i0>0 ? i1/i0 : 0; } - b[i] = i0>0 ? i1/i0 : 0; } - return 0; -} -MGL_NO_EXPORT void *mgl_mom_x(void *par) -{ - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0], ny=t->p[1], nz=t->p[2], nn=t->n; - mreal *b=t->a; - const mreal *a=t->b; - const mglFormula *eq = (const mglFormula *)t->v; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i=t->id;iCalc(x,y,z,a[ii]); + register mreal i1=0,i0=0; + for(long j=0;jvthr(j+nn*i); + i0 += u; i1 += u*res.a[j+nn*i]; + } + b->a[i] = i0>0 ? i1/i0 : 0; } - b[i] = i0>0 ? i1/i0 : 0; } - return 0; -} -HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how) -{ // NOTE: only for mglData (for speeding up) - long nx=dat->GetNx(),ny=dat->GetNy(),nz=dat->GetNz(); - const mglData *d=dynamic_cast(dat); - if(!d) return 0; - mglFormula eq(how); - long p[3]={nx,ny,nz}; - mglData *b=0; - if(dir=='x') - { b=new mglData(nx); mglStartThread(mgl_mom_x,0,nx,b->a,d->a,0,p,&eq); } - if(dir=='y') - { b=new mglData(ny); mglStartThread(mgl_mom_y,0,ny,b->a,d->a,0,p,&eq); } - if(dir=='z') - { b=new mglData(nz); mglStartThread(mgl_mom_z,0,nz,b->a,d->a,0,p,&eq); } return b; } uintptr_t MGL_EXPORT mgl_data_momentum_(uintptr_t *d, char *dir, const char *how, int,int l) { char *s=new char[l+1]; memcpy(s,how,l); s[l]=0; - uintptr_t r=uintptr_t(mgl_data_momentum(_DT_,*dir, s)); - delete []s; return r; } + uintptr_t r=uintptr_t(mgl_data_momentum(_DT_,*dir, s)); delete []s; return r; } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_eqmul(void *par) -{ - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0]; - mreal *b=t->a; - const mreal *a=t->b; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i=t->id;in;i+=mglNumThr) b[i] *= a[i%nx]; - return 0; -} void MGL_EXPORT mgl_data_mul_dat(HMDT d, HCDT a) { - long n, nx=d->nx, ny=d->ny, nz=d->nz; - const mglData *b = dynamic_cast(a); - if(b) + long nx=d->nx, ny=d->ny, nz=d->nz; + long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); + if(mz==1 && my==1 && mx==1) { - if(b->nz==1 && b->ny==1 && nx==b->nx) - { n=nx; mglStartThread(mgl_eqmul,0,nx*ny*nz,d->a,b->a,0,&n); } - else if(b->nz==1 && ny==b->ny && nx==b->nx) - { n=nx*ny; mglStartThread(mgl_eqmul,0,nx*ny*nz,d->a,b->a,0,&n); } - else if(nz==b->nz && ny==b->ny && nx==b->nx) - { n=nx*ny*nz; mglStartThread(mgl_eqmul,0,nx*ny*nz,d->a,b->a,0,&n); } + mreal v=a->v(0); +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] *= v; } - else + else if(mz==1 && my==1 && nx==mx) +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] *= a->v(i); + else if(mz==1 && ny==my && nx==mx) +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] *= a->v(i,j); + else if(nz==mz && ny==my && nx==mx) #pragma omp parallel for collapse(3) for(long k=0;ka[i+nx*(j+ny*k)] *= a->v(i,j,k); @@ -621,36 +557,32 @@ void MGL_EXPORT mgl_data_mul_dat(HMDT d, HCDT a) //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_mul_num(HMDT d, mreal a) { - long n=1, nx=d->nx, ny=d->ny, nz=d->nz; mreal aa=a; - mglStartThread(mgl_eqmul,0,nx*ny*nz,d->a,&aa,0,&n); + long nx=d->nx, ny=d->ny, nz=d->nz; +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] *= a; } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_eqdiv(void *par) -{ - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0]; - mreal *b=t->a; - const mreal *a=t->b; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i=t->id;in;i+=mglNumThr) b[i] /= a[i%nx]; - return 0; -} void MGL_EXPORT mgl_data_div_dat(HMDT d, HCDT a) { - long n, nx=d->nx, ny=d->ny, nz=d->nz; - const mglData *b = dynamic_cast(a); - if(b) + long nx=d->nx, ny=d->ny, nz=d->nz; + long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); + if(mz==1 && my==1 && mx==1) { - if(b->nz==1 && b->ny==1 && nx==b->nx) - { n=nx; mglStartThread(mgl_eqdiv,0,nx*ny*nz,d->a,b->a,0,&n); } - else if(b->nz==1 && ny==b->ny && nx==b->nx) - { n=nx*ny; mglStartThread(mgl_eqdiv,0,nx*ny*nz,d->a,b->a,0,&n); } - else if(nz==b->nz && ny==b->ny && nx==b->nx) - { n=nx*ny*nz; mglStartThread(mgl_eqdiv,0,nx*ny*nz,d->a,b->a,0,&n); } + mreal v=a->v(0); +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] /= v; } - else + else if(mz==1 && my==1 && nx==mx) +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] /= a->v(i); + else if(mz==1 && ny==my && nx==mx) +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] /= a->v(i,j); + else if(nz==mz && ny==my && nx==mx) #pragma omp parallel for collapse(3) for(long k=0;ka[i+nx*(j+ny*k)] /= a->v(i,j,k); @@ -658,36 +590,32 @@ void MGL_EXPORT mgl_data_div_dat(HMDT d, HCDT a) //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_div_num(HMDT d, mreal a) { - long n=1, nx=d->nx, ny=d->ny, nz=d->nz; mreal aa=a; - mglStartThread(mgl_eqdiv,0,nx*ny*nz,d->a,&aa,0,&n); + long nx=d->nx, ny=d->ny, nz=d->nz; +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] /= a; } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_eqadd(void *par) -{ - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0]; - mreal *b=t->a; - const mreal *a=t->b; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i=t->id;in;i+=mglNumThr) b[i] += a[i%nx]; - return 0; -} void MGL_EXPORT mgl_data_add_dat(HMDT d, HCDT a) { - long n, nx=d->nx, ny=d->ny, nz=d->nz; - const mglData *b = dynamic_cast(a); - if(b) + long nx=d->nx, ny=d->ny, nz=d->nz; + long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); + if(mz==1 && my==1 && mx==1) { - if(b->nz==1 && b->ny==1 && nx==b->nx) - { n=nx; mglStartThread(mgl_eqadd,0,nx*ny*nz,d->a,b->a,0,&n); } - else if(b->nz==1 && ny==b->ny && nx==b->nx) - { n=nx*ny; mglStartThread(mgl_eqadd,0,nx*ny*nz,d->a,b->a,0,&n); } - else if(nz==b->nz && ny==b->ny && nx==b->nx) - { n=nx*ny*nz; mglStartThread(mgl_eqadd,0,nx*ny*nz,d->a,b->a,0,&n); } + mreal v=a->v(0); +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] += v; } - else + else if(mz==1 && my==1 && nx==mx) +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] += a->v(i); + else if(mz==1 && ny==my && nx==mx) +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] += a->v(i,j); + else if(nz==mz && ny==my && nx==mx) #pragma omp parallel for collapse(3) for(long k=0;ka[i+nx*(j+ny*k)] += a->v(i,j,k); @@ -695,36 +623,32 @@ void MGL_EXPORT mgl_data_add_dat(HMDT d, HCDT a) //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_add_num(HMDT d, mreal a) { - long n=1, nx=d->nx, ny=d->ny, nz=d->nz; mreal aa=a; - mglStartThread(mgl_eqadd,0,nx*ny*nz,d->a,&aa,0,&n); + long nx=d->nx, ny=d->ny, nz=d->nz; +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] += a; } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_eqsub(void *par) -{ - mglThreadD *t=(mglThreadD *)par; - long nx=t->p[0]; - mreal *b=t->a; - const mreal *a=t->b; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i=t->id;in;i+=mglNumThr) b[i] -= a[i%nx]; - return 0; -} void MGL_EXPORT mgl_data_sub_dat(HMDT d, HCDT a) { - long n, nx=d->nx, ny=d->ny, nz=d->nz; - const mglData *b = dynamic_cast(a); - if(b) + long nx=d->nx, ny=d->ny, nz=d->nz; + long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); + if(mz==1 && my==1 && mx==1) { - if(b->nz==1 && b->ny==1 && nx==b->nx) - { n=nx; mglStartThread(mgl_eqsub,0,nx*ny*nz,d->a,b->a,0,&n); } - else if(b->nz==1 && ny==b->ny && nx==b->nx) - { n=nx*ny; mglStartThread(mgl_eqsub,0,nx*ny*nz,d->a,b->a,0,&n); } - else if(nz==b->nz && ny==b->ny && nx==b->nx) - { n=nx*ny*nz; mglStartThread(mgl_eqsub,0,nx*ny*nz,d->a,b->a,0,&n); } + mreal v=a->v(0); +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] -= v; } - else + else if(mz==1 && my==1 && nx==mx) +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] -= a->v(i); + else if(mz==1 && ny==my && nx==mx) +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] -= a->v(i,j); + else if(nz==mz && ny==my && nx==mx) #pragma omp parallel for collapse(3) for(long k=0;ka[i+nx*(j+ny*k)] -= a->v(i,j,k); @@ -732,8 +656,10 @@ void MGL_EXPORT mgl_data_sub_dat(HMDT d, HCDT a) //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_sub_num(HMDT d, mreal a) { - long n=1, nx=d->nx, ny=d->ny, nz=d->nz; mreal aa=a; - mglStartThread(mgl_eqsub,0,nx*ny*nz,d->a,&aa,0,&n); + long nx=d->nx, ny=d->ny, nz=d->nz; +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] -= a; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_mul_dat_(uintptr_t *d, uintptr_t *b) { mgl_data_mul_dat(_DT_, _DA_(b)); } @@ -765,18 +691,19 @@ MGL_NO_EXPORT void *mgl_hist_1(void *par) long nn=t->n, n = t->p[0]; mreal *b=new mreal[n]; memset(b,0,n*sizeof(mreal)); - const mreal *a=t->b, *c=t->c, *v=(const mreal *)t->v; + HCDT a = (HCDT)(t->b), c = (HCDT)(t->c); + const mreal *v=(const mreal *)t->v; #if !MGL_HAVE_PTHREAD #pragma omp parallel for #endif for(long i=t->id;ivthr(i)-v[0])/(v[1]-v[0])); if(k>=0 && kvthr(i):1.; } t->a = b; return 0; } @@ -784,10 +711,11 @@ MGL_NO_EXPORT void *mgl_hist_2(void *par) { mglThreadD *t=(mglThreadD *)par; long nn=t->n, n = t->p[0]; - long ns=t->p[1], nx=t->p[2], ny=t->p[3], nz=t->p[4]; + long ns=t->p[1], nx=t->p[2], ny=t->p[3]; mreal *b=new mreal[n], d=1./ns; memset(b,0,n*sizeof(mreal)); - const mreal *a=t->b, *c=t->c, *v=(const mreal *)t->v; + HCDT a = (HCDT)(t->b), c = (HCDT)(t->c); + const mreal *v=(const mreal *)t->v; bool sp = n>0; #if !MGL_HAVE_PTHREAD #pragma omp parallel for @@ -795,8 +723,8 @@ MGL_NO_EXPORT void *mgl_hist_2(void *par) for(long i=t->id;i=0 && k(dat); - if(n<2 || v1==v2 || !d) return 0; // NOTE: For mglData only! + if(n<2 || v1==v2) return 0; mglData *b=new mglData(n); mreal v[2]={v1,v2}; - long nx=d->nx, ny=d->ny, nz=d->nz; + long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz(); long ns=abs(nsub)+1, p[5]={n,ns,nx,ny,nz}; - if(nsub==0) mglStartThread(mgl_hist_1,mgl_hist_p, nx*ny*nz, b->a,d->a,0,p,v); - else mglStartThread(mgl_hist_2,mgl_hist_p, nx*ny*nz*ns*ns*ns, b->a,d->a,0,p,v); + if(nsub==0) mglStartThread(mgl_hist_1,mgl_hist_p, nx*ny*nz, b->a,(const mreal *)dat,0,p,v); + else mglStartThread(mgl_hist_2,mgl_hist_p, nx*ny*nz*ns*ns*ns, b->a,(const mreal *)dat,0,p,v); return b; } //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_data_hist_w(HCDT dat, HCDT weight, long n, mreal v1, mreal v2, long nsub) { - const mglData *d = dynamic_cast(dat); - const mglData *w = dynamic_cast(weight); - if(n<2 || v1==v2 || !d || !w) return 0; // NOTE: For mglData only! + if(n<2 || v1==v2) return 0; mglData *b=new mglData(n); mreal v[2]={v1,v2}; - long nx=d->nx, ny=d->ny, nz=d->nz; + long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz(); long ns=abs(nsub)+1, p[5]={n,ns,nx,ny,nz}; - if(nsub==0) mglStartThread(mgl_hist_1,mgl_hist_p, nx*ny*nz, b->a,d->a,w->a,p,v); - else mglStartThread(mgl_hist_2,mgl_hist_p, nx*ny*nz*ns*ns*ns, b->a,d->a,w->a,p,v); + if(nsub==0) mglStartThread(mgl_hist_1,mgl_hist_p, nx*ny*nz, b->a,(const mreal *)dat,(const mreal *)weight,p,v); + else mglStartThread(mgl_hist_2,mgl_hist_p, nx*ny*nz*ns*ns*ns, b->a,(const mreal *)dat,(const mreal *)weight,p,v); return b; } //----------------------------------------------------------------------------- @@ -841,7 +766,7 @@ uintptr_t MGL_EXPORT mgl_data_hist_w_(uintptr_t *d, uintptr_t *w, int *n, mreal { return uintptr_t(mgl_data_hist_w(_DT_,_DA_(w),*n,*v1,*v2,*nsub)); } //----------------------------------------------------------------------------- long MGL_NO_EXPORT mgl_idx_var; -int MGL_NO_EXPORT mgl_cmd_idx(const void *a, const void *b) +int MGL_LOCAL_PURE mgl_cmd_idx(const void *a, const void *b) { mreal *aa = (mreal *)a, *bb = (mreal *)b; return (aa[mgl_idx_var]>bb[mgl_idx_var] ? 1:(aa[mgl_idx_var]0.5*fmin(fabs(f),fabs(f1))) // TODO switch to bisection if slow +/* if(fabs(f-f1)>0.5*mgl_min(fabs(f),fabs(f1))) // TODO switch to bisection if slow { x = (x1+x0)/2; f = func(x,par); if(fabs(f)<1e-7) return x; diff --git a/src/data_gr.cpp b/src/data_gr.cpp index fcdc558..faf12e7 100644 --- a/src/data_gr.cpp +++ b/src/data_gr.cpp @@ -28,6 +28,9 @@ #include "mgl2/thread.h" #include "mgl2/base.h" //----------------------------------------------------------------------------- +mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); +mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector &head); +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_refill_gr(HMGL gr, HMDT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, long sl, const char *opt) { if(!vdat) return; @@ -52,59 +55,21 @@ void MGL_EXPORT mgl_data_refill_gr_(uintptr_t *gr, uintptr_t *d, uintptr_t *xdat { char *s=new char[l+1]; memcpy(s,opt,l); s[l]=0; mgl_data_refill_gr(_GR_,_DT_,_DA_(xdat),_DA_(ydat),_DA_(zdat),_DA_(vdat),*sl,s); delete []s; } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_fill_f(void *par) -{ - mglThreadD *t=(mglThreadD *)par; - const mglFormula *f = (const mglFormula *)(t->v); - long nx=t->p[0],ny=t->p[1]; - mreal *b=t->a; - const mreal *v=t->b, *w=t->c, *x=t->d; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) - { - register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny); - b[i0] = f->Calc(x[0]+i*x[1], x[2]+j*x[3], x[4]+k*x[5], b[i0], v?v[i0]:0, w?w[i0]:0); - } - return 0; -} -MGL_NO_EXPORT void *mgl_fill_fgen(void *par) -{ - mglThreadV *t=(mglThreadV *)par; - const mglFormula *f = (const mglFormula *)(t->v); - long nx=t->p[0],ny=t->p[1]; - mreal *b=t->a; - HCDT v=(HCDT)t->b, w=(HCDT)t->c; - const mreal *x=t->d; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) - { - register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny); - b[i0] = f->Calc(x[0]+i*x[1], x[2]+j*x[3], x[4]+k*x[5], b[i0], v?v->vthr(i0):0, w?w->vthr(i0):0); - } - return 0; -} void MGL_EXPORT mgl_data_fill_eq(HMGL gr, HMDT d, const char *eq, HCDT vdat, HCDT wdat, const char *opt) { - const mglData *v = dynamic_cast(vdat); - const mglData *w = dynamic_cast(wdat); - long nn = d->nx*d->ny*d->nz, par[3]={d->nx,d->ny,d->nz}; - if(vdat && vdat->GetNN()!=nn) return; - if(wdat && wdat->GetNN()!=nn) return; + if(vdat && vdat->GetNN()!=d->GetNN()) return; // incompatible dimesions + if(wdat && wdat->GetNN()!=d->GetNN()) return; gr->SaveState(opt); - mreal xx[6]={gr->Min.x,0, gr->Min.y,0, gr->Min.z,0}; - if(d->nx>1) xx[1] = (gr->Max.x-gr->Min.x)/(d->nx-1.); - if(d->ny>1) xx[3] = (gr->Max.y-gr->Min.y)/(d->ny-1.); - if(d->nz>1) xx[5] = (gr->Max.z-gr->Min.z)/(d->nz-1.); - mglFormula f(eq); - if(v && w) mglStartThread(mgl_fill_f,0,nn,d->a,v->a,w->a,par,&f,xx); - else if(vdat && wdat) mglStartThreadV(mgl_fill_fgen,nn,d->a,vdat,wdat,par,&f,xx); - else if(v) mglStartThread(mgl_fill_f,0,nn,d->a,v->a,0,par,&f,xx); - else if(vdat) mglStartThreadV(mgl_fill_fgen,nn,d->a,vdat,0,par,&f,xx); - else mglStartThread(mgl_fill_f,0,nn,d->a,0,0,par,&f,xx); + std::wstring s = d->s; d->s = L"u"; + mglDataV x(d->nx,d->ny,d->nz, gr->Min.x,gr->Max.x,'x'); x.s=L"x"; + mglDataV y(d->nx,d->ny,d->nz, gr->Min.y,gr->Max.y,'y'); y.s=L"y"; + mglDataV z(d->nx,d->ny,d->nz, gr->Min.z,gr->Max.z,'z'); z.s=L"z"; + mglDataV r(d->nx,d->ny,d->nz); r.s=L"#$mgl"; + mglData v(vdat), w(wdat); v.s = L"v"; w.s = L"w"; + std::vector list; + list.push_back(&x); list.push_back(&y); list.push_back(&z); list.push_back(&r); + list.push_back(d); list.push_back(&v); list.push_back(&w); + d->Set(mglFormulaCalc(eq,list)); d->s = s; gr->LoadState(); } void MGL_EXPORT mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w, const char *opt,int l,int lo) @@ -112,62 +77,21 @@ void MGL_EXPORT mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, u char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0; mgl_data_fill_eq(_GR_,_DT_,s,_DA_(v),_DA_(w),o); delete []o; delete []s; } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_cfill_f(void *par) -{ - mglThreadC *t=(mglThreadC *)par; - const mglFormulaC *f = (const mglFormulaC *)(t->v); - long nx=t->p[0],ny=t->p[1]; - dual *b=t->a; - const dual *v=t->b, *w=t->c, *x=t->d; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) - { - register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny); - b[i0] = f->Calc(x[0]+mreal(i)*x[1], x[2]+mreal(j)*x[3], x[4]+mreal(k)*x[5], - b[i0], v?v[i0]:dual(0,0), w?w[i0]:dual(0,0)); - } - return 0; -} -MGL_NO_EXPORT void *mgl_cfill_fgen(void *par) -{ - mglThreadV *t=(mglThreadV *)par; - const mglFormulaC *f = (const mglFormulaC *)(t->v); - long nx=t->p[0],ny=t->p[1]; - dual *b=t->aa; - HCDT v=(HCDT)t->b, w=(HCDT)t->c; - const mreal *x=t->d; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) - { - register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny); - b[i0] = f->Calc(x[0]+i*x[1], x[2]+j*x[3], x[4]+k*x[5], - b[i0], v?v->vthr(i0):0, w?w->vthr(i0):0); - } - return 0; -} void MGL_EXPORT mgl_datac_fill_eq(HMGL gr, HADT d, const char *eq, HCDT vdat, HCDT wdat, const char *opt) { - const mglDataC *v = dynamic_cast(vdat); - const mglDataC *w = dynamic_cast(wdat); - long nn = d->nx*d->ny*d->nz, par[3]={d->nx,d->ny,d->nz}; - if(v && v->nx*v->ny*v->nz!=nn) return; - if(w && w->nx*w->ny*w->nz!=nn) return; + if(vdat && vdat->GetNN()!=d->GetNN()) return; // incompatible dimesions + if(wdat && wdat->GetNN()!=d->GetNN()) return; gr->SaveState(opt); - mreal xx[6]={gr->Min.x,0, gr->Min.y,0, gr->Min.z,0}; - if(d->nx>1) xx[1] = (gr->Max.x-gr->Min.x)/(d->nx-1.); - if(d->ny>1) xx[3] = (gr->Max.y-gr->Min.y)/(d->ny-1.); - if(d->nz>1) xx[5] = (gr->Max.z-gr->Min.z)/(d->nz-1.); - dual cc[6]={xx[0],xx[1],xx[2],xx[3],xx[4],xx[5]}; - mglFormulaC f(eq); - if(v && w) mglStartThreadC(mgl_cfill_f,0,nn,d->a,v->a,w->a,par,&f,cc); - else if(vdat && wdat) mglStartThreadV(mgl_cfill_fgen,nn,d->a,vdat,wdat,par,&f,xx); - else if(v) mglStartThreadC(mgl_cfill_f,0,nn,d->a,v->a,0,par,&f,cc); - else if(vdat) mglStartThreadV(mgl_cfill_fgen,nn,d->a,vdat,0,par,&f,xx); - else mglStartThreadC(mgl_cfill_f,0,nn,d->a,0,0,par,&f,cc); + std::wstring s = d->s; d->s = L"u"; + mglDataV x(d->nx,d->ny,d->nz, gr->Min.x,gr->Max.x,'x'); x.s=L"x"; + mglDataV y(d->nx,d->ny,d->nz, gr->Min.y,gr->Max.y,'y'); y.s=L"y"; + mglDataV z(d->nx,d->ny,d->nz, gr->Min.z,gr->Max.z,'z'); z.s=L"z"; + mglDataV r(d->nx,d->ny,d->nz); r.s=L"#$mgl"; + mglData v(vdat), w(wdat); v.s = L"v"; w.s = L"w"; + std::vector list; + list.push_back(&x); list.push_back(&y); list.push_back(&z); list.push_back(&r); + list.push_back(d); list.push_back(&v); list.push_back(&w); + d->Set(mglFormulaCalcC(eq,list)); d->s = s; gr->LoadState(); } void MGL_EXPORT mgl_datac_fill_eq_(uintptr_t *gr, uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w, const char *opt,int l,int lo) diff --git a/src/data_io.cpp b/src/data_io.cpp index 1ac3472..ff6b7b7 100644 --- a/src/data_io.cpp +++ b/src/data_io.cpp @@ -39,8 +39,8 @@ #undef intf #endif -//#define isn(ch) ((ch)<' ' && (ch)!='\t') -#define isn(ch) ((ch)=='\n') +inline bool isn(char ch) {return ch=='\n';} +mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_create_data() { return new mglData; } HMDT MGL_EXPORT mgl_create_data_size(long nx, long ny, long nz){ return new mglData(nx,ny,nz); } @@ -63,39 +63,41 @@ void mglFromStr(HMDT d,char *buf,long NX,long NY,long NZ) // TODO: add multithre mgl_data_create(d, NX,NY,NZ); long nb = strlen(buf); register long i=0, j=0; - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); while(j0 || buf[j+1]!='#') // this is columns id - while(!isn(buf[j]) && j='a' && buf[j]<='z') d->id.push_back(buf[j]); j++; } } - while(buf[j]<=' ' && j' ' && buf[j]!=',' && buf[j]!=';' && j' ' && buf[j]!=',' && buf[j]!=';') j++; buf[j]=0; d->a[i] = strstr(s,"NAN")?NAN:atof(s); i++; if(i>=NX*NY*NZ) break; } - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_set(HMDT d, HCDT a) { if(!a) return; - const mglData *dd = dynamic_cast(a); // faster for mglData +// d->temp = a->temp; d->s = a->s; d->func = a->func; d->o = a->o; + mgl_data_create(d, a->GetNx(), a->GetNy(), a->GetNz()); + const mglData *dd = dynamic_cast(a); // faster for mglData if(dd) // this one should be much faster memcpy(d->a, dd->a, d->nx*d->ny*d->nz*sizeof(mreal)); else // very inefficient!!! @@ -253,37 +255,46 @@ void MGL_EXPORT mgl_data_set_id_(uintptr_t *d, const char *eq,int l) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; mgl_data_set_id(_DT_, s); delete []s; } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_data_set_name_w(mglDataA *dat, const wchar_t *name) +{ dat->s = name; } +void MGL_EXPORT mgl_data_set_name(mglDataA *dat, const char *name) +{ MGL_TO_WCS(name,dat->s = wcs); } +void MGL_EXPORT mgl_data_set_name_(uintptr_t *d, const char *name,int l) +{ char *s=new char[l+1]; memcpy(s,name,l); s[l]=0; + mgl_data_set_name(_DT_,s); delete []s; } +void MGL_EXPORT mgl_data_set_func(mglDataA *dat, void (*func)(void *), void *par) +{ dat->func = func; dat->o = par; } +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_save(HCDT d, const char *fname,long ns) { FILE *fp = fopen(fname,"w"); if(!fp) return; - register long i,j,k; long nx=d->GetNx(), ny=d->GetNy(), nz=d->GetNz(); - setlocale(LC_NUMERIC, "C"); - if(ns<0 || (ns>=nz && nz>1)) for(k=0;k=nz && nz>1)) for(long k=0;k(d); if(dr && !dr->id.empty()) fprintf(fp,"## %s\n",dr->id.c_str()); const mglDataC *dc = dynamic_cast(d); if(dc && !dc->id.empty()) fprintf(fp,"## %s\n",dc->id.c_str()); - for(i=0;iv(j,i,k)); + for(long j=0;jv(j,i,k)); fprintf(fp,"%g\n",d->v(nx-1,i,k)); } fprintf(fp,"\n"); } else { // save selected slice - if(nz>1) for(i=0;i1) for(long i=0;iv(j,i,ns)); + for(long j=0;jv(j,i,ns)); fprintf(fp,"%g\n",d->v(nx-1,i,ns)); } - else if(nsv(j,ns)); } - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); fclose(fp); } void MGL_EXPORT mgl_data_save_(uintptr_t *d, const char *fname,int *ns,int l) @@ -403,24 +414,21 @@ int MGL_EXPORT mgl_data_read_mat(HMDT d, const char *fname, long dim) char *buf = mgl_read_gz(fp); long nb = strlen(buf); gzclose(fp); - register long j=0,i,l; - while(j' ') j++; } else if(dim==2) { sscanf(buf+j,"%ld%ld",&nx,&ny); - while(buf[j]!='\n' && j' ' && !first) first=true; if(first && (ch==' ' || ch=='\t' || ch==',' || ch==';') && b[i+1]>' ') nx++; } @@ -442,7 +450,7 @@ int MGL_EXPORT mgl_data_read_mat(HMDT d, const char *fname, long dim) else if(dim==3) { sscanf(buf+j,"%ld%ld%ld",&nx,&ny,&nz); - while(buf[j]!='\n' && j' ' && j' ' && jGetNN(); - const mglData *b = dynamic_cast(d); #pragma omp parallel { register mreal m=-INFINITY, v; - if(b) #pragma omp for nowait - for(long i=0;ia[i]; m = mvthr(i); m = mvthr(i); m = mm ? m1:m; } } @@ -483,18 +485,12 @@ mreal MGL_EXPORT mgl_data_min(HCDT d) { mreal m1=INFINITY; long nn=d->GetNN(); - const mglData *b = dynamic_cast(d); #pragma omp parallel { register mreal m=INFINITY, v; - if(b) -#pragma omp for nowait - for(long i=0;ia[i]; m = m>v ? v:m; } - else #pragma omp for nowait - for(long i=0;ivthr(i); m = m>v ? v:m; } + for(long i=0;ivthr(i); m = m>v ? v:m; } #pragma omp critical(min_dat) { m1 = m1GetNN(); - const mglData *b = dynamic_cast(d); #pragma omp parallel { register mreal m=0, v; - if(b) #pragma omp for nowait - for(long i=0;ia[i]; m = mvthr(i); m = mvthr(i); m = mm ? m1:m; } } return m1; @@ -529,19 +519,13 @@ mreal MGL_EXPORT mgl_data_pos_min(HCDT d) { mreal m1=INFINITY; long nn=d->GetNN(); - const mglData *b = dynamic_cast(d); #pragma omp parallel { register mreal m=INFINITY, v; - if(b) -#pragma omp for nowait - for(long i=0;ia[i]; m = m>v && v>0 ? v:m; } - else #pragma omp for nowait - for(long i=0;ivthr(i); m = m>v && v>0 ? v:m; } -#pragma omp critical(min_dat) + for(long i=0;ivthr(i); m = m>v && v>0 ? v:m; } +#pragma omp critical(pmin_dat) { m1 = m1p[0],ny=t->p[1]; - mreal *b=t->a, x1=t->b[0], dx=t->b[1]; - register char dir = t->s[0]; - if(dir=='x') -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) b[i0] = x1+dx*(i0%nx); - else if(dir=='y') -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) b[i0] = x1+dx*((i0/nx)%ny); - else if(dir=='z') -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) b[i0] = x1+dx*(i0/(nx*ny)); - return 0; -} void MGL_EXPORT mgl_data_fill(HMDT d, mreal x1,mreal x2,char dir) { if(mgl_isnan(x2)) x2=x1; if(dir<'x' || dir>'z') dir='x'; - long par[2]={d->nx,d->ny}; - mreal b[2]={x1,x2-x1}; - if(dir=='x') b[1] *= d->nx>1 ? 1./(d->nx-1):0; - if(dir=='y') b[1] *= d->ny>1 ? 1./(d->ny-1):0; - if(dir=='z') b[1] *= d->nz>1 ? 1./(d->nz-1):0; - mglStartThread(mgl_fill_x,0,d->nx*d->ny*d->nz,d->a,b,0,par,0,0,0,&dir); + long nx=d->nx,ny=d->ny,nz=d->nz; + if(dir=='x') + { + mreal dx = d->nx>1 ? (x2-x1)/(d->nx-1):0; +#pragma omp parallel for collapse(2) + for(long j=0;ja[i+nx*j] = x1+dx*i; +#pragma omp parallel for + for(long j=0;ja[nx*j] = x1; + } + if(dir=='y') + { + mreal dx = d->ny>1 ? (x2-x1)/(d->ny-1):0; +#pragma omp parallel for collapse(3) + for(long k=0;ka[i+nx*(j+ny*k)] = x1+dx*j; +#pragma omp parallel for collapse(2) + for(long j=0;ja[i+nx*ny*j] = x1; + } + if(dir=='z') + { + mreal dx = d->nz>1 ? (x2-x1)/(d->nz-1):0; +#pragma omp parallel for collapse(2) + for(long j=1;ja[i+nx*ny*j] = x1+dx*j; +#pragma omp parallel for + for(long j=0;ja[j] = x1; + } } void MGL_EXPORT mgl_data_fill_(uintptr_t *d, mreal *x1,mreal *x2,const char *dir,int) { mgl_data_fill(_DT_,*x1,*x2,*dir); } @@ -869,15 +849,16 @@ MGL_NO_EXPORT void *mgl_modify(void *par) void MGL_EXPORT mgl_data_modify(HMDT d, const char *eq,long dim) { long nx=d->nx, ny=d->ny, nz=d->nz, par[3]={nx,ny,nz}; - mglFormula f(eq); - if(dim<0) dim=0; - if(nz>1) // 3D array + if(dim<=0) mgl_data_modify_vw(d,eq,0,0); // fastes variant for whole array + else if(nz>1) // 3D array { + mglFormula f(eq); par[2] -= dim; if(par[2]<0) par[2]=0; mglStartThread(mgl_modify,0,nx*ny*par[2],d->a+nx*ny*dim,0,0,par,&f); } else // 2D or 1D array { + mglFormula f(eq); par[1] -= dim; if(par[1]<0) par[1]=0; mglStartThread(mgl_modify,0,nx*par[1],d->a+nx*dim,0,0,par,&f); } @@ -886,37 +867,18 @@ void MGL_EXPORT mgl_data_modify_(uintptr_t *d, const char *eq,int *dim,int l) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; mgl_data_modify(_DT_,s,*dim); delete []s; } //----------------------------------------------------------------------------- -MGL_NO_EXPORT void *mgl_modify_gen(void *par) -{ - mglThreadV *t=(mglThreadV *)par; - const mglFormula *f = (const mglFormula *)(t->v); - register long nx=t->p[0],ny=t->p[1],nz=t->p[2]; - mreal *b=t->a, dx,dy,dz; - HCDT v=(HCDT)t->b, w=(HCDT)t->c; - dx=nx>1?1/(nx-1.):0; dy=ny>1?1/(ny-1.):0; dz=nz>1?1/(nz-1.):0; -#if !MGL_HAVE_PTHREAD -#pragma omp parallel for -#endif - for(long i0=t->id;i0n;i0+=mglNumThr) - { - register long i=i0%nx, j=((i0/nx)%ny), k=i0/(nx*ny); - b[i0] = f->Calc(i*dx, j*dy, k*dz, b[i0], v?v->vthr(i0):0, w?w->vthr(i0):0); - } - return 0; -} void MGL_EXPORT mgl_data_modify_vw(HMDT d, const char *eq,HCDT vdat,HCDT wdat) { - const mglData *v = dynamic_cast(vdat); - const mglData *w = dynamic_cast(wdat); - long nn = d->nx*d->ny*d->nz, par[3]={d->nx,d->ny,d->nz}; - if(vdat && vdat->GetNN()!=nn) return; - if(wdat && wdat->GetNN()!=nn) return; - mglFormula f(eq); - if(v && w) mglStartThread(mgl_modify,0,nn,d->a,v->a,w->a,par,&f); - else if(vdat && wdat) mglStartThreadV(mgl_modify_gen,nn,d->a,vdat,wdat,par,&f); - else if(v) mglStartThread(mgl_modify,0,nn,d->a,v->a,0,par,&f); - else if(vdat) mglStartThreadV(mgl_modify_gen,nn,d->a,vdat,0,par,&f); - else mglStartThread(mgl_modify,0,nn,d->a,0,0,par,&f); + std::wstring s = d->s; d->s = L"u"; + mglDataV x(d->nx,d->ny,d->nz, 0,1,'x'); x.s=L"x"; + mglDataV y(d->nx,d->ny,d->nz, 0,1,'y'); y.s=L"y"; + mglDataV z(d->nx,d->ny,d->nz, 0,1,'z'); z.s=L"z"; + mglDataV r(d->nx,d->ny,d->nz); r.s=L"#$mgl"; + mglData v(vdat), w(wdat); v.s = L"v"; w.s = L"w"; + std::vector list; + list.push_back(&x); list.push_back(&y); list.push_back(&z); list.push_back(d); + list.push_back(&v); list.push_back(&w); list.push_back(&r); + d->Set(mglFormulaCalc(eq,list)); d->s = s; } void MGL_EXPORT mgl_data_modify_vw_(uintptr_t *d, const char *eq, uintptr_t *v, uintptr_t *w,int l) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; @@ -968,7 +930,7 @@ int MGL_EXPORT mgl_data_read_hdf4(HMDT ,const char *,const char *) #if MGL_HAVE_HDF5 void MGL_EXPORT mgl_data_save_hdf(HCDT dat,const char *fname,const char *data,int rewrite) { - const mglData *d = dynamic_cast(dat); // NOTE: only for mglData + const mglData *d = dynamic_cast(dat); // NOTE: slow for non-mglData if(!d) { mglData d(dat); mgl_data_save_hdf(&d,fname,data,rewrite); return; } hid_t hf,hd,hs; hsize_t dims[3]; @@ -1063,6 +1025,9 @@ void MGL_EXPORT mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char * { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; char *t=new char[n+1]; memcpy(t,data,n); t[n]=0; mgl_data_save_hdf(_DT_,s,t,*rewrite); delete []s; delete []t; } +int MGL_EXPORT mgl_datas_hdf_(const char *fname, char *buf, int l, int size) +{ char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; + int r = mgl_datas_hdf(s,buf,size); delete []s; return r; } //----------------------------------------------------------------------------- bool MGL_EXPORT mgl_add_file(long &kx,long &ky, long &kz, mreal *&b, mglData *d,bool as_slice) { @@ -1171,3 +1136,33 @@ int MGL_EXPORT mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; int r = mgl_data_read_all(_DT_,s,*as_slice); delete []s; return r; } //----------------------------------------------------------------------------- +HMDT MGL_EXPORT mgl_data_column(HCDT dat, const char *eq) +{ + const mglData *dd=dynamic_cast(dat); + std::vector list; + if(dd && dd->id.length()>0) for(size_t i=0;iid.length();i++) + { + mglDataT *col = new mglDataT(*dat); + col->SetInd(i,dd->id[i]); + list.push_back(col); + } + const mglDataC *dc=dynamic_cast(dat); + if(dc && dc->id.length()>0) for(size_t i=0;iid.length();i++) + { + mglDataT *col = new mglDataT(*dat); + col->SetInd(i,dc->id[i]); + list.push_back(col); + } + if(list.size()==0) return 0; // no named columns + mglDataV *t = new mglDataV(dat->GetNy(),dat->GetNz()); + t->s=L"#$mgl"; list.push_back(t); + mglData *r = new mglData; + r->Set(mglFormulaCalc(eq,list)); + for(size_t i=0;i #endif +#if MGL_HAVE_JPEG +#include +#endif //----------------------------------------------------------------------------- -size_t MGL_NO_EXPORT mgl_col_dif(unsigned char *c1,unsigned char *c2,bool sum) +size_t MGL_LOCAL_PURE mgl_col_dif(unsigned char *c1,unsigned char *c2,bool sum) { size_t res,d1=abs(long(c1[0])-long(c2[0])), d2=abs(long(c1[1])-long(c2[1])),d3=abs(long(c1[2])-long(c2[2])); @@ -45,10 +48,10 @@ MGL_NO_EXPORT unsigned char *mgl_create_scheme(const char *scheme,long &num) if(np<2) { delete []cc; return 0; } for(size_t i=0;ihi) h=hi; + if(type==PNG_COLOR_TYPE_RGB_ALPHA) +#pragma omp parallel for + for(long i=0;ih) hi = h; + if(wi>w) wi = w; + for(long i=0;iny;i++) for(long j=0;jnx;j++) { - size_t pos=0,val,mval=256; + size_t pos=0,mval=256; for(long k=0;kny-i-1]+3*j,true); + size_t val = mgl_col_dif(c+3*k,rows[d->ny-i-1]+3*j,true); if(val==0) { pos=k; break; } if(valGetNx(), ny=dd->GetNy(), nz=dd->GetNz(); - const mglData *md = dynamic_cast(dd); if(v1>v2) return; if(ns<0 || ns>=nz) ns=0; if(v1==v2) { v1 = INFINITY; v2=-INFINITY; - if(md) -//#pragma omp parallel for // NOTE comparison here - for(long i=0;ia[i]; if(vvv2) v2=vv; } - else -//#pragma omp parallel for // NOTE comparison here - for(long i=0;ivthr(i); if(vvv2) v2=vv; } + for(long i=0;ivthr(i); if(vvv2) v2=vv; } } if(v1==v2) return; long num=0; @@ -139,23 +225,13 @@ void MGL_EXPORT mgl_data_export(HCDT dd, const char *fname, const char *scheme,m unsigned char *d = new unsigned char[3*nx*ny]; #pragma omp parallel for for(long i=0;ia[j+nx*(i+ny*ns)]; - register long k = long(num*(vv-v1)/(v2-v1)); - if(k<0) k=0; if(k>=num) k=num-1; - memcpy(d+3*(j+i*nx),c+3*k,3); - } - else #pragma omp parallel for collapse(2) - for(long i=0;iv(j,i,ns)-v1)/(v2-v1)); - if(k<0) k=0; if(k>=num) k=num-1; - memcpy(d+3*(j+i*nx),c+3*k,3); - } + for(long i=0;iv(j,i,ns)-v1)/(v2-v1)); + if(k<0) k=0; if(k>=num) k=num-1; + memcpy(d+3*(j+i*nx),c+3*k,3); + } delete []c; FILE *fp = fopen(fname, "wb"); diff --git a/src/eval.cpp b/src/eval.cpp index ee3ee8b..6da9744 100644 --- a/src/eval.cpp +++ b/src/eval.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #endif //----------------------------------------------------------------------------- // constants for expression parsing @@ -59,6 +60,7 @@ EQ_ELE, // elliptic integral E(\phi,k) = \int_0^\phi dt \sqrt((1 - k^2 \sin^2 EQ_ELF, // elliptic integral F(\phi,k) = \int_0^\phi dt 1/\sqrt((1 - k^2 \sin^2(t))) EQ_LP, // Legendre polynomial P_l(x), (|x|<=1, l>=0) EQ_BETA, // beta function B(x,y) = Gamma(x)*Gamma(y)/Gamma(x+y) +EQ_GAMMA_INC, // incomplete gamma function Gamma(a,x) = \int_x^\infty dt t^{a-1} \exp(-t) for x>=0. // normal functions of 1 argument EQ_SIN, // sine function \sin(x). !!! MUST BE FIRST 1-PLACE FUNCTION EQ_COS, // cosine function \cos(x). @@ -127,8 +129,8 @@ EQ_CL // Clausen function #endif //----------------------------------------------------------------------------- int mglFormula::Error=0; -bool mglCheck(char *str,int n); -int mglFindInText(char *str,const char *lst); +bool MGL_LOCAL_PURE mglCheck(char *str,int n); +int MGL_LOCAL_PURE mglFindInText(char *str,const char *lst); //----------------------------------------------------------------------------- #if MGL_HAVE_GSL MGL_NO_EXPORT gsl_rng *mgl_rng=0; // NOTE: should be deleted by gsl_rng_free() but I don't know where :( @@ -148,7 +150,7 @@ void MGL_EXPORT mgl_srnd(long seed) } void MGL_EXPORT mgl_srnd_(int *seed) { mgl_srnd(*seed); } //----------------------------------------------------------------------------- -double MGL_EXPORT mgl_hypot(double x, double y) { return hypot(x,y); } +double MGL_EXPORT_CONST mgl_hypot(double x, double y) { return hypot(x,y); } //----------------------------------------------------------------------------- #if MGL_HAVE_PTHREAD pthread_mutex_t mutexRnd; @@ -266,6 +268,7 @@ mglFormula::mglFormula(const char *string) { Kod=EQ_A; Res = str[0]-'a'; } else if(!strcmp(str,"rnd")) Kod=EQ_RND; else if(!strcmp(str,"pi")) Res=M_PI; + else if(!strcmp(str,"inf")) Res=INFINITY; else Res=atof(str); // this is number } else @@ -376,6 +379,7 @@ mglFormula::mglFormula(const char *string) else if(!strcmp(name,"y")) Kod=EQ_BESY; else if(!strcmp(name,"f")) Kod=EQ_ELF; else if(!strcmp(name,"gamma")) Kod=EQ_GAMMA; + else if(!strcmp(name,"gamma_inc")) Kod=EQ_GAMMA_INC; else if(!strcmp(name,"ns")) Kod=EQ_NS; else if(!strcmp(name,"nc")) Kod=EQ_NC; else if(!strcmp(name,"nd")) Kod=EQ_ND; @@ -463,74 +467,75 @@ mreal mglFormula::CalcD(const mreal var[MGL_VS], char diff) const return CalcDIn(diff-'a', var); } //----------------------------------------------------------------------------- -double MGL_NO_EXPORT cand(double a,double b) {return a&&b?1:0;} -double MGL_NO_EXPORT cor(double a,double b) {return a||b?1:0;} -double MGL_NO_EXPORT ceq(double a,double b) {return a==b?1:0;} -double MGL_NO_EXPORT clt(double a,double b) {return ab?1:0;} -double MGL_NO_EXPORT add(double a,double b) {return a+b;} -double MGL_NO_EXPORT sub(double a,double b) {return a-b;} -double MGL_NO_EXPORT mul(double a,double b) {return a&&b?a*b:0;} -double MGL_NO_EXPORT del(double a,double b) {return b?a/b:NAN;} -double MGL_NO_EXPORT ipw(double a,double b) {return fabs(b-int(b))<1e-5 ? mgl_ipow(a,int(b)) : pow(a,b);} -double MGL_NO_EXPORT llg(double a,double b) {return log(a)/log(b);} +double MGL_LOCAL_CONST cand(double a,double b) {return a&&b?1:0;} +double MGL_LOCAL_CONST cor(double a,double b) {return a||b?1:0;} +double MGL_LOCAL_CONST ceq(double a,double b) {return a==b?1:0;} +double MGL_LOCAL_CONST clt(double a,double b) {return ab?1:0;} +double MGL_LOCAL_CONST add(double a,double b) {return a+b;} +double MGL_LOCAL_CONST sub(double a,double b) {return a-b;} +double MGL_LOCAL_CONST mul(double a,double b) {return a&&b?a*b:0;} +double MGL_LOCAL_CONST del(double a,double b) {return b?a/b:NAN;} +double MGL_LOCAL_CONST ipw(double a,double b) {return fabs(b-int(b))<1e-5 ? mgl_ipow(a,int(b)) : pow(a,b);} +double MGL_LOCAL_CONST llg(double a,double b) {return log(a)/log(b);} #if MGL_HAVE_GSL -double MGL_NO_EXPORT gslEllE(double a,double b) {return gsl_sf_ellint_E(a,b,GSL_PREC_SINGLE);} -double MGL_NO_EXPORT gslEllF(double a,double b) {return gsl_sf_ellint_F(a,b,GSL_PREC_SINGLE);} -double MGL_NO_EXPORT gslLegP(double a,double b) {return gsl_sf_legendre_Pl(int(a),b);} -double MGL_NO_EXPORT gslEllEc(double a) {return gsl_sf_ellint_Ecomp(a,GSL_PREC_SINGLE);} -double MGL_NO_EXPORT gslEllFc(double a) {return gsl_sf_ellint_Kcomp(a,GSL_PREC_SINGLE);} -double MGL_NO_EXPORT gslAi(double a) {return gsl_sf_airy_Ai(a,GSL_PREC_SINGLE);} -double MGL_NO_EXPORT gslBi(double a) {return gsl_sf_airy_Bi(a,GSL_PREC_SINGLE);} -double MGL_NO_EXPORT gslAi_d(double a) {return gsl_sf_airy_Ai_deriv(a,GSL_PREC_SINGLE);} -double MGL_NO_EXPORT gslBi_d(double a) {return gsl_sf_airy_Bi_deriv(a,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslEllE(double a,double b) {return gsl_sf_ellint_E(a,b,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslEllF(double a,double b) {return gsl_sf_ellint_F(a,b,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslLegP(double a,double b) {return gsl_sf_legendre_Pl(int(a),b);} +double MGL_LOCAL_CONST gslEllEc(double a) {return gsl_sf_ellint_Ecomp(a,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslEllFc(double a) {return gsl_sf_ellint_Kcomp(a,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslAi(double a) {return gsl_sf_airy_Ai(a,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslBi(double a) {return gsl_sf_airy_Bi(a,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslAi_d(double a) {return gsl_sf_airy_Ai_deriv(a,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslBi_d(double a) {return gsl_sf_airy_Bi_deriv(a,GSL_PREC_SINGLE);} #endif -double MGL_NO_EXPORT sgn(double a) {return a<0 ? -1:(a>0?1:0);} -double MGL_NO_EXPORT stp(double a) {return a>0 ? 1:0;} -double MGL_NO_EXPORT arg(double a,double b) { return atan2(b,a); } -double MGL_NO_EXPORT mgz1(double) {return 0;} -double MGL_NO_EXPORT mgz2(double,double) {return 0;} +double MGL_LOCAL_CONST sgn(double a) {return a<0 ? -1:(a>0?1:0);} +double MGL_LOCAL_CONST stp(double a) {return a>0 ? 1:0;} +double MGL_LOCAL_CONST arg(double a,double b) { return atan2(b,a); } +double MGL_LOCAL_CONST mgz1(double) {return NAN;} // NOTE I think NAN value is more correct here than 0 +double MGL_LOCAL_CONST mgz2(double,double) {return NAN;} // NOTE I think NAN value is more correct here than 0 #ifdef WIN32 -double MGL_NO_EXPORT asinh(double x) { return log(x+sqrt(x*x+1.)); } -double MGL_NO_EXPORT acosh(double x) { return x>1 ? log(x+sqrt(x*x-1.)) : NAN; } -double MGL_NO_EXPORT atanh(double x) { return fabs(x)<1 ? log((1.+x)/(1.-x))/2 : NAN; } +double MGL_LOCAL_CONST asinh(double x) { return log(x+sqrt(x*x+1.)); } +double MGL_LOCAL_CONST acosh(double x) { return x>1 ? log(x+sqrt(x*x-1.)) : NAN; } +double MGL_LOCAL_CONST atanh(double x) { return fabs(x)<1 ? log((1.+x)/(1.-x))/2 : NAN; } #endif //----------------------------------------------------------------------------- typedef double (*func_1)(double); typedef double (*func_2)(double, double); -// evaluation of embedded (included) expressions -mreal mglFormula::CalcIn(const mreal *a1) const -{ - mreal z2[EQ_SIN-EQ_LT] = {3,3,3,3,0,3,3,0,0,0,0,0,NAN,0 +//----------------------------------------------------------------------------- +static const mreal z2[EQ_SIN-EQ_LT] = {3,3,3,3,0,3,3,0,0,0,0,0,NAN,0 #if MGL_HAVE_GSL - ,3,NAN, 3,NAN, 0,0,3,1 + ,3,NAN, 3,NAN, 0,0,3,1,3 #else - ,0,0,0,0,0,0,0,0 + ,0,0,0,0,0,0,0,0,0 #endif - }; - func_2 f2[EQ_SIN-EQ_LT] = {clt,cgt,ceq,cor,cand,add,sub,mul,del,ipw,pow,fmod,llg,arg,hypot +}; +static const func_2 f2[EQ_SIN-EQ_LT] = {clt,cgt,ceq,cor,cand,add,sub,mul,del,ipw,pow,fmod,llg,arg,hypot #if MGL_HAVE_GSL - ,gsl_sf_bessel_Jnu,gsl_sf_bessel_Ynu, - gsl_sf_bessel_Inu,gsl_sf_bessel_Knu, - gslEllE,gslEllF,gslLegP,gsl_sf_beta + ,gsl_sf_bessel_Jnu,gsl_sf_bessel_Ynu, + gsl_sf_bessel_Inu,gsl_sf_bessel_Knu, + gslEllE,gslEllF,gslLegP,gsl_sf_beta,gsl_sf_gamma_inc, #else - ,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2 + ,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2 #endif - }; - func_1 f1[EQ_SN-EQ_SIN] = {sin,cos,tan,asin,acos,atan,sinh,cosh,tanh, - asinh,acosh,atanh,sqrt,exp,log,log10,sgn,stp,floor,fabs +}; +static const func_1 f1[EQ_SN-EQ_SIN] = {sin,cos,tan,asin,acos,atan,sinh,cosh,tanh, + asinh,acosh,atanh,sqrt,exp,log,log10,sgn,stp,floor,fabs #if MGL_HAVE_GSL - ,gsl_sf_dilog,gslEllEc,gslEllFc,gslAi,gslBi,gsl_sf_erf, - gsl_sf_expint_3,gsl_sf_expint_Ei,gsl_sf_expint_E1,gsl_sf_expint_E2, - gsl_sf_Si,gsl_sf_Ci,gsl_sf_gamma,gsl_sf_psi,gsl_sf_lambert_W0, - gsl_sf_lambert_Wm1,gsl_sf_sinc,gsl_sf_zeta,gsl_sf_eta,gslAi_d,gslBi_d, - gsl_sf_dawson + ,gsl_sf_dilog,gslEllEc,gslEllFc,gslAi,gslBi,gsl_sf_erf, + gsl_sf_expint_3,gsl_sf_expint_Ei,gsl_sf_expint_E1,gsl_sf_expint_E2, + gsl_sf_Si,gsl_sf_Ci,gsl_sf_gamma,gsl_sf_psi,gsl_sf_lambert_W0, + gsl_sf_lambert_Wm1,gsl_sf_sinc,gsl_sf_zeta,gsl_sf_eta,gslAi_d,gslBi_d, + gsl_sf_dawson #else - ,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1, - mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1 + ,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1, + mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1,mgz1 #endif - }; -// if(Error) return 0; +}; +//----------------------------------------------------------------------------- +// evaluation of embedded (included) expressions +mreal mglFormula::CalcIn(const mreal *a1) const +{ if(KodCalcIn(a1), d = Left->CalcDIn(id,a1); @@ -690,7 +698,7 @@ mreal mglFormula::CalcDIn(int id, const mreal *a1) const } //----------------------------------------------------------------------------- // Check braces correctness -bool MGL_NO_EXPORT mglCheck(char *str,int n) +bool MGL_LOCAL_PURE mglCheck(char *str,int n) { register long s = 0,i; for(i=0;i=0;i--) @@ -716,12 +724,12 @@ int MGL_NO_EXPORT mglFindInText(char *str,const char *lst) } //----------------------------------------------------------------------------- HMEX MGL_EXPORT mgl_create_expr(const char *expr) { return new mglFormula(expr); } -void MGL_EXPORT mgl_delete_expr(HMEX ex) { delete ex; } -double MGL_EXPORT mgl_expr_eval(HMEX ex, double x, double y,double z) +void MGL_EXPORT mgl_delete_expr(HMEX ex) { if(ex) delete ex; } +double MGL_EXPORT_PURE mgl_expr_eval(HMEX ex, double x, double y,double z) { return ex->Calc(x,y,z); } double MGL_EXPORT mgl_expr_eval_v(HMEX ex, mreal *var) { return ex->Calc(var); } -double MGL_EXPORT mgl_expr_diff(HMEX ex, char dir, double x, double y,double z) +double MGL_EXPORT_PURE mgl_expr_diff(HMEX ex, char dir, double x, double y,double z) { return ex->CalcD(dir,x,y,z); } double MGL_EXPORT mgl_expr_diff_v(HMEX ex, char dir, mreal *var) { return ex->CalcD(var, dir); } diff --git a/src/evalc.cpp b/src/evalc.cpp index 8834f3a..f8f76a6 100644 --- a/src/evalc.cpp +++ b/src/evalc.cpp @@ -56,12 +56,13 @@ EQ_EXPI, // exponential function \exp(i*x) EQ_LN, // logarithm of x, ln(x) EQ_LG, // decimal logarithm of x, lg(x) = ln(x)/ln(10) EQ_ABS, // absolute value +EQ_ARG, // argument (or phase) of complex number EQ_LAST // id of last entry }; //----------------------------------------------------------------------------- int mglFormulaC::Error=0; -bool mglCheck(char *str,int n); -int mglFindInText(char *str,const char *lst); +bool MGL_LOCAL_PURE mglCheck(char *str,int n); +int MGL_LOCAL_PURE mglFindInText(char *str,const char *lst); //----------------------------------------------------------------------------- mglFormulaC::~mglFormulaC() { @@ -126,6 +127,7 @@ mglFormulaC::mglFormulaC(const char *string) { Kod=EQ_A; Res = str[0]-'a'; } else if(!strcmp(str,"rnd")) Kod=EQ_RND; else if(!strcmp(str,"pi")) Res=M_PI; + else if(!strcmp(str,"inf")) Res=INFINITY; else if(str[0]=='i') Res = dual(0,str[1]>' '?atof(str+1):1); else Res=atof(str); // this is number } @@ -155,6 +157,7 @@ mglFormulaC::mglFormulaC(const char *string) else if(!strcmp(name,"lg")) Kod=EQ_LG; else if(!strcmp(name,"ln")) Kod=EQ_LN; else if(!strcmp(name,"abs")) Kod=EQ_ABS; + else if(!strcmp(name,"arg")) Kod=EQ_ARG; else { delete []str; return; } // unknown function n=mglFindInText(str,","); if(n>=0) @@ -204,34 +207,35 @@ dual mglFormulaC::Calc(const dual var[MGL_VS]) const return CalcIn(var); } //----------------------------------------------------------------------------- -dual MGL_NO_EXPORT addc(dual a,dual b) {return a+b;} -dual MGL_NO_EXPORT subc(dual a,dual b) {return a-b;} -dual MGL_NO_EXPORT mulc(dual a,dual b) {return a*b;} -dual MGL_NO_EXPORT divc(dual a,dual b) {return a/b;} -dual MGL_NO_EXPORT ipwc(dual a,dual b) {return mgl_ipowc(a,int(b.real()));} -dual MGL_NO_EXPORT powc(dual a,dual b) {return exp(b*log(a)); } -dual MGL_NO_EXPORT llgc(dual a,dual b) {return log(a)/log(b); } -dual MGL_NO_EXPORT expi(dual a) { return exp(dual(0,1)*a); } -dual MGL_NO_EXPORT expi(double a) { return dual(cos(a),sin(a)); } +dual MGL_LOCAL_CONST addc(dual a,dual b) {return a+b;} +dual MGL_LOCAL_CONST subc(dual a,dual b) {return a-b;} +dual MGL_LOCAL_CONST mulc(dual a,dual b) {return a*b;} +dual MGL_LOCAL_CONST divc(dual a,dual b) {return a/b;} +dual MGL_LOCAL_CONST ipwc(dual a,dual b) {return mgl_ipowc(a,int(b.real()));} +dual MGL_LOCAL_CONST powc(dual a,dual b) {return exp(b*log(a)); } +dual MGL_LOCAL_CONST llgc(dual a,dual b) {return log(a)/log(b); } +dual MGL_LOCAL_CONST expi(dual a) { return exp(dual(0,1)*a); } +dual MGL_LOCAL_CONST expi(double a) { return dual(cos(a),sin(a)); } //----------------------------------------------------------------------------- dual MGL_NO_EXPORT ic = dual(0,1); -dual MGL_NO_EXPORT asinhc(dual x) { return log(x+sqrt(x*x+mreal(1))); } -dual MGL_NO_EXPORT acoshc(dual x) { return log(x+sqrt(x*x-mreal(1))); } -dual MGL_NO_EXPORT atanhc(dual x) { return log((mreal(1)+x)/(mreal(1)-x))/mreal(2); } -dual MGL_NO_EXPORT sinc(dual x) { return sin(x); } -dual MGL_NO_EXPORT cosc(dual x) { return cos(x); } -dual MGL_NO_EXPORT tanc(dual x) { return tan(x); } -dual MGL_NO_EXPORT sinhc(dual x) { return sinh(x); } -dual MGL_NO_EXPORT coshc(dual x) { return cosh(x); } -dual MGL_NO_EXPORT tanhc(dual x) { return tanh(x); } -dual MGL_NO_EXPORT asinc(dual x) { return log(ic*x+sqrt(mreal(1)-x*x))/ic; } -dual MGL_NO_EXPORT acosc(dual x) { return log(x+sqrt(x*x-mreal(1)))/ic; } -dual MGL_NO_EXPORT atanc(dual x) { return log((ic-x)/(ic+x))/(mreal(2)*ic); } -dual MGL_NO_EXPORT expc(dual x) { return exp(x); } -dual MGL_NO_EXPORT sqrtc(dual x) { return sqrt(x); } -dual MGL_NO_EXPORT logc(dual x) { return log(x); } -dual MGL_NO_EXPORT absc(dual x) { return abs(x); } -dual MGL_NO_EXPORT lgc(dual x) { return log10(x);} +dual MGL_LOCAL_CONST asinhc(dual x) { return log(x+sqrt(x*x+mreal(1))); } +dual MGL_LOCAL_CONST acoshc(dual x) { return log(x+sqrt(x*x-mreal(1))); } +dual MGL_LOCAL_CONST atanhc(dual x) { return log((mreal(1)+x)/(mreal(1)-x))/mreal(2); } +dual MGL_LOCAL_CONST sinc(dual x) { return sin(x); } +dual MGL_LOCAL_CONST cosc(dual x) { return cos(x); } +dual MGL_LOCAL_CONST tanc(dual x) { return tan(x); } +dual MGL_LOCAL_CONST sinhc(dual x) { return sinh(x); } +dual MGL_LOCAL_CONST coshc(dual x) { return cosh(x); } +dual MGL_LOCAL_CONST tanhc(dual x) { return tanh(x); } +dual MGL_LOCAL_CONST asinc(dual x) { return log(ic*x+sqrt(mreal(1)-x*x))/ic; } +dual MGL_LOCAL_CONST acosc(dual x) { return log(x+sqrt(x*x-mreal(1)))/ic; } +dual MGL_LOCAL_CONST atanc(dual x) { return log((ic-x)/(ic+x))/(mreal(2)*ic); } +dual MGL_LOCAL_CONST expc(dual x) { return exp(x); } +dual MGL_LOCAL_CONST sqrtc(dual x) { return sqrt(x); } +dual MGL_LOCAL_CONST logc(dual x) { return log(x); } +dual MGL_LOCAL_CONST absc(dual x) { return abs(x); } +dual MGL_LOCAL_CONST argc(dual x) { return arg(x); } +dual MGL_LOCAL_CONST lgc(dual x) { return log10(x);} //----------------------------------------------------------------------------- typedef dual (*func_1)(dual); typedef dual (*func_2)(dual, dual); @@ -261,30 +265,30 @@ dual mglFormulaC::CalcIn(const dual *a1) const return NAN; } //----------------------------------------------------------------------------- -dual MGL_EXPORT mgl_ipowc(dual x,int n) +mdual MGL_EXPORT_CONST mgl_ipowc(dual x,int n) { dual t; - if(n==2) return x*x; - if(n==1) return x; - if(n<0) return mreal(1)/mgl_ipowc(x,-n); + if(n==2) { t = x*x; return t.real()+t.imag()*_Complex_I; } + if(n==1) return x.real()+x.imag()*_Complex_I; + if(n<0) { t = mreal(1)/mgl_ipowc(x,-n); return t.real()+t.imag()*_Complex_I; } if(n==0) return mreal(1); t = mgl_ipowc(x,n/2); t = t*t; if(n%2==1) t *= x; - return t; + return t.real()+t.imag()*_Complex_I; } -dual MGL_EXPORT mgl_ipowc_(dual *x,int *n) { return mgl_ipowc(*x,*n); } +mdual MGL_EXPORT_PURE mgl_ipowc_(dual *x,int *n) { return mgl_ipowc(*x,*n); } //----------------------------------------------------------------------------- HAEX MGL_EXPORT mgl_create_cexpr(const char *expr) { return new mglFormulaC(expr); } uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int l) { char *s=new char[l+1]; memcpy(s,expr,l); s[l]=0; uintptr_t res = uintptr_t(mgl_create_cexpr(s)); delete []s; return res; } -void MGL_EXPORT mgl_delete_cexpr(HAEX ex) { delete ex; } +void MGL_EXPORT mgl_delete_cexpr(HAEX ex) { if(ex) delete ex; } void MGL_EXPORT mgl_delete_cexpr_(uintptr_t *ex) { mgl_delete_cexpr((HAEX)ex); } -dual MGL_EXPORT mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z) -{ return ex->Calc(x,y,z); } -dual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z) +mdual MGL_EXPORT_PURE mgl_cexpr_eval(HAEX ex, dual x, dual y,dual z) +{ dual r = ex->Calc(x,y,z); return r.real()+r.imag()*_Complex_I; } +mdual MGL_EXPORT mgl_cexpr_eval_(uintptr_t *ex, dual *x, dual *y, dual *z) { return mgl_cexpr_eval((HAEX) ex, *x,*y,*z); } -dual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *var) -{ return ex->Calc(var); } +mdual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *var) +{ dual r = ex->Calc(var); return r.real()+r.imag()*_Complex_I; } //----------------------------------------------------------------------------- diff --git a/src/evalp.cpp b/src/evalp.cpp index 602bfcf..5b4489f 100644 --- a/src/evalp.cpp +++ b/src/evalp.cpp @@ -27,7 +27,22 @@ //----------------------------------------------------------------------------- std::wstring mgl_trim_ws(const std::wstring &str); int mglFormulaError; -mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const mglVar *head); +mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector &head); +mglDataC MGL_NO_EXPORT mglFormulaCalcC(std::wstring string, mglParser *arg, const std::vector &head); +//----------------------------------------------------------------------------- +mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head) +{ + std::wstring s; + for(long i=0;str[i];i++) s.push_back(str[i]); + return mglFormulaCalc(s,0,head); +} +//----------------------------------------------------------------------------- +mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector &head) +{ + std::wstring s; + for(long i=0;str[i];i++) s.push_back(str[i]); + return mglFormulaCalcC(s,0,head); +} //----------------------------------------------------------------------------- void mglApplyFunc(mglData &d, double (*func)(double)) { @@ -36,11 +51,51 @@ void mglApplyFunc(mglData &d, double (*func)(double)) for(long i=0;i &head, double (*func)(double,double)) { const mglData &a = mglFormulaCalc(a1,arg,head), &b = mglFormulaCalc(a2,arg,head); long n = mgl_max(a.nx,b.nx), m = mgl_max(a.ny,b.ny), l = mgl_max(a.nz,b.nz); mglData r(n, m, l); + if(a.nx==b.nx && b.ny==a.ny && b.nz==a.nz) +#pragma omp parallel for + for(long i=0;i &head, dual (*func)(dual,dual)) +{ + const mglDataC &a = mglFormulaCalcC(a1,arg,head), &b = mglFormulaCalcC(a2,arg,head); + long n = mgl_max(a.nx,b.nx), m = mgl_max(a.ny,b.ny), l = mgl_max(a.nz,b.nz); + mglDataC r(n, m, l); if(b.nx*b.ny*b.nz==1) #pragma omp parallel for for(long i=0;ib?1:0;} -double MGL_NO_EXPORT add(double a,double b);// {return a+b;} -double MGL_NO_EXPORT sub(double a,double b);// {return a-b;} -double MGL_NO_EXPORT mul(double a,double b);// {return a&&b?a*b:0;} -double MGL_NO_EXPORT del(double a,double b);// {return b?a/b:NAN;} -double MGL_NO_EXPORT ipw(double a,double b);// {return mgl_ipow(a,int(b));} -double MGL_NO_EXPORT llg(double a,double b);// {return log(a)/log(b);} -//double MGL_NO_EXPORT asinh(double x);// { return log(x+sqrt(x*x+1)); } -//double MGL_NO_EXPORT acosh(double x);// { return x>1 ? log(x+sqrt(x*x-1)) : NAN; } -//double MGL_NO_EXPORT atanh(double x);// { return fabs(x)<1 ? log((1+x)/(1-x))/2 : NAN; } -double MGL_NO_EXPORT gslEllE(double a,double b);// {return gsl_sf_ellint_E(a,b,GSL_PREC_SINGLE);} -double MGL_NO_EXPORT gslEllF(double a,double b);// {return gsl_sf_ellint_F(a,b,GSL_PREC_SINGLE);} -double MGL_NO_EXPORT gslLegP(double a,double b);// {return gsl_sf_legendre_Pl(int(a),b);} +double MGL_LOCAL_CONST cand(double a,double b);// {return a&&b?1:0;} +double MGL_LOCAL_CONST cor(double a,double b);// {return a||b?1:0;} +double MGL_LOCAL_CONST ceq(double a,double b);// {return a==b?1:0;} +double MGL_LOCAL_CONST clt(double a,double b);// {return ab?1:0;} +double MGL_LOCAL_CONST add(double a,double b);// {return a+b;} +double MGL_LOCAL_CONST sub(double a,double b);// {return a-b;} +double MGL_LOCAL_CONST mul(double a,double b);// {return a&&b?a*b:0;} +double MGL_LOCAL_CONST del(double a,double b);// {return b?a/b:NAN;} +double MGL_LOCAL_CONST ipw(double a,double b);// {return mgl_ipow(a,int(b));} +double MGL_LOCAL_CONST llg(double a,double b);// {return log(a)/log(b);} +//double MGL_LOCAL_CONST asinh(double x);// { return log(x+sqrt(x*x+1)); } +//double MGL_LOCAL_CONST acosh(double x);// { return x>1 ? log(x+sqrt(x*x-1)) : NAN; } +//double MGL_LOCAL_CONST atanh(double x);// { return fabs(x)<1 ? log((1+x)/(1-x))/2 : NAN; } +double MGL_LOCAL_CONST gslEllE(double a,double b);// {return gsl_sf_ellint_E(a,b,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslEllF(double a,double b);// {return gsl_sf_ellint_F(a,b,GSL_PREC_SINGLE);} +double MGL_LOCAL_CONST gslLegP(double a,double b);// {return gsl_sf_legendre_Pl(int(a),b);} //----------------------------------------------------------------------------- // It seems that standard wcstombs() have a bug. So, I replace by my own. void MGL_EXPORT mgl_wcstombs(char *dst, const wchar_t *src, int size) @@ -120,30 +175,32 @@ void MGL_EXPORT mgl_wcstombs(char *dst, const wchar_t *src, int size) dst[j] = 0; } //----------------------------------------------------------------------------- -const mglVar *FindVar(const mglVar *head, std::wstring &name) +MGL_LOCAL_PURE const mglDataA *FindVar(const std::vector &head, const std::wstring &name) { - const mglVar *v=head; - while(v) - { - if(v->s==name) return v; - v = v->next; - } + for(size_t i=0;is==name) return head[i]; return 0; } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_wcslwr(wchar_t *str) +{ + register size_t l=mgl_wcslen(str); + for(size_t k=0;k='A' && str[k]<='Z') ? str[k]+'a'-'A' : str[k]; +} +//----------------------------------------------------------------------------- /// Parse string and substitute the script argument // All numbers are presented as mglData(1). Do boundary checking. // NOTE: In any case where number is required the mglData::a[0] is used. // String flag is binary 0x1 -> 'x', 0x2 -> 'y', 0x4 -> 'z' -// NOTE: the speed is not a goal (mglFormula is faster). It is true interpreter! -mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const mglVar *head) +mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::vector &head) { #if MGL_HAVE_GSL gsl_set_error_handler_off(); #endif mglData res; if(str.empty() || mglFormulaError) return res; // nothing to parse - if(!head && arg) head = arg->DataList; +// if(arg) head = arg->DataList; str = mgl_trim_ws(str); long n,len=str.length(); if(str[0]=='(' && mglCheck(str.substr(1,len-2))) // remove braces @@ -260,24 +317,30 @@ mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const mgl for(n=0;n=len) // this is number or variable { - const mglVar *v = FindVar(head, str); + HCDT v = (str!=L"#$mgl")?FindVar(head, str):0; mglNum *f = arg?arg->FindNum(str.c_str()):0; if(v) res = v; else if(f) res.a[0] = f->d; - else if(!str.compare(L"rnd")) res.a[0] = mgl_rnd(); - else if(!str.compare(L"nan")) res.a[0] = NAN; - else if(!str.compare(L"pi")) res.a[0] = M_PI; - else if(!str.compare(L"on")) res.a[0] = 1; - else if(!str.compare(L"off")) res.a[0] = 0; else if(!str.compare(L":")) res.a[0] = -1; - else res.a[0] = wcstod(str.c_str(),0); // this is number + else + { + HCDT v=FindVar(head, L"#$mgl"); + if(v) res.Create(v->GetNx(),v->GetNy(),v->GetNz()); + if(!str.compare(L"rnd")) for(long i=0;iFindVar(nm.c_str()); if(!v && !nm.compare(0,7,L"jacobi_")) nm = nm.substr(7); if(v) // subdata @@ -286,17 +349,20 @@ mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const mgl { char *buf = new char[len]; mgl_wcstombs(buf, str.substr(1).c_str(), len-1); buf[len-1]=0; - res=v->Column(buf); delete []buf; + const mglData *vd = dynamic_cast(v); + if(vd) res=vd->Column(buf); + const mglDataC *vc = dynamic_cast(v); + if(vc) res=vc->Column(buf); + delete []buf; } else { - long m; mglData a1, a2, a3; a1.a[0] = a2.a[0] = a3.a[0] = -1; n=mglFindInText(str,","); if(n>0) { - m=mglFindInText(str.substr(0,n),","); + long m=mglFindInText(str.substr(0,n),","); if(m>0) { str[m]=0; @@ -311,7 +377,7 @@ mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const mgl } } else a1 = mglFormulaCalc(str, arg, head); - res = v->SubData(a1,a2,a3); + res = mglSubData(*v,a1,a2,a3); } } else if(nm[0]=='a') // function @@ -517,6 +583,9 @@ mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const mgl } else if(!nm.compare(L"int")) { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,floor); } + else if(!nm.compare(L"random")) + { res=mglFormulaCalc(str, arg, head); register long n = res.GetNN(), i; + for(i=0;i0?1:0;} +dual MGL_LOCAL_CONST addc(dual a,dual b); //{return a+b;} +dual MGL_LOCAL_CONST subc(dual a,dual b); //{return a-b;} +dual MGL_LOCAL_CONST mulc(dual a,dual b); //{return a*b;} +dual MGL_LOCAL_CONST divc(dual a,dual b); //{return a/b;} +dual MGL_LOCAL_CONST ipwc(dual a,dual b); //{return mgl_ipowc(a,int(b.real()));} +dual MGL_LOCAL_CONST powc(dual a,dual b); //{return exp(b*log(a)); } +dual MGL_LOCAL_CONST llgc(dual a,dual b); //{return log(a)/log(b); } +dual MGL_LOCAL_CONST expi(dual a); //{ return exp(dual(0,1)*a); } +dual MGL_LOCAL_CONST expi(double a); //{ return dual(cos(a),sin(a)); } +//----------------------------------------------------------------------------- +dual MGL_LOCAL_CONST asinhc(dual x); //{ return log(x+sqrt(x*x+mreal(1))); } +dual MGL_LOCAL_CONST acoshc(dual x); //{ return log(x+sqrt(x*x-mreal(1))); } +dual MGL_LOCAL_CONST atanhc(dual x); //{ return log((mreal(1)+x)/(mreal(1)-x))/mreal(2); } +dual MGL_LOCAL_CONST sinc(dual x); //{ return sin(x); } +dual MGL_LOCAL_CONST cosc(dual x); //{ return cos(x); } +dual MGL_LOCAL_CONST tanc(dual x); //{ return tan(x); } +dual MGL_LOCAL_CONST sinhc(dual x); //{ return sinh(x); } +dual MGL_LOCAL_CONST coshc(dual x); //{ return cosh(x); } +dual MGL_LOCAL_CONST tanhc(dual x); //{ return tanh(x); } +dual MGL_LOCAL_CONST asinc(dual x); //{ return log(ic*x+sqrt(mreal(1)-x*x))/ic; } +dual MGL_LOCAL_CONST acosc(dual x); //{ return log(x+sqrt(x*x-mreal(1)))/ic; } +dual MGL_LOCAL_CONST atanc(dual x); //{ return log((ic-x)/(ic+x))/(mreal(2)*ic); } +dual MGL_LOCAL_CONST expc(dual x); //{ return exp(x); } +dual MGL_LOCAL_CONST sqrtc(dual x); //{ return sqrt(x); } +dual MGL_LOCAL_CONST logc(dual x); //{ return log(x); } +dual MGL_LOCAL_CONST absc(dual x); //{ return abs(x); } +dual MGL_LOCAL_CONST argc(dual x); //{ return arg(x); } +dual MGL_LOCAL_CONST lgc(dual x); //{ return log10(x);} +//----------------------------------------------------------------------------- +/// Parse string and substitute the script argument +// All numbers are presented as mglData(1). Do boundary checking. +// NOTE: In any case where number is required the mglData::a[0] is used. +// String flag is binary 0x1 -> 'x', 0x2 -> 'y', 0x4 -> 'z' +mglDataC MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::vector &head) { - register size_t l=mgl_wcslen(str); - for(size_t k=0;k='A' && str[k]<='Z') ? str[k]+'a'-'A' : str[k]; +#if MGL_HAVE_GSL + gsl_set_error_handler_off(); +#endif + mglDataC res; + if(str.empty() || mglFormulaError) return res; // nothing to parse +// if(arg) head = arg->DataList; + str = mgl_trim_ws(str); + long n,len=str.length(); + if(str[0]=='(' && mglCheck(str.substr(1,len-2))) // remove braces + { str = str.substr(1,len-2); len-=2; } + if(str[0]=='[') // this is manual subdata + { + mglData a1; + long i, j, br=0,k; + bool ar=true,mt=false; + for(i=1,j=1;i0) br--; + if(str[i]==',' && !br) + { + a1=mglFormulaCalc(str.substr(j,i-j), arg, head); + if(j==1) + { res = a1; ar = (a1.nx==1); mt = (a1.nx>1 && a1.ny==1); } + else + { + if(ar) // res 1d array + { k = res.nx; res.Insert('x',k); res.Put(a1,k); } + else if(mt) // res 2d array + { k = res.ny; res.Insert('y',k); res.Put(a1,-1,k); } + else // res 3d array + { k = res.nz; res.Insert('z',k); res.Put(a1,-1,-1,k); } + } + j=i+1; + } + } + a1=mglFormulaCalc(str.substr(j,i-j), arg, head); + if(j==1) + { res = a1; ar = (a1.nx==1); mt = (a1.nx>1 && a1.ny==1); } + else + { + if(ar) // res 1d array + { k = res.nx; res.Insert('x',k); res.Put(a1,k); } + else if(mt) // res 2d array + { k = res.ny; res.Insert('y',k); res.Put(a1,-1,k); } + else // res 3d array + { k = res.nz; res.Insert('z',k); res.Put(a1,-1,-1,k); } + } + return res; + } + + n=mglFindInText(str,"<>="); // low priority -- conditions + if(n>=0) + return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='<'?cltc:(str[n]=='>'?cgtc:ceqc)); + n=mglFindInText(str,"+-"); // normal priority -- additions + if(n>=0 && (n<2 || str[n-1]!='e' || (str[n-2]!='.' && !isdigit(str[n-2])))) + return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='+'?addc:subc); + n=mglFindInText(str,"*/"); // high priority -- multiplications + if(n>=0) + return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='*'?mulc:divc); +/* n=mglFindInText(str,"@"); // high priority -- combine // TODO enable later + if(n>=0) + return mglFormulaCalcC(str.substr(0,n),arg, head).Combine(mglFormulaCalcC(str.substr(n+1),arg, head));*/ + n=mglFindInText(str,"^"); // highest priority -- power + if(n>=0) + return mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, ipwc); + n=mglFindInText(str,":"); // highest priority -- array + if(n>=0 && str.compare(L":")) + { + const mglData &a1=mglFormulaCalc(str.substr(0,n), arg, head); + const mglData &a2=mglFormulaCalc(str.substr(n+1), arg, head); + res.Create(abs(int(a2.a[0]+0.5)-int(a1.a[0]+0.5))+1); + res.Fill(a1.a[0], a2.a[0]); + return res; + } + n=mglFindInText(str,"."); // highest priority -- suffixes + if(n>=0) + { + mreal x,y,z,k; + dual v=NAN; + mglDataC d = mglFormulaCalcC(str.substr(0,n), arg, head); + const std::wstring &p=str.substr(n+1); + if(!p.compare(L"a")) v = d.a[0]; + else if(!p.compare(L"fst")) { long i=-1,j=-1,l=-1; v = d.Find(0,i,j,l); } + else if(!p.compare(L"lst")) { long i=-1,j=-1,l=-1; v = d.Last(0,i,j,l); } + else if(!p.compare(L"nx")) v=d.nx; + else if(!p.compare(L"ny")) v=d.ny; + else if(!p.compare(L"nz")) v=d.nz; + else if(!p.compare(L"max")) v=d.Maximal(); + else if(!p.compare(L"min")) v=d.Minimal(); + else if(!p.compare(L"pmax")) { v=d.Maximal(); } +// else if(!p.compare(L"pmin")) { v=d.MinimalPos(); } +// else if(!p.compare(L"nmax")) { v=d.MaximalNeg(); } + else if(!p.compare(L"nmin")) { v=0; } + else if(!p.compare(L"sum")) v=d.Momentum('x',x,y); + else if(!p.compare(L"mx")) { d.Maximal(x,y,z); v=x/d.nx; } + else if(!p.compare(L"my")) { d.Maximal(x,y,z); v=y/d.ny; } + else if(!p.compare(L"mz")) { d.Maximal(x,y,z); v=z/d.nz; } + else if(!p.compare(L"ax")) { d.Momentum('x',x,y); v=x/d.nx; } + else if(!p.compare(L"ay")) { d.Momentum('y',x,y); v=x/d.ny; } + else if(!p.compare(L"az")) { d.Momentum('z',x,y); v=x/d.nz; } + else if(!p.compare(L"wx")) { d.Momentum('x',x,y); v=y/d.nx; } + else if(!p.compare(L"wy")) { d.Momentum('y',x,y); v=y/d.ny; } + else if(!p.compare(L"wz")) { d.Momentum('z',x,y); v=y/d.nz; } + else if(!p.compare(L"sx")) { d.Momentum('x',x,y,z,k); v=z/d.nx; } + else if(!p.compare(L"sy")) { d.Momentum('y',x,y,z,k); v=z/d.ny; } + else if(!p.compare(L"sz")) { d.Momentum('z',x,y,z,k); v=z/d.nz; } + else if(!p.compare(L"kx")) { d.Momentum('x',x,y,z,k); v=k/d.nx; } + else if(!p.compare(L"ky")) { d.Momentum('y',x,y,z,k); v=k/d.ny; } + else if(!p.compare(L"kz")) { d.Momentum('z',x,y,z,k); v=k/d.nz; } + else if(!p.compare(L"aa")) { d.Momentum('a',x,y); v=x; } + else if(!p.compare(L"wa")) { d.Momentum('a',x,y); v=y; } + else if(!p.compare(L"sa")) { d.Momentum('a',x,y,z,k);v=z; } + else if(!p.compare(L"ka")) { d.Momentum('a',x,y,z,k);v=k; } + // if this is valid suffix when finish parsing (it can be mreal number) + if(mgl_isfin(v)) { res.a[0] = v; return res; } + } + for(n=0;n=len) // this is number or variable + { + HCDT v = (str!=L"#$mgl")?FindVar(head, str):0; + mglNum *f = arg?arg->FindNum(str.c_str()):0; + if(v) res = v; + else if(f) res.a[0] = f->d; + else if(!str.compare(L":")) res.a[0] = -1; + else + { + HCDT v=FindVar(head, L"#$mgl"); + if(v) res.Create(v->GetNx(),v->GetNy(),v->GetNz()); + if(!str.compare(L"rnd")) for(long i=0;i1 && str[1]>' ')?wcstod(str.c_str(),0):1); + else res = mreal(wcstod(str.c_str(),0)); // this is real number + } + return res; + } + else + { + std::wstring nm = str.substr(0,n); + str = str.substr(n+1,len-n-2); len -= n+2; + HCDT v = FindVar(head, nm); +// mglVar *v = arg->FindVar(nm.c_str()); + if(!v && !nm.compare(0,7,L"jacobi_")) nm = nm.substr(7); + if(v) // subdata + { + if(str[0]=='\'' && str[len-1]=='\'') // this is column call + { + char *buf = new char[len]; + mgl_wcstombs(buf, str.substr(1).c_str(), len-1); buf[len-1]=0; + const mglData *vd = dynamic_cast(v); + if(vd) res=vd->Column(buf); + const mglDataC *vc = dynamic_cast(v); + if(vc) res=vc->Column(buf); + delete []buf; + } + else + { + mglData a1, a2, a3; + a1.a[0] = a2.a[0] = a3.a[0] = -1; + n=mglFindInText(str,","); + if(n>0) + { + long m=mglFindInText(str.substr(0,n),","); + if(m>0) + { + str[m]=0; + a1 = mglFormulaCalcC(str.substr(0,m), arg, head); + a2 = mglFormulaCalcC(str.substr(m+1,n-m-1), arg, head); + a3 = mglFormulaCalcC(str.substr(n+1), arg, head); + } + else + { + a1 = mglFormulaCalcC(str.substr(0,n), arg, head); + a2 = mglFormulaCalcC(str.substr(n+1), arg, head); + } + } + else a1 = mglFormulaCalcC(str, arg, head); + res = mglSubData(*v,a1,a2,a3); + } + } + else if(nm[0]=='a') // function + { + if(!nm.compare(L"asin")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,asinc); } + else if(!nm.compare(L"acos")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,acosc); } + else if(!nm.compare(L"atan")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,atanc); } + else if(!nm.compare(L"arg")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,argc); } + else if(!nm.compare(L"abs")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,absc); } + } + else if(nm[0]=='c') + { + if(!nm.compare(L"cos")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,cosc); } + else if(!nm.compare(L"cosh") || !nm.compare(L"ch")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,coshc); } + } + else if(!nm.compare(L"exp")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,expc); } + else if(nm[0]=='l') + { + if(!nm.compare(L"log") || !nm.compare(L"ln")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,logc); } + else if(!nm.compare(L"lg")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,lgc); } + } + else if(nm[0]=='s') + { + if(!nm.compare(L"sqrt")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,sqrtc); } + else if(!nm.compare(L"sin")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,sinc); } + else if(!nm.compare(L"sinh") || !nm.compare(L"sh")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,sinhc); } + } + else if(nm[0]=='t') + { + if(!nm.compare(L"tg") || !nm.compare(L"tan")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,tanc); } + else if(!nm.compare(L"tanh") || !nm.compare(L"th")) + { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,tanhc); } + } + else if(!nm.compare(L"pow")) + { + n=mglFindInText(str,","); + if(n<=0) mglFormulaError=true; + else res = mglApplyOperC(str.substr(0,n),str.substr(n+1),arg, head, powc); + } + else if(!nm.compare(L"random")) + { res=mglFormulaCalcC(str, arg, head); register long n = res.GetNN(), i; + for(i=0;i(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dd")) *d += *(a[1].d); + else if(!strcmp(k,"dn"))*d += a[1].v; else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_sort(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dn")) a[0].d->Sort(a[1].v, -1); - else if(!strcmp(k,"dnn")) a[0].d->Sort(a[1].v, a[2].v); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dn")) d->Sort(a[1].v, -1); + else if(!strcmp(k,"dnn")) d->Sort(a[1].v, a[2].v); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -249,11 +253,24 @@ int MGL_NO_EXPORT mgls_clearlegend(mglGraph *gr, long , mglArg *, const char *k, else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_rasterize(mglGraph *gr, long , mglArg *, const char *, const char *) +{ + gr->Rasterize(); return 0; +} +//----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_background(mglGraph *gr, long , mglArg *a, const char *k, const char *) +{ + int res=0; + if(!strcmp(k,"s")) gr->LoadBackground(a[0].s.c_str()); + else if(!strcmp(k,"sn")) gr->LoadBackground(a[0].s.c_str(),a[1].v); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_clf(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; if(!strcmp(k,"")) gr->Clf(); - else if(!strcmp(k,"s")) gr->Clf(a[0].s[0]); + else if(!strcmp(k,"s")) gr->Clf(a[0].s.c_str()); else if(!strcmp(k,"nnn")) gr->Clf(a[0].v,a[1].v,a[2].v); else res = 1; return res; } @@ -293,21 +310,27 @@ int MGL_NO_EXPORT mgls_crange(mglGraph *gr, long , mglArg *a, const char *k, con int MGL_NO_EXPORT mgls_crop(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dnns")) a[0].d->Crop(iint(a[1].v),iint(a[2].v),a[3].s.c_str()[0]); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dnns")) d->Crop(iint(a[1].v),iint(a[2].v),a[3].s.c_str()[0]); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_clean(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dn")) a[0].d->Clean(iint(a[1].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dn")) d->Clean(iint(a[1].v)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_cumsum(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->CumSum(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) d->CumSum(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -375,10 +398,12 @@ int MGL_NO_EXPORT mgls_colorbar(mglGraph *gr, long , mglArg *a, const char *k, c int MGL_NO_EXPORT mgls_copy(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dd")) a[0].d->Set(*(a[1].d)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dd")) d->Set(*(a[1].d)); else if(!strcmp(k,"dds")) - { a[0].d->Set(*(a[1].d)); gr->Fill(*(a[0].d), a[2].s.c_str()); } - else if(!strcmp(k,"dn")) *(a[0].d) = a[1].v; + { d->Set(*(a[1].d)); gr->Fill(*d, a[2].s.c_str()); } + else if(!strcmp(k,"dn")) *d = a[1].v; else res = 1; return res; } //----------------------------------------------------------------------------- @@ -576,6 +601,38 @@ int MGL_NO_EXPORT mgls_rhomb(mglGraph *gr, long , mglArg *a, const char *k, cons else res = 1; gr->Self()->LoadState(); return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_polygon(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) +{ + int res=0; gr->Self()->SaveState(opt); + if(!strcmp(k,"nnnnn")) + gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), iint(a[4].v)); + else if(!strcmp(k,"nnnnns")) + gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), iint(a[4].v), a[5].s.c_str()); + else if(!strcmp(k,"nnnnnnn")) + gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), iint(a[6].v)); + else if(!strcmp(k,"nnnnnnns")) + gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), iint(a[6].v), a[7].s.c_str()); + else res = 1; gr->Self()->LoadState(); return res; +} +//----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_arc(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) +{ + int res=0; gr->Self()->SaveState(opt); + if(!strcmp(k,"nnnnn")) + gr->Arc(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].v); + else if(!strcmp(k,"nnnnns")) + gr->Arc(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), a[4].v, a[5].s.c_str()); + else if(!strcmp(k,"nnnnnn")) + gr->Arc(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v), a[5].v); + else if(!strcmp(k,"nnnnnns")) + gr->Arc(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v), a[5].v, a[6].s.c_str()); + else if(!strcmp(k,"nnnnnnnnnn")) + gr->Arc(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v, a[5].v), mglPoint(a[6].v,a[7].v, a[8].v), a[9].v); + else if(!strcmp(k,"nnnnnnnnnns")) + gr->Arc(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v, a[5].v), mglPoint(a[6].v,a[7].v, a[8].v), a[9].v, a[10].s.c_str()); + else res = 1; gr->Self()->LoadState(); return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_dens(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; @@ -628,24 +685,30 @@ int MGL_NO_EXPORT mgls_densz(mglGraph *gr, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_divto(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dd")) *(a[0].d) /= *(a[1].d); - else if(!strcmp(k,"dn")) *(a[0].d) /= a[1].v; + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dd")) *d /= *(a[1].d); + else if(!strcmp(k,"dn")) *d /= a[1].v; else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_multo(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dd")) *(a[0].d) *= *(a[1].d); - else if(!strcmp(k,"dn")) *(a[0].d) *= a[1].v; + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dd")) *d *= *(a[1].d); + else if(!strcmp(k,"dn")) *d *= a[1].v; else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_subto(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dd")) *(a[0].d) -= *(a[1].d); - else if(!strcmp(k,"dn")) *(a[0].d) -= a[1].v; + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dd")) *d -= *(a[1].d); + else if(!strcmp(k,"dn")) *d -= a[1].v; else res = 1; return res; } //----------------------------------------------------------------------------- @@ -664,16 +727,20 @@ int MGL_NO_EXPORT mgls_dots(mglGraph *gr, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_diff(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->Diff(a[1].s.c_str()); - else if(!strcmp(k,"ddd")) a[0].d->Diff(*(a[1].d), *(a[2].d)); - else if(!strcmp(k,"dddd")) a[0].d->Diff(*(a[1].d), *(a[2].d), *(a[3].d)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) d->Diff(a[1].s.c_str()); + else if(!strcmp(k,"ddd")) d->Diff(*(a[1].d), *(a[2].d)); + else if(!strcmp(k,"dddd")) d->Diff(*(a[1].d), *(a[2].d), *(a[3].d)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_diff2(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->Diff2(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) d->Diff2(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -807,29 +874,45 @@ int MGL_NO_EXPORT mgls_grad(mglGraph *gr, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_fill(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - if(!strcmp(k,"dnn")) a[0].d->Fill(a[1].v,a[2].v); - else if(!strcmp(k,"dnns")) a[0].d->Fill(a[1].v,a[2].v,a[3].s.c_str()[0]); - else if(!strcmp(k,"ds")) gr->Fill(*(a[0].d),a[1].s.c_str(),opt); - else if(!strcmp(k,"dsd")) gr->Fill(*(a[0].d),a[1].s.c_str(), *(a[2].d),opt); - else if(!strcmp(k,"dsdd")) gr->Fill(*(a[0].d),a[1].s.c_str(), *(a[2].d), *(a[3].d),opt); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dnn")) d->Fill(a[1].v,a[2].v); + else if(!strcmp(k,"dnns")) d->Fill(a[1].v,a[2].v,a[3].s.c_str()[0]); + else if(!strcmp(k,"ds")) gr->Fill(*d,a[1].s.c_str(),opt); + else if(!strcmp(k,"dsd")) gr->Fill(*d,a[1].s.c_str(), *(a[2].d),opt); + else if(!strcmp(k,"dsdd")) gr->Fill(*d,a[1].s.c_str(), *(a[2].d), *(a[3].d),opt); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_refill(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - if(!strcmp(k,"ddd")) gr->Refill(*(a[0].d),*(a[1].d),*(a[2].d),-1,opt); - else if(!strcmp(k,"dddn")) gr->Refill(*(a[0].d),*(a[1].d),*(a[2].d),iint(a[3].v),opt); - else if(!strcmp(k,"dddd")) gr->Refill(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),-1,opt); - else if(!strcmp(k,"ddddn")) gr->Refill(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),iint(a[4].v),opt); - else if(!strcmp(k,"ddddd")) gr->Refill(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),opt); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ddd")) gr->Refill(*d,*(a[1].d),*(a[2].d),-1,opt); + else if(!strcmp(k,"dddn")) gr->Refill(*d,*(a[1].d),*(a[2].d),iint(a[3].v),opt); + else if(!strcmp(k,"dddd")) gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),-1,opt); + else if(!strcmp(k,"ddddn")) gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),iint(a[4].v),opt); + else if(!strcmp(k,"ddddd")) gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),opt); + else res = 1; return res; +} +//----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_gspline(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) +{ + int res=0; + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ddd")) d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,-1); + else if(!strcmp(k,"dddn")) d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,iint(a[3].v)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_fillsample(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->FillSample(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) d->FillSample(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -967,31 +1050,39 @@ int MGL_NO_EXPORT mgls_legendmarks(mglGraph *gr, long , mglArg *a, const char *k int MGL_NO_EXPORT mgls_modify(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->Modify(a[1].s.c_str()); - else if(!strcmp(k,"dsn")) a[0].d->Modify(a[1].s.c_str(), iint(a[2].v)); - else if(!strcmp(k,"dsd")) a[0].d->Modify(a[1].s.c_str(),*(a[2].d)); - else if(!strcmp(k,"dsdd")) a[0].d->Modify(a[1].s.c_str(),*(a[2].d),*(a[3].d)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) d->Modify(a[1].s.c_str()); + else if(!strcmp(k,"dsn")) d->Modify(a[1].s.c_str(), iint(a[2].v)); + else if(!strcmp(k,"dsd")) d->Modify(a[1].s.c_str(),*(a[2].d)); + else if(!strcmp(k,"dsdd")) d->Modify(a[1].s.c_str(),*(a[2].d),*(a[3].d)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_max(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dds")) *(a[0].d) = a[1].d->Max(a[2].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dds")) *d = mglData(true,mgl_data_max_dir(a[1].d,a[2].s.c_str())); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_min(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dds")) *(a[0].d) = a[1].d->Min(a[2].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dds")) *d = mglData(true,mgl_data_min_dir(a[1].d,a[2].s.c_str())); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_sum(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dds")) *(a[0].d) = a[1].d->Sum(a[2].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dds")) *d = mglData(true,mgl_data_sum(a[1].d,a[2].s.c_str())); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1050,10 +1141,12 @@ int MGL_NO_EXPORT mgls_read(mglGraph *gr, long , mglArg *a, const char *k, const { int res=0; bool rr=true; - if(!strcmp(k,"ds")) rr=a[0].d->Read(a[1].s.c_str()); - else if(!strcmp(k,"dsn")) rr=a[0].d->Read(a[1].s.c_str(), iint(a[2].v)); - else if(!strcmp(k,"dsnn")) rr=a[0].d->Read(a[1].s.c_str(), iint(a[2].v),iint(a[3].v)); - else if(!strcmp(k,"dsnnn")) rr=a[0].d->Read(a[1].s.c_str(), iint(a[2].v),iint(a[3].v),iint(a[4].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) rr=d->Read(a[1].s.c_str()); + else if(!strcmp(k,"dsn")) rr=d->Read(a[1].s.c_str(), iint(a[2].v)); + else if(!strcmp(k,"dsnn")) rr=d->Read(a[1].s.c_str(), iint(a[2].v),iint(a[3].v)); + else if(!strcmp(k,"dsnnn")) rr=d->Read(a[1].s.c_str(), iint(a[2].v),iint(a[3].v),iint(a[4].v)); if(!rr) gr->SetWarn(mglWarnFile,"Read"); return res; } @@ -1062,8 +1155,10 @@ int MGL_NO_EXPORT mgls_readmat(mglGraph *gr, long , mglArg *a, const char *k, co { int res=0; bool rr=true; - if(!strcmp(k,"ds")) rr=a[0].d->ReadMat(a[1].s.c_str()); - else if(!strcmp(k,"dsn")) rr=a[0].d->ReadMat(a[1].s.c_str(), iint(a[2].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) rr=d->ReadMat(a[1].s.c_str()); + else if(!strcmp(k,"dsn")) rr=d->ReadMat(a[1].s.c_str(), iint(a[2].v)); else res = 1; if(!rr) gr->SetWarn(mglWarnFile,"ReadMat"); return res; @@ -1073,11 +1168,13 @@ int MGL_NO_EXPORT mgls_readall(mglGraph *gr, long , mglArg *a, const char *k, co { int res=0; bool rr=true; - if(!strcmp(k,"ds")) rr=a[0].d->ReadAll(a[1].s.c_str()); - else if(!strcmp(k,"dsn")) rr=a[0].d->ReadAll(a[1].s.c_str(), a[2].v); - else if(!strcmp(k,"dsnn")) rr=a[0].d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v); - else if(!strcmp(k,"dsnnn")) rr=a[0].d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v); - else if(!strcmp(k,"dsnnnn"))rr=a[0].d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) rr=d->ReadAll(a[1].s.c_str()); + else if(!strcmp(k,"dsn")) rr=d->ReadAll(a[1].s.c_str(), a[2].v); + else if(!strcmp(k,"dsnn")) rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v); + else if(!strcmp(k,"dsnnn")) rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v); + else if(!strcmp(k,"dsnnnn"))rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v); else res = 1; if(!rr) gr->SetWarn(mglWarnFile,"ReadMat"); return res; @@ -1086,7 +1183,9 @@ int MGL_NO_EXPORT mgls_readall(mglGraph *gr, long , mglArg *a, const char *k, co int MGL_NO_EXPORT mgls_readhdf(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dss")) a[0].d->ReadHDF(a[1].s.c_str(), a[2].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dss")) d->ReadHDF(a[1].s.c_str(), a[2].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1143,9 +1242,11 @@ int MGL_NO_EXPORT mgls_face(mglGraph *gr, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_resize(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ddn")) *(a[0].d) = a[1].d->Resize(iint(a[2].v)); - else if(!strcmp(k,"ddnn")) *(a[0].d) = a[1].d->Resize(iint(a[2].v), iint(a[3].v)); - else if(!strcmp(k,"ddnnn")) *(a[0].d) = a[1].d->Resize(iint(a[2].v), iint(a[3].v), iint(a[4].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ddn")) *d = mglData(true,mgl_data_resize_box(a[1].d, iint(a[2].v),0,0, 0,1, 0,1, 0,1)); + else if(!strcmp(k,"ddnn")) *d = mglData(true,mgl_data_resize_box(a[1].d, iint(a[2].v),iint(a[3].v),0, 0,1, 0,1, 0,1)); + else if(!strcmp(k,"ddnnn")) *d = mglData(true,mgl_data_resize_box(a[1].d, iint(a[2].v),iint(a[3].v),iint(a[4].v), 0,1, 0,1, 0,1)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1192,22 +1293,29 @@ int MGL_NO_EXPORT mgls_save(mglGraph *, long , mglArg *a, const char *k, const c int MGL_NO_EXPORT mgls_smooth(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"d")) a[0].d->Smooth(); - else if(!strcmp(k,"ds")) a[0].d->Smooth(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"d")) d->Smooth(); + else if(!strcmp(k,"ds")) d->Smooth(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_swap(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->Swap(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) d->Swap(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_idset(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->SetColumnId(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + mglDataC *c = dynamic_cast(a[0].d); + if(!strcmp(k,"ds") && d) d->SetColumnId(a[1].s.c_str()); + else if(!strcmp(k,"ds") && c) c->SetColumnId(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1296,20 +1404,24 @@ int MGL_NO_EXPORT mgls_radar(mglGraph *gr, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_squeeze(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dn")) a[0].d->Squeeze(iint(a[1].v)); - else if(!strcmp(k,"dnn")) a[0].d->Squeeze(iint(a[1].v), iint(a[2].v)); - else if(!strcmp(k,"dnnn")) a[0].d->Squeeze(iint(a[1].v), iint(a[2].v),iint(a[3].v)); - else if(!strcmp(k,"dnnnn")) a[0].d->Squeeze(iint(a[1].v), iint(a[2].v),iint(a[3].v), a[4].v); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dn")) d->Squeeze(iint(a[1].v)); + else if(!strcmp(k,"dnn")) d->Squeeze(iint(a[1].v), iint(a[2].v)); + else if(!strcmp(k,"dnnn")) d->Squeeze(iint(a[1].v), iint(a[2].v),iint(a[3].v)); + else if(!strcmp(k,"dnnnn")) d->Squeeze(iint(a[1].v), iint(a[2].v),iint(a[3].v), a[4].v); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_stfad(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; if(!strcmp(k,"dddn")) - *(a[0].d) = mglSTFA(*(a[1].d),*(a[2].d), iint(a[3].v)); + *d = mglSTFA(*(a[1].d),*(a[2].d), iint(a[3].v)); else if(!strcmp(k,"dddns")) - *(a[0].d) = mglSTFA(*(a[1].d),*(a[2].d), iint(a[3].v), a[4].s.c_str()[0]); + *d = mglSTFA(*(a[1].d),*(a[2].d), iint(a[3].v), a[4].s.c_str()[0]); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1410,7 +1522,7 @@ int MGL_NO_EXPORT mgls_multiplot(mglGraph *gr, long , mglArg *a, const char *k, if(!strcmp(k,"nnnnn")) gr->MultiPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), iint(a[3].v), iint(a[4].v)); else if(!strcmp(k,"nnnnns")) - gr->MultiPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), iint(a[3].v), iint(a[4].v), a[3].s.c_str()); + gr->MultiPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), iint(a[3].v), iint(a[4].v), a[5].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1426,16 +1538,23 @@ int MGL_NO_EXPORT mgls_title(mglGraph *gr, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_column(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dds")) *(a[0].d) = a[1].d->Column(a[2].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dds")) *d = mglData(true,mgl_data_column(a[1].d,a[2].s.c_str())); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_subdata(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ddn")) *(a[0].d) = a[1].d->SubData(iint(a[2].v)); - else if(!strcmp(k,"ddnn")) *(a[0].d) = a[1].d->SubData(iint(a[2].v), iint(a[3].v)); - else if(!strcmp(k,"ddnnn")) *(a[0].d) = a[1].d->SubData(iint(a[2].v), iint(a[3].v), iint(a[4].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ddn")) *d = mglData(true,mgl_data_subdata(a[1].d, iint(a[2].v), -1, -1)); + else if(!strcmp(k,"ddnn")) *d = mglData(true,mgl_data_subdata(a[1].d, iint(a[2].v), iint(a[3].v), -1)); + else if(!strcmp(k,"ddnnn")) *d = mglData(true,mgl_data_subdata(a[1].d, iint(a[2].v), iint(a[3].v), iint(a[4].v))); + else if(!strcmp(k,"ddd")) *d = mglSubData(*(a[1].d), *(a[2].d)); + else if(!strcmp(k,"dddd")) *d = mglSubData(*(a[1].d), *(a[2].d), *(a[3].d)); + else if(!strcmp(k,"ddddd")) *d = mglSubData(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d)); else res = 1; return res; } @@ -1443,7 +1562,9 @@ int MGL_NO_EXPORT mgls_subdata(mglGraph *, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_trace(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dd")) *(a[0].d) = a[1].d->Trace(); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dd")) *d = mglData(true,mgl_data_trace(a[1].d)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1515,21 +1636,24 @@ int MGL_NO_EXPORT mgls_transptype(mglGraph *gr, long , mglArg *a, const char *k, int MGL_NO_EXPORT mgls_fourier(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dds")) mglFourier(*(a[0].d),*(a[1].d),a[2].s.c_str()); + mglData *re = dynamic_cast(a[0].d), *im = dynamic_cast(a[1].d); + if(!strcmp(k,"dds") && re && im) mglFourier(*re,*im,a[2].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_transform(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dsdd")) *(a[0].d) = mglTransform(*(a[2].d),*(a[3].d),a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"dsdd") && d) *d = mglTransform(*(a[2].d),*(a[3].d),a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_transforma(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dsdd")) *(a[0].d) = mglTransformA(*(a[2].d),*(a[3].d),a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"dsdd") && d) *d = mglTransformA(*(a[2].d),*(a[3].d),a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1613,9 +1737,27 @@ int MGL_NO_EXPORT mgls_tricont(mglGraph *gr, long , mglArg *a, const char *k, co else if(!strcmp(k,"ddddds")) gr->TriContV(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt); else if(!strcmp(k,"dddddd")) - gr->TriContV(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt); + gr->TriCont(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt); else if(!strcmp(k,"dddddds")) - gr->TriContV(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt); + gr->TriCont(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt); + else res = 1; return res; +} +//----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_tricontv(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) +{ + int res=0; + if(!strcmp(k,"dddd")) + gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",opt); + else if(!strcmp(k,"dddds")) + gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),opt); + else if(!strcmp(k,"ddddd")) + gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt); + else if(!strcmp(k,"ddddds")) + gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt); + else if(!strcmp(k,"dddddd")) + gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt); + else if(!strcmp(k,"dddddds")) + gr->TriContVt(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[6].s.c_str(),opt); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1629,8 +1771,10 @@ int MGL_NO_EXPORT mgls_ternary(mglGraph *gr, long , mglArg *a, const char *k, co int MGL_NO_EXPORT mgls_transpose(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"d")) a[0].d->Transpose(); - else if(!strcmp(k,"ds")) a[0].d->Transpose(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"d")) d->Transpose(); + else if(!strcmp(k,"ds")) d->Transpose(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1778,12 +1922,24 @@ int MGL_NO_EXPORT mgls_zrange(mglGraph *gr, long , mglArg *a, const char *k, con else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_ctick(mglGraph *gr, long , mglArg *a, const char *k, const char *) +{ + int res=0; + if(!strcmp(k,"s")) gr->SetTickTempl('c',a[0].w.c_str()); + else if(!strcmp(k,"n")) gr->SetTicks('c',a[0].v,0,0); + else if(!strcmp(k,"ns")) gr->SetTicks('c',a[0].v,0,0,a[1].w.c_str()); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_xtick(mglGraph *gr, long n, mglArg *a, const char *k, const char *) { int res=0; if(!strcmp(k,"n")) gr->SetTicks('x', a[0].v); + else if(!strcmp(k,"ns")) gr->SetTicks('x', a[0].v, 0, NAN, a[1].w.c_str()); else if(!strcmp(k,"nn")) gr->SetTicks('x', a[0].v, iint(a[1].v)); + else if(!strcmp(k,"nns")) gr->SetTicks('x', a[0].v, iint(a[1].v), NAN, a[2].w.c_str()); else if(!strcmp(k,"nnn")) gr->SetTicks('x', a[0].v, iint(a[1].v), a[2].v); + else if(!strcmp(k,"nnns")) gr->SetTicks('x', a[0].v, iint(a[1].v), a[2].v, a[3].w.c_str()); else if(!strcmp(k,"s")) gr->SetTickTempl('x',a[0].w.c_str()); else if(!strcmp(k,"ds")) gr->SetTicksVal('x', *(a[0].d), a[1].w.c_str()); else if(!strcmp(k,"dsn")) gr->SetTicksVal('x', *(a[0].d), a[1].w.c_str(), a[2].v); @@ -1796,7 +1952,7 @@ int MGL_NO_EXPORT mgls_xtick(mglGraph *gr, long n, mglArg *a, const char *k, con { v[i] = a[2*i].v; s += a[2*i+1].w+L"\n"; } else break; } - gr->SetTicksVal('x',mglData(i,v),s.c_str()); + gr->SetTicksVal('x',mglData(i,v),s.c_str(),a[2*i].type==2?a[2*i].v:0); } else res = 1; return res; } @@ -1805,8 +1961,11 @@ int MGL_NO_EXPORT mgls_ytick(mglGraph *gr, long n, mglArg *a, const char *k, con { int res=0; if(!strcmp(k,"n")) gr->SetTicks('y', a[0].v); + else if(!strcmp(k,"ns")) gr->SetTicks('y', a[0].v, 0, NAN, a[1].w.c_str()); else if(!strcmp(k,"nn")) gr->SetTicks('y', a[0].v, iint(a[1].v)); + else if(!strcmp(k,"nns")) gr->SetTicks('y', a[0].v, iint(a[1].v), NAN, a[2].w.c_str()); else if(!strcmp(k,"nnn")) gr->SetTicks('y', a[0].v, iint(a[1].v), a[2].v); + else if(!strcmp(k,"nnns")) gr->SetTicks('y', a[0].v, iint(a[1].v), a[2].v, a[3].w.c_str()); else if(!strcmp(k,"s")) gr->SetTickTempl('y',a[0].w.c_str()); else if(!strcmp(k,"ds")) gr->SetTicksVal('y', *(a[0].d), a[1].w.c_str()); else if(!strcmp(k,"dsn")) gr->SetTicksVal('y', *(a[0].d), a[1].w.c_str(), a[2].v); @@ -1828,8 +1987,11 @@ int MGL_NO_EXPORT mgls_ztick(mglGraph *gr, long n, mglArg *a, const char *k, con { int res=0; if(!strcmp(k,"n")) gr->SetTicks('z', a[0].v); + else if(!strcmp(k,"ns")) gr->SetTicks('z', a[0].v, 0, NAN, a[1].w.c_str()); else if(!strcmp(k,"nn")) gr->SetTicks('z', a[0].v, iint(a[1].v)); + else if(!strcmp(k,"nns")) gr->SetTicks('z', a[0].v, iint(a[1].v), NAN, a[2].w.c_str()); else if(!strcmp(k,"nnn")) gr->SetTicks('z', a[0].v, iint(a[1].v), a[2].v); + else if(!strcmp(k,"nnns")) gr->SetTicks('z', a[0].v, iint(a[1].v), a[2].v, a[3].w.c_str()); else if(!strcmp(k,"s")) gr->SetTickTempl('z',a[0].w.c_str()); else if(!strcmp(k,"ds")) gr->SetTicksVal('z', *(a[0].d), a[1].w.c_str()); else if(!strcmp(k,"dsn")) gr->SetTicksVal('z', *(a[0].d), a[1].w.c_str(), a[2].v); @@ -1862,15 +2024,18 @@ int MGL_NO_EXPORT mgls_error(mglGraph *gr, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_extend(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dn")) a[0].d->Extend(iint(a[1].v)); - else if(!strcmp(k,"dnn")) a[0].d->Extend(iint(a[1].v),iint(a[2].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dn")) d->Extend(iint(a[1].v)); + else if(!strcmp(k,"dnn")) d->Extend(iint(a[1].v),iint(a[2].v)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_join(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dd")) a[0].d->Join(*(a[1].d)); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"dd") && d) d->Join(*(a[1].d)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1900,7 +2065,8 @@ int MGL_NO_EXPORT mgls_info(mglGraph *gr, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_integrate(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->Integral(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"ds") && d) d->Integral(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1973,78 +2139,90 @@ int MGL_NO_EXPORT mgls_origin(mglGraph *gr, long , mglArg *a, const char *k, con int MGL_NO_EXPORT mgls_norm(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dnn")) a[0].d->Norm(a[1].v,a[2].v); - else if(!strcmp(k,"dnnn")) a[0].d->Norm(a[1].v,a[2].v,a[3].v!=0); - else if(!strcmp(k,"dnnnn")) a[0].d->Norm(a[1].v,a[2].v,a[3].v!=0,iint(a[4].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dnn")) d->Norm(a[1].v,a[2].v); + else if(!strcmp(k,"dnnn")) d->Norm(a[1].v,a[2].v,a[3].v!=0); + else if(!strcmp(k,"dnnnn")) d->Norm(a[1].v,a[2].v,a[3].v!=0,iint(a[4].v)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_hist(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - if(!strcmp(k,"ddd")) *(a[0].d) = gr->Hist(*(a[1].d), *(a[2].d),opt); - else if(!strcmp(k,"dddd")) *(a[0].d) = gr->Hist(*(a[1].d), *(a[2].d), *(a[3].d),opt); - else if(!strcmp(k,"ddddd")) *(a[0].d) = gr->Hist(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d),opt); - else if(!strcmp(k,"ddnnn")) *(a[0].d) = a[1].d->Hist(int(a[2].v+0.5), a[3].v, a[4].v); - else if(!strcmp(k,"ddnnnn")) *(a[0].d) = a[1].d->Hist(int(a[2].v+0.5), a[3].v, a[4].v, int(a[5].v+0.5)); - else if(!strcmp(k,"dddnnn")) *(a[0].d) = a[1].d->Hist(*(a[2].d), int(a[3].v+0.5), a[4].v, a[5].v); - else if(!strcmp(k,"dddnnnn")) *(a[0].d) = a[1].d->Hist(*(a[2].d), int(a[3].v+0.5), a[4].v, a[5].v, int(a[6].v+0.5)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ddd")) *d = gr->Hist(*(a[1].d), *(a[2].d),opt); + else if(!strcmp(k,"dddd")) *d = gr->Hist(*(a[1].d), *(a[2].d), *(a[3].d),opt); + else if(!strcmp(k,"ddddd")) *d = gr->Hist(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d),opt); + else if(!strcmp(k,"ddnnn")) *d = mglData(true,mgl_data_hist(a[1].d,int(a[2].v+0.5), a[3].v, a[4].v, 0)); + else if(!strcmp(k,"ddnnnn")) *d = mglData(true,mgl_data_hist(a[1].d,int(a[2].v+0.5), a[3].v, a[4].v, int(a[5].v+0.5))); + else if(!strcmp(k,"dddnnn")) *d = mglData(true,mgl_data_hist_w(a[1].d,a[2].d, int(a[3].v+0.5), a[4].v, a[5].v, 0)); + else if(!strcmp(k,"dddnnnn")) *d = mglData(true,mgl_data_hist_w(a[1].d,a[2].d, int(a[3].v+0.5), a[4].v, a[5].v, int(a[6].v+0.5))); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_mirror(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->Mirror(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"ds") && d) d->Mirror(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_hankel(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->Hankel(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"ds") && d) d->Hankel(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_sinfft(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->SinFFT(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"ds") && d) d->SinFFT(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_cosfft(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->CosFFT(a[1].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"ds") && d) d->CosFFT(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_new(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - if(!strcmp(k,"dn")) a[0].d->Create(iint(a[1].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dn")) d->Create(iint(a[1].v)); else if(!strcmp(k,"dns")) - { a[0].d->Create(iint(a[1].v)); - a[0].d->Fill(gr->Self(),a[2].s.c_str(),opt); } - else if(!strcmp(k,"dnn")) a[0].d->Create(iint(a[1].v),iint(a[2].v)); + { d->Create(iint(a[1].v)); + d->Fill(gr->Self(),a[2].s.c_str(),opt); } + else if(!strcmp(k,"dnn")) d->Create(iint(a[1].v),iint(a[2].v)); else if(!strcmp(k,"dnns")) - { a[0].d->Create(iint(a[1].v),iint(a[2].v)); - a[0].d->Fill(gr->Self(),a[3].s.c_str(),opt); } - else if(!strcmp(k,"dnnn")) a[0].d->Create(iint(a[1].v),iint(a[2].v),iint(a[3].v)); + { d->Create(iint(a[1].v),iint(a[2].v)); + d->Fill(gr->Self(),a[3].s.c_str(),opt); } + else if(!strcmp(k,"dnnn")) d->Create(iint(a[1].v),iint(a[2].v),iint(a[3].v)); else if(!strcmp(k,"dnnns")) - { a[0].d->Create(iint(a[1].v),iint(a[2].v),iint(a[3].v)); - a[0].d->Fill(gr->Self(),a[4].s.c_str(),opt); } + { d->Create(iint(a[1].v),iint(a[2].v),iint(a[3].v)); + d->Fill(gr->Self(),a[4].s.c_str(),opt); } else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_var(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + mglData *d = dynamic_cast(a[0].d); // TODO use mglDataV here?! + if(!d) return 1; if(!strcmp(k,"dnn")) - { a[0].d->Create(iint(a[1].v)); a[0].d->Fill(a[2].v, NAN); } + { d->Create(iint(a[1].v)); d->Fill(a[2].v, NAN); } else if(!strcmp(k,"dnnn")) - { a[0].d->Create(iint(a[1].v)); a[0].d->Fill(a[2].v, a[3].v); } + { d->Create(iint(a[1].v)); d->Fill(a[2].v, a[3].v); } else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2093,62 +2271,102 @@ int MGL_NO_EXPORT mgls_facez(mglGraph *gr, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_normsl(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dnn")) a[0].d->NormSl(a[1].v, a[2].v); - else if(!strcmp(k,"dnns")) a[0].d->NormSl(a[1].v, a[2].v, a[3].s.c_str()[0]); - else if(!strcmp(k,"dnnsn")) a[0].d->NormSl(a[1].v, a[2].v, a[3].s.c_str()[0],a[4].v); - else if(!strcmp(k,"dnnsnn"))a[0].d->NormSl(a[1].v, a[2].v, a[3].s.c_str()[0],a[4].v,a[5].v); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dnn")) d->NormSl(a[1].v, a[2].v); + else if(!strcmp(k,"dnns")) d->NormSl(a[1].v, a[2].v, a[3].s.c_str()[0]); + else if(!strcmp(k,"dnnsn")) d->NormSl(a[1].v, a[2].v, a[3].s.c_str()[0],a[4].v); + else if(!strcmp(k,"dnnsnn"))d->NormSl(a[1].v, a[2].v, a[3].s.c_str()[0],a[4].v,a[5].v); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_momentum(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dds")) *(a[0].d) = a[1].d->Momentum('z', a[2].s.c_str()); - else if(!strcmp(k,"ddss")) *(a[0].d) = a[1].d->Momentum(a[3].s.c_str()[0], a[2].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dds")) *d = mglData(true,mgl_data_momentum(a[1].d,'z', a[2].s.c_str())); + else if(!strcmp(k,"ddss")) *d = mglData(true,mgl_data_momentum(a[1].d,a[3].s.c_str()[0], a[2].s.c_str())); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_fit(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; if(!strcmp(k,"dddddssd")) - *(a[0].d) = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(), *(a[7].d),opt); + { + mglData *i = dynamic_cast(a[7].d); + if(i) *d = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(), *i,opt); + else res = 1; + } else if(!strcmp(k,"dddddss")) - *(a[0].d) = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(),opt); + *d = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(),opt); else if(!strcmp(k,"ddddssd")) - *(a[0].d) = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(), *(a[6].d),opt); + { + mglData *i = dynamic_cast(a[6].d); + if(i) *d = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(), *i,opt); + else res = 1; + } else if(!strcmp(k,"ddddss")) - *(a[0].d) = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(),opt); + *d = gr->Fit(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(),opt); else if(!strcmp(k,"dddssd")) - *(a[0].d) = gr->Fit(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(), *(a[5].d),opt); + { + mglData *i = dynamic_cast(a[5].d); + if(i) *d = gr->Fit(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(), *i,opt); + else res = 1; + } else if(!strcmp(k,"dddss")) - *(a[0].d) = gr->Fit(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(),opt); + *d = gr->Fit(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(),opt); else if(!strcmp(k,"ddssd")) - *(a[0].d) = gr->Fit(*(a[1].d), a[2].s.c_str(), a[3].s.c_str(), *(a[4].d),opt); + { + mglData *i = dynamic_cast(a[4].d); + if(i) *d = gr->Fit(*(a[1].d), a[2].s.c_str(), a[3].s.c_str(), *i,opt); + else res = 1; + } else if(!strcmp(k,"ddss")) - *(a[0].d) = gr->Fit(*(a[1].d), a[2].s.c_str(), a[3].s.c_str(),opt); + *d = gr->Fit(*(a[1].d), a[2].s.c_str(), a[3].s.c_str(),opt); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_fits(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; if(!strcmp(k,"ddddddssd")) - *(a[0].d) = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), *(a[5].d), a[6].s.c_str(), a[7].s.c_str(), *(a[8].d),opt); + { + mglData *i = dynamic_cast(a[8].d); + if(i) *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), *(a[5].d), a[6].s.c_str(), a[7].s.c_str(), *i,opt); + else res = 1; + } else if(!strcmp(k,"ddddddss")) - *(a[0].d) = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), *(a[5].d), a[6].s.c_str(), a[7].s.c_str(),opt); + *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), *(a[5].d), a[6].s.c_str(), a[7].s.c_str(),opt); else if(!strcmp(k,"dddddssd")) - *(a[0].d) = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(), *(a[7].d),opt); + { + mglData *i = dynamic_cast(a[7].d); + if(i) *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(), *i,opt); + else res = 1; + } else if(!strcmp(k,"dddddss")) - *(a[0].d) = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(),opt); + *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(), a[6].s.c_str(),opt); else if(!strcmp(k,"ddddssd")) - *(a[0].d) = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(), *(a[6].d),opt); + { + mglData *i = dynamic_cast(a[6].d); + if(i) *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(), *i,opt); + else res = 1; + } else if(!strcmp(k,"ddddss")) - *(a[0].d) = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(),opt); + *d = gr->FitS(*(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(), a[5].s.c_str(),opt); else if(!strcmp(k,"dddssd")) - *(a[0].d) = gr->FitS(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(), *(a[5].d),opt); + { + mglData *i = dynamic_cast(a[5].d); + if(i) *d = gr->FitS(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(), *i,opt); + else res = 1; + } else if(!strcmp(k,"dddss")) - *(a[0].d) = gr->FitS(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(),opt); + *d = gr->FitS(*(a[1].d), *(a[2].d), a[3].s.c_str(), a[4].s.c_str(),opt); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2176,17 +2394,11 @@ int MGL_NO_EXPORT mgls_arrowsize(mglGraph *gr, long , mglArg *a, const char *k, int MGL_NO_EXPORT mgls_rearrange(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dn")) a[0].d->Rearrange(iint(a[1].v)); - else if(!strcmp(k,"dnn")) a[0].d->Rearrange(iint(a[1].v), iint(a[2].v)); - else if(!strcmp(k,"dnnn")) a[0].d->Rearrange(iint(a[1].v), iint(a[2].v), iint(a[3].v)); - else res = 1; return res; -} -//----------------------------------------------------------------------------- -int MGL_NO_EXPORT mgls_ctick(mglGraph *gr, long , mglArg *a, const char *k, const char *) -{ - int res=0; - if(!strcmp(k,"s")) gr->SetTickTempl('c',a[0].w.c_str()); - else if(!strcmp(k,"n")) gr->SetTicks('c',a[0].v); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dn")) d->Rearrange(iint(a[1].v)); + else if(!strcmp(k,"dnn")) d->Rearrange(iint(a[1].v), iint(a[2].v)); + else if(!strcmp(k,"dnnn")) d->Rearrange(iint(a[1].v), iint(a[2].v), iint(a[3].v)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2261,8 +2473,10 @@ int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_import(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dss")) a[0].d->Import(a[1].s.c_str(), a[2].s.c_str()); - else if(!strcmp(k,"dssnn")) a[0].d->Import(a[1].s.c_str(), a[2].s.c_str(), a[3].v,a[4].v); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dss")) d->Import(a[1].s.c_str(), a[2].s.c_str()); + else if(!strcmp(k,"dssnn")) d->Import(a[1].s.c_str(), a[2].s.c_str(), a[3].v,a[4].v); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2279,7 +2493,7 @@ int MGL_NO_EXPORT mgls_write(mglGraph *gr, long , mglArg *a, const char *k, cons int res=0; if(!strcmp(k,"")) gr->WriteFrame("", "MathGL"); else if(!strcmp(k,"s")) gr->WriteFrame(a[0].s.c_str(), "MathGL"); - return res; + else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_region(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) @@ -2299,53 +2513,63 @@ int MGL_NO_EXPORT mgls_region(mglGraph *gr, long , mglArg *a, const char *k, con int MGL_NO_EXPORT mgls_envelop(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"d")) a[0].d->Envelop(); - else if(!strcmp(k,"ds")) a[0].d->Envelop(a[1].s.c_str()[0]); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"d")) d->Envelop(); + else if(!strcmp(k,"ds")) d->Envelop(a[1].s.c_str()[0]); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_sew(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"d")) a[0].d->Sew(); - else if(!strcmp(k,"ds")) a[0].d->Sew(a[1].s.c_str()); - else if(!strcmp(k,"dsn")) a[0].d->Sew(a[1].s.c_str(), a[2].v); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"d")) d->Sew(); + else if(!strcmp(k,"ds")) d->Sew(a[1].s.c_str()); + else if(!strcmp(k,"dsn")) d->Sew(a[1].s.c_str(), a[2].v); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_evaluate(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ddd")) *(a[0].d) = a[1].d->Evaluate(*(a[2].d)); - else if(!strcmp(k,"dddn")) *(a[0].d) = a[1].d->Evaluate(*(a[2].d), a[3].v!=0); - else if(!strcmp(k,"dddd")) *(a[0].d) = a[1].d->Evaluate(*(a[2].d), *(a[3].d)); - else if(!strcmp(k,"ddddn")) *(a[0].d) = a[1].d->Evaluate(*(a[2].d), *(a[3].d), a[4].v!=0); - else if(!strcmp(k,"ddddd")) *(a[0].d) = a[1].d->Evaluate(*(a[2].d), *(a[3].d), *(a[4].d)); - else if(!strcmp(k,"dddddn"))*(a[0].d) = a[1].d->Evaluate(*(a[2].d), *(a[3].d), *(a[4].d), a[5].v!=0); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ddd")) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0,true)); + else if(!strcmp(k,"dddn")) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0, a[3].v!=0)); + else if(!strcmp(k,"dddd")) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0,true)); + else if(!strcmp(k,"ddddn")) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0, a[4].v!=0)); + else if(!strcmp(k,"ddddd")) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,a[4].d,true)); + else if(!strcmp(k,"dddddn"))*d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,a[4].d, a[5].v!=0)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_solve(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ddns")) *(a[0].d) = a[1].d->Solve(a[2].v, a[3].s[0]); - else if(!strcmp(k,"ddnsn")) *(a[0].d) = a[1].d->Solve(a[2].v, a[3].s[0], a[4].v!=0); - else if(!strcmp(k,"ddnsd")) *(a[0].d) = a[1].d->Solve(a[2].v, a[3].s[0], *(a[4].d)); - else if(!strcmp(k,"ddnsdn"))*(a[0].d) = a[1].d->Solve(a[2].v, a[3].s[0], *(a[4].d), a[5].v!=0); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ddns")) *d = mglData(true,mgl_data_solve(a[1].d, a[2].v, a[3].s[0], 0, true)); + else if(!strcmp(k,"ddnsn")) *d = mglData(true,mgl_data_solve(a[1].d, a[2].v, a[3].s[0], 0, a[4].v!=0)); + else if(!strcmp(k,"ddnsd")) *d = mglData(true,mgl_data_solve(a[1].d, a[2].v, a[3].s[0], a[4].d, true)); + else if(!strcmp(k,"ddnsdn"))*d = mglData(true,mgl_data_solve(a[1].d, a[2].v, a[3].s[0], a[4].d, a[5].v!=0)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_put(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dn")) a[0].d->Put(a[1].v); - else if(!strcmp(k,"dnn")) a[0].d->Put(a[1].v, iint(a[2].v)); - else if(!strcmp(k,"dnnn")) a[0].d->Put(a[1].v, iint(a[2].v),iint(a[3].v)); - else if(!strcmp(k,"dnnnn")) a[0].d->Put(a[1].v, iint(a[2].v),iint(a[3].v),iint(a[4].v)); - else if(!strcmp(k,"dd")) a[0].d->Put(*(a[1].d)); - else if(!strcmp(k,"ddn")) a[0].d->Put(*(a[1].d), iint(a[2].v)); - else if(!strcmp(k,"ddnn")) a[0].d->Put(*(a[1].d), iint(a[2].v),iint(a[3].v)); - else if(!strcmp(k,"ddnnn")) a[0].d->Put(*(a[1].d), iint(a[2].v),iint(a[3].v),iint(a[4].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dn")) d->Put(a[1].v); + else if(!strcmp(k,"dnn")) d->Put(a[1].v, iint(a[2].v)); + else if(!strcmp(k,"dnnn")) d->Put(a[1].v, iint(a[2].v),iint(a[3].v)); + else if(!strcmp(k,"dnnnn")) d->Put(a[1].v, iint(a[2].v),iint(a[3].v),iint(a[4].v)); + else if(!strcmp(k,"dd")) d->Put(*(a[1].d)); + else if(!strcmp(k,"ddn")) d->Put(*(a[1].d), iint(a[2].v)); + else if(!strcmp(k,"ddnn")) d->Put(*(a[1].d), iint(a[2].v),iint(a[3].v)); + else if(!strcmp(k,"ddnnn")) d->Put(*(a[1].d), iint(a[2].v),iint(a[3].v),iint(a[4].v)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2359,141 +2583,145 @@ int MGL_NO_EXPORT mgls_palette(mglGraph *gr, long , mglArg *a, const char *k, co int MGL_NO_EXPORT mgls_combine(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ddd")) *(a[0].d) = a[1].d->Combine(*(a[2].d)); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"ddd") && d) *d = mglData(true,mgl_data_combine(a[1].d, a[2].d)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_correl(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ddds")) *(a[0].d) = a[1].d->Correl(*(a[2].d), a[3].s.c_str()); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"ddds") && d) *d = mglData(true,mgl_data_correl(a[1].d, a[2].d, a[3].s.c_str())); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_roots(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dsds")) *(a[0].d) = a[2].d->Roots(a[1].s.c_str(), a[3].s[0]); - else if(!strcmp(k,"dsns")) a[0].d->a[0] = mgl_find_root_txt(a[1].s.c_str(), a[2].v, a[3].s[0]); - else if(!strcmp(k,"dsd")) *(a[0].d) = a[2].d->Roots(a[1].s.c_str(), 'x'); - else if(!strcmp(k,"dsn")) a[0].d->a[0] = mgl_find_root_txt(a[1].s.c_str(), a[2].v, 'x'); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dsds")) *d = mglData(true,mgl_data_roots(a[1].s.c_str(), a[2].d, a[3].s[0])); + else if(!strcmp(k,"dsns")) d->a[0] = mgl_find_root_txt(a[1].s.c_str(), a[2].v, a[3].s[0]); + else if(!strcmp(k,"dsd")) *d = mglData(true,mgl_data_roots(a[1].s.c_str(), a[2].d, 'x')); + else if(!strcmp(k,"dsn")) d->a[0] = mgl_find_root_txt(a[1].s.c_str(), a[2].v, 'x'); + else res = 1; return res; +} +//----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_ode(mglGraph *, long , mglArg *a, const char *k, const char *) +{ + int res=0; + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"dssd")) + *d = mglODE(a[1].s.c_str(), a[2].s.c_str(), *(a[3].d)); + else if(!strcmp(k,"dssdnn")) + *d = mglODE(a[1].s.c_str(), a[2].s.c_str(), *(a[3].d), a[4].v, a[5].v); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_pde(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - if(!strcmp(k,"dsdd")) - *(a[0].d) = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt); + mglData *d = dynamic_cast(a[0].d), *c = dynamic_cast(a[1].d); + if(!d) return 1; + if(!strcmp(k,"dsdd")) // TODO mglDataC can be used here + *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt); else if(!strcmp(k,"dsddn")) - *(a[0].d) = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt); + *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt); else if(!strcmp(k,"dsddnn")) - *(a[0].d) = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt); - else if(!strcmp(k,"ddsdd")) - { - HADT res = mgl_pde_solve_c(gr->Self(),a[2].s.c_str(), a[3].d, a[4].d, 0.1,100,opt); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } - else if(!strcmp(k,"ddsddn")) - { - HADT res = mgl_pde_solve_c(gr->Self(),a[2].s.c_str(), a[3].d, a[4].d, a[5].v,100,opt); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } - else if(!strcmp(k,"ddsddnn")) - { - HADT res = mgl_pde_solve_c(gr->Self(),a[2].s.c_str(), a[3].d, a[4].d, a[5].v,a[6].v,opt); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } + *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt); + else if(!strcmp(k,"ddsdd") && c) + { mglDataC res = mglDataC(true, mgl_pde_solve_c(gr->Self(),a[2].s.c_str(), a[3].d, a[4].d, 0.1,100,opt)); + *d = res.Abs(); *c = res.Arg(); } + else if(!strcmp(k,"ddsddn") && c) + { mglDataC res = mglDataC(true, mgl_pde_solve_c(gr->Self(),a[2].s.c_str(), a[3].d, a[4].d, a[5].v,100,opt)); + *d = res.Abs(); *c = res.Arg(); } + else if(!strcmp(k,"ddsddnn") && c) + { mglDataC res = mglDataC(true, mgl_pde_solve_c(gr->Self(),a[2].s.c_str(), a[3].d, a[4].d, a[5].v,a[6].v,opt)); + *d = res.Abs(); *c = res.Arg(); } else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_qo2d(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + mglData *d = dynamic_cast(a[0].d), *c = dynamic_cast(a[1].d); + if(!d) return 1; if(!strcmp(k,"dsddd")) - *(a[0].d) = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0)); + *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0)); else if(!strcmp(k,"dsdddn")) - *(a[0].d) = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0)); + *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0)); else if(!strcmp(k,"dsdddnn")) - *(a[0].d) = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0)); + *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0)); else if(!strcmp(k,"dsdddnndd")) - *(a[0].d) = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, a[7].d,a[8].d)); - else if(!strcmp(k,"ddsddd")) - { - HADT res = mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } - else if(!strcmp(k,"ddsdddn")) - { - HADT res = mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } - else if(!strcmp(k,"ddsdddnn")) - { - HADT res = mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } - else if(!strcmp(k,"ddsdddnndd")) - { - HADT res = mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, a[8].d,a[9].d); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } + *d = mglData(true, mgl_qo2d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast(a[7].d),dynamic_cast(a[8].d))); + else if(!strcmp(k,"ddsddd") && c) + { mglDataC res = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0)); + *d = res.Abs(); *c = res.Arg(); } + else if(!strcmp(k,"ddsdddn") && c) + { mglDataC res = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0)); + *d = res.Abs(); *c = res.Arg(); } + else if(!strcmp(k,"ddsdddnn") && c) + { mglDataC res = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0)); + *d = res.Abs(); *c = res.Arg(); } + else if(!strcmp(k,"ddsdddnndd") && c) + { mglDataC res = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, dynamic_cast(a[8].d),dynamic_cast(a[9].d))); + *d = res.Abs(); *c = res.Arg(); } else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_qo3d(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + mglData *d = dynamic_cast(a[0].d), *c = dynamic_cast(a[1].d); + if(!d) return 1; if(!strcmp(k,"dsddd")) - *(a[0].d) = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0,0)); + *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0,0)); else if(!strcmp(k,"dsdddn")) - *(a[0].d) = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0,0)); + *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,100, 0,0,0)); else if(!strcmp(k,"dsdddnn")) - *(a[0].d) = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0,0)); + *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, 0,0,0)); else if(!strcmp(k,"dsdddnnddd")) - *(a[0].d) = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, a[7].d,a[8].d,a[9].d)); - else if(!strcmp(k,"ddsddd")) - { - HADT res = mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0,0); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } - else if(!strcmp(k,"ddsdddn")) - { - HADT res = mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0,0); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } - else if(!strcmp(k,"ddsdddnn")) - { - HADT res = mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0,0); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } - else if(!strcmp(k,"ddsdddnnddd")) - { - HADT res = mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, a[8].d,a[9].d,a[10].d); - *(a[0].d) = res->Abs(); *(a[1].d) = res->Arg(); - } + *d = mglData(true, mgl_qo3d_solve(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, a[5].v,a[6].v, dynamic_cast(a[7].d),dynamic_cast(a[8].d),dynamic_cast(a[9].d))); + else if(!strcmp(k,"ddsddd") && c) + { mglDataC res = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0,0)); + *d = res.Abs(); *c = res.Arg(); } + else if(!strcmp(k,"ddsdddn") && c) + { mglDataC res = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,100, 0,0,0)); + *d = res.Abs(); *c = res.Arg(); } + else if(!strcmp(k,"ddsdddnn") && c) + { mglDataC res = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, 0,0,0)); + *d = res.Abs(); *c = res.Arg(); } + else if(!strcmp(k,"ddsdddnnddd") && c) + { mglDataC res = mglDataC(true, mgl_qo3d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, a[6].v,a[7].v, dynamic_cast(a[8].d),dynamic_cast(a[9].d),dynamic_cast(a[10].d))); + *d = res.Abs(); *c = res.Arg(); } else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_ray(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; if(!strcmp(k,"dsnnnn")) - *(a[0].d) = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v), mglPoint(a[4].v, a[5].v)); + *d = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v), mglPoint(a[4].v, a[5].v)); else if(!strcmp(k,"dsnnnnnn")) - *(a[0].d) = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v, a[4].v), mglPoint(a[5].v, a[6].v, a[7].v)); + *d = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v, a[4].v), mglPoint(a[5].v, a[6].v, a[7].v)); else if(!strcmp(k,"dsnnnnnnn")) - *(a[0].d) = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v, a[4].v), mglPoint(a[5].v, a[6].v, a[7].v), a[8].v); + *d = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v, a[4].v), mglPoint(a[5].v, a[6].v, a[7].v), a[8].v); else if(!strcmp(k,"dsnnnnnnnn")) - *(a[0].d) = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v, a[4].v), mglPoint(a[5].v, a[6].v, a[7].v), a[8].v,a[9].v); + *d = mglRay(a[1].s.c_str(), mglPoint(a[2].v, a[3].v, a[4].v), mglPoint(a[5].v, a[6].v, a[7].v), a[8].v,a[9].v); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_jacobian(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ddd")) *(a[0].d) = mglJacobian(*(a[1].d), *(a[2].d)); - else if(!strcmp(k,"dddd")) *(a[0].d) = mglJacobian(*(a[1].d), *(a[2].d), *(a[3].d)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ddd")) *d = mglJacobian(*(a[1].d), *(a[2].d)); + else if(!strcmp(k,"dddd")) *d = mglJacobian(*(a[1].d), *(a[2].d), *(a[3].d)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2566,42 +2794,48 @@ int MGL_NO_EXPORT mgls_adjust(mglGraph *gr, long , mglArg *a, const char *k, con int MGL_NO_EXPORT mgls_insert(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->Insert(a[1].s.c_str()[0]); - else if(!strcmp(k,"dsn")) a[0].d->Insert(a[1].s.c_str()[0], iint(a[2].v)); - else if(!strcmp(k,"dsnn")) a[0].d->Insert(a[1].s.c_str()[0], iint(a[2].v), iint(a[3].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) d->Insert(a[1].s.c_str()[0]); + else if(!strcmp(k,"dsn")) d->Insert(a[1].s.c_str()[0], iint(a[2].v)); + else if(!strcmp(k,"dsnn")) d->Insert(a[1].s.c_str()[0], iint(a[2].v), iint(a[3].v)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_delete(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ds")) a[0].d->Delete(a[1].s.c_str()[0]); - else if(!strcmp(k,"dsn")) a[0].d->Delete(a[1].s.c_str()[0], iint(a[2].v)); - else if(!strcmp(k,"dsnn")) a[0].d->Delete(a[1].s.c_str()[0], iint(a[2].v), iint(a[3].v)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ds")) d->Delete(a[1].s.c_str()[0]); + else if(!strcmp(k,"dsn")) d->Delete(a[1].s.c_str()[0], iint(a[2].v)); + else if(!strcmp(k,"dsnn")) d->Delete(a[1].s.c_str()[0], iint(a[2].v), iint(a[3].v)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_roll(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"dsn")) a[0].d->Roll(a[1].s.c_str()[0], iint(a[2].v)); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"dsn") && d) d->Roll(a[1].s.c_str()[0], iint(a[2].v)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_datagrid(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - if(!strcmp(k,"dddd")) gr->DataGrid(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d),opt); + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"dddd") && d) gr->DataGrid(*d, *(a[1].d), *(a[2].d), *(a[3].d),opt); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_triangulate(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"ddd")) - *(a[0].d) = mglTriangulation(*(a[1].d), *(a[2].d)); - else if(!strcmp(k,"dddd")) - *(a[0].d) = mglTriangulation(*(a[1].d), *(a[2].d), *(a[3].d)); + mglData *d = dynamic_cast(a[0].d); + if(!d) return 1; + if(!strcmp(k,"ddd")) *d = mglTriangulation(*(a[1].d), *(a[2].d)); + else if(!strcmp(k,"dddd")) *d = mglTriangulation(*(a[1].d), *(a[2].d), *(a[3].d)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2634,7 +2868,16 @@ int MGL_NO_EXPORT mgls_drawreg(mglGraph *gr, long , mglArg *a, const char *k, co { int res=0; if(!strcmp(k,"")) gr->SetDrawReg(); - if(!strcmp(k,"nnn")) gr->SetDrawReg(iint(a[0].v), iint(a[1].v), iint(a[2].v)); + else if(!strcmp(k,"nnn")) gr->SetDrawReg(iint(a[0].v), iint(a[1].v), iint(a[2].v)); + else res = 1; return res; +} +//----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_version(mglGraph *gr, long , mglArg *a, const char *k, const char *) +{ + int res=0; + char buf[32]; sprintf(buf,"MathGL version is 2.%g",MGL_VER2); + if(!strcmp(k,"")) gr->SetWarn(-1,buf); + else if(!strcmp(k,"s")) res = mgl_check_version(a[0].s.c_str())?1:0; else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2645,6 +2888,7 @@ mglCommand mgls_base_cmd[] = { {"alpha","Switch on/off transparency","alpha [val]", mgls_alpha ,2}, {"alphadef","Set default transparency","alphadef val", mgls_alphadef ,2}, {"ambient","Set ambient light brightness","ambient val", mgls_ambient ,2}, + {"arc","Draw angle arc","arc x0 y0 x1 y1 a ['fmt']|x0 y0 z0 x1 y1 a ['fmt']|x0 y0 z0 xr yr zr x1 y1 z1 a ['fmt']", mgls_arc ,13}, {"area","Draw area plot for 1D data","area Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_area ,7}, {"arrowsize","Set size of arrows","arrowsize val", mgls_arrowsize ,2}, {"ask","Define parameter from user input","ask $N 'question'", 0, 6}, @@ -2652,6 +2896,7 @@ mglCommand mgls_base_cmd[] = { {"axial","Draw surfaces of contour lines rotation","axial Zdat ['fmt' num]|Xdat Ydat Zdat ['fmt' num]", mgls_axial ,8}, {"axis","Setup or draw axis","axis ['dir' 'fmt']|'fx' 'fy' 'fz' ['fc']|how", mgls_axis ,12}, {"axisstl","Set axis and tick style","axisstl 'stl' ['sub']", mgls_axisstl ,14}, + {"background","Load image for background","background 'fname'", mgls_background ,12}, {"ball","Draw point (ball)","ball posx posy ['fmt']|posx posy posz ['fmt']", mgls_ball ,13}, {"barh","Draw horizontal bars for 1D data", "barh Ydat ['fmt' above]|Xdat Ydat ['fmt' above]", mgls_barh ,7}, {"bars","Draw bars for 1D data","bars Ydat ['fmt' above]|Xdat Ydat ['fmt' above]|Xdat Ydat Zdat ['fmt' above]", mgls_bars ,7}, @@ -2696,7 +2941,7 @@ mglCommand mgls_base_cmd[] = { {"crange","Set color range","crange Dat [add] | c1 c2 [add]", mgls_crange ,14}, {"crop","Crop edge of data","crop Dat n1 n2 'dir'", mgls_crop ,16}, {"crust","Draw reconstructed surface for arbitrary data points","crust Xdat Ydat Zdat ['fmt']", mgls_crust ,0}, - {"ctick","Set ticks for colorbar","ctick 'tmpl' | dx", mgls_ctick ,14}, + {"ctick","Set ticks for colorbar","ctick 'tmpl' | dc ['factor']", mgls_ctick ,14}, {"cumsum","Cumulative summation","cumsum Dat 'dir'", mgls_cumsum ,16}, {"curve","Draw curve","curve x1 y1 dx1 dy1 x2 y2 dx2 dy2 ['fmt']|x1 y1 z1 dx1 dy1 dz1 x2 y2 z2 dx2 dy2 dz2 ['fmt']", mgls_curve ,13}, {"cut","Setup plot points cutting","cut val|x1 y1 z1 x2 y2 z2|'cond'", mgls_cut ,2}, @@ -2755,6 +3000,7 @@ mglCommand mgls_base_cmd[] = { {"grid2","Draw grid for data array(s)","grid Zdat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_grid2 ,8}, {"grid3","Draw grid at slices of 3D data","grid3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_grid3 ,9}, {"gridplot","Set position of plot inside cell of matrix", "gridplot nx ny ind [d]", mgls_gridplot ,5}, + {"gspline","Fill data by global spline of Vdat","gspline Dat Xdat Vdat [sl]", mgls_gspline ,3}, {"hankel","Hankel transform at some direction","hankel Dat 'dir'", mgls_hankel ,16}, {"hist","Create histogram (distribution) of data values","hist Res Dat num v1 v2 [nsub]|Res Dat Wdat num v1 v2 [nsub]", mgls_hist ,4}, {"idset","Set column id for data","idset Dat 'ids'", mgls_idset ,3}, @@ -2790,6 +3036,7 @@ mglCommand mgls_base_cmd[] = { {"next","Start next for-cycle iteration","next", 0, 6}, {"norm","Normalize data","norm Dat v1 v2 [sym dim]", mgls_norm ,16}, {"normsl","Normalize data slice by slice","normsl Dat v1 v2 ['dir' keep sym] ", mgls_normsl ,16}, + {"ode","Solve ODE","ode Res 'df' 'var' Ini [dt tmax]", mgls_ode ,4}, {"ohlc","Draw Open-High-Low-Close (OHLC) diagram","ohlc Odat Hdat Ldat Cdat ['fmt']|Xdat Odat Hdat Ldat Cdat ['fmt']", mgls_ohlc ,7}, {"once","Start/close commands which should executed only once","once val", 0, 6}, {"origin","Set axis origin","origin x0 y0 [z0]", mgls_origin ,14}, @@ -2800,6 +3047,7 @@ mglCommand mgls_base_cmd[] = { {"pipe","Draw flow pipes for vector field","pipe Udat Vdat ['fmt' rad num]|Xdat Ydat Udat Vdat ['fmt' rad num]|Udat Vdat Wdat ['fmt' rad num]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' rad num]", mgls_pipe ,11}, {"plot","Draw usual plot for 1D data","plot Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_plot ,7}, {"plotid","Set default filename","plotid 'name'", mgls_plotid ,2}, + {"polygon","Draw polygon","polygon x1 y1 x2 y2 num ['fmt']|x1 y1 z1 x2 y2 z2 num ['fmt']", mgls_polygon ,13}, {"put","Put value (numeric or array) to given data element","put Dat val [i j k] | Dat Val [i j k]", mgls_put ,3}, {"putsfit","Print fitted formula","putsfit x y ['pre' 'font' size]|x y z ['pre' 'font' size]", mgls_putsfit ,15}, {"qo2d","Solve PDE in accompanied coordinates for 2d case","qo2d Res 'ham' IniRe IniIm Ray [r k0 Xout Yout]", mgls_qo2d ,4}, @@ -2808,6 +3056,7 @@ mglCommand mgls_base_cmd[] = { {"quality","Set plot quality","quality [val]", mgls_quality ,2}, {"radar","Draw radar chart","radar Rdat ['fmt']", mgls_radar ,7}, {"ranges","Set axis ranges","ranges x1 x2 y1 y2 [z1 z2]", mgls_ranges ,14}, + {"rasterize","Rasterize and save to background","rasterize", mgls_rasterize ,12}, {"ray","Solve Hamiltonian ODE (find GO ray or trajectory)","ray Res 'ham' x0 y0 z0 px0 py0 pz0 [dz=0.1 tmax=10]", mgls_ray ,4}, {"read","Read data from file","read Dat 'file' [nx ny nz]", mgls_read ,4}, {"readall","Read and join data from several files","readall Dat 'templ' [slice]", mgls_readall ,4}, @@ -2872,25 +3121,27 @@ mglCommand mgls_base_cmd[] = { {"transpose","Transpose data array","transpose Dat ['dir']", mgls_transpose ,16}, {"transptype","Set type transparency","transptype val", mgls_transptype ,2}, {"triangulate","Find triangles of randomly placed points","triangulate Res Xdat Ydat [er]|Res Xdat Ydat Zdat [er]", mgls_triangulate ,4}, - {"tricont","Draw contour lines for surface of triangles","tricont Vdat Idat Xdat Ydat ['fmt']|Vdat Idat Xdat Ydat Zdat ['fmt']|Vdat Idat Xdat Ydat Zdat Cdat ['fmt'] ", mgls_tricont ,0}, + {"tricont","Draw contour lines for surface of triangles","tricont Idat Xdat Ydat Cdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt']|Vdat Idat Xdat Ydat Cdat ['fmt']|Vdat Idat Xdat Ydat Zdat Cdat ['fmt']", mgls_tricont ,0}, + {"tricontv","Draw contour tubes for surface of triangles","tricontv Idat Xdat Ydat Cdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt']|Vdat Idat Xdat Ydat Cdat ['fmt']|Vdat Idat Xdat Ydat Zdat Cdat ['fmt']", mgls_tricontv ,0}, {"triplot","Draw surface of triangles","triplot Idat Xdat Ydat ['fmt']|Idat Xdat Ydat Zdat ['fmt']|Idat Xdat Ydat Zdat Cdat ['fmt'] ", mgls_triplot ,0}, {"tube","Draw curve by tube","tube Ydat Rdat ['fmt']|Ydat rval ['fmt']|Xdat Ydat Rdat ['fmt']|Xdat Ydat rval ['fmt']|Xdat Ydat Zdat Rdat ['fmt']|Xdat Ydat Zdat rval ['fmt']", mgls_tube ,7}, {"tuneticks","Set ticks tuning","tuneticks val [fctr]", mgls_tuneticks ,14}, {"var","Create new 1D data and fill it in range","var Dat nx x1 [x2]", mgls_var ,4}, {"vect","Draw vector field","vect Udat Vdat ['fmt']|Xdat Ydat Udat Vdat ['fmt']|Udat Vdat Wdat ['fmt']|Xdat Ydat Zdat Udat Vdat Wdat ['fmt']", mgls_vect ,11}, {"vect3","Draw vector field at slices of 3D data","vect Udat Vdat Wdat ['fmt' sval]|Xdat Ydat Zdat Udat Vdat Wdat ['fmt' sval]", mgls_vect3 ,11}, + {"version","Print MathGL version or check if it is valid","version |'ver'", mgls_version, 2}, {"view","Change view angles - use 'rotate' for plot rotation","view tetz tetx [tety]", mgls_view ,5}, - {"write","Write current image to graphical file","write 'fname' [solid]", mgls_write ,2}, + {"write","Write current image to graphical file","write ['fname']", mgls_write ,2}, {"xlabel","Draw label for x-axis","xlabel 'txt' [pos]", mgls_xlabel ,12}, {"xrange","Set range for x-axis","xrange Dat [add] | x1 x2 [add]", mgls_xrange ,14}, - {"xtick","Set ticks for x-axis","xtick dx [sx tx] | 'tmpl' | Xdat 'lbl' [add] | v1 'lbl1' ...", mgls_xtick,14}, + {"xtick","Set ticks for x-axis","xtick dx ['factor'] | dx sx ['factor'] | dx sx tx ['factor'] | 'tmpl' | Xdat 'lbl' [add] | v1 'lbl1' ...", mgls_xtick,14}, {"ylabel","Draw label for y-axis","ylabel 'txt' [pos]", mgls_ylabel,12}, {"yrange","Set range for y-axis","yrange Dat [add] | y1 y2 [add]", mgls_yrange,14}, - {"ytick","Set ticks for y-axis","ytick dy [sy ty] | 'tmpl' | Ydat 'lbl' [add] | v1 'lbl1' ...", mgls_ytick,14}, + {"ytick","Set ticks for y-axis","ytick dy ['factor'] | dy sy ['factor'] | dy sy ty ['factor'] | 'tmpl' | Ydat 'lbl' [add] | v1 'lbl1' ...", mgls_ytick,14}, {"zlabel","Draw label for z-axis","zlabel 'txt' [pos]", mgls_zlabel,12}, {"zoom","Zoom plot region","zoom x1 x2 y1 y2", mgls_zoom,5}, {"zoomaxis","Zoom axis range","zoomaxis x1 x2|x1 x2 y1 y2|x1 x2 y1 y2 z1 z2|x1 x2 y1 y2 z1 z2 c1 c2", mgls_zoomaxis,14}, {"zrange","Set range for z-axis","yrange Dat [add] | z1 z2 [add]", mgls_zrange ,14}, - {"ztick","Set ticks for z-axis","ztick dz [sz tz] | 'tmpl' | Zdat 'lbl' [add] | v1 'lbl1' ...", mgls_ztick,14}, + {"ztick","Set ticks for z-axis","ztick dz ['factor'] | dz sz ['factor'] | dz sz tz ['factor'] | 'tmpl' | Zdat 'lbl' [add] | v1 'lbl1' ...", mgls_ztick,14}, {"","","",NULL,0}}; //----------------------------------------------------------------------------- diff --git a/src/export.cpp b/src/export.cpp index 742b704..c44d53b 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -255,11 +255,9 @@ int MGL_NO_EXPORT mgl_gif_save(const char *fname, int w, int h, unsigned char ** // define colormap GifColorType col[256]; memset(col,0,256*sizeof(GifColorType)); - register long m; - register int i,j,k,ii; - for(i=0;i<6;i++) for(j=0;j<6;j++) for(k=0;k<6;k++) + for(int i=0;i<6;i++) for(int j=0;j<6;j++) for(int k=0;k<6;k++) { - m = i+6*(j+6*k); // part 1 + long m = i+6*(j+6*k); // part 1 col[m].Red = 51*i; col[m].Green=51*j; col[m].Blue =51*k; @@ -277,11 +275,11 @@ int MGL_NO_EXPORT mgl_gif_save(const char *fname, int w, int h, unsigned char ** // write frame EGifPutImageDesc(fg, 0, 0, w, h, 0, 0); GifPixelType *line = new GifPixelType[w*h]; - for(m=0;m=5 EGifPutExtensionLeader(gif,0xff); EGifPutExtensionBlock(gif,11,ext1); @@ -385,13 +385,11 @@ void mglCanvas::EndFrame() if(!l) return; EGifPutImageDesc(gif, 0, 0, width, height, 0, 0); GifPixelType *line = new GifPixelType[n]; - register long m; - register int i,j,k,ii; - for(m=0;m>j)&1) == p) f++; else { - snprintf(b,32," %g",f*w); s += b; + snprintf(b,32," %g%c",f*w,dlm); s += b; p = (d>>j)&1; f = 1; n++; } } - snprintf(b,32," %g",f*w); s += b; - s += n%2 ? "" : " 0"; + snprintf(b,32,"%g",f*w); s += b; + s += (n%2) ? "" : " 0"; return s.c_str(); } //----------------------------------------------------------------------------- -bool MGL_NO_EXPORT mgl_is_same(HMGL gr, long i, mreal wp,uint32_t cp, int st) +bool MGL_LOCAL_PURE mgl_is_same(HMGL gr, long i, mreal wp,uint32_t cp, int st) { const mglPrim &pr=_Gr_->GetPrm(i); if(abs(pr.type)!=1) return false; @@ -153,11 +153,10 @@ void MGL_NO_EXPORT put_desc(HMGL gr, void *fp, bool gz, const char *pre, const c const mglGlyph &g = gr->GetGlf(q.n4); int nl=g.nl; const short *ln=g.line; - long ik,ii; bool np=true; - if(ln && nl>0) for(ik=0;ik0) for(long ik=0;ikSetWarn(mglWarnOpen,fname); return; } - setlocale(LC_NUMERIC, "C"); - mgl_printf(fp, gz, "%%!PS-Adobe-3.0 EPSF-3.0\n%%%%BoundingBox: 0 0 %d %d\n", _Gr_->GetWidth(), _Gr_->GetHeight()); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); + int w = _Gr_->GetWidth(), h = _Gr_->GetHeight(); + mgl_printf(fp, gz, "%%!PS-Adobe-3.0 EPSF-3.0\n%%%%BoundingBox: 0 0 %d %d\n", w, h); mgl_printf(fp, gz, "%%%%Created by MathGL library\n%%%%Title: %s\n",descr ? descr : fname); mgl_printf(fp, gz, "%%%%CreationDate: %s\n",ctime(&now)); mgl_printf(fp, gz, "/lw {setlinewidth} def\n/rgb {setrgbcolor} def\n"); @@ -240,6 +240,25 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr) // if(m_C) mgl_printf(fp, gz, "/m_C {m_c m_o} def\n"); mgl_printf(fp, gz, "\n"); + // Write background image first + const unsigned char *img = mgl_get_background(gr); + bool same = true; + unsigned char white[3]={255,255,255}; +#pragma omp parallel for + for(long i=0;i=0;j--) for(long i=0;i0) mgl_printf(fp, gz, "\n"); + mgl_printf(fp, gz, "%02x%02x%02x",img[4*(i+w*j)],img[4*(i+w*j)+1],img[4*(i+w*j)+2]); + } + mgl_printf(fp, gz, "\n>} false 3 colorimage\n\n"); + } + else if(memcmp(img,white,3)) + mgl_printf(fp, gz, "np 0 0 mt 0 %d ll %d %d ll %d 0 ll cp %g %g %g rgb fill\n", h, w, h, w, img[0]/255., img[1]/255., img[2]/255.); + // write definition for all glyphs put_desc(gr,fp,gz,"/%c%c_%04x { np\n", "\t%d %d mt ", "%d %d ll ", "cp\n", "} def\n"); // write primitives @@ -309,7 +328,7 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr) snprintf(str,256,"%.2g lw %.2g %.2g %.2g rgb ", q.w>1 ? q.w:1., cp.r[0]/255.,cp.r[1]/255.,cp.r[2]/255.); wp = q.w>1 ? q.w:1; st = q.n3; put_line(gr,fp,gz,i,wp,cp.c,st, "np %g %g mt ", "%g %g ll ", false, 1); - const char *sd = mgl_get_dash(q.n3,q.w); + const char *sd = mgl_get_dash(q.n3,q.w,' '); if(sd && sd[0]) mgl_printf(fp, gz, "%s [%s] %g sd dr\n",str,sd,q.w*q.s); else mgl_printf(fp, gz, "%s d0 dr\n",str); } @@ -341,7 +360,7 @@ void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr) } mgl_printf(fp, gz, "\nshowpage\n%%%%EOF\n"); if(strcmp(fname,"-")) { if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); } - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); } void MGL_EXPORT mgl_write_eps_(uintptr_t *gr, const char *fname,const char *descr,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; @@ -356,22 +375,47 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr) time_t now; time(&now); bool gz = fname[strlen(fname)-1]=='z'; - long hh = _Gr_->GetHeight(); + long hh = _Gr_->GetHeight(), ww = _Gr_->GetWidth(); void *fp; if(!strcmp(fname,"-")) fp = stdout; // allow to write in stdout else fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt"); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); mgl_printf(fp, gz, "\n"); mgl_printf(fp, gz, "\n"); - mgl_printf(fp, gz, "\n", _Gr_->GetWidth(), hh); + mgl_printf(fp, gz, "\n", ww, hh); mgl_printf(fp, gz, "\n"); mgl_printf(fp, gz, "\n\n\n",descr?descr:fname,ctime(&now)); // write definition for all glyphs - put_desc(gr,fp,gz,"\n"); + put_desc(gr,fp,gz,"\n"); + + + // Write background image first + const unsigned char *img = mgl_get_background(gr); + bool same = true; + unsigned char white[3]={255,255,255}; +#pragma omp parallel for + for(long i=0;i +/* mgl_printf(fp, gz, "%d %d 8 [1 0 0 1 0 0] {<", ww,hh,1+ww*hh/40); + for(long j=hh-1;j>=0;j--) for(long i=0;i0) mgl_printf(fp, gz, "\n"); + mgl_printf(fp, gz, "%02x%02x%02x",img[4*(i+ww*j)],img[4*(i+ww*j)+1],img[4*(i+ww*j)+2]); + } + mgl_printf(fp, gz, "\n>} false 3 colorimage\n\n");*/ + } + else if(memcmp(img,white,3)) + { + mgl_printf(fp, gz, "\n", img[0], img[1], img[2], img[3]/255.); + mgl_printf(fp, gz, " \n", hh, ww, hh, ww); + } + + // currentColor -> inherit ??? mgl_printf(fp, gz, "\n"); // write primitives @@ -449,7 +493,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr) mgl_printf(fp,gz,"1) mgl_printf(fp, gz, " stroke-width=\"%g\"", q.w); @@ -501,7 +545,7 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr) { mglPrim &q=gr->GetPrm(i); if(q.type==-1) q.type = 1; } mgl_printf(fp, gz, ""); if(strcmp(fname,"-")) { if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); } - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); } void MGL_EXPORT mgl_write_svg_(uintptr_t *gr, const char *fname,const char *descr,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; @@ -515,7 +559,7 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr) FILE *fp = fopen(fname,"wt"); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); fprintf(fp, "%% Created by MathGL library\n%% Title: %s\n\n",descr?descr:fname); // provide marks fprintf(fp, "\\providecommand{\\mglp}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1,#2-#4) -- (#1,#2+#4);}\n"); @@ -638,7 +682,7 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr) for(long i=0;iGetPrmNum();i++) { mglPrim &q=gr->GetPrm(i); if(q.type==-1) q.type = 1; } fclose(fp); - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); // provide main file for viewing figure fp=fopen("mglmain.tex","wt"); diff --git a/src/export_3d.cpp b/src/export_3d.cpp index 4d0ac83..6e0d624 100644 --- a/src/export_3d.cpp +++ b/src/export_3d.cpp @@ -31,15 +31,13 @@ std::string MGL_NO_EXPORT mgl_sprintf(const char *str, ...); //----------------------------------------------------------------------------- void mglTexture::GetRGBA(unsigned char *f) const { - register long i,j,i0; - mglColor c1,c2,c; - for(i=255;i>=0;i--) + for(long i=255;i>=0;i--) { - c1 = col[2*i]; c2 = col[2*i+1]; - for(j=0;j<256;j++) + mglColor c1 = col[2*i], c2 = col[2*i+1]; + for(long j=0;j<256;j++) { - i0 = 4*(j+256*i); - c = c1 + (c2-c1)*(j/255.); + register long i0 = 4*(j+256*i); + mglColor c = c1 + (c2-c1)*(j/255.); f[i0] = int(255*c.r); f[i0+1] = int(255*c.g); f[i0+2] = int(255*c.b); @@ -54,7 +52,7 @@ void MGL_EXPORT mgl_obj_glyph_old(HMGL gr, const mglPrim &q, const mglPnt &p, FI mreal c=q.s*cos(q.w*M_PI/180), s=-q.s*sin(q.w*M_PI/180); if(mgl_isnan(q.s)) c=s=0; double b[4] = {c,-s, s,c}; - long i=q.n1+1, ik,il=0; + long i=q.n1+1; const mglGlyph &g = gr->GetGlf(q.n4); const mreal dd = 0.004; @@ -81,7 +79,7 @@ void MGL_EXPORT mgl_obj_glyph_old(HMGL gr, const mglPrim &q, const mglPnt &p, FI { if(!(q.n3&4)) // glyph_fill(p,f,g, d); { - for(ik=0;ikGetPrmNum()==0) return; // nothing to do - long m1=0,m2=0,m,j; + long m1=0,m2=0; for(size_t i=0;iGrp.size();i++) // prepare array of indirect indexing - { m = gr->Grp[i].Id; if(mm2) m2=m; } + { register long m = gr->Grp[i].Id; if(mm2) m2=m; } long *ng = new long[m2-m1+1]; for(size_t i=0;iGrp.size();i++) ng[gr->Grp[i].Id-m1] = i; for(long i=0;iGetPrmNum();i++) // collect data for groups // it is rather expensive (extra 4b per primitive) but need for export to 3D { - m = gr->GetPrm(i).id-m1; + register long m = gr->GetPrm(i,false).id-m1; if(m>=0 && mGrp[ng[m]].p.push_back(i); } delete []ng; @@ -304,7 +302,7 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr, FILE *fp=fopen(fname,"wt"); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } // vertices definition - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname); for(long i=0;iGetPntNum();i++) { @@ -323,7 +321,7 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr, std::vector &p = gr->Grp[i].p; for(size_t j=0;jGetPrm(p[j]); + const mglPrim &q=gr->GetPrm(p[j],false); mgl_obj_prim_old(gr, q, gr->GetPnt(q.n1), fp, mgl_isnan(q.s)?0:q.s); } gr->Grp[i].p.clear(); // we don't need indexes anymore @@ -345,7 +343,7 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr, fprintf(fp,"map_Ka %s\nmap_Kd %s\nmap_Ks %s\n",tname,tname,tname); fclose(fp); // prepare texture file (TGA or PNG) - j=gr->GetTxtNum(); + long j=gr->GetTxtNum(); unsigned char *buf = new unsigned char[4*256*256*j]; unsigned char **pbuf= (unsigned char **)malloc(256*j*sizeof(unsigned char *)); for(long i=0;i<256*j;i++) pbuf[i] = buf+4*256*i; @@ -353,7 +351,7 @@ void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr, if(use_png) mgl_pnga_save(tname,256,256*j,pbuf); else mgl_tga_save(tname,256,256*j,pbuf); free(pbuf); delete []buf; delete []tname; - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); } void MGL_EXPORT mgl_write_obj_old_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; @@ -365,13 +363,12 @@ void MGL_EXPORT mgl_write_stl(HMGL gr, const char *fname,const char *descr) if(gr->GetPrmNum()==0) return; // nothing to do FILE *fp = fopen(fname,"wt"); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); fprintf(fp,"solid %s\n",(descr && *descr)?descr:"mathgl"); - register long i; mglPnt pp; - for(i=0;iGetPrmNum();i++) + for(long i=0;iGetPrmNum();i++) { - const mglPrim &q=gr->GetPrm(i); + const mglPrim &q=gr->GetPrm(i,false); if(q.type==2) // triangles { pp = gr->GetPnt(q.n1); @@ -406,7 +403,7 @@ void MGL_EXPORT mgl_write_stl(HMGL gr, const char *fname,const char *descr) } fprintf(fp,"endsolid %s",(descr && *descr)?descr:"mathgl"); fclose(fp); - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); } void MGL_EXPORT mgl_write_stl_(uintptr_t *gr, const char *fname,const char *descr,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; @@ -417,13 +414,12 @@ void MGL_EXPORT mgl_write_xyz(HMGL gr, const char *fname,const char *descr) { if(gr->GetPrmNum()==0) return; // nothing to do - register long i; FILE *fp=fopen(fname,"wt"), *ff; // vertices definition if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); fprintf(fp,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname); fprintf(fp,"# List of Vertices, with (x,y,z) coordinates.\n"); - for(i=0;iGetPntNum();i++) + for(long i=0;iGetPntNum();i++) { const mglPnt &pp = gr->GetPnt(i); fprintf(fp,"%g %g %g\n",pp.x,pp.y,pp.z); @@ -439,15 +435,15 @@ void MGL_EXPORT mgl_write_xyz(HMGL gr, const char *fname,const char *descr) fprintf(fp,"# Indices of vertices to connect for lines\n"); fprintf(ff,"# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname); fprintf(ff,"# Indices of vertices to connect for faces\n"); - for(i=0;iGetPrmNum();i++) + for(long i=0;iGetPrmNum();i++) { - const mglPrim &q=gr->GetPrm(i); + const mglPrim &q=gr->GetPrm(i,false); if(q.type==1) fprintf(fp,"%ld %ld\n",q.n1+1,q.n2+1); if(q.type==2) fprintf(ff,"%ld %ld %ld\n",q.n1+1,q.n2+1,q.n3+1); if(q.type==3) fprintf(ff,"%ld %ld %ld\n%ld %ld %ld\n",q.n1+1,q.n2+1,q.n3+1,q.n4+1,q.n2+1,q.n3+1); } fclose(fp); fclose(ff); delete []tname; - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); } void MGL_EXPORT mgl_write_xyz_(uintptr_t *gr, const char *fname,const char *descr,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; @@ -456,17 +452,17 @@ void MGL_EXPORT mgl_write_xyz_(uintptr_t *gr, const char *fname,const char *desc //----------------------------------------------------------------------------- void MGL_EXPORT mgl_write_off(HMGL gr, const char *fname,const char *descr, int colored) { - register long i,nf=0; - for(i=0;iGetPrmNum();i++) // find number of faces + long nf=0; + for(long i=0;iGetPrmNum();i++) // find number of faces { - const mglPrim &q=gr->GetPrm(i); + const mglPrim &q=gr->GetPrm(i,false); if(q.type==2 || q.type==3) nf++; } if(nf<=0) return; // nothing to do FILE *fp=fopen(fname,"wt"); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); // vertices definition if(colored) fprintf(fp,"COFF\n# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname); @@ -474,16 +470,16 @@ void MGL_EXPORT mgl_write_off(HMGL gr, const char *fname,const char *descr, int fprintf(fp,"OFF\n# Created by MathGL library\n# Title: %s\n",(descr && *descr) ? descr : fname); fprintf(fp,"# List of Vertices, with (x,y,z,r,g,b,a) coordinates.\n"); fprintf(fp,"%ld %ld 0\n",gr->GetPntNum(), nf); - for(i=0;iGetPntNum();i++) + for(long i=0;iGetPntNum();i++) { const mglPnt &pp = gr->GetPnt(i); if(colored) fprintf(fp,"%g %g %g %g %g %g %g\n", pp.x, pp.y, pp.z, pp.r, pp.g, pp.b, pp.a); else fprintf(fp,"%g %g %g\n", pp.x, pp.y, pp.z); } - for(i=0;iGetPrmNum();i++) + for(long i=0;iGetPrmNum();i++) { - const mglPrim &q=gr->GetPrm(i); + const mglPrim &q=gr->GetPrm(i,false); const mglPnt &p1=gr->GetPnt(q.n1); if(colored) { @@ -511,7 +507,7 @@ void MGL_EXPORT mgl_write_off(HMGL gr, const char *fname,const char *descr, int } } fclose(fp); - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); } void MGL_EXPORT mgl_write_off_(uintptr_t *gr, const char *fname,const char *descr,int *colored,int l,int n) { char *s=new char[l+1]; memcpy(s,fname,l); s[l]=0; @@ -542,28 +538,22 @@ MGL_EXPORT const char *mgl_get_json(HMGL gr) std::string mglCanvas::GetJSON() { ClearUnused(); // clear unused points + PreparePrim(3); std::string res, buf; - long i,ll=0,l=(long)Pnt.size(); + long ll=0,l=(long)Pnt.size(); long factor = Width>1?10:10000; - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); res = res + mgl_sprintf("{\n\"width\":%d,\t\"height\":%d,\t\"depth\":%d,\t\"plotid\":\"%s\",\t\"npnts\":%ld,\t\"pnts\":[\n", factor*Width, factor*Height, factor*Depth, PlotId.c_str(), l); - std::string *tmp=new std::string[l]; -#pragma omp parallel for reduction(+:ll) for(long i=0;i=0?q.n1+npnt:-1; - q.n2 = q.n2>=0?q.n2+npnt:-1; - if(q.type==2 || q.type==3) - { q.n3 = q.n3>=0?q.n3+npnt:-1; q.n4 = q.n4>=0?q.n4+npnt:-1; } - if(q.type==4) - { q.n4 = q.n4>=0?q.n4+nglf:-1; q.s *= font_factor/(w=0?q.n1+npnt:-1; q.n2 = q.n2>=0?q.n2+npnt:-1; + switch(q.type) + { + case 3: q.n4 = q.n4>=0?q.n4+npnt:-1; + case 2: q.n3 = q.n3>=0?q.n3+npnt:-1; q.m = mask; break; + case 4: q.s *= (Width=0?q.n4+nglf:-1; break; + } + Prm.push_back(q); } mglTexture t; - for(i=0;i=0 && m\n%s\n\n",Grp[i].Lbl.c_str()); for(j=0;j\n"); // finish with this object @@ -1029,7 +1022,7 @@ void MGL_EXPORT mgl_x3d_mdef(HMGL gr, void *fp, bool gz) m_L=false,m_r=false,m_R=false,m_X=false,m_P=false; for(long i=0;iGetPrmNum();i++) { - const mglPrim q = gr->GetPrm(i); + const mglPrim q = gr->GetPrm(i,false); if(q.type>0) continue; if(q.n4=='+') m_p = true; if(q.n4=='x') m_x = true; if(q.n4=='s') m_s = true; if(q.n4=='d') m_d = true; if(q.n4=='v') m_v = true; @@ -1164,7 +1157,7 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr) bool gz = fname[strlen(fname)-1]=='z'; void *fp = gz ? (void*)gzopen(fname,"wt") : (void*)fopen(fname,"wt"); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); mgl_printf(fp, gz, "\n"); mgl_printf(fp, gz, "\n"); mgl_printf(fp, gz, "\n\n\n",fname); @@ -1187,14 +1180,11 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr) for(long i=0;iGetPrmNum();i++) // collect data for groups // it is rather expensive (extra 4b per primitive) but need for export to 3D { - m = gr->GetPrm(i).id-m1; + m = gr->GetPrm(i,false).id-m1; if(m>=0 && mGrp[ng[m]].p.push_back(i); } delete []ng; - // resort in creation order for proper drawing of lines and faces - gr->resort(); - // primitive definition in groups long npnt = gr->GetPntNum(), k; long *pnt=new long[npnt]; @@ -1208,7 +1198,7 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr) long line=-1, face=-1, other=-1; k=0; for(size_t j=0;jGetPrm(p[j]); + const mglPrim &q=gr->GetPrm(p[j],false); if(q.type==1) line=q.n1; // find kind of primitives in the group if(q.type==2 || q.type==3) face =q.n1; if(q.type>3 || q.type==0) other=q.n1; @@ -1221,13 +1211,13 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr) bool same=true; // check if there are the same colors for all line segments for(size_t j=0;jGetPrm(p[j]); + const mglPrim &q=gr->GetPrm(p[j],false); if(q.type==1 && c!=gr->GetPntC(q.n1)) same=false; } memset(pnt,-1,npnt*sizeof(long)); for(size_t j=0,k=0;jGetPrm(p[j]); + const mglPrim &q=gr->GetPrm(p[j],false); if(q.type!=1) continue; if(q.n1>=0 && pnt[q.n1]<0) { pnt[q.n1]=k; k++; } if(q.n2>=0 && pnt[q.n2]<0) { pnt[q.n2]=k; k++; } @@ -1253,13 +1243,13 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr) bool same=true; // check if there are the same colors for all line segments for(size_t j=0;jGetPrm(p[j]); + const mglPrim &q=gr->GetPrm(p[j],false); if((q.type==2 || q.type==3) && c!=gr->GetPntC(q.n1)) same=false; } memset(pnt,-1,npnt*sizeof(long)); for(size_t j=0,k=0;jGetPrm(p[j]); + const mglPrim &q=gr->GetPrm(p[j],false); if(q.type!=2 && q.type!=3) continue; if(q.n1>=0 && pnt[q.n1]<0) { pnt[q.n1]=k; k++; } if(q.n2>=0 && pnt[q.n2]<0) { pnt[q.n2]=k; k++; } @@ -1286,7 +1276,7 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr) /* memset(pnt,-1,npnt*sizeof(long)); for(j=0,k=0;jGetPrm(p[j]); + const mglPrim &q=gr->GetPrm(p[j],false); if(q.type!=2 && q.type!=3) continue; if(q.n1>=0 && pnt[q.n1]<0) { pnt[q.n1]=k; k++; } if(q.n2>=0 && pnt[q.n2]<0) { pnt[q.n2]=k; k++; } @@ -1310,7 +1300,7 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr) for(size_t j=0;jGetPrm(p[j]); // TODO: collect by type (quads,trig,line) and draw together??? + const mglPrim &q=gr->GetPrm(p[j],false); // TODO: collect by type (quads,trig,line) and draw together??? mgl_x3d_prim(q, gr->GetPnt(q.n1), pnt, fp,gz, q.s*gr->FontFactor()); } mgl_printf(fp,gz,"\n",gr->Grp[i].Lbl.c_str()); @@ -1318,7 +1308,7 @@ void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr) } mgl_printf(fp, gz, "\n"); if(gz) gzclose((gzFile)fp); else fclose((FILE *)fp); - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); delete []pnt; } void MGL_EXPORT mgl_write_x3d_(uintptr_t *gr, const char *fname,const char *descr,int l,int n) diff --git a/src/fft.cpp b/src/fft.cpp index c606b04..c5a8c97 100644 --- a/src/fft.cpp +++ b/src/fft.cpp @@ -127,23 +127,18 @@ void MGL_EXPORT mgl_fft(double *x, long s, long n, const void *wt, void *ws, int const double *c = (const double *)wt; double *d = (double *)ws, f = inv?1./n:1; memset(d,0,2*n*sizeof(double)); - if(inv) -//#pragma omp parallel for // NOTE only 1st for can be used! - for(long i=0;ip[0],ny=t->p[1]; + long nx=t->p[0],ny=t->p[1]; #if !MGL_HAVE_PTHREAD #pragma omp parallel #endif { void *w = mgl_fft_alloc_thr(nx); #pragma omp for nowait - for(i=t->id;in;i+=mglNumThr) + for(long i=t->id;in;i+=mglNumThr) mgl_fft(t->b+2*(i%nx)+2*nx*ny*(i/nx), nx, ny, t->v, w, t->p[3]); mgl_fft_free_thr(w); } @@ -184,14 +179,14 @@ MGL_NO_EXPORT void* mgl_ffty(void *par) MGL_NO_EXPORT void* mgl_fftz(void *par) { mglThreadT *t=(mglThreadT *)par; - register long i,nx=t->p[0],ny=t->p[1],nz=t->p[2]; + long nx=t->p[0],ny=t->p[1],nz=t->p[2]; #if !MGL_HAVE_PTHREAD #pragma omp parallel #endif { void *w = mgl_fft_alloc_thr(nx); #pragma omp for nowait - for(i=t->id;in;i+=mglNumThr) + for(long i=t->id;in;i+=mglNumThr) mgl_fft(t->b+2*i, nx*ny, nz, t->v, w, t->p[3]); mgl_fft_free_thr(w); } @@ -632,7 +627,7 @@ MGL_NO_EXPORT void* mgl_cosx(void *par) for(long j=0;jv,w,false); double f1=0.5*(a[k]-a[nn+k]), s=-1; - a[nn+k]=0.5*(a[k]+a[nn+k]*(nn%2?-1:1)); + a[nn+k]=0.5*(a[k]+a[nn+k]*((nn%2)?-1:1)); for(long j=1;jv,w,false); double f1=0.5*(a[i+nx*ny*k]-a[i+nx*(ny*k+nn)]), s=-1; - a[i+nx*(ny*k+nn)]=0.5*(a[i+nx*ny*k]+a[i+nx*(ny*k+nn)]*(nn%2?-1:1)); + a[i+nx*(ny*k+nn)]=0.5*(a[i+nx*ny*k]+a[i+nx*(ny*k+nn)]*((nn%2)?-1:1)); for(long j=1;jv,w,false); double f1=0.5*(a[i]-a[i+k*nn]), s=-1; - a[i+k*nn]=0.5*(a[i]+a[i+k*nn]*(nn%2?-1:1)); + a[i+k*nn]=0.5*(a[i]+a[i+k*nn]*((nn%2)?-1:1)); for(long j=1;jGetNx(), ny = am->GetNy(), nz = am->GetNz(); - if(nx*ny*nz != ph->GetNx()*ph->GetNy()*ph->GetNz() || !tr || tr[0]==0) - return 0; + if(nx*ny*nz != ph->GetNN() || !tr || tr[0]==0) return 0; mglData re(nx,ny,nz), im(nx,ny,nz); - const mglData *da=dynamic_cast(am); - const mglData *dp=dynamic_cast(ph); - if(da && dp) -#pragma omp parallel for - for(long i=0;ia[i]*cos(dp->a[i]); - im.a[i] = da->a[i]*sin(dp->a[i]); } - else #pragma omp parallel for - for(long i=0;ivthr(i)*cos(ph->vthr(i)); - im.a[i] = am->vthr(i)*sin(ph->vthr(i)); } + for(long i=0;ivthr(i), p=ph->vthr(i); + re.a[i] = a*cos(p); im.a[i] = a*sin(p); + } return mgl_transform(&re, &im, tr); } //----------------------------------------------------------------------------- @@ -783,8 +771,7 @@ HMDT MGL_EXPORT mgl_transform(HCDT re, HCDT im, const char *tr) { if(!tr || *tr==0) return 0; long nx = re->GetNx(), ny = re->GetNy(), nz = re->GetNz(); - if(nx*ny*nz != im->GetNx()*im->GetNy()*im->GetNz() || !tr || tr[0]==0) - return 0; + if(nx*ny*nz != im->GetNN() || !tr || tr[0]==0) return 0; mglData rr(re),ii(im); if(strchr(tr,'i') && strchr(tr,'f')) // general case { @@ -1099,12 +1086,8 @@ void MGL_EXPORT mgl_data_fill_sample(HMDT d, const char *how) } else // Fourier { - if(xx) -#pragma omp parallel for - for(long i=0;iny*d->nz;i++) memcpy(aa+i*n,aa,n*sizeof(mreal)); diff --git a/src/fit.cpp b/src/fit.cpp index e5f4f82..d84d6e7 100644 --- a/src/fit.cpp +++ b/src/fit.cpp @@ -28,6 +28,7 @@ #include #include #endif +mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); //----------------------------------------------------------------------------- int mglFitPnts=100; ///< Number of output points in fitting char mglFitRes[1024]; ///< Last fitted formula @@ -53,12 +54,10 @@ void MGL_EXPORT mgl_puts_fit_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, const struct mglFitData { long n; ///< number of points - mreal *x; ///< x values - mreal *y; ///< y values - mreal *z; ///< z values + mglDataA *x,*y,*z; ///< x, y, z values mreal *a; ///< function values mreal *s; ///< value dispersions (sigma) - mglFormula *eq; ///< approximation formula + const char *eq; ///< approximation formula int m; ///< number of variables const char *var; ///< variables for fitting }; @@ -67,46 +66,71 @@ struct mglFitData int mgl_fit__f (const gsl_vector *x, void *data, gsl_vector *f) { mglFitData *fd = (mglFitData *)data; -#pragma omp parallel - { - mreal val[MGL_VS]; - for(long i=0;im;i++) val[fd->var[i]-'a'] = gsl_vector_get(x,i); -#pragma omp for - for(long i=0;in;i++) - { - val['x'-'a'] = fd->x[i]; - val['y'-'a'] = fd->y ? fd->y[i] : 0; - val['z'-'a'] = fd->z ? fd->z[i] : 0; - gsl_vector_set (f, i, (fd->eq->Calc(val) - fd->a[i])/fd->s[i]); - } - } + mglDataV *var = new mglDataV[fd->m]; + std::vector list; + for(long i=0;im;i++) + { var[i].s=fd->var[i]; var[i].Fill(gsl_vector_get(x,i)); list.push_back(var+i); } + if(fd->x) list.push_back(fd->x); + if(fd->y) list.push_back(fd->y); + if(fd->z) list.push_back(fd->z); + mglData res = mglFormulaCalc(fd->eq, list); +#pragma omp parallel for + for(long i=0;in;i++) + gsl_vector_set (f, i, (res.a[i] - fd->a[i])/fd->s[i]); + delete []var; return GSL_SUCCESS; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgl_fit__df (const gsl_vector * x, void *data, gsl_matrix * J) { mglFitData *fd = (mglFitData *)data; -#pragma omp parallel + mglDataV *var = new mglDataV[fd->m]; + std::vector list; + for(long i=0;im;i++) + { var[i].s=fd->var[i]; var[i].Fill(gsl_vector_get(x,i)); list.push_back(var+i); } + if(fd->x) list.push_back(fd->x); + if(fd->y) list.push_back(fd->y); + if(fd->z) list.push_back(fd->z); + mglData res = mglFormulaCalc(fd->eq, list); + const mreal eps = 1e-5; + for(long j=0;jm;j++) { - mreal val[MGL_VS],s; - for(long i=0;im;i++) val[fd->var[i]-'a'] = gsl_vector_get(x,i); -#pragma omp for + var[j].Fill(gsl_vector_get(x,j)+eps); + mglData dif = (mglFormulaCalc(fd->eq, list)-res)/eps; + var[j].Fill(gsl_vector_get(x,j)); +#pragma omp parallel for for(long i=0;in;i++) - { - val['x'-'a'] = fd->x[i]; s = fd->s[i]; - val['y'-'a'] = fd->y ? fd->y[i] : 0; - val['z'-'a'] = fd->z ? fd->z[i] : 0; - for(long j=0;jm;j++) - gsl_matrix_set (J, i, j, fd->eq->CalcD(val, fd->var[j])/s); - } + gsl_matrix_set (J, i, j, dif.a[i]/fd->s[i]); } + delete []var; return GSL_SUCCESS; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgl_fit__fdf (const gsl_vector * x, void *data, gsl_vector * f, gsl_matrix * J) { - mgl_fit__f(x, data, f); - mgl_fit__df(x, data, J); + mglFitData *fd = (mglFitData *)data; + mglDataV *var = new mglDataV[fd->m]; + std::vector list; + for(long i=0;im;i++) + { var[i].s=fd->var[i]; var[i].Fill(gsl_vector_get(x,i)); list.push_back(var+i); } + if(fd->x) list.push_back(fd->x); + if(fd->y) list.push_back(fd->y); + if(fd->z) list.push_back(fd->z); + mglData res = mglFormulaCalc(fd->eq, list); +#pragma omp parallel for + for(long i=0;in;i++) + gsl_vector_set (f, i, (res.a[i] - fd->a[i])/fd->s[i]); + const mreal eps = 1e-5; + for(long j=0;jm;j++) + { + var[j].Fill(gsl_vector_get(x,j)+eps); + mglData dif = (mglFormulaCalc(fd->eq, list)-res)/eps; + var[j].Fill(gsl_vector_get(x,j)); +#pragma omp parallel for + for(long i=0;in;i++) + gsl_matrix_set (J, i, j, dif.a[i]/fd->s[i]); + } + delete []var; return GSL_SUCCESS; } #endif @@ -233,23 +257,17 @@ HMDT MGL_EXPORT mgl_fit_ys(HMGL gr, HCDT y, HCDT s, const char *eq, const char * //----------------------------------------------------------------------------- void MGL_NO_EXPORT mgl_fill_fit(HMGL gr, mglData &fit, mglData &in, mglFitData &fd, const char *var, long nx, long ny, long nz, long k) { + mglDataV *vv = new mglDataV[fd.m]; + std::vector list; + for(long i=0;iMin.x,gr->Max.x,'x'); x.s = L"x"; list.push_back(&x); + mglDataV y(nx,ny,nz, gr->Min.y,gr->Max.y,'y'); y.s = L"y"; list.push_back(&y); + mglDataV z(nx,ny,nz, gr->Min.z,gr->Max.z,'z'); z.s = L"z"; list.push_back(&z); + mglData res = mglFormulaCalc(fd.eq, list); long nn = nx*ny*nz; - mreal dx = nx>1?(gr->Max.x-gr->Min.x)/(nx-1):0; - mreal dy = ny>1?(gr->Max.y-gr->Min.y)/(ny-1):0; - mreal dz = nz>1?(gr->Max.z-gr->Min.z)/(nz-1):0; -#pragma omp parallel - { - mreal val[MGL_VS]; memset(val,0,MGL_VS*sizeof(mreal)); - for(long j=0;jMin.x+jx*dx; - if(dy) val['y'-'a'] = gr->Min.y+jy*dy; - if(dz) val['z'-'a'] = gr->Min.z+jz*dz; - fit.a[jx+nx*(jy+ny*jz)+k*nn] = fd.eq->Calc(val); - } - } + memcpy(fit.a+k*nn,res.a,nn*sizeof(mreal)); + delete []vv; } //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT xx, HCDT yy, HCDT ss, const char *eq, const char *var, HMDT ini, const char *opt) @@ -261,31 +279,31 @@ HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT xx, HCDT yy, HCDT ss, const char *eq, { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; } if(m<2) { gr->SetWarn(mglWarnLow,"Fit[S]"); return 0; } - if(ss->GetNx()*ss->GetNy()*ss->GetNz() != m*yy->GetNy()*yy->GetNz()) + if(ss->GetNN() != yy->GetNN()) { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; } if(!var || *var==0) { gr->SetWarn(mglWarnNull,"Fit[S]"); return 0; } - mglData x(xx), y(yy), s(ss); + mglData x(xx), y(yy), s(ss); x.s=L"x"; mglFitData fd; - fd.n = m; fd.x = x.a; fd.y = 0; + fd.n = m; fd.x = &x; fd.y = 0; fd.z = 0; fd.a = y.a; fd.s = s.a; - fd.var = var; fd.m = strlen(var); - fd.eq = new mglFormula(eq); + fd.eq = eq; fd.var = var; fd.m = strlen(var); mglData in(fd.m), *fit=new mglData(nn, yy->GetNy(), yy->GetNz()); mreal res=-1; for(long i=0;iGetNy()*yy->GetNz();i++) { if(ini && ini->nx>=fd.m) in.Set(ini->a,fd.m); else in.Fill(0.,0); - fd.a = y.a+i*m; fd.x = x.a+(i%x.ny)*m; + mglDataR xc(x); xc.SetInd(i%x.ny, L"x"); + fd.a = y.a+i*m; fd.x = &xc; //x.a+(i%x.ny)*m; fd.s = s.a+i*m; res = mgl_fit_base(fd,in.a); mgl_fill_fit(gr,*fit,in,fd,var,nn,1,1,i); if(ini && ini->nx>=fd.m) memcpy(ini->a,in.a,fd.m*sizeof(mreal)); } mglPrepareFitEq(gr,res,eq,var,in.a); - delete fd.eq; gr->LoadState(); return fit; + gr->LoadState(); return fit; } //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT ss, const char *eq, const char *var, HMDT ini, const char *opt) @@ -295,7 +313,7 @@ HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT ss, const long nn = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5); if(xx->GetNx()!=m) { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; } - if(ss->GetNx()*ss->GetNy()*ss->GetNz() != m*n*zz->GetNz()) + if(ss->GetNN() != zz->GetNN()) { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; } if(yy->GetNx()!=n && (xx->GetNy()!=n || yy->GetNx()!=m || yy->GetNy()!=n)) { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; } @@ -304,18 +322,18 @@ HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT ss, const if(!var || *var==0) { gr->SetWarn(mglWarnNull,"Fit[S]"); return 0; } - mglData x(m, n), y(m, n), z(zz), s(ss); + mglData x(m, n), y(m, n), z(zz), s(ss); x.s=L"x"; y.s=L"y"; #pragma omp parallel for collapse(2) - for(long i=0;iGetNz()); mreal res = -1; for(long i=0;iGetNz();i++) @@ -328,7 +346,7 @@ HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT ss, const if(ini && ini->nx>=fd.m) memcpy(ini->a,in.a,fd.m*sizeof(mreal)); } mglPrepareFitEq(gr,res, eq,var,in.a); - delete fd.eq; gr->LoadState(); return fit; + gr->LoadState(); return fit; } //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_fit_xyzas(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT aa, HCDT ss, const char *eq, const char *var, HMDT ini, const char *opt) @@ -338,17 +356,18 @@ HMDT MGL_EXPORT mgl_fit_xyzas(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT aa, HCDT long nn = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5); if(m<2 || n<2 || l<2) { gr->SetWarn(mglWarnLow,"Fit[S]"); return 0; } - if(ss->GetNx()*ss->GetNy()*ss->GetNz() != i) + if(ss->GetNN() != i) { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; } - bool both = xx->GetNx()*xx->GetNy()*xx->GetNz()==i && yy->GetNx()*yy->GetNy()*yy->GetNz()==i && zz->GetNx()*zz->GetNy()*zz->GetNz()==i; + bool both = xx->GetNN()==i && yy->GetNN()==i && zz->GetNN()==i; if(!(both || (xx->GetNx()==m && yy->GetNx()==n && zz->GetNx()==l))) { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; } if(!var || *var==0) { gr->SetWarn(mglWarnNull,"Fit[S]"); return 0; } - mglData x(aa), y(aa), z(aa), a(aa), s(ss); + mglData x(m,n,l), y(m,n,l), z(m,n,l), a(aa), s(ss); + x.s=L"x"; y.s=L"y"; z.s=L"z"; #pragma omp parallel for collapse(3) - for(long i=0;inx>=fd.m) memcpy(ini->a,in.a,fd.m*sizeof(mreal)); mglPrepareFitEq(gr,res, eq,var,in.a); - delete fd.eq; gr->LoadState(); return fit; + gr->LoadState(); return fit; } //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_hist_x(HMGL gr, HCDT x, HCDT a, const char *opt) { - long nn=a->GetNx()*a->GetNy()*a->GetNz(); - if(nn!=x->GetNx()*x->GetNy()*x->GetNz()) + long nn=a->GetNN(); + if(nn!=x->GetNN()) { gr->SetWarn(mglWarnDim,"Hist"); return 0; } mreal rr = gr->SaveState(opt); long n = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5); mglData *res = new mglData(n); - const mglData *dx = dynamic_cast(x); - const mglData *da = dynamic_cast(a); mreal vx = n/(gr->Max.x-gr->Min.x); - if(dx && da) -#pragma omp parallel for - for(long i=0;ia[i]-gr->Min.x)*vx); - if(j1>=0 && j1a[j1] += da->a[i]; - } - else -#pragma omp parallel for - for(long i=0;ivthr(i)-gr->Min.x)*vx); - if(j1>=0 && j1a[j1] += a->vthr(i); - } + for(long i=0;ivthr(i)-gr->Min.x)*vx); + if(j1>=0 && j1a[j1] += a->vthr(i); + } gr->LoadState(); return res; } //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_hist_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *opt) { - long nn=a->GetNx()*a->GetNy()*a->GetNz(); - if(nn!=x->GetNx()*x->GetNy()*x->GetNz() || nn!=y->GetNx()*y->GetNy()*y->GetNz()) + long nn=a->GetNN(); + if(nn!=x->GetNN() || nn!=y->GetNN()) { gr->SetWarn(mglWarnDim,"Hist"); return 0; } mreal rr = gr->SaveState(opt); long n = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5); mglData *res = new mglData(n, n); - const mglData *dx = dynamic_cast(x); - const mglData *dy = dynamic_cast(y); - const mglData *da = dynamic_cast(a); mreal vx = n/(gr->Max.x-gr->Min.x); mreal vy = n/(gr->Max.y-gr->Min.y); - if(dx && dy && da) -#pragma omp parallel for - for(long i=0;ia[i]-gr->Min.x)*vx); - register long j2 = long((dy->a[i]-gr->Min.y)*vy); - if(j1>=0 && j1=0 && j2a[j1+n*j2] += da->a[i]; - } - else -#pragma omp parallel for - for(long i=0;ivthr(i)-gr->Min.x)*vx); - register long j2 = long((y->vthr(i)-gr->Min.y)*vy); - if(j1>=0 && j1=0 && j2a[j1+n*j2] += a->vthr(i); - } + for(long i=0;ivthr(i)-gr->Min.x)*vx); + register long j2 = long((y->vthr(i)-gr->Min.y)*vy); + if(j1>=0 && j1=0 && j2a[j1+n*j2] += a->vthr(i); + } gr->LoadState(); return res; } //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_hist_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *opt) { - long nn=a->GetNx()*a->GetNy()*a->GetNz(); - if(nn!=x->GetNx()*x->GetNy()*x->GetNz() || nn!=y->GetNx()*y->GetNy()*y->GetNz() || nn!=z->GetNx()*z->GetNy()*z->GetNz()) + long nn=a->GetNN(); + if(nn!=x->GetNN() || nn!=y->GetNN() || nn!=z->GetNN()) { gr->SetWarn(mglWarnDim,"Hist"); return 0; } mreal rr = gr->SaveState(opt); long n = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5); mglData *res = new mglData(n, n, n); - const mglData *dx = dynamic_cast(x); - const mglData *dy = dynamic_cast(y); - const mglData *dz = dynamic_cast(z); - const mglData *da = dynamic_cast(a); mreal vx = n/(gr->Max.x-gr->Min.x), vy = n/(gr->Max.y-gr->Min.y), vz = n/(gr->Max.z-gr->Min.z); - if(dx && dy && dz && da) -#pragma omp parallel for - for(long i=0;ia[i]-gr->Min.x)*vx); - register long j2 = long((dy->a[i]-gr->Min.y)*vy); - register long j3 = long((dz->a[i]-gr->Min.z)*vz); - if(j1>=0 && j1=0 && j2=0 && j3a[j1+n*(j2+n*j3)] += da->a[i]; - } - else -#pragma omp parallel for - for(long i=0;iStop) continue; - register long j1 = long((x->vthr(i)-gr->Min.x)*vx); - register long j2 = long((y->vthr(i)-gr->Min.y)*vy); - register long j3 = long((z->vthr(i)-gr->Min.z)*vz); - if(j1>=0 && j1=0 && j2=0 && j3a[j1+n*(j2+n*j3)] += a->vthr(i); - } - gr->LoadState(); return gr->Stop?0:res; + for(long i=0;ivthr(i)-gr->Min.x)*vx); + register long j2 = long((y->vthr(i)-gr->Min.y)*vy); + register long j3 = long((z->vthr(i)-gr->Min.z)*vz); + if(j1>=0 && j1=0 && j2=0 && j3a[j1+n*(j2+n*j3)] += a->vthr(i); + } + gr->LoadState(); return res; } //----------------------------------------------------------------------------- uintptr_t MGL_EXPORT mgl_hist_x_(uintptr_t* gr, uintptr_t* x, uintptr_t* a, const char *opt, int lo) @@ -484,7 +461,13 @@ uintptr_t MGL_EXPORT mgl_hist_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, ui uintptr_t r = (uintptr_t)mgl_hist_xyz(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), o); delete []o; return r; } //----------------------------------------------------------------------------- -MGL_EXPORT const char *mgl_get_fit(HMGL ) { return mglFitRes; } +MGL_EXPORT_CONST const char *mgl_get_fit(HMGL ) { return mglFitRes; } +int MGL_EXPORT mgl_get_fit_(uintptr_t *gr, char *out, int len) +{ + const char *res = mgl_get_fit(_GR_); + if(out) strncpy(out,res,len); + return strlen(res); +} //----------------------------------------------------------------------------- uintptr_t MGL_EXPORT mgl_fit_1_(uintptr_t* gr, uintptr_t* y, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo) { diff --git a/src/font.cpp b/src/font.cpp index 40c12a2..85639cf 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -21,11 +21,11 @@ #include #include -// #ifdef WIN32 -// #include -// #else -// #include -// #endif +#if !defined(__BORLANDC__) || (__CODEGEARC__ >= 0x0630) +#include +#else +#include +#endif #include "mgl2/base.h" #include "mgl2/font.h" @@ -35,17 +35,36 @@ extern float mgl_fact; extern long mgl_gen_fnt[516][6]; extern short mgl_buf_fnt[246080]; extern mglTeXsymb mgl_tex_symb[]; +extern long mgl_tex_num; //mglFont mglDefFont("nofont"); mglFont mglDefFont; //----------------------------------------------------------------------------- -char mglGetStyle(const char *how, int *font, int *align) +long MGL_EXPORT_PURE mgl_internal_code(unsigned s, const std::vector &glyphs) { - char col=0; + register long i1=0,i2=glyphs.size()-1; + register wchar_t j = wchar_t(s & MGL_FONT_MASK); + // let suppose that id[i]glyphs[i].id) i1=i+1; + else return i; + } + return j==glyphs[i2].id ? i2 : -1; +} +//----------------------------------------------------------------------------- +bool MGL_EXPORT mglGetStyle(const char *how, int *font, int *align) +{ + bool col=false; if(align) *align = 1; // centering text by default if(!how || *how==0) return col; // NOTE: no brightness for text color for(;*how && *how!=':';how++) - if(strchr(MGL_COLORS,*how)) col=*how; + { + if(strchr(MGL_COLORS,*how)) col = true; + if(*how=='{' && how[1]=='x') col = true; + } if(align) { *align = 1; @@ -66,11 +85,11 @@ char mglGetStyle(const char *how, int *font, int *align) return col; } //----------------------------------------------------------------------------- -float mglFont::Puts(const char *str,const char *how,float col) const +float mglFont::Puts(const char *str,const char *how,float c1,float c2) const { int font=0, align=1; float w=0; - char cc=mglGetStyle(how,&font,&align); - MGL_TO_WCS(str,w = Puts(wcs,font,align,cc?-cc:col)); + mglGetStyle(how,&font,&align); + MGL_TO_WCS(str,w = Puts(wcs,font,align,c1,c2)); return w; } //----------------------------------------------------------------------------- @@ -82,11 +101,11 @@ float mglFont::Width(const char *str,const char *how) const return w; } //----------------------------------------------------------------------------- -float mglFont::Puts(const wchar_t *str,const char *how,float col) const +float mglFont::Puts(const wchar_t *str,const char *how,float c1,float c2) const { int font=0, align=1; - char cc=mglGetStyle(how,&font,&align); - return Puts(str, font, align,cc?-cc:col); + mglGetStyle(how,&font,&align); + return Puts(str, font, align,c1,c2); } //----------------------------------------------------------------------------- float mglFont::Width(const wchar_t *str,const char *how) const @@ -96,59 +115,58 @@ float mglFont::Width(const wchar_t *str,const char *how) const return Width(str, font); } //----------------------------------------------------------------------------- -float mglFont::Puts(const wchar_t *str,int font,int align, float col) const +float mglFont::Puts(const wchar_t *str,int font,int align, float c1,float c2) const { - if(numg==0 || !str || *str==0) return 0; + if(GetNumGlyph()==0 || !str || *str==0) return 0; float ww=0,w=0,h = (align&4) ? 500./fact[0] : 0; - size_t size = mgl_wcslen(str)+1,i,num=0; + size_t size = mgl_wcslen(str)+1,num=0; if(parse) { unsigned *wcs = new unsigned[size], *buf=wcs; memcpy(wcs,str,size*sizeof(wchar_t)); Convert(str, wcs); - for(i=0;wcs[i];i++) + for(size_t i=0;wcs[i];i++) { if(wcs[i]=='\n') // parse '\n' symbol { - wcs[i]=0; w = Puts(buf,0,0,1.f,0x10|font,col); // find width - Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,col); // draw it really + wcs[i]=0; w = Puts(buf,0,0,1.f,0x10|font,c1,c2); // find width + Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,c1,c2); // draw it really buf=wcs+i+1; num++; if(w>ww) ww=w; } if(wcs[i]=='\\' && wcs[i+1]=='n' && (wcs[i+2]>' ' || wcschr(L"{}[]()!@#$%^&*/-?.,_=+\\\"", wcs[i+2]))) // parse '\n' symbol { - wcs[i]=0; w = Puts(buf,0,0,1.f,0x10|font,col); // find width - Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,col); // draw it really + wcs[i]=0; w = Puts(buf,0,0,1.f,0x10|font,c1,c2); // find width + Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,c1,c2); // draw it really buf=wcs+i+2; num++; if(w>ww) ww=w; } } // draw string itself - w = Puts(buf,0,0,1.f,0x10|font,col); // find width - Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,col); // draw it really + w = Puts(buf,0,0,1.f,0x10|font,c1,c2); // find width + Puts(buf,-w*(align&3)/2.f,-h - 500.*num/fact[0],1.f,font,c1,c2); // draw it really if(w>ww) ww=w; delete []wcs; } else { int s = (font/MGL_FONT_BOLD)&3; - long j; h *= fact[0]/fact[s]; - for(i=0;iGlyph(w, -h, 1, s+(font&MGL_FONT_WIRE)?4:0, j, col); + gr->Glyph(w, -h, 1, (s+(font&MGL_FONT_WIRE))?4:0, j, c1+i*(c2-c1)/(size-1)); } - else j = 0;//Internal('!'); - w+= width[s][j]/fact[s]; + w+= GetWidth(s,j)/fact[s]; } } return ww; @@ -156,32 +174,31 @@ float mglFont::Puts(const wchar_t *str,int font,int align, float col) const //----------------------------------------------------------------------------- float mglFont::Width(const wchar_t *str,int font) const { - if(numg==0 || !str || *str==0) return 0; + if(GetNumGlyph()==0 || !str || *str==0) return 0; float ww=0,w=0; - size_t size = mgl_wcslen(str)+1,i; + size_t size = mgl_wcslen(str)+1; if(parse) { unsigned *wcs = new unsigned[size], *buf=wcs; memcpy(wcs,str,size*sizeof(wchar_t)); Convert(str, wcs); - for(i=0;wcs[i];i++) if(wcs[i]=='\n') // parse '\n' symbol + for(size_t i=0;wcs[i];i++) if(wcs[i]=='\n') // parse '\n' symbol { - wcs[i]=0; w = Puts(buf,0,0,1.,0x10|font,'k'); // find width + wcs[i]=0; w = Puts(buf,0,0,1.,0x10|font,'k','k'); // find width buf=wcs+i+1; if(w>ww) ww=w; } - w = Puts(buf,0,0,1.,0x10|font,'k'); + w = Puts(buf,0,0,1.,0x10|font,'k','k'); if(wid[i]) i1=i+1; // i is bad - else return i; - } - return j==id[i2] ? i2 : -1; -} -//----------------------------------------------------------------------------- /// Table of acents and its UTF8 codes MGL_NO_EXPORT mglTeXsymb mgl_act_symb[] = { {0x02c6, L"hat"}, {0x02dc, L"tilde"}, {0x02d9, L"dot"}, {0x00a8, L"ddot"}, {0x20db, L"dddot"}, {0x20dc, L"ddddot"}, {0x02ca, L"acute"}, {0x02c7, L"check"}, {0x02cb, L"grave"}, {0x20d7, L"vec"}, {0x02c9, L"bar"}, {0x02d8, L"breve"}, /*end*/{0, L"\0"}}; //----------------------------------------------------------------------------- -int MGL_NO_EXPORT mgl_tex_symb_cmp(const void *a, const void *b) +int MGL_LOCAL_PURE mgl_tex_symb_cmp(const void *a, const void *b) { const mglTeXsymb *aa = (const mglTeXsymb *)a; const mglTeXsymb *bb = (const mglTeXsymb *)b; @@ -239,10 +241,10 @@ unsigned mglFont::Parse(const wchar_t *s) const register long k; unsigned res = unsigned(-2); // Default is no symbol if(!s || !s[0]) return res; - for(k=0;mgl_tex_symb[k].kod;k++); // determine the number of symbols +// for(k=0;mgl_tex_symb[k].kod;k++); // determine the number of symbols mglTeXsymb tst, *rts; tst.tex = s; - rts = (mglTeXsymb *) bsearch(&tst, mgl_tex_symb, k, sizeof(mglTeXsymb), mgl_tex_symb_cmp); + rts = (mglTeXsymb *) bsearch(&tst, mgl_tex_symb, mgl_tex_num, sizeof(mglTeXsymb), mgl_tex_symb_cmp); if(rts) return rts->kod; // for(k=0;mgl_tex_symb[k].kod;k++) // special symbols @@ -287,10 +289,10 @@ unsigned mglFont::Parse(const wchar_t *s) const void mglFont::Convert(const wchar_t *str, unsigned *res) const { register size_t r,i,j,k,i0; - wchar_t s[128]=L"", ch; // TeX command and current char + wchar_t s[128]=L""; // TeX command and current char for(i=j=0;str[i];i++) { - ch = str[i]; + wchar_t ch = str[i]; if(ch=='\\') // It can be TeX command { if(wcschr(L"{}_^\\@# ",str[i+1])) // No, it is usual symbol @@ -311,6 +313,7 @@ void mglFont::Convert(const wchar_t *str, unsigned *res) const } } } + else if(ch=='\b'){} else if(ch<=' ' && ch!='\n') res[j++] = ' '; // no \t at this moment :( else if(ch=='_') res[j++] = MGL_FONT_LOWER; else if(ch=='^') res[j++] = MGL_FONT_UPPER; @@ -318,7 +321,7 @@ void mglFont::Convert(const wchar_t *str, unsigned *res) const else if(ch=='{') res[j++] = unsigned(-3); else if(ch=='}') res[j++] = unsigned(-4); else if(ch=='#' && str[i+1]>' ') - res[j++] = MGL_COLOR_MASK + (0xff & str[++i]); + res[j++] = MGL_COLOR_MASK + (0xff & str[++i]); // TODO inline colors -- stack of RGBA colors + index else res[j++] = ch; // It is just symbol } res[j] = 0; @@ -352,8 +355,8 @@ float mglFont::get_ptr(long &i,unsigned *str, unsigned **b1, unsigned **b2,float } else { s2[0] = str[i]; *b2 = s2; i++; } i--; - w1 = Puts(*b1, 0, 0, f1, 0x10|st,'k'); - w2 = Puts(*b2, 0, 0, f2, 0x10|st,'k'); + w1 = Puts(*b1, 0, 0, f1, 0x10|st,'k','k'); + w2 = Puts(*b2, 0, 0, f2, 0x10|st,'k','k'); return w1>w2 ? w1 : w2; } //----------------------------------------------------------------------------- @@ -365,37 +368,37 @@ void mglFont::draw_ouline(int st, float x, float y, float f, float g, float ww, gr->Glyph(x,y-200*f/g, ww*g, (st&MGL_FONT_WIRE)?12:8, 0, ccol); } //----------------------------------------------------------------------------- -#define MGL_CLEAR_STYLE {st = style; yy = y; ff = f; ccol=col; a = (st/MGL_FONT_BOLD)&3;} -float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,float col) const +#define MGL_CLEAR_STYLE {st = style; yy = y; ff = f; ccol=c1+dc*i; a = (st/MGL_FONT_BOLD)&3;} +float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,float c1,float c2) const { - if(numg==0) return 0; - register long j,k; - long i; - register unsigned s,ss; + if(GetNumGlyph()==0) return 0; float w=0; // string width int st = style; // current style unsigned *b1, *b2; // pointer to substring unsigned *str; // string itself float yy=y, ff=f, ww, w1, w2; - float ccol=col; int a = (st/MGL_FONT_BOLD)&3; + long i; for(i=0;text[i];i++); + float dc=i>1?(c2-c1)/(i-1):0; str = new unsigned[i+1]; memcpy(str,text,(i+1)*sizeof(unsigned)); - for(i=0;str[i];i++) + float ccol = 0; + for(long i=0;str[i];i++) { - s = str[i]; ww = 0; + ccol = ccol<0?ccol:c1+dc*i; + unsigned s = str[i]; ww = 0; if(s==unsigned(-3)) // recursion call here { i++; b1 = str+i; - for(k=1;k>0 && str[i];i++) + for(long k=1;k>0 && str[i];i++) { if(str[i]==unsigned(-4)) k--; if(str[i]==unsigned(-3)) k++; } str[i-1]=0; i--; - ww = Puts(b1, x, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + ww = Puts(b1, x, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); if(gr && !(style&0x10)) // add under-/over- line now draw_ouline(st,x,y,f,fact[a],ww,ccol); MGL_CLEAR_STYLE @@ -403,15 +406,15 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s=='\n') // newline { ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff, st); - Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); - Puts(b2, x+(ww-w2)/2, yy-600*ff/fact[a], ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); + Puts(b2, x+(ww-w2)/2, yy-600*ff/fact[a], ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); MGL_CLEAR_STYLE } else if(s==unsigned(-9)) // underset { ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff/4, st); - Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); - Puts(b2, x+(ww-w2)/2, yy-150*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); + Puts(b2, x+(ww-w2)/2, yy-150*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); if(gr && !(style&0x10)) // add under-/over- line now draw_ouline(st,x,y,f,fact[a],ww,ccol); MGL_CLEAR_STYLE @@ -419,8 +422,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s==unsigned(-8)) // overset { ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff/4, st); - Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); - Puts(b2, x+(ww-w2)/2, yy+375*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); + Puts(b2, x+(ww-w2)/2, yy+375*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); if(gr && !(style&0x10)) // add under-/over- line now draw_ouline(st,x,y,f,fact[a],ww,ccol); MGL_CLEAR_STYLE @@ -428,8 +431,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s==unsigned(-12)) // sub { ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff/4, st); - Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); - Puts(b2, x+(ww-w2)/2, yy-250*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); + Puts(b2, x+(ww-w2)/2, yy-250*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); if(gr && !(style&0x10)) // add under-/over- line now draw_ouline(st,x,y,f,fact[a],ww,ccol); MGL_CLEAR_STYLE @@ -437,8 +440,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s==unsigned(-13)) // sup { ww = get_ptr(i, str, &b1, &b2, w1, w2, ff, ff/4, st); - Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); - Puts(b2, x+(ww-w2)/2, yy+450*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + Puts(b1, x+(ww-w1)/2, yy, ff, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); + Puts(b2, x+(ww-w2)/2, yy+450*ff/fact[a], ff/4, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); if(gr && !(style&0x10)) // add under-/over- line now draw_ouline(st,x,y,f,fact[a],ww,ccol); MGL_CLEAR_STYLE @@ -446,8 +449,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s==unsigned(-11)) // stackl { ww = get_ptr(i, str, &b1, &b2, w1, w2, ff*0.45, ff*0.45, st); - Puts(b1, x, yy+250*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); - Puts(b2, x, yy-110*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + Puts(b1, x, yy+250*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); + Puts(b2, x, yy-110*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); if(gr && !(style&0x10)) // add under-/over- line now draw_ouline(st,x,y,f,fact[a],ww,ccol); MGL_CLEAR_STYLE @@ -455,8 +458,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s==unsigned(-10)) // stacr { ww = get_ptr(i, str, &b1, &b2, w1, w2, ff*0.45, ff*0.45, st); - Puts(b1, x+(ww-w1), yy+250*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); - Puts(b2, x+(ww-w2), yy-110*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + Puts(b1, x+(ww-w1), yy+250*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); + Puts(b2, x+(ww-w2), yy-110*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); if(gr && !(style&0x10)) // add under-/over- line now draw_ouline(st,x,y,f,fact[a],ww,ccol); MGL_CLEAR_STYLE @@ -464,8 +467,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s==unsigned(-7)) // stack { ww = get_ptr(i, str, &b1, &b2, w1, w2, ff*0.45, ff*0.45, st); - Puts(b1, x+(ww-w1)/2, yy+250*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); - Puts(b2, x+(ww-w2)/2, yy-110*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + Puts(b1, x+(ww-w1)/2, yy+250*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); + Puts(b2, x+(ww-w2)/2, yy-110*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); if(gr && !(style&0x10)) // add under-/over- line now draw_ouline(st,x,y,f,fact[a],ww,ccol); MGL_CLEAR_STYLE @@ -473,8 +476,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s==unsigned(-6)) // frac { ww = get_ptr(i, str, &b1, &b2, w1, w2, ff*0.45, ff*0.45, st); - Puts(b1, x+(ww-w1)/2, yy+250*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); - Puts(b2, x+(ww-w2)/2, yy-110*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol); + Puts(b1, x+(ww-w1)/2, yy+250*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); + Puts(b2, x+(ww-w2)/2, yy-110*ff/fact[a], ff*0.45, (st&(~MGL_FONT_OLINE)&(~MGL_FONT_ULINE)), ccol,ccol); if(gr && !(style&0x10)) // add under-/over- line now { draw_ouline(st,x,y,f,fact[a],ww,ccol); @@ -485,8 +488,8 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s==unsigned(-4)) MGL_CLEAR_STYLE // should be never here but if I miss sth ... else if(s==unsigned(-14)) // script symbols { - k=1; - if(str[i+1]==unsigned(-3)) for(j=i+2;k>0 && str[j];j++) + long k=1; + if(str[i+1]==unsigned(-3)) for(long j=i+2;k>0 && str[j];j++) { if(str[j]==unsigned(-3)) k++; if(str[j]==unsigned(-4)) k--; @@ -499,12 +502,13 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else if(s==unsigned(-1)) // set normal font st = style & MGL_FONT_ROMAN; else if((s&MGL_COLOR_MASK)==MGL_COLOR_MASK) // color specification - ccol = -float(s & 0xff); + ccol = -float(s & 0xff); // TODO inline colors -- make textures else { - ss = s&MGL_FONT_MASK; + unsigned ss = s&MGL_FONT_MASK; if(ss) // draw symbol (glyph) { + long j = Internal('!'); if(ss>' ') { j = Internal(ss); @@ -516,8 +520,7 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa else gr->Glyph(x,yy,ff,a,j,ccol); } } - else j = Internal('!'); - ww = ff*width[a][j]/fact[a]; + ww = ff*GetWidth(a,j)/fact[a]; if(gr && !(style&0x10)) // add under-/over- line now draw_ouline(st,x,y,f,fact[a],ww,ccol); if(s & MGL_FONT_ZEROW) ww = 0; @@ -540,116 +543,59 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa return w; } //----------------------------------------------------------------------------- -void mglFont::mem_alloc() -{ - id = new wchar_t[numg]; - width[0] = new short[numg]; width[1] = new short[numg]; - width[2] = new short[numg]; width[3] = new short[numg]; - tr[0] = new int[numg]; numt[0] = new short[numg]; - tr[1] = new int[numg]; numt[1] = new short[numg]; - tr[2] = new int[numg]; numt[2] = new short[numg]; - tr[3] = new int[numg]; numt[3] = new short[numg]; - ln[0] = new int[numg]; numl[0] = new short[numg]; - ln[1] = new int[numg]; numl[1] = new short[numg]; - ln[2] = new int[numg]; numl[2] = new short[numg]; - ln[3] = new int[numg]; numl[3] = new short[numg]; -} -//----------------------------------------------------------------------------- // copy normal style as default for other styles void mglFont::main_copy() { -#pragma omp parallel sections +#pragma omp parallel for + for(size_t i=0;i &buf) // TODO add buffer for input file?! +bool mglFont::read_data(const char *fname, int s, std::vector &buf, std::vector &extra) { gzFile fp; char str[256]; int n, tmpw, tmpnl, tmpnt, retVal; - unsigned s, tmpi, tmppl, tmppt; + unsigned ss, tmpi, tmppl, tmppt; fp = gzopen(fname,"r"); if(!fp) return false; // false if no file // first string is comment (not used), second string have information if(!gzgets(fp,str,256) || strncmp(str,"# font",6) || !gzgets(fp,str,256)) { gzclose(fp); return false; } - retVal = sscanf(str, "%d%f%u", &n, ff, &s); + retVal = sscanf(str, "%d%f%u", &n, fact+s, &ss); //Check sscanf read all data (3 items) if(retVal != 3) { gzclose(fp); return false; } @@ -658,12 +604,26 @@ bool mglFont::read_data(const char *fname, float *ff, short *wdt, short *lnum, i gzgets(fp,str,256); retVal = sscanf(str,"%u%d%d%u%d%u", &tmpi, &tmpw, &tmpnl, &tmppl, &tmpnt, &tmppt); if(retVal != 6) { gzclose(fp); buf.clear(); return false; } - long j=Internal(unsigned(tmpi)); if(j<0) continue; - if(wdt) wdt[j] = tmpw; - lnum[j] = tmpnl; posl[j] = -1-tmppl; - tnum[j] = tmpnt; post[j] = -1-tmppt; + long j=Internal(unsigned(tmpi)); + if(j>=0) // known symbol + { + mglGlyphDescr &g = glyphs[j]; g.width[s] = tmpw; + g.ln[s] = -1-tmppl; g.tr[s] = -1-tmppt; + g.numl[s] = tmpnl; g.numt[s] = tmpnt; + } + else + { + mglGlyphDescr g; g.id = tmpi; + g.width[0] = g.width[1] = g.width[2] = g.width[3] = tmpw; + g.numl[0] = g.numl[1] = g.numl[2] = g.numl[3] = tmpnl; + g.ln[0] = g.ln[1] = g.ln[2] = g.ln[3] = -1-tmppl; + g.numt[0] = g.numt[1] = g.numt[2] = g.numt[3] = tmpnt; + g.tr[0] = g.tr[1] = g.tr[2] = g.tr[3] = -1-tmppt; +#pragma omp critical + extra.push_back(g); + } } - for(unsigned i=0;i &buf) // TODO add buffer for input file?! +bool mglFont::read_main(const char *fname, std::vector &buf) { gzFile fp; int tmpi, tmpw, tmpnl, tmpnt; - unsigned s, tmppl, tmppt; + unsigned s, tmppl, tmppt,numg; char str[256]; fp = gzopen(fname,"r"); if(!fp) return false; // this font must be in any case @@ -686,15 +646,18 @@ bool mglFont::read_main(const char *fname, std::vector &buf) // TODO add sscanf(str, "%u%f%u", &numg, fact, &s); fact[1] = fact[2] = fact[3] = fact[0]; // copy default factor for other font styles; // now allocate memory for all fonts - mem_alloc(); + mem_alloc(numg); // and load symbols itself for(size_t i=0;i &buf) // TODO add buf.push_back(atoi(str)); } gzclose(fp); // finish wire normal font - main_copy(); // copy normal style as default for other styles return true; } //----------------------------------------------------------------------------- @@ -715,7 +677,7 @@ bool mglFont::Load(const char *base, const char *path) sep='\\'; #endif char str[256]; - const char *oldLocale = setlocale(LC_NUMERIC,"C"); + std::string loc = setlocale(LC_NUMERIC,"C"); if(!path) path = MGL_FONT_PATH; if(base && *base) { @@ -735,60 +697,119 @@ bool mglFont::Load(const char *base, const char *path) if(!(base && *base) || !read_main(str,norm)) { // mglGlobalMess += "Load built-in font.\n"; - read_def(); setlocale(LC_NUMERIC,oldLocale); + read_def(); setlocale(LC_NUMERIC,loc.c_str()); if(buf) delete []buf; return true; } fact[1] = fact[2] = fact[3] = fact[0]; + std::vector ex_b,ex_i,ex_bi; #pragma omp parallel sections { //================== bold =========================================== #pragma omp section { char str[256]; snprintf(str,256,"%s%c%s_b.vfm",path,sep,base); // this file may absent - read_data(str, fact+1, width[1], numl[1], ln[1], numt[1], tr[1], bold); } + read_data(str, 1, bold, ex_b); } //================== italic ========================================= #pragma omp section { char str[256]; snprintf(str,256,"%s%c%s_i.vfm",path,sep,base); - read_data(str, fact+2, width[2], numl[2], ln[2], numt[2], tr[2], ital); } + read_data(str, 2, ital, ex_i); } //================== bold-italic ==================================== #pragma omp section { char str[256]; snprintf(str,256,"%s%c%s_bi.vfm",path,sep,base); - read_data(str, fact+3, width[3], numl[3], ln[3], numt[3], tr[3], both); } + read_data(str, 3, both, ex_bi); } } // now collect data numb = norm.size()+bold.size()+ital.size()+both.size(); Buf = new short[numb]; -#pragma omp parallel for - for(long i=0;i0) + memcpy(Buf+cur,bold.data(),bold.size()*sizeof(short)); #pragma omp parallel for - for(long i=0;i0) + memcpy(Buf+cur,ital.data(),ital.size()*sizeof(short)); #pragma omp parallel for - for(long i=0;i0) + memcpy(Buf+cur,both.data(),both.size()*sizeof(short)); #pragma omp parallel for - for(long i=0;i=0) // known symbol + { + mglGlyphDescr &g = ex_b[j], &f = ex_i[i]; + g.width[2] = f.width[2]; + g.ln[2] = f.ln[2]; g.tr[2] = f.tr[2]; + g.numl[2] = f.numl[2]; g.numt[2] = f.numt[2]; + } + else ex_b.push_back(ex_i[i]); + } + std::sort(ex_b.begin(),ex_b.end()); + } + if(ex_b.size()==0) ex_b = ex_bi; + else + { + for(size_t i=0;i=0) // known symbol + { + mglGlyphDescr &g = ex_b[j], &f = ex_bi[i]; + g.width[2] = f.width[3]; + g.ln[2] = f.ln[3]; g.tr[2] = f.tr[3]; + g.numl[2] = f.numl[3]; g.numt[2] = f.numt[3]; + } + else ex_b.push_back(ex_bi[i]); + } + std::sort(ex_b.begin(),ex_b.end()); + } + if(ex_b.size()>0) + { + glyphs.reserve(ex_b.size()); // preallocate memory + glyphs.insert(glyphs.end(), ex_b.begin(), ex_b.end()); + std::sort(glyphs.begin(),glyphs.end()); + } // Finally normalize all factors fact[0] *= mgl_fgen; fact[1] *= mgl_fgen; fact[2] *= mgl_fgen; fact[3] *= mgl_fgen; - setlocale(LC_NUMERIC,oldLocale); + setlocale(LC_NUMERIC,loc.c_str()); if(buf) delete []buf; return true; } @@ -811,7 +832,7 @@ void MGL_NO_EXPORT mgl_init() //----------------------------------------------------------------------------- mglFont::mglFont(const char *name, const char *path) { - parse = true; numg=0; gr=0; + parse = true; gr=0; Buf=0; // if(this==&mglDefFont) Load(name, path); else Copy(&mglDefFont); if(name && *name) Load(name, path); else if(this!=&mglDefFont) Copy(&mglDefFont); @@ -826,73 +847,21 @@ void mglFont::Restore() { Copy(&mglDefFont); } //----------------------------------------------------------------------------- void mglFont::Clear() { -// if(gr) gr->Clf(); - if(numg) - { - delete []id; delete []Buf; numg = 0; - delete [](width[0]); delete [](width[1]); delete [](width[2]); delete [](width[3]); - delete [](tr[0]); delete [](tr[1]); delete [](tr[2]); delete [](tr[3]); - delete [](ln[0]); delete [](ln[1]); delete [](ln[2]); delete [](ln[3]); - delete [](numt[0]); delete [](numt[1]); delete [](numt[2]); delete [](numt[3]); - delete [](numl[0]); delete [](numl[1]); delete [](numl[2]); delete [](numl[3]); - } +#pragma omp critical(font) + { if(Buf) delete []Buf; Buf=0; glyphs.clear(); } } //----------------------------------------------------------------------------- void mglFont::Copy(mglFont *f) { if(!f || f==this) return; - Clear(); - numg = f->numg; numb = f->numb; - mem_alloc(); - // copy general data -#pragma omp parallel sections - { -#pragma omp section - memcpy(id,f->id,numg*sizeof(wchar_t)); -#pragma omp section - memcpy(width[0],f->width[0],numg*sizeof(short)); -#pragma omp section - memcpy(width[1],f->width[1],numg*sizeof(short)); -#pragma omp section - memcpy(width[2],f->width[2],numg*sizeof(short)); -#pragma omp section - memcpy(width[3],f->width[3],numg*sizeof(short)); -#pragma omp section - memcpy(tr[0],f->tr[0],numg*sizeof(unsigned)); -#pragma omp section - memcpy(tr[1],f->tr[1],numg*sizeof(unsigned)); -#pragma omp section - memcpy(tr[2],f->tr[2],numg*sizeof(unsigned)); -#pragma omp section - memcpy(tr[3],f->tr[3],numg*sizeof(unsigned)); -#pragma omp section - memcpy(numt[0],f->numt[0],numg*sizeof(short)); -#pragma omp section - memcpy(numt[1],f->numt[1],numg*sizeof(short)); -#pragma omp section - memcpy(numt[2],f->numt[2],numg*sizeof(short)); -#pragma omp section - memcpy(numt[3],f->numt[3],numg*sizeof(short)); -#pragma omp section - memcpy(ln[0],f->ln[0],numg*sizeof(unsigned)); -#pragma omp section - memcpy(ln[1],f->ln[1],numg*sizeof(unsigned)); -#pragma omp section - memcpy(ln[2],f->ln[2],numg*sizeof(unsigned)); -#pragma omp section - memcpy(ln[3],f->ln[3],numg*sizeof(unsigned)); -#pragma omp section - memcpy(numl[0],f->numl[0],numg*sizeof(short)); -#pragma omp section - memcpy(numl[1],f->numl[1],numg*sizeof(short)); -#pragma omp section - memcpy(numl[2],f->numl[2],numg*sizeof(short)); -#pragma omp section - memcpy(numl[3],f->numl[3],numg*sizeof(short)); -#pragma omp section - memcpy(fact,f->fact,4*sizeof(float)); - } - // now copy symbols descriptions - Buf = new short[numb]; memcpy(Buf, f->Buf, numb*sizeof(short)); +#pragma omp critical(font) + { if(Buf) delete []Buf; Buf=0; } + // copy scale factors + memcpy(fact,f->fact,4*sizeof(float)); + // copy symbols descriptions + numb = f->numb; Buf = new short[numb]; memcpy(Buf, f->Buf, numb*sizeof(short)); + // copy symbol parameters + glyphs.resize(f->glyphs.size()); + memcpy(glyphs.data(),f->glyphs.data(),glyphs.size()*sizeof(mglGlyphDescr)); } //----------------------------------------------------------------------------- diff --git a/src/interp.hpp b/src/interp.hpp index daab03f..0457157 100644 --- a/src/interp.hpp +++ b/src/interp.hpp @@ -1,157 +1,14 @@ //----------------------------------------------------------------------------- -template void mglFillP(long x,long y, const Treal *a,long nx,long ny,Treal _p[4][4]) -{ - Treal sx[4]={0,0,0,0},sy[4]={0,0,0,0},f[4]={0,0,0,0},d[4]={0,0,0,0}; - if(x<0 || y<0 || x>nx-2 || y>ny-2) - { - memset(_p[0],0,4*sizeof(Treal)); - memset(_p[1],0,4*sizeof(Treal)); - memset(_p[2],0,4*sizeof(Treal)); - memset(_p[3],0,4*sizeof(Treal)); - return; - } - // �������� ������� - f[0]=a[x+nx*y]; f[1]=a[x+nx*(y+1)]; - if(nx>1) { f[2]=a[x+1+nx*y]; f[3]=a[x+1+nx*(y+1)]; } - else { f[2] = f[0]; f[3] = f[1]; } - // ����������� �� x - if(nx>1) - { - if(x==0) - { - sx[0]=a[x+1+y*nx]-a[x+nx*y]; - sx[1]=a[x+1+nx*(y+1)]-a[x+nx*(y+1)]; - } - else - { - sx[0]=(a[x+1+nx*y]-a[x-1+nx*y])/mreal(2); - sx[1]=(a[x+1+nx*(y+1)]-a[x-1+nx*(y+1)])/mreal(2); - } - } - if(x==nx-2) - { - sx[2]=a[x+1+nx*y]-a[x+nx*y]; - sx[3]=a[x+1+nx*(y+1)]-a[x+nx*(y+1)]; - } - else - { - sx[2]=(a[x+2+nx*y]-a[x+nx*y])/mreal(2); - sx[3]=(a[x+2+nx*(y+1)]-a[x+nx*(y+1)])/mreal(2); - } - // ����������� �� y - if(y==0) - { - sy[0]=a[x+nx*(y+1)]-a[x+nx*y]; - sy[2]=a[x+1+nx*(y+1)]-a[x+1+nx*y]; - } - else - { - sy[0]=(a[x+nx*(y+1)]-a[x+nx*(y-1)])/mreal(2); - sy[2]=(a[x+1+nx*(y+1)]-a[x+1+nx*(y-1)])/mreal(2); - } - if(y==ny-2) - { - sy[1]=a[x+nx*(y+1)]-a[x+nx*y]; - sy[3]=a[x+1+nx*(y+1)]-a[x+1+nx*y]; - } - else - { - sy[1]=(a[x+nx*(y+2)]-a[x+nx*y])/mreal(2); - sy[3]=(a[x+1+nx*(y+2)]-a[x+1+nx*y])/mreal(2); - } - // ������������ ����������� - if(nx>1) - { - // ������ d[0] - if(y==0 && x==0) - d[0]=(a[x+1+nx*(y+1)]-a[x+nx*(y+1)]-a[x+1+nx*y]+a[x+nx*y]); - else if(y==0) - d[0]=(a[x+1+nx*(y+1)]-a[x-1+nx*(y+1)]-a[x+1+nx*y]+a[x-1+nx*y])/mreal(2); - else if(x==0) - d[0]=(a[x+1+nx*(y+1)]-a[x+nx*(y+1)]-a[x+1+nx*(y-1)]+a[x+nx*(y-1)])/mreal(2); - else - d[0]=(a[x+1+nx*(y+1)]-a[x-1+nx*(y+1)]-a[x+1+nx*(y-1)]+a[x-1+nx*(y-1)])/mreal(4); - // ������ d[1] - if(y==ny-2 && x==0) - d[1]=(a[x+1+nx*(y+1)]-a[x+nx*(y+1)]-a[x+1+nx*y]+a[x+nx*y]); - else if(y==ny-2) - d[1]=(a[x+1+nx*(y+1)]-a[x-1+nx*(y+1)]-a[x+1+nx*y]+a[x-1+nx*y])/mreal(2); - else if(x==0) - d[1]=(a[x+1+nx*(y+2)]-a[x+nx*(y+2)]-a[x+1+nx*y]+a[x+nx*y])/mreal(2); - else - d[1]=(a[x+1+nx*(y+2)]-a[x-1+nx*(y+2)]-a[x+1+nx*y]+a[x-1+nx*y])/mreal(4); - // ������ d[2] - if(y==0 && x==nx-2) - d[2]=(a[x+1+nx*(y+1)]-a[x+nx*(y+1)]-a[x+1+nx*y]+a[x+nx*y]); - else if(y==0) - d[2]=(a[x+2+nx*(y+1)]-a[x+nx*(y+1)]-a[x+2+nx*y]+a[x+nx*y])/mreal(2); - else if(x==nx-2) - d[2]=(a[x+1+nx*(y+1)]-a[x+nx*(y+1)]-a[x+1+nx*(y-1)]+a[x+nx*(y-1)])/mreal(2); - else - d[2]=(a[x+2+nx*(y+1)]-a[x+nx*(y+1)]-a[x+2+nx*(y-1)]+a[x+nx*(y-1)])/mreal(4); - // ������ d[3] - if(y==ny-2 && x==nx-2) - d[3]=(a[x+1+nx*(y+1)]-a[x+nx*(y+1)]-a[x+1+nx*y]+a[x+nx*y]); - else if(y==ny-2) - d[3]=(a[x+2+nx*(y+1)]-a[x+nx*(y+1)]-a[x+2+nx*y]+a[x+nx*y])/mreal(2); - else if(x==nx-2) - d[3]=(a[x+1+nx*(y+2)]-a[x+nx*(y+2)]-a[x+1+nx*y]+a[x+nx*y])/mreal(2); - else - d[3]=(a[x+2+nx*(y+2)]-a[x+nx*(y+2)]-a[x+2+nx*y]+a[x+nx*y])/mreal(4); - } - // ��������� ������������ �������� - _p[0][0]=f[0]; _p[1][0]=sx[0]; - _p[2][0]=mreal(3)*(f[2]-f[0])-mreal(2)*sx[0]-sx[2]; - _p[3][0]=sx[0]+sx[2]+mreal(2)*(f[0]-f[2]); - _p[0][1]=sy[0]; _p[1][1]=d[0]; - _p[2][1]=mreal(3)*(sy[2]-sy[0])-mreal(2)*d[0]-d[2]; - _p[3][1]=d[0]+d[2]+mreal(2)*(sy[0]-sy[2]); - _p[0][2]=mreal(3)*(f[1]-f[0])-mreal(2)*sy[0]-sy[1]; - _p[1][2]=mreal(3)*(sx[1]-sx[0])-mreal(2)*d[0]-d[1]; - _p[2][2]=mreal(9)*(f[0]-f[1]-f[2]+f[3])+mreal(6)*(sy[0]-sy[2]+sx[0]-sx[1])+ - mreal(3)*(sx[2]-sx[3]+sy[1]-sy[3])+mreal(2)*(d[1]+d[2])+mreal(4)*d[0]+d[3]; - _p[3][2]=mreal(6)*(f[1]+f[2]-f[0]-f[3])+mreal(3)*(sx[1]-sx[0]+sx[3]-sx[2])+ - mreal(4)*(sy[2]-sy[0])+mreal(2)*(sy[3]-sy[1]-d[0]-d[2])-d[1]-d[3]; - _p[0][3]=mreal(2)*(f[0]-f[1])+sy[0]+sy[1]; - _p[1][3]=mreal(2)*(sx[0]-sx[1])+d[0]+d[1]; - _p[2][3]=mreal(6)*(f[1]+f[2]-f[0]-f[3])+mreal(3)*(sy[2]-sy[1]+sy[3]-sy[0])+ - mreal(4)*(sx[1]-sx[0])+mreal(2)*(sx[3]-sx[2]-d[0]-d[1])-d[2]-d[3]; - _p[3][3]=d[0]+d[1]+d[2]+d[3]+mreal(4)*(f[0]-f[1]-f[2]+f[3])+ - mreal(2)*(sx[0]-sx[1]+sx[2]-sx[3]+sy[0]-sy[2]+sy[1]-sy[3]); -} -//----------------------------------------------------------------------------- -template void mglFillP(long x, const Treal *a,long nx,Treal _p[4]) -{ - if(x<0 || x>nx-2) - { - memset(_p,0,4*sizeof(Treal)); - return; - } - Treal s[2],f[2]; - // �������� ������� - f[0]=a[x]; f[1]=a[x+1]; - // ����������� �� x - if(x==0) s[0]=a[x+1]-a[x]; - else s[0]=(a[x+1]-a[x-1])/mreal(2); - if(x==nx-2) s[1]=a[x+1]-a[x]; - else s[1]=(a[x+2]-a[x])/mreal(2); - // ��������� ������������ �������� - _p[0]=f[0]; _p[1]=s[0]; - _p[2]=mreal(3)*(f[1]-f[0])-mreal(2)*s[0]-s[1]; - _p[3]=s[0]+s[1]+mreal(2)*(f[0]-f[1]); -} -//----------------------------------------------------------------------------- template Treal mglLineart(const Treal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) { if(!a || nx<1 || ny<1 || nz<1) return 0; register long i0; - long kx,ky,kz; Treal b=0,dx,dy,dz,b1,b0; if(x<0 || y<0 || z<0 || x>nx-1 || y>ny-1 || z>nz-1) return 0; if(nz>1 && z!=floor(z)) // 3d interpolation { - kx=long(x); ky=long(y); kz=long(z); + long kx=long(x), ky=long(y), kz=long(z); dx = x-mreal(kx); dy = y-mreal(ky); dz = z-mreal(kz); i0 = kx+nx*(ky+ny*kz); @@ -164,7 +21,7 @@ template Treal mglLineart(const Treal *a, long nx, long ny, long n } else if(ny>1 && y!=floor(y)) // 2d interpolation { - kx=long(x); ky=long(y); + long kx=long(x), ky=long(y); dx = x-kx; dy=y-ky; i0 = kx+nx*ky; b = a[i0]*(mreal(1)-dx-dy+dx*dy) + dx*(mreal(1)-dy)*a[i0+1] + @@ -172,7 +29,7 @@ template Treal mglLineart(const Treal *a, long nx, long ny, long n } else if(nx>1 && x!=floor(x)) // 1d interpolation { - kx = long(x); + long kx = long(x); b = a[kx] + (x-kx)*(a[kx+1]-a[kx]); } else // no interpolation @@ -180,205 +37,218 @@ template Treal mglLineart(const Treal *a, long nx, long ny, long n return b; } //----------------------------------------------------------------------------- -template Treal mglSpline3t(const Treal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z, Treal *dx=0, Treal *dy=0, Treal *dz=0) +template Treal mgl_spline3t(const Treal y[4], long n, mreal dx, Treal &dy) { - if(!a || nx<1 || ny<1 || nz<1) return 0; - Treal _p[4][4]; - register long i,j; - Treal fx=1, fy=1; - long kx=long(x),ky=long(y),kz=long(z); - Treal b=0; - x = x>0 ?(x0 ?(y0 ?(znx-1 || y>ny-1 || z>nz-1) return 0; - if(dx) *dx=0; if(dy) *dy=0; if(dz) *dz=0; - if(kx>nx-2) kx = nx-2; if(kx<0) kx = 0; - if(ky>ny-2) ky = ny-2; if(ky<0) ky = 0; - if(kz>nz-2) kz = nz-2; if(kz<0) kz = 0; -// if(nz>1 && z!=kz) // 3d interpolation - if(nz>1) // 3d interpolation + Treal d[3], t0,t1, f0,d0; + d[0] = -(y[2]-mreal(4)*y[1]+mreal(3)*y[0])/mreal(2); + d[1] = (y[2]-y[0])/mreal(2); + d[2] = (y[3]-y[1])/mreal(2); +// d[3] = (mreal(3)*y[3]-mreal(4)*y[2]+y[1])/mreal(2); + + t0 = (y[2]+y[0])/mreal(2)-y[1]; + t1 = (y[3]+y[1])/mreal(2)-y[2]; + f0 = y[n]; d0 = d[n]; + Treal res = 0; + if(n==1) + { + Treal f1 = y[2], d1 = d[2]; + Treal b3 = mreal(10)*(f1-f0)+t1-mreal(3)*t0-mreal(4)*d1-mreal(6)*d0; + Treal b4 = mreal(15)*(f0-f1)-mreal(2)*t1+mreal(3)*t0+mreal(7)*d1+mreal(8)*d0; + Treal b5 = mreal(6)*(f1-f0)+t1-t0-mreal(3)*d1-mreal(3)*d0; + dy = d0 + dx*(mreal(2)*t0+dx*(mreal(3)*b3+dx*(mreal(4)*b4+dx*mreal(5)*b5))); +// d2y = mreal(2)*t0 + dx*(mreal(6)*b3+dx*(mreal(12)*b4+dx*mreal(20)*b5)); // 2nd derivative for future + res = f0 + dx*(d0+dx*(t0+dx*(b3+dx*(b4+dx*b5)))); + } + else if(n<1) + { res = f0 + dx*(d0+dx*t0); dy = d0+dx*t0*mreal(2); } + else + { res = f0 + dx*(d0+dx*t1); dy = d0+dx*t1*mreal(2); } + return res; +} +//----------------------------------------------------------------------------- +template Treal mgl_spline3st(const Treal y[4], long n, mreal dx) +{ + Treal d[3], t0,t1, f0,d0; + d[0] = -(y[2]-mreal(4)*y[1]+mreal(3)*y[0])/mreal(2); + d[1] = (y[2]-y[0])/mreal(2); + d[2] = (y[3]-y[1])/mreal(2); +// d[3] = (mreal(3)*y[3]-mreal(4)*y[2]+y[1])/mreal(2); + + Treal res; + f0 = y[n]; d0 = d[n]; + t0 = (y[2]+y[0])/mreal(2)-y[1]; + t1 = (y[3]+y[1])/mreal(2)-y[2]; + if(n==1) + { + Treal f1 = y[2], d1 = d[2]; + Treal b3 = mreal(10)*(f1-f0)+t1-mreal(3)*t0-mreal(4)*d1-mreal(6)*d0; + Treal b4 = mreal(15)*(f0-f1)-mreal(2)*t1+mreal(3)*t0+mreal(7)*d1+mreal(8)*d0; + Treal b5 = mreal(6)*(f1-f0)+t1-t0-mreal(3)*d1-mreal(3)*d0; + res = f0 + dx*(d0+dx*(t0+dx*(b3+dx*(b4+dx*b5)))); + } + else res = f0 + dx*(d0+dx*(n<1?t0:t1)); + return res; +} +//----------------------------------------------------------------------------- +template Treal mglSpline1t(const Treal *a, long nx, mreal x, Treal *dx=0) +{ + Treal r,d; + if(nx>3) { - Treal b1[4]={0,0,0,0}, x1[4]={0,0,0,0}, y1[4]={0,0,0,0}; - long kk=1; - if(kz==0) { kk=0; } - else if(nz>3 && kz==nz-2) { kk=2; } - for(long k=0;k<4;k++) - { - if(kz+k-kk=0) - mglFillP(kx, ky, a+(kz+k-kk)*nx*ny, nx, ny, _p); - else - { - memset(_p[0],0,4*sizeof(Treal)); - memset(_p[1],0,4*sizeof(Treal)); - memset(_p[2],0,4*sizeof(Treal)); - memset(_p[3],0,4*sizeof(Treal)); - } - for(i=0,fx=1;i<4;i++) - { - for(j=0,fy=1;j<4;j++) - { b1[k] += fy*fx*_p[i][j]; fy *= y-ky; } - for(j=1,fy=1;j<4;j++) - { y1[k] += mreal(j)*fy*fx*_p[i][j]; fy *= y-ky; } - fx *= x-kx; - } - for(i=1,fx=1;i<4;i++) - { - for(j=0,fy=1;j<4;j++) - { x1[k] += mreal(i)*fy*fx*_p[i][j]; fy *= y-ky; } - fx *= x-kx; - } - } - mglFillP(kk, b1, nz>3 ? 4:3, _p[0]); - mglFillP(kk, x1, nz>3 ? 4:3, _p[1]); - mglFillP(kk, y1, nz>3 ? 4:3, _p[2]); - for(i=0,fx=1,b=0;i<4;i++) - { - b += fx*_p[0][i]; - if(dx) *dx += fx*_p[1][i]; - if(dy) *dy += fx*_p[2][i]; - fx *= z-kz; - } - if(dz) for(i=1,fx=1;i<4;i++) - { *dz += mreal(i)*fx*_p[0][i]; fx *= z-kz; } + register long k = long(x); + if(k>0 && k(a+k-1, 1, x-k, d); + else if(k<1) r = mgl_spline3t(a, 0, x, d); + else r = mgl_spline3t(a+nx-4, 2, x+2-nx, d); } -// else if(ny>1 && y!=ky) // 2d interpolation - else if(ny>1) // 2d interpolation + else if(nx<2) { d=0; r = a[0]; } + else if(nx==2) { d=a[1]-a[0]; r = a[0]+(a[1]-a[0])*x; } + else // nx==3 { - mglFillP(kx, ky, a+kz*nx*ny, nx, ny, _p); - for(i=0,fx=1,b=0;i<4;i++) - { - for(j=0,fy=1;j<4;j++) - { b += fy*fx*_p[i][j]; fy *= y-ky; } - if(dy) for(j=1,fy=1;j<4;j++) - { *dy+= mreal(j)*fy*fx*_p[i][j]; fy *= y-ky; } - fx *= x-kx; - } - if(dx) for(i=1,fx=1;i<4;i++) - { - for(j=0,fy=1;j<4;j++) - { *dx+= mreal(i)*fy*fx*_p[i][j]; fy *= y-ky; } - fx *= x-kx; - } + Treal b1=-(a[2]-mreal(4)*a[1]+mreal(3)*a[0])/mreal(2), b2=(a[2]-mreal(2)*a[1]+a[0])/mreal(2); + d = b1+mreal(2)*b2*x; r = a[0]+x*(b1+b2*x); } -// else if(nx>1 && x!=kx) // 1d interpolation - else if(nx>1) // 1d interpolation + if(dx) *dx=d; + return r; +} +//----------------------------------------------------------------------------- +template Treal mglSpline1st(const Treal *a, long nx, mreal x) +{ + Treal r; + if(nx>3) { - mglFillP(kx, a+(ky+ny*kz)*nx, nx, _p[0]); - for(i=0,fx=1,b=0;i<4;i++) - { b += fx*_p[0][i]; fx *= x-kx; } - if(dx) for(i=1,fx=1;i<4;i++) - { *dx+= mreal(i)*fx*_p[0][i]; fx *= x-kx; } + register long k = long(x); + if(k>0 && k(a+k-1, 1, x-k); + else if(k<1) r = mgl_spline3st(a, 0, x); + else r = mgl_spline3st(a+nx-4, 2, x+2-nx); } - else // no interpolation - b = a[kx+nx*(ky+ny*kz)]; - return b; + else if(nx<2) r = a[0]; + else if(nx==2) r = a[0]+(a[1]-a[0])*x; + else // nx==3 + { + Treal b1=-(a[2]-mreal(4)*a[1]+mreal(3)*a[0])/mreal(2), b2=(a[2]-mreal(2)*a[1]+a[0])/mreal(2); + r = a[0]+x*(b1+b2*x); + } + return r; } //----------------------------------------------------------------------------- -template Treal mglSpline3st(const Treal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) +template Treal mglSpline3t(const Treal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z, Treal *dx=0, Treal *dy=0, Treal *dz=0) { - if(!a || nx<1 || ny<1 || nz<1) return 0; - Treal _p[4][4]; - register long i,j; - Treal fx=1, fy=1; - long kx=long(x),ky=long(y),kz=long(z); - Treal b=0; +// if(!a || nx<1 || ny<1 || nz<1) return 0; // NOTE remove this line because this should already checked + Treal gx=0,gy=0,gz=0; x = x>0 ?(x0 ?(y0 ?(znx-1 || y>ny-1 || z>nz-1) return 0; - if(kx>nx-2) kx = nx-2; if(kx<0) kx = 0; - if(ky>ny-2) ky = ny-2; if(ky<0) ky = 0; - if(kz>nz-2) kz = nz-2; if(kz<0) kz = 0; -// if(nz>1 && z!=kz) // 3d interpolation + Treal b; if(nz>1) // 3d interpolation { - Treal b1[4]={0,0,0,0}, x1[4]={0,0,0,0}, y1[4]={0,0,0,0}; - long kk=1; - if(kz==0) { kk=0; } - else if(nz>3 && kz==nz-2) { kk=2; } - for(long k=0;k<4;k++) - { - if(kz+k-kk=0) - mglFillP(kx, ky, a+(kz+k-kk)*nx*ny, nx, ny, _p); - else - { - memset(_p[0],0,4*sizeof(Treal)); - memset(_p[1],0,4*sizeof(Treal)); - memset(_p[2],0,4*sizeof(Treal)); - memset(_p[3],0,4*sizeof(Treal)); - } - for(i=0,fx=1;i<4;i++) - { - for(j=0,fy=1;j<4;j++) - { b1[k] += fy*fx*_p[i][j]; fy *= y-ky; } - fx *= x-kx; - } - } - mglFillP(kk, b1, nz>3 ? 4:3, _p[0]); - mglFillP(kk, x1, nz>3 ? 4:3, _p[1]); - mglFillP(kk, y1, nz>3 ? 4:3, _p[2]); - for(i=0,fx=1,b=0;i<4;i++) + Treal tz[4], yz[4], xz[4]; + long kz=long(z)-1, mz, k=long(y)-1, m; + if(nz>3) + { mz = 4; kz = kz>=0?kz:0; + if(kz>nz-4) kz = nz-4; } + else { mz = nz; kz=0; } + if(ny>3) + { m = 4; k = k>=0?k:0; + if(k>ny-4) k = ny-4; } + else { m = ny; k=0; } + for(long j=0;j(a+nx*(i+k+ny*(j+kz)),nx,x,d+i); + tz[j] = mglSpline1t(t,m,y-k,yz+j); + xz[j] = mglSpline1t(d,m,y-k,0); } + b = mglSpline1t(tz,mz,z-kz,&gz); + gx = mglSpline1t(xz,mz,z-kz,0); + gy = mglSpline1t(yz,mz,z-kz,0); } -// else if(ny>1 && y!=ky) // 2d interpolation else if(ny>1) // 2d interpolation { - mglFillP(kx, ky, a+kz*nx*ny, nx, ny, _p); - for(i=0,fx=1,b=0;i<4;i++) - { - for(j=0,fy=1;j<4;j++) - { b += fy*fx*_p[i][j]; fy *= y-ky; } - fx *= x-kx; - } - } -// else if(nx>1 && x!=kx) // 1d interpolation - else if(nx>1) // 1d interpolation - { - mglFillP(kx, a+(ky+ny*kz)*nx, nx, _p[0]); - for(i=0,fx=1,b=0;i<4;i++) - { b += fx*_p[0][i]; fx *= x-kx; } - } - else // no interpolation - b = a[kx+nx*(ky+ny*kz)]; + Treal t[4], d[4]; + long k = long(y)-1, m; + if(ny>3) + { m = 4; k = k>=0?k:0; if(k>ny-4) k = ny-4; } + else { m = ny; k=0; } + for(long i=0;i(a+nx*(i+k),nx,x,d+i); + b = mglSpline1t(t,m,y-k,&gy); + gx = mglSpline1t(d,m,y-k,0); + } + else // 1d interpolation + b = mglSpline1t(a,nx,x,&gx); + if(dx) *dx=gx; if(dy) *dy=gy; if(dz) *dz=gz; return b; } //----------------------------------------------------------------------------- -template Treal mglSpline1t(const Treal *a, long nx, mreal x, Treal *dx=0) +template Treal mglSpline3st(const Treal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) { - Treal _p[4]; - long kx=long(x); - Treal b=0; +// if(!a || nx<1 || ny<1 || nz<1) return 0; // NOTE remove this line because this should already checked x = x>0 ?(xnx-2) kx = nx-2; if(kx<0) kx = 0; - if(nx>1) // 1d interpolation + y = y>0 ?(y0 ?(z1) // 3d interpolation { - mglFillP(kx, a, nx, _p); - b = _p[0]+(x-kx)*(_p[1]+(x-kx)*(_p[2]+(x-kx)*_p[3])); - if(dx) *dx = _p[1]+(x-kx)*(mreal(2)*_p[2]+mreal(3)*(x-kx)*_p[3]); + Treal tz[4], t[4]; + long kz=long(z)-1, mz, k=long(y)-1, m; + if(nz>3) + { mz = 4; kz = kz>=0?kz:0; + if(kz>nz-4) kz = nz-4; } + else { mz = nz; kz=0; } + if(ny>3) + { m = 4; k = k>=0?k:0; + if(k>ny-4) k = ny-4; } + else { m = ny; k=0; } + for(long j=0;j(a+nx*(i+k+ny*(j+kz)),nx,x); + tz[j] = mglSpline1st(t,m,y-k); + } + b = mglSpline1st(tz,mz,z-kz); } - else // no interpolation - { b = a[0]; if(dx) *dx=0; } + else if(ny>1) // 2d interpolation + { + Treal t[4]; + long k = long(y)-1, m; + if(ny>3) + { m = 4; k = k>=0?k:0; + if(k>ny-4) k = ny-4; } + else { m = ny; k=0; } + for(long i=0;i(a+nx*(i+k),nx,x); + b = mglSpline1st(t,m,y-k); + } + else // 1d interpolation + b = mglSpline1st(a,nx,x); return b; } //----------------------------------------------------------------------------- -template Treal mglSpline1st(const Treal *a, long nx, mreal x) -{ - Treal _p[4]; - long kx=long(x); - Treal b=0; - x = x>0 ?(xnx-2) kx = nx-2; if(kx<0) kx = 0; - if(nx>1) // 1d interpolation - { - mglFillP(kx, a, nx, _p); - b = _p[0]+(x-kx)*(_p[1]+(x-kx)*(_p[2]+(x-kx)*_p[3])); +template void mgl_gspline_init(long n, const mreal *x, const Treal *v, Treal *c) +{ // c must have size 5*(n-1) !!! +// if(n<2) return; // NOTE remove this line because this should already checked + Treal *a = new Treal[n], *b = new Treal[n]; + for(long i=0;i=0;i--) b[i] += a[i]*b[i+1]; + // no spline coefficients + for(long i=0;i >::const_iterator pm = lines.begin(); pm != lines.end(); pm++) { - fprintf(fp,"usemtl Material%"PRIuS"\n", pm->first); + fprintf(fp,"usemtl Material%" PRIuS "\n", pm->first); for(std::deque::const_iterator pl = pm->second.begin(); pl != pm->second.end(); pl++) - fprintf(fp,"l %"PRIuS" %"PRIuS"\n", pl->p1, pl->p2); + fprintf(fp,"l %" PRIuS " %" PRIuS "\n", pl->p1, pl->p2); } } void writePoints() { for(std::map >::const_iterator pm = points.begin(); pm != points.end(); pm++) { - fprintf(fp,"usemtl Material%"PRIuS"\n", pm->first); + fprintf(fp,"usemtl Material%" PRIuS "\n", pm->first); for(std::deque::const_iterator pp = pm->second.begin(); pp != pm->second.end(); pp++) - fprintf(fp,"p %"PRIuS"\n", *pp); + fprintf(fp,"p %" PRIuS "\n", *pp); } } void writeTriangles() { for(std::deque::const_iterator pt = triangles.begin(); pt != triangles.end(); pt++) - fprintf(fp,"f %"PRIuS" %"PRIuS" %"PRIuS"\n", pt->p1, pt->p2, pt->p3); + fprintf(fp,"f %" PRIuS " %" PRIuS " %" PRIuS "\n", pt->p1, pt->p2, pt->p3); } void writeTexturedTriangles() { for(std::deque::const_iterator pt = triangles.begin(); pt != triangles.end(); pt++) - fprintf(fp,"f %"PRIuS"/%"PRIuS" %"PRIuS"/%"PRIuS" %"PRIuS"/%"PRIuS"\n", pt->p1,pt->t1, pt->p2,pt->t2, pt->p3,pt->t3); + fprintf(fp,"f %" PRIuS "/%" PRIuS " %" PRIuS "/%" PRIuS " %" PRIuS "/%" PRIuS "\n", pt->p1,pt->t1, pt->p2,pt->t2, pt->p3,pt->t3); } }; @@ -371,7 +371,7 @@ struct ObjMaterials { { const size_t color_index = materialmap.size(); materialmap.insert(std::make_pair(color,color_index)); - fprintf(fp,"newmtl Material%"PRIuS"\n", color_index); + fprintf(fp,"newmtl Material%" PRIuS "\n", color_index); fprintf(fp,"Ka 0.1 0.1 0.1\n"); fprintf(fp,"Kd %g %g %g\n", color.r, color.g, color.b); fprintf(fp,"Ks 0.0 0.0 0.0\n"); @@ -391,17 +391,13 @@ struct ObjMaterials { } }; - -static size_t power_of_two(size_t input) +size_t MGL_LOCAL_CONST power_of_two(size_t input) { size_t value = 1; - while ( value < input ) { - value <<= 1; - } + while ( value < input ) value <<= 1; return value; } - void MGL_EXPORT mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png) { if(gr->GetPrmNum()==0) return; // nothing to do @@ -416,7 +412,7 @@ void MGL_EXPORT mgl_write_obj(HMGL gr, const char *fname,const char *descr, int for(i=0;iGetPrmNum());i++) // collect data for groups // it is rather expensive (extra 4b per primitive) but need for export to 3D { - m = gr->GetPrm(i).id-mmin; + m = gr->GetPrm(i,false).id-mmin; if(m>=0 && mGrp[ng[m]].p.push_back(i); } delete []ng; @@ -509,7 +505,7 @@ void MGL_EXPORT mgl_write_obj(HMGL gr, const char *fname,const char *descr, int ObjGroup grp(fp, vertexcoords); for(j=0;jGetPrm(p[j]); + const mglPrim &q = gr->GetPrm(p[j],false); register long n1=q.n1,n2=q.n2,n3=q.n3,n4=q.n4; switch(q.type) @@ -945,7 +941,7 @@ void MGL_EXPORT mgl_write_obj(HMGL gr, const char *fname,const char *descr, int if (!grp.triangles.empty()) { if (grp.samecolor) { - fprintf(fp,"usemtl Material%"PRIuS"\n", materials.addColor(grp.commoncolor)); + fprintf(fp,"usemtl Material%" PRIuS "\n", materials.addColor(grp.commoncolor)); grp.writeTriangles(); } else { fprintf(fp,"usemtl Material\n"); diff --git a/src/opengl.cpp b/src/opengl.cpp index 1da1b53..e35b6ca 100644 --- a/src/opengl.cpp +++ b/src/opengl.cpp @@ -23,28 +23,39 @@ mglCanvasGL::~mglCanvasGL(){} //----------------------------------------------------------------------------- void mglCanvasGL::Finish() { +#if MGL_USE_DOUBLE +#define MGL_GL_TYPE GL_DOUBLE +#else +#define MGL_GL_TYPE GL_FLOAT +#endif + if(Prm.size()>0) { PreparePrim(0); - glVertexPointer(3, GL_FLOAT, sizeof(mglPnt), &(Pnt[0].x)); - glNormalPointer(GL_FLOAT, sizeof(mglPnt), &(Pnt[0].u)); - glColorPointer(4, GL_FLOAT, sizeof(mglPnt), &(Pnt[0].r)); +/* glVertexPointer(3, MGL_GL_TYPE, sizeof(mglPnt), &(Pnt[0].x)); // something wrong with arrays + glNormalPointer(MGL_GL_TYPE, sizeof(mglPnt), &(Pnt[0].u)); + glColorPointer(4, MGL_GL_TYPE, sizeof(mglPnt), &(Pnt[0].r)); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_COLOR_ARRAY);*/ int pdef=PDef; mreal ss=pPos, ww=PenWidth; mglPrim p; for(size_t i=0;iGetNx(),m=a->GetNy(),l=a->GetNz(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); - if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"DensX"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensX"); return; } - mglData xx,yy,zz,aa; - gr->SaveState(opt); - if(l>1) { aa.Create(m,l); xx.Create(m,l); yy.Create(m,l); zz.Create(m,l); @@ -44,15 +34,9 @@ void MGL_EXPORT mgl_dens_x(HMGL gr, HCDT a, const char *sch, double sv, const ch long k = long(d); d = d - k; if(k>n-2) { k=n-2; d=1; } if(k<0) { k=0; d=0; } - const mglData *ma=dynamic_cast(a); - if(ma) #pragma omp parallel for collapse(2) - for(long j=0;ja[k+n*(i+m*j)]*(1-d) + d*ma->a[k+1+n*(i+m*j)]; - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(k,i,j)*(1-d) + d*a->v(k+1,i,j); + for(long j=0;jv(k,i,j)*(1-d) + d*a->v(k+1,i,j); a = &aa; } else @@ -60,18 +44,12 @@ void MGL_EXPORT mgl_dens_x(HMGL gr, HCDT a, const char *sch, double sv, const ch xx.Fill(sv, sv); yy.Fill(gr->Min.y, gr->Max.y,'x'); zz.Fill(gr->Min.z, gr->Max.z,'y'); - mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); + return a; } //----------------------------------------------------------------------------- -void MGL_EXPORT mgl_dens_y(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) +HCDT MGL_NO_EXPORT fill_slice_y(HMGL gr, double sv, HCDT a, mglData &xx, mglData &yy, mglData &zz, mglData &aa) { long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); - if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"DensY"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensY"); return; } - mglData xx,yy,zz,aa; - gr->SaveState(opt); - if(l>1) { aa.Create(n,l); xx.Create(n,l); yy.Create(n,l); zz.Create(n,l); @@ -79,15 +57,9 @@ void MGL_EXPORT mgl_dens_y(HMGL gr, HCDT a, const char *sch, double sv, const ch long k = long(d); d = d - k; if(k>m-2) { k=m-2; d=1; } if(k<0) { k=0; d=0; } - const mglData *ma=dynamic_cast(a); - if(ma) -#pragma omp parallel for collapse(2) - for(long j=0;ja[i+n*(k+m*j)]*(1-d) + d*ma->a[i+n+n*(k+m*j)]; - else #pragma omp parallel for collapse(2) - for(long j=0;jv(i,k,j)*(1-d) + d*a->v(i,k+1,j); + for(long j=0;jv(i,k,j)*(1-d) + d*a->v(i,k+1,j); a = &aa; } else @@ -95,18 +67,12 @@ void MGL_EXPORT mgl_dens_y(HMGL gr, HCDT a, const char *sch, double sv, const ch yy.Fill(sv, sv); xx.Fill(gr->Min.x, gr->Max.x,'x'); zz.Fill(gr->Min.z, gr->Max.z,'y'); - mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); + return a; } //----------------------------------------------------------------------------- -void MGL_EXPORT mgl_dens_z(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) +HCDT MGL_NO_EXPORT fill_slice_z(HMGL gr, double sv, HCDT a, mglData &xx, mglData &yy, mglData &zz, mglData &aa) { long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); - if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); - if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"DensZ"); return; } - if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensZ"); return; } - mglData xx,yy,zz,aa; - gr->SaveState(opt); - xx.Create(n,m); yy.Create(n,m); zz.Create(n,m); if(l>1) { @@ -115,20 +81,54 @@ void MGL_EXPORT mgl_dens_z(HMGL gr, HCDT a, const char *sch, double sv, const ch long k = long(d); d = d - k; if(k>l-2) { k=l-2; d=1; } if(k<0) { k=0; d=0; } - const mglData *ma=dynamic_cast(a); - if(ma) #pragma omp parallel for collapse(2) - for(long j=0;ja[i+n*(j+m*k)]*(1-d) + d*ma->a[i+n*m+n*(j+m*k)]; - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(i,j,k)*(1-d) + d*a->v(i,j,k+1); + for(long j=0;jv(i,j,k)*(1-d) + d*a->v(i,j,k+1); a = &aa; } zz.Fill(sv, sv); yy.Fill(gr->Min.y, gr->Max.y,'y'); xx.Fill(gr->Min.x, gr->Max.x,'x'); + return a; +} +//----------------------------------------------------------------------------- +// +// DensX, DensY, DensZ series +// +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_dens_x(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) +{ + long n=a->GetNx(),m=a->GetNy(); + if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); + if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"DensX"); return; } + if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensX"); return; } + mglData xx,yy,zz,aa; + gr->SaveState(opt); + a = fill_slice_x(gr,sv,a,xx,yy,zz,aa); + mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_dens_y(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) +{ + long n=a->GetNx(),m=a->GetNy(); + if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); + if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"DensY"); return; } + if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensY"); return; } + mglData xx,yy,zz,aa; + gr->SaveState(opt); + a = fill_slice_y(gr,sv,a,xx,yy,zz,aa); + mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_dens_z(HMGL gr, HCDT a, const char *sch, double sv, const char *opt) +{ + long n=a->GetNx(),m=a->GetNy(); + if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); + if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"DensZ"); return; } + if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"DensZ"); return; } + mglData xx,yy,zz,aa; + gr->SaveState(opt); + a = fill_slice_z(gr,sv,a,xx,yy,zz,aa); mgl_surfc_xy(gr,&xx,&yy,&zz,a,sch,0); } //----------------------------------------------------------------------------- @@ -156,7 +156,7 @@ void MGL_EXPORT mgl_dens_z_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal void MGL_EXPORT mgl_cont_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, HCDT z, mreal c, int text,long ak); void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { - long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); + long n=a->GetNx(),m=a->GetNy(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContX"); return; } if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContX"); return; } @@ -164,34 +164,13 @@ void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double static int cgid=1; gr->StartGroup("ContX",cgid++); mglData xx,yy,zz,aa; - bool text=(mglchr(sch,'t')); + int text=0; + if(mglchr(sch,'t')) text=1; + if(mglchr(sch,'T')) text=2; long ss=gr->AddTexture(sch); gr->SetPenPal(sch); - if(l>1) - { - aa.Create(m,l); xx.Create(m,l); yy.Create(m,l); zz.Create(m,l); - mreal d = (n-1)*(sv - gr->Min.x)/(gr->Max.x - gr->Min.x); - long k = long(d); d = d - k; - if(k>n-2) { k=n-2; d=1; } - if(k<0) { k=0; d=0; } - const mglData *ma=dynamic_cast(a); - if(ma) -#pragma omp parallel for collapse(2) - for(long j=0;ja[k+n*(i+m*j)]*(1-d) + d*ma->a[k+1+n*(i+m*j)]; - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(k,i,j)*(1-d) + d*a->v(k+1,i,j); - a = &aa; - } - else - { xx.Create(n,m); yy.Create(n,m); zz.Create(n,m); } - xx.Fill(sv, sv); - yy.Fill(gr->Min.y, gr->Max.y,'x'); - zz.Fill(gr->Min.z, gr->Max.z,'y'); -#pragma omp parallel for + a = fill_slice_x(gr,sv,a,xx,yy,zz,aa); for(long i=0;iGetNx();i++) { register mreal v0 = v->v(i); @@ -202,7 +181,7 @@ void MGL_EXPORT mgl_cont_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double //----------------------------------------------------------------------------- void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { - long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); + long n=a->GetNx(),m=a->GetNy(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContY"); return; } if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContY"); return; } @@ -210,34 +189,13 @@ void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double static int cgid=1; gr->StartGroup("ContY",cgid++); mglData xx,yy,zz,aa; - bool text=(mglchr(sch,'t')); + int text=0; + if(mglchr(sch,'t')) text=1; + if(mglchr(sch,'T')) text=2; long ss=gr->AddTexture(sch); gr->SetPenPal(sch); - if(l>1) - { - aa.Create(n,l); xx.Create(n,l); yy.Create(n,l); zz.Create(n,l); - mreal d = (m-1)*(sv - gr->Min.y)/(gr->Max.y - gr->Min.y); - long k = long(d); d = d - k; - if(k>m-2) { k=m-2; d=1; } - if(k<0) { k=0; d=0; } - const mglData *ma=dynamic_cast(a); - if(ma) -#pragma omp parallel for collapse(2) - for(long j=0;ja[i+n*(k+m*j)]*(1-d) + d*ma->a[i+n+n*(k+m*j)]; - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(i,k,j)*(1-d) + d*a->v(i,k+1,j); - a = &aa; - } - else - { xx.Create(n,m); yy.Create(n,m); zz.Create(n,m); } - yy.Fill(sv, sv); - xx.Fill(gr->Min.x, gr->Max.x,'x'); - zz.Fill(gr->Min.z, gr->Max.z,'y'); -#pragma omp parallel for + a = fill_slice_y(gr,sv,a,xx,yy,zz,aa); for(long i=0;iGetNx();i++) { register mreal v0 = v->v(i); @@ -248,7 +206,7 @@ void MGL_EXPORT mgl_cont_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double //----------------------------------------------------------------------------- void MGL_EXPORT mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { - long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); + long n=a->GetNx(),m=a->GetNy(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContZ"); return; } if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContZ"); return; } @@ -256,33 +214,13 @@ void MGL_EXPORT mgl_cont_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double static int cgid=1; gr->StartGroup("ContZ",cgid++); mglData xx,yy,zz,aa; - bool text=(mglchr(sch,'t')); + int text=0; + if(mglchr(sch,'t')) text=1; + if(mglchr(sch,'T')) text=2; long ss=gr->AddTexture(sch); gr->SetPenPal(sch); - xx.Create(n,m); yy.Create(n,m); zz.Create(n,m); - if(l>1) - { - aa.Create(n,m); - mreal d = (l-1)*(sv - gr->Min.z)/(gr->Max.z - gr->Min.z); - long k = long(d); d = d - k; - if(k>l-2) { k=l-2; d=1; } - if(k<0) { k=0; d=0; } - const mglData *ma=dynamic_cast(a); - if(ma) -#pragma omp parallel for collapse(2) - for(long j=0;ja[i+n*(j+m*k)]*(1-d) + d*ma->a[i+n*m+n*(j+m*k)]; - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(i,j,k)*(1-d) + d*a->v(i,j,k+1); - a = &aa; - } - zz.Fill(sv, sv); - yy.Fill(gr->Min.y, gr->Max.y,'y'); - xx.Fill(gr->Min.x, gr->Max.x,'x'); -#pragma omp parallel for + a = fill_slice_z(gr,sv,a,xx,yy,zz,aa); for(long i=0;iGetNx();i++) { register mreal v0 = v->v(i); @@ -355,7 +293,7 @@ void MGL_EXPORT mgl_cont_z_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const void MGL_EXPORT mgl_contf_gen(HMGL gr, mreal v1, mreal v2, HCDT a, HCDT x, HCDT y, HCDT z, mreal c, long ak); void MGL_EXPORT mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { - long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); + long n=a->GetNx(),m=a->GetNy(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContFX"); return; } if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContFX"); return; } @@ -364,30 +302,7 @@ void MGL_EXPORT mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double mglData xx,yy,zz,aa; long ss=gr->AddTexture(sch); - if(l>1) - { - aa.Create(m,l); xx.Create(m,l); yy.Create(m,l); zz.Create(m,l); - mreal d = (n-1)*(sv - gr->Min.x)/(gr->Max.x - gr->Min.x); - long k = long(d); d = d - k; - if(k>n-2) { k=n-2; d=1; } - if(k<0) { k=0; d=0; } - const mglData *ma=dynamic_cast(a); - if(ma) -#pragma omp parallel for collapse(2) - for(long j=0;ja[k+n*(i+m*j)]*(1-d) + d*ma->a[k+1+n*(i+m*j)]; - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(k,i,j)*(1-d) + d*a->v(k+1,i,j); - a = &aa; - } - else - { xx.Create(n,m); yy.Create(n,m); zz.Create(n,m); } - xx.Fill(sv, sv); - yy.Fill(gr->Min.y, gr->Max.y,'x'); - zz.Fill(gr->Min.z, gr->Max.z,'y'); -#pragma omp parallel for + a = fill_slice_x(gr,sv,a,xx,yy,zz,aa); for(long i=0;iGetNx()-1;i++) { register mreal v0 = v->v(i); @@ -398,7 +313,7 @@ void MGL_EXPORT mgl_contf_x_val(HMGL gr, HCDT v, HCDT a, const char *sch, double //----------------------------------------------------------------------------- void MGL_EXPORT mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { - long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); + long n=a->GetNx(),m=a->GetNy(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContFY"); return; } if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContFY"); return; } @@ -407,30 +322,7 @@ void MGL_EXPORT mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double mglData xx,yy,zz,aa; long ss=gr->AddTexture(sch); - if(l>1) - { - aa.Create(n,l); xx.Create(n,l); yy.Create(n,l); zz.Create(n,l); - mreal d = (m-1)*(sv - gr->Min.y)/(gr->Max.y - gr->Min.y); - long k = long(d); d = d - k; - if(k>m-2) { k=m-2; d=1; } - if(k<0) { k=0; d=0; } - const mglData *ma=dynamic_cast(a); - if(ma) -#pragma omp parallel for collapse(2) - for(long j=0;ja[i+n*(k+m*j)]*(1-d) + d*ma->a[i+n+n*(k+m*j)]; - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(i,k,j)*(1-d) + d*a->v(i,k+1,j); - a = &aa; - } - else - { xx.Create(n,m); yy.Create(n,m); zz.Create(n,m); } - yy.Fill(sv, sv); - xx.Fill(gr->Min.x, gr->Max.x,'x'); - zz.Fill(gr->Min.z, gr->Max.z,'y'); -#pragma omp parallel for + a = fill_slice_y(gr,sv,a,xx,yy,zz,aa); for(long i=0;iGetNx()-1;i++) { register mreal v0 = v->v(i); @@ -441,7 +333,7 @@ void MGL_EXPORT mgl_contf_y_val(HMGL gr, HCDT v, HCDT a, const char *sch, double //----------------------------------------------------------------------------- void MGL_EXPORT mgl_contf_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sv, const char *opt) { - long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); + long n=a->GetNx(),m=a->GetNy(); if(mgl_isnan(sv)) sv = gr->GetOrgX('x'); if(n<2 || m<2) { gr->SetWarn(mglWarnLow,"ContFZ"); return; } if(svMin.x || sv>gr->Max.x) { gr->SetWarn(mglWarnSlc,"ContFZ"); return; } @@ -450,29 +342,7 @@ void MGL_EXPORT mgl_contf_z_val(HMGL gr, HCDT v, HCDT a, const char *sch, double mglData xx,yy,zz,aa; long ss=gr->AddTexture(sch); - xx.Create(n,m); yy.Create(n,m); zz.Create(n,m); - if(l>1) - { - aa.Create(n,m); - mreal d = (l-1)*(sv - gr->Min.z)/(gr->Max.z - gr->Min.z); - long k = long(d); d = d - k; - if(k>l-2) { k=l-2; d=1; } - if(k<0) { k=0; d=0; } - const mglData *ma=dynamic_cast(a); - if(ma) -#pragma omp parallel for collapse(2) - for(long j=0;ja[i+n*(j+m*k)]*(1-d) + d*ma->a[i+n*m+n*(j+m*k)]; - else -#pragma omp parallel for collapse(2) - for(long j=0;jv(i,j,k)*(1-d) + d*a->v(i,j,k+1); - a = &aa; - } - zz.Fill(sv, sv); - yy.Fill(gr->Min.y, gr->Max.y,'y'); - xx.Fill(gr->Min.x, gr->Max.x,'x'); -#pragma omp parallel for + a = fill_slice_z(gr,sv,a,xx,yy,zz,aa); for(long i=0;iGetNx()-1;i++) { register mreal v0 = v->v(i); diff --git a/src/parser.cpp b/src/parser.cpp index 2b61cda..ac09a5a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -33,8 +33,6 @@ MGL_EXPORT void (*mgl_ask_func)(const wchar_t *, wchar_t *)=0; void MGL_EXPORT mgl_ask_gets(const wchar_t *quest, wchar_t *res) { printf("%ls\n",quest); if(!fgetws(res,1024,stdin)) *res=0; } //----------------------------------------------------------------------------- -mglFunc::mglFunc(const mglFunc &f) -{ pos=f.pos; narg=f.narg; func=f.func; } mglFunc::mglFunc(long p, const wchar_t *f) { pos = p; func = f; @@ -75,7 +73,7 @@ MGL_NO_EXPORT wchar_t *mgl_str_copy(const char *s) str[i] = 0; return str; } //----------------------------------------------------------------------------- -int MGL_NO_EXPORT mgl_cmd_cmp(const void *a, const void *b) +int MGL_LOCAL_PURE mgl_cmd_cmp(const void *a, const void *b) { const mglCommand *aa = (const mglCommand *)a; const mglCommand *bb = (const mglCommand *)b; @@ -87,7 +85,7 @@ bool mgl_check_for_name(const std::wstring &s) return !isalpha(s[0])||s.find_first_of(L".:()")!=std::wstring::npos; } //----------------------------------------------------------------------------- -mglCommand *mglParser::FindCommand(const char *com) +const mglCommand *mglParser::FindCommand(const char *com) const { if(!AllowFileIO && ( !strncmp(com,"read",4) || !strncmp(com,"save",4) || !strcmp(com,"fgets") || !strcmp(com,"import") || !strcmp(com,"export") )) return 0; @@ -99,7 +97,7 @@ mglCommand *mglParser::FindCommand(const char *com) return rts; } //----------------------------------------------------------------------------- -mglCommand *mglParser::FindCommand(const wchar_t *com) +const mglCommand *mglParser::FindCommand(const wchar_t *com) const { size_t s = 15type==6) return 2; if(rts->type == 4) { if(n<1 || mgl_check_for_name(var)) return 2; - mglVar *v = AddVar(var.c_str()); - v->Create(1,1,1); - a[0].type = 0; a[0].d = v; + a[0].type = 0; a[0].d = AddVar(var.c_str()); a[0].w = var; k[0] = 'd'; } char *o=0; @@ -142,26 +138,8 @@ int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const s return res; } //----------------------------------------------------------------------------- -void mglNum::MoveAfter(mglNum *var) -{ - if(prev) prev->next = next; - if(next) next->prev = prev; - prev = next = 0; - if(var) - { prev = var; next = var->next; var->next = this; } - if(next) next->prev = this; -} -//----------------------------------------------------------------------------- -mglNum::~mglNum() -{ - if(prev) prev->next = next; - if(next) next->prev = prev; -} -//----------------------------------------------------------------------------- mglParser::mglParser(bool setsize) { - DataList=0; NumList=0; -// wchar_t *par[40]; ///< Parameter for substituting instead of $1, ..., $9 InUse = 1; Skip=Stop=for_br=false; memset(for_stack,0,40*sizeof(int)); @@ -184,16 +162,12 @@ mglParser::~mglParser() //----------------------------------------------------------------------------- void mglParser::DeleteAll() { - if(DataList) - { - while(DataList->next) delete DataList->next; - delete DataList; DataList = 0; - } - if(NumList) - { - while(NumList->next) delete NumList->next; - delete NumList; NumList = 0; - } + for(size_t i=0;i=0 && n<40) par[n] = str; } //----------------------------------------------------------------------------- -mglVar *mglParser::FindVar(const wchar_t *name) +mglDataA *mglParser::FindVar(const wchar_t *name) { - if(!name || *name==0) return DataList; - mglVar *v=DataList; - while(v) - { - if(v->s==name) return v; - v = v->next; - } + for(size_t i=0;is==name) return DataList[i]; return 0; } //----------------------------------------------------------------------------- -mglVar *mglParser::AddVar(const wchar_t *name) -{ - mglVar *v = FindVar(name); - if(v) return v; - v = new mglVar; v->s = name; - if(DataList) v->MoveAfter(DataList); - else DataList = v; - return v; +mglData *mglParser::AddVar(const wchar_t *name) +{ // TODO add list of forbidden names (like function names) + for(size_t i=0;is==name) + { + delete (DataList[i]); + mglData *d = new mglData; d->s = name; + DataList[i] = d; return d; + } + mglData *d = new mglData; d->s = name; + DataList.push_back(d); + return d; } //----------------------------------------------------------------------------- mglNum *mglParser::FindNum(const wchar_t *name) { - mglNum *v=NumList; - while(v) - { - if(v->s==name) return v; - v = v->next; - } + for(size_t i=0;is==name) return NumList[i]; return 0; } //----------------------------------------------------------------------------- mglNum *mglParser::AddNum(const wchar_t *name) { mglNum *v = FindNum(name); - if(v) return v; - v = new mglNum; v->s = name; - if(NumList) v->MoveAfter(NumList); - else NumList = v; + if(!v) + { + mglNum *n=new mglNum; n->s = name; + NumList.push_back(n); + v = NumList[NumList.size()-1]; + } return v; } //----------------------------------------------------------------------------- -int mglFindArg(const std::wstring &str) +int MGL_LOCAL_PURE mglFindArg(const std::wstring &str) { register long l=0,k=0,i; for(i=0;i &head); void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a) { register long n; for(n=1;ntemp=true; + mglData *u=new mglData; std::wstring s = arg[n].substr(1,arg[n].length()-2); - a[n-1].w = L"/*"+s+L"*/"; - if(DataList) u->MoveAfter(DataList); - else DataList = u; - a[n-1].type = 0; a[n-1].d = u; - ParseDat(gr, s, *u); + a[n-1].w = u->s = L"/*"+s+L"*/"; + a[n-1].type = 0; + ParseDat(gr, s, *u); a[n-1].d = u; + u->temp=true; DataList.push_back(u); } - else if((v = FindVar(arg[n].c_str()))!=0) // have to find normal variables (for data creation) + else if((v = FindVar(arg[n].c_str()))!=0) // try to find normal variables (for data creation) { a[n-1].type=0; a[n-1].d=v; a[n-1].w=v->s; } - else if((f = FindNum(arg[n].c_str()))!=0) // have to find normal variables (for data creation) + else if((f = FindNum(arg[n].c_str()))!=0) // try to find normal number (for data creation) { a[n-1].type=2; a[n-1].d=0; a[n-1].v=f->d; a[n-1].w = f->s; } else { // parse all numbers and formulas by unified way @@ -358,10 +327,9 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a) { a[n-1].type = 2; a[n-1].v = d.a[0]; } else { - u=new mglVar; u->temp=true; u->Set(d); + mglData *u=new mglData; u->Set(d); a[n-1].w = L"/*"+arg[n]+L"*/"; - if(DataList) u->MoveAfter(DataList); - else DataList = u; + u->temp=true; DataList.push_back(u); a[n-1].type = 0; a[n-1].d = u; } } @@ -372,19 +340,15 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a) int mglParser::PreExec(mglGraph *, long k, std::wstring *arg, mglArg *a) { long n=0; - mglVar *v; if(!arg[0].compare(L"delete") && k==2) // parse command "delete" - { - DeleteVar(arg[1].c_str()); n=1; - } + { DeleteVar(arg[1].c_str()); n=1; } else if(!arg[0].compare(L"list")) // parse command "list" { if(k<3 || mgl_check_for_name(arg[1])) return 2; long nx=0, ny=1,j=0,i,t=0; - char ch; for(i=2;inx ? j:nx; j=0; ny++; } } - v = AddVar(arg[1].c_str()); + mglData *v = AddVar(arg[1].c_str()); if(t==1) nx = j>nx ? j:nx; if(t==1) // list of numeric values { @@ -413,7 +377,8 @@ int mglParser::PreExec(mglGraph *, long k, std::wstring *arg, mglArg *a) } if(t==2) // list of data { - mglData *b = a[1].d; + mglData *b = dynamic_cast(a[1].d); + if(!b) return 1; long nn = 0; if(b->nz>1) return 2; if(b->ny>1) @@ -422,10 +387,11 @@ int mglParser::PreExec(mglGraph *, long k, std::wstring *arg, mglArg *a) nn = b->nx*b->ny; for(i=2,j=0;inx*b->ny) continue; - memcpy(v->a+j*nn,b->a,nn*(b->nz)*sizeof(mreal)); - j+=b->nz; + if(nn!=a[i-1].d->GetNx()*a[i-1].d->GetNy()) continue; + b = dynamic_cast(a[i-1].d); + if(b) memcpy(v->a+j*nn,b->a,nn*(b->nz)*sizeof(mreal)); + else for(long ii=0;iiGetNN();ii++) v->a[ii+j*nn] = a[i-1].d->vthr(ii); + j+=a[i-1].d->GetNz(); } } else @@ -434,10 +400,12 @@ int mglParser::PreExec(mglGraph *, long k, std::wstring *arg, mglArg *a) nn = b->nx; for(i=2,j=0;inx) continue; - memcpy(v->a+j*nn,b->a,nn*(b->ny)*sizeof(mreal)); - j+=b->ny; + if(nn!=a[i-1].d->GetNx()) continue; + b = dynamic_cast(a[i-1].d); + long nny = a[i-1].d->GetNy(); + if(b) memcpy(v->a+j*nn,b->a,nn*nny*sizeof(mreal)); + else for(long ii=0;iia[ii+j*nn] = a[i-1].d->vthr(ii); + j+=nny; } } } @@ -513,11 +481,14 @@ int mglParser::ParseDef(std::wstring &str) int nn = s[1]<='9' ? s[1]-'0' : (s[1]>='a' ? s[1]-'a'+10:-1); if(s[0]=='$' && nn>=0 && nn<='z'-'a'+10) { - static wchar_t res[1024]; s = mgl_trim_ws(s.substr(2)); if(s[0]=='\'') s=s.substr(1,s.length()-2); if(mgl_ask_func) - { mgl_ask_func(s.c_str(),res); if(*res) AddParam(nn, res); } + { + static wchar_t res[1024]; + mgl_ask_func(s.c_str(),res); + if(*res) AddParam(nn, res); + } return mgl_ask_func?1:2; } else return 2; @@ -533,10 +504,22 @@ int mglParser::ParseDef(std::wstring &str) return 0; } //----------------------------------------------------------------------------- +/*void MGL_NO_EXPORT print_data(const char *s, std::vector h) +{ + printf("%s\ts=%lu:\n",s,h.size()); + for(size_t i=0;itemp, h[i]->s.c_str()); + printf("\n"); + } + fflush(stdout); +}*/ +//----------------------------------------------------------------------------- // return values: 0 - OK, 1 - wrong arguments, 2 - wrong command, 3 - string too long, 4 -- unclosed string int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) { - if(Stop) return 0; + if(Stop || gr->NeedStop()) return 0; std::wstring arg[1024]; str=mgl_trim_ws(str); long n,k=0,m=0,mm=0,res; @@ -628,12 +611,11 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) { register int i; mglParser *prs = new mglParser(AllowSetSize); - prs->DataList=DataList; prs->NumList=NumList; prs->Cmd=Cmd; + prs->DataList.swap(DataList); prs->NumList.swap(NumList); prs->Cmd=Cmd; for(i=10;i<30;i++) prs->AddParam(i,par[i].c_str()); prs->Execute(gr,fp); for(i=10;i<30;i++) AddParam(i,prs->par[i].c_str()); - DataList=prs->DataList; prs->DataList=0; - NumList =prs->NumList; prs->NumList=0; + DataList.swap(prs->DataList); NumList.swap(prs->NumList); prs->Cmd=0; delete prs; fclose(fp); } else n=1; @@ -648,7 +630,7 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) int r = ch-'0'; if(ch>='a' && ch<='z') r = 10+ch-'a'; // int r = int(a[0].v); - if(arg[1][1]==0 && (r>=0 && r<40)) // TODO: check this + if(arg[1][1]==0 && (r>=0 && r<40)) { if(a[1].type==0) { @@ -684,13 +666,9 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) else n = Exec(gr, arg[0].c_str(),k-1,a, arg[1].c_str(), opt.c_str()); delete []a; } - mglVar *v = DataList, *u; - while(v) // remove temporary data arrays - { - u = v->next; - if(v->temp) { if(DataList==v) DataList = v->next; delete v; } - v = u; - } + // delete temporary data arrays + for(size_t i=0;itemp) + { mglDataA *u=DataList[i]; DataList[i]=0; delete u; } return n; } //----------------------------------------------------------------------------- @@ -709,7 +687,7 @@ int mglParser::ParseDat(mglGraph *gr, std::wstring str, mglData &res) } // try to find last argument if(!str.empty()) { arg[k] = str; k++; } - if(k<1) n =0; + if(k<1) n = 0; else { // fill arguments by its values mglArg *a = new mglArg[k+1]; @@ -723,7 +701,7 @@ int mglParser::ParseDat(mglGraph *gr, std::wstring str, mglData &res) kk += id[a[i].type]; a[i].s.assign(a[i].w.begin(),a[i].w.end()); } - mglCommand *rts=FindCommand(arg[0].c_str()); + const mglCommand *rts=FindCommand(arg[0].c_str()); if(!rts || rts->type!=4) n = 2; else n = rts->exec(gr, k, a, kk.c_str(), 0); delete []a; @@ -847,15 +825,15 @@ void mglParser::Execute(mglGraph *gr, FILE *fp, bool print) void mglParser::Execute(mglGraph *gr, int n, const wchar_t **text) { if(n<1 || text==0) return; - long i, r, res=0; + long res=0; char buf[64]; for_br=Skip=false; if_pos=0; ScanFunc(0); fn_stack.clear(); - for(i=0;iSetWarn(-1, ""); gr->SetObjId(i+1); - r = Parse(gr,text[i],i+1); + long r = Parse(gr,text[i],i+1); if(r<0) { i = -r-2; continue; } if(r==1) snprintf(buf,64,"\nWrong argument(s) in line %ld\n", i+1); else if(r==2) snprintf(buf,64,"\nWrong command in line %ld\n", i+1); @@ -889,11 +867,10 @@ void mglParser::Execute(mglGraph *gr, const wchar_t *text) { // if string need to be continued then I but ' ' instead of 0x0 and // pointer next string to 0x0. Last one for keeping number of strings. if(next) - { wcs[i]=wcs[next]=' '; str[n] = wcs+s-1; next=0; } + { for(size_t ii=next;ii<=i;ii++) wcs[ii]='\b'; str[n] = wcs+s-1; next=0; } else { wcs[i]=0; str[n] = wcs+i+1; } n++; - } } Execute(gr, n, str); @@ -902,26 +879,18 @@ void mglParser::Execute(mglGraph *gr, const wchar_t *text) //----------------------------------------------------------------------------- void mglParser::Execute(mglGraph *gr, const char *text) { - MGL_TO_WCS(text, Execute(gr, wcs)); -} -//----------------------------------------------------------------------------- -void mglParser::DeleteVar(mglVar *v) -{ - if(!v) return; - if(DataList==v) DataList = v->next; - delete v; + MGL_TO_WCS(text, Execute(gr, wcs)); } //----------------------------------------------------------------------------- void mglParser::DeleteVar(const char *name) { - mglVar *v = FindVar(name); - DeleteVar(v); + MGL_TO_WCS(name,DeleteVar(wcs)); } //----------------------------------------------------------------------------- void mglParser::DeleteVar(const wchar_t *name) { - mglVar *v = FindVar(name); - DeleteVar(v); + for(size_t i=0;is==name) + { mglDataA *u=DataList[i]; DataList[i]=0; delete u; } } //----------------------------------------------------------------------------- void mglParser::AddCommand(mglCommand *cmd, int mc) @@ -935,19 +904,19 @@ void mglParser::AddCommand(mglCommand *cmd, int mc) memcpy(buf, cmd, mc*sizeof(mglCommand)); memcpy(buf+mc, Cmd, (mp+1)*sizeof(mglCommand)); qsort(buf, mp+mc, sizeof(mglCommand), mgl_cmd_cmp); - if(Cmd!=mgls_base_cmd) delete []Cmd; - Cmd = buf; +#pragma omp critical(cmd_parser) + { if(Cmd!=mgls_base_cmd) delete []Cmd; Cmd = buf; } } //----------------------------------------------------------------------------- HMPR MGL_EXPORT mgl_create_parser() { return new mglParser; } void MGL_EXPORT mgl_delete_parser(HMPR p) { delete p; } void MGL_EXPORT mgl_parser_add_param(HMPR p, int id, const char *str) { p->AddParam(id,str); } void MGL_EXPORT mgl_parser_add_paramw(HMPR p, int id, const wchar_t *str) { p->AddParam(id,str); } -HMDT MGL_EXPORT mgl_parser_add_var(HMPR p, const char *name) { mglVar *v=p->AddVar(name); return v; } -HMDT MGL_EXPORT mgl_parser_find_var(HMPR p, const char *name) { mglVar *v=p->FindVar(name); return v; } +HMDT MGL_EXPORT mgl_parser_add_var(HMPR p, const char *name) { return p->AddVar(name); } +MGL_EXPORT_PURE mglDataA *mgl_parser_find_var(HMPR p, const char *name) { return p->FindVar(name);} void MGL_EXPORT mgl_parser_del_var(HMPR p, const char *name) { p->DeleteVar(name); } -HMDT MGL_EXPORT mgl_parser_add_varw(HMPR p, const wchar_t *name) { mglVar *v=p->AddVar(name); return v; } -HMDT MGL_EXPORT mgl_parser_find_varw(HMPR p, const wchar_t *name) { mglVar *v=p->FindVar(name); return v; } +HMDT MGL_EXPORT mgl_parser_add_varw(HMPR p, const wchar_t *name) { return p->AddVar(name); } +MGL_EXPORT_PURE mglDataA *mgl_parser_find_varw(HMPR p, const wchar_t *name) { return p->FindVar(name);} void MGL_EXPORT mgl_parser_del_varw(HMPR p, const wchar_t *name) { p->DeleteVar(name); } int MGL_EXPORT mgl_parse_line(HMGL gr, HMPR p, const char *str, int pos) { return p->Parse(gr, str, pos); } @@ -973,11 +942,11 @@ void MGL_EXPORT mgl_parser_add_param_(uintptr_t* p, int *id, const char *str, in /*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ uintptr_t MGL_EXPORT mgl_parser_add_var_(uintptr_t* p, const char *name, int l) { char *s=new char[l+1]; memcpy(s,name,l); s[l]=0; - mglVar *v=_PR_->AddVar(s); delete []s; return uintptr_t(v); } + mglData *v=_PR_->AddVar(s); delete []s; return uintptr_t(v); } /*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ -uintptr_t MGL_EXPORT mgl_parser_find_var_(uintptr_t* p, const char *name, int l) +uintptr_t MGL_EXPORT_PURE mgl_parser_find_var_(uintptr_t* p, const char *name, int l) { char *s=new char[l+1]; memcpy(s,name,l); s[l]=0; - mglVar *v=_PR_->FindVar(s); delete []s; return uintptr_t(v); } + mglDataA *v=_PR_->FindVar(s); delete []s; return uintptr_t(v); } void MGL_EXPORT mgl_parser_del_var_(uintptr_t* p, const char *name, int l) { char *s=new char[l+1]; memcpy(s,name,l); s[l]=0; _PR_->DeleteVar(s); delete []s; } @@ -997,29 +966,38 @@ long MGL_EXPORT mgl_use_parser(HMPR pr, int inc) long MGL_EXPORT mgl_use_parser_(uintptr_t *p, int *inc) { _PR_->InUse+=*inc; return _PR_->InUse; } //--------------------------------------------------------------------------- -int MGL_EXPORT mgl_parser_cmd_type(HMPR pr, const char *name) +MGL_EXPORT_PURE mglDataA *mgl_parser_get_var(HMPR p, unsigned long id) +{ return idDataList.size()?p->DataList[id]:0; } +uintptr_t MGL_EXPORT_PURE mgl_parser_get_var_(uintptr_t* p, unsigned long *id) +{ return uintptr_t(mgl_parser_get_var(_PR_,*id)); } +long MGL_EXPORT_PURE mgl_parser_num_var(HMPR p) +{ return p->DataList.size(); } +long MGL_EXPORT_PURE mgl_parser_num_var_(uintptr_t* p) +{ return mgl_parser_num_var(_PR_); } +//--------------------------------------------------------------------------- +int MGL_EXPORT_PURE mgl_parser_cmd_type(HMPR pr, const char *name) { - mglCommand *cmd = pr->FindCommand(name); + const mglCommand *cmd = pr->FindCommand(name); return cmd ? cmd->type + 1 : 0; } -int MGL_EXPORT mgl_parser_cmd_type_(uintptr_t* p, const char *str, int l) +int MGL_EXPORT_PURE mgl_parser_cmd_type_(uintptr_t* p, const char *str, int l) { char *s=new char[l+1]; memcpy(s,str,l); s[l]=0; l = mgl_parser_cmd_type(_PR_, s); delete []s; return l; } //--------------------------------------------------------------------------- -MGL_EXPORT const char *mgl_parser_cmd_desc(HMPR pr, const char *name) +MGL_EXPORT_PURE const char *mgl_parser_cmd_desc(HMPR pr, const char *name) { - mglCommand *cmd = pr->FindCommand(name); + const mglCommand *cmd = pr->FindCommand(name); return cmd ? cmd->desc : 0; } -MGL_EXPORT const char *mgl_parser_cmd_frmt(HMPR pr, const char *name) +MGL_EXPORT_PURE const char *mgl_parser_cmd_frmt(HMPR pr, const char *name) { - mglCommand *cmd = pr->FindCommand(name); + const mglCommand *cmd = pr->FindCommand(name); return cmd ? cmd->form : 0; } //--------------------------------------------------------------------------- -MGL_EXPORT const char *mgl_parser_cmd_name(HMPR pr, long id) +MGL_EXPORT_PURE const char *mgl_parser_cmd_name(HMPR pr, long id) { return (id=0) ? pr->Cmd[id].name:""; } -long MGL_EXPORT mgl_parser_cmd_num(HMPR pr) +long MGL_EXPORT_PURE mgl_parser_cmd_num(HMPR pr) { register long i=0; while(pr->Cmd[i].name[0]) i++; return i; } //--------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_parser_calc(HMPR pr, const char *formula) diff --git a/src/pde.cpp b/src/pde.cpp index 6dc1b2c..a1dd088 100644 --- a/src/pde.cpp +++ b/src/pde.cpp @@ -22,66 +22,57 @@ #include "mgl2/eval.h" #include "mgl2/thread.h" #include "mgl2/base.h" -#define GAMMA 0.1 +const double GAMMA=0.1; ///< value for damping +mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); +mglDataC MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector &head); //----------------------------------------------------------------------------- struct mgl_pde_ham { - dual *a,*hxy,*hxv,*huv,*huy; - mglFormula *eqs; + ddual *a,*hxy,*hxv,*huv,*huy; + const char *eqs; long nx,ny; - mreal xx,yy,xs,ys,dx,dy,dq,dp,zz; + double xx,yy,xs,ys,dx,dy,dq,dp,zz; double dd; }; -MGL_NO_EXPORT void *mgl_pde_hprep(void *par) +void MGL_NO_EXPORT mgl_pde_hprep(const mgl_pde_ham *f) { - mglThreadD *t=(mglThreadD *)par; - const mgl_pde_ham *f = (const mgl_pde_ham *)t->v; - mglFormula *eqs = f->eqs; - long nx=2*f->nx, ny=2*f->ny; - dual *a = f->a; + long nx = f->nx, ny = f->ny; + mglDataV x(nx,ny), y(nx,ny), z, r(nx,ny); + mglDataW p(nx,ny), q(nx,ny); + x.s = L"x"; y.s = L"y"; p.s = L"p"; q.s = L"q"; r.s=L"#$mgl"; + z.s = L"z"; z.Fill(f->zz); + dual dd(0,f->dd); + mglData u(nx,ny); u.s = L"u"; +#pragma omp parallel for + for(long i=0;ia[i]); + std::vector list; + list.push_back(&x); list.push_back(&y); list.push_back(&z); + list.push_back(&p); list.push_back(&q); list.push_back(&u); -#if !MGL_HAVE_PTHREAD -#pragma omp parallel -#endif + x.Fill(f->xx,f->xx+f->dx*(nx-1),'x'); p.Freq(0,'x'); + y.Fill(f->yy,f->yy+f->dy*(ny-1),'y'); q.Freq(0,'y'); + mglDataC res = mglFormulaCalcC(f->eqs, list); +#pragma omp parallel for + for(long i=0;ihxy[i] = res.a[i]*dd; + if(ny>2) { - mreal var[MGL_VS]; memset(var,0,MGL_VS*sizeof(mreal)); - var['z'-'a'] = f->zz; -#pragma omp for nowait - for(long i0=t->id;i0n;i0+=mglNumThr) - { - register long i = i0%nx, j = i0/nx; var['u'-'a'] = abs(a[i0]); - var['x'-'a'] = f->xx+f->dx*i; var['p'-'a'] = 0; - var['y'-'a'] = f->yy+f->dy*j; var['q'-'a'] = 0; - f->hxy[i0] = dual(-eqs->CalcD(var,'i'), eqs->Calc(var))*f->dd; - } - if(f->ny>2) -#pragma omp for nowait - for(long i0=t->id;i0n;i0+=mglNumThr) // step 3/2 - { - register long i = i0%nx, j = i0/nx; var['u'-'a'] = abs(a[i0]); - var['x'-'a'] = f->xs; var['p'-'a'] = f->dp*(iyy+f->dy*j; var['q'-'a'] = 0; - f->huy[i0] = dual(-eqs->CalcD(var,'i'), eqs->Calc(var))*f->dd; - } -#pragma omp for nowait - for(long i0=t->id;i0n;i0+=mglNumThr) // step 2 - { - register long i = i0%nx, j = i0/nx; var['u'-'a'] = abs(a[i0]); - var['x'-'a'] = f->xs; var['p'-'a'] = f->dp*(iys; var['q'-'a'] = f->dq*(jhuv[i0] = dual(-eqs->CalcD(var,'i'), eqs->Calc(var))*f->dd; - } - if(f->ny>2) -#pragma omp for nowait - for(long i0=t->id;i0n;i0+=mglNumThr) // step 3/2 - { - register long i = i0%nx, j = i0/nx; var['u'-'a'] = abs(a[i0]); - var['x'-'a'] = f->xx+f->dx*i; var['p'-'a'] = 0; - var['y'-'a'] = f->ys; var['q'-'a'] = f->dq*(jhxv[i0] = dual(-eqs->CalcD(var,'i'), eqs->Calc(var))*f->dd; - } + x.Fill(f->xs); p.Freq(f->dp,'x'); + res = mglFormulaCalcC(f->eqs, list); +#pragma omp parallel for + for(long i=0;ihuy[i] = res.a[i]*dd; + } + x.Fill(f->xs); p.Freq(f->dp,'x'); + y.Fill(f->ys); q.Freq(f->dq,'y'); + res = mglFormulaCalcC(f->eqs, list); +#pragma omp parallel for + for(long i=0;ihuv[i] = res.a[i]*dd; + if(ny>2) + { + x.Fill(f->xx,f->xx+f->dx*(nx-1),'x'); p.Freq(0,'x'); + res = mglFormulaCalcC(f->eqs, list); +#pragma omp parallel for + for(long i=0;ihxv[i] = res.a[i]*dd; } - return 0; } //----------------------------------------------------------------------------- // Solve equation dx/dz = func(p,q,x,y,z,|u|)[u] where p=d/dx, q=d/dy. At this moment simplified form of ham is supported: ham = f(p,q,z) + g(x,y,z,'u'), where variable 'u'=|u| (for allowing solve nonlinear problems). You may specify imaginary part like ham = p^2 + i*x*(x>0) but only if dependence on variable 'i' is linear (i.e. ham = hre+i*him). @@ -96,15 +87,14 @@ HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_ { gr->SetWarn(mglWarnDim,"PDE"); return 0; } mglDataC *res=new mglDataC(nz, nx, ny); - mglFormula eqs(ham); - dual *a = new dual[4*nx*ny], hh0; // Add "damping" area - dual *hxy = new dual[4*nx*ny], *hxv = new dual[4*nx*ny]; - dual *huy = new dual[4*nx*ny], *huv = new dual[4*nx*ny]; - dual *hx = new dual[2*nx], *hv = new dual[2*ny]; - dual *hy = new dual[2*ny], *hu = new dual[2*nx]; - mreal *dmp = new mreal[4*nx*ny]; - memset(a,0,4*nx*ny*sizeof(dual)); - memset(dmp,0,4*nx*ny*sizeof(mreal)); + ddual *a = new ddual[4*nx*ny], hh0; // Add "damping" area + ddual *hxy = new ddual[4*nx*ny], *hxv = new ddual[4*nx*ny]; + ddual *huy = new ddual[4*nx*ny], *huv = new ddual[4*nx*ny]; + ddual *hx = new ddual[2*nx], *hv = new ddual[2*ny]; + ddual *hy = new ddual[2*ny], *hu = new ddual[2*nx]; + double *dmp = new double[4*nx*ny]; + memset(a,0,4*nx*ny*sizeof(ddual)); + memset(dmp,0,4*nx*ny*sizeof(double)); #pragma omp parallel for collapse(2) for(long j=0;j1?(Max.y-Min.y)/(ny-1):0; mreal dp = M_PI/(Max.x-Min.x)/k0, dq = M_PI/(Max.y-Min.y)/k0; mreal xs=(Min.x+Max.x)/2, ys=(Min.y+Max.y)/2; -// double xx = Min.x - dx*nx/2, yy = Min.x - dy*ny/2; double dd = k0*dz; - mgl_pde_ham tmp;tmp.eqs = &eqs; - tmp.nx = nx; tmp.ny = ny; tmp.dd = dd; tmp.a=a; + mgl_pde_ham tmp;tmp.eqs = ham; + tmp.nx = 2*nx; tmp.ny = 2*ny; tmp.dd = dd; tmp.a=a; tmp.hxy=hxy; tmp.hxv=hxv; tmp.huy=huy; tmp.huv=huv; tmp.xx = Min.x-dx*(nx/2); tmp.xs = xs; tmp.dx = dx; tmp.dp = dp; tmp.yy = Min.y-dy*(ny/2); tmp.ys = ys; tmp.dy = dy; tmp.dq = dq; @@ -138,14 +127,12 @@ HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_ void *wty = mgl_fft_alloc(2*ny,0,0); for(long k=1;kStop) continue; + if(gr->NeedStop()) break; tmp.zz = Min.z+dz*k; memset(hxy,0,4*nx*ny*sizeof(dual)); memset(hxv,0,4*nx*ny*sizeof(dual)); memset(huv,0,4*nx*ny*sizeof(dual)); memset(huy,0,4*nx*ny*sizeof(dual)); - mglStartThread(mgl_pde_hprep,0,4*nx*ny,0,0,0,0,&tmp); -#pragma omp parallel for + mgl_pde_hprep(&tmp); for(long i=0;i<2*nx;i++) { hx[i] = hxv[i]; hu[i] = huv[i]; } -#pragma omp parallel for for(long j=0;j<2*ny;j++) { hy[j] = huy[2*nx*j]; hv[j] = huv[2*nx*j];} // rearrange arrays hh0=hu[0]; @@ -215,10 +202,46 @@ HMDT MGL_EXPORT mgl_pde_solve(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im HMDT out = mgl_datac_abs(res); delete res; return out; } //----------------------------------------------------------------------------- -HMDT MGL_EXPORT mgl_ode_solve(void (*func)(const mreal *x, mreal *dx, void *par), int n, mreal *x0, mreal dt, mreal tmax, void *par) +struct mglOdeTxt { long n; HMEX *eq; const char *var; }; +void MGL_NO_EXPORT mgl_txt_func(const mreal *x, mreal *dx, void *par) +{ + mglOdeTxt *p=(mglOdeTxt *)par; + mreal vars['z'-'a'+1]; + for(long i=0;in;i++) + { char ch = p->var[i]; if(ch>='a' && ch<='z') vars[ch-'a']=x[i]; } +#pragma omp parallel for + for(long i=0;in;i++) + dx[i] = mgl_expr_eval_v(p->eq[i], vars); +} +HMDT MGL_EXPORT mgl_ode_solve_str(const char *func, const char *var, HCDT x0, mreal dt, mreal tmax) +{ + if(!var || !(*var) || !func) return 0; + long len = strlen(func); + mglOdeTxt par; par.var=var; + par.n = strlen(var); + par.eq = new HMEX[par.n]; + char *buf = new char[len+1], *f=buf, *g=f; memcpy(buf,func,len+1); + mreal *xx = new mreal[par.n]; + for(long i=0;ivthr(i):0; + for(long k=0;f[k];k++) if(f[k]==';') + { g = f+k+1; f[k]=0; break; } + if(f==g) g = f+strlen(f); + par.eq[i] = mgl_create_expr(f); + f = g; + } + HMDT res = mgl_ode_solve_ex(mgl_txt_func,par.n,xx,dt,tmax,&par,NULL); + for(long i=0;ia[i+n*k] = x[i] += (k1[i]+k2[i]+2*k3[i])*dt/6; + for(i=0;ia+n*(k-1),par); + for(i=0;ia[i+n*k] = x[i]; } delete []x; delete []k1; delete []k2; delete []k3; delete []v; return res; @@ -326,11 +351,11 @@ void MGL_NO_EXPORT mgl_init_ra(int n, int n7, const mreal *r, mgl_ap *ra) // pre //----------------------------------------------------------------------------- struct mgl_qo2d_ham { - dual *hx, *hu, *a, h0; - double *dmp; - mreal *r, dr, dk; + ddual *hx, *hu, *a, h0; + double *dmp, dr, dk; + mreal *r; mgl_ap *ra; - dual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par); + ddual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par); void *par; }; //----------------------------------------------------------------------------- @@ -364,7 +389,7 @@ MGL_NO_EXPORT void *mgl_qo2d_hprep(void *par) return 0; } //----------------------------------------------------------------------------- -HADT MGL_EXPORT mgl_qo2d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy) +HADT MGL_EXPORT mgl_qo2d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy) { const mglData *ray=dynamic_cast(ray_dat); // NOTE: Ray must be mglData! if(!ray) return 0; @@ -372,19 +397,17 @@ HADT MGL_EXPORT mgl_qo2d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal px, if(nx<2 || ini_im->GetNx()!=nx || nt<2) return 0; mglDataC *res=new mglDataC(nx,nt,1); - dual *a=new dual[2*nx], *hu=new dual[2*nx], *hx=new dual[2*nx]; + ddual *a=new ddual[2*nx], *hu=new ddual[2*nx], *hx=new ddual[2*nx]; double *dmp=new double[2*nx]; mgl_ap *ra = new mgl_ap[nt]; mgl_init_ra(nt, n7, ray->a, ra); // ray mreal dr = r/(nx-1), dk = M_PI*(nx-1)/(k0*r*nx); memset(dmp,0,2*nx*sizeof(double)); -#pragma omp parallel for for(long i=0;iv(i),ini_im->v(i)); // init void *wsx, *wtx = mgl_fft_alloc(2*nx,&wsx,1); if(xx && yy) { xx->Create(nx,nt); yy->Create(nx,nt); } @@ -395,27 +418,22 @@ HADT MGL_EXPORT mgl_qo2d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal px, // start calculation for(long k=0;ka[i+k*nx]=a[i+nx/2]*sqrt(ra[0].ch/ra[k].ch); - if(xx && yy) -#pragma omp parallel for - for(long i=0;ia[i+k*nx] = ray->a[n7*k] + ra[k].x1*x1; // new coordinates - yy->a[i+k*nx] = ray->a[n7*k+1] + ra[k].y1*x1; - } + if(xx && yy) for(long i=0;ia[i+k*nx] = ray->a[n7*k] + ra[k].x1*x1; // new coordinates + yy->a[i+k*nx] = ray->a[n7*k+1] + ra[k].y1*x1; + } tmp.r=ray->a+n7*k; tmp.ra=ra+k; mreal hh = ra[k].pt*(1/sqrt(sqrt(1.041))-1); // 0.041=0.45^4 -- minimal value of h tmp.h0 = ham(0, tmp.r[0], tmp.r[1], tmp.r[3]+ra[k].x0*hh, tmp.r[4]+ra[k].x0*hh, par); mglStartThread(mgl_qo2d_hprep,0,2*nx,0,0,0,0,&tmp); // Step for field - dual dt = dual(0, -ra[k].dt*k0); -#pragma omp parallel for + ddual dt = ddual(0, -ra[k].dt*k0); for(long i=0;i<2*nx;i++) a[i] *= exp(hx[i]*dt); mgl_fft((double *)a, 1, 2*nx, wtx, wsx, false); -#pragma omp parallel for for(long i=0;i<2*nx;i++) a[i] *= exp(hu[i]*dt); mgl_fft((double *)a, 1, 2*nx, wtx, wsx, true); @@ -447,19 +465,19 @@ HADT MGL_EXPORT mgl_qo2d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal px, return res; } //----------------------------------------------------------------------------- -HMDT MGL_EXPORT mgl_qo2d_func(dual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy) +HMDT MGL_EXPORT mgl_qo2d_func(ddual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy) { HADT res = mgl_qo2d_func_c(ham,par,ini_re,ini_im,ray_dat,r,k0,xx,yy); HMDT out = mgl_datac_abs(res); delete res; return out; } //----------------------------------------------------------------------------- -dual MGL_NO_EXPORT mgl_ham2d(mreal u, mreal x, mreal y, mreal px, mreal py, void *par) +ddual MGL_NO_EXPORT mgl_ham2d(mreal u, mreal x, mreal y, mreal px, mreal py, void *par) { mglFormula *h = (mglFormula *)par; mreal var[MGL_VS]; memset(var,0,MGL_VS*sizeof(mreal)); var['x'-'a'] = x; var['y'-'a'] = y; var['u'-'a'] = u; var['p'-'a'] = px; var['q'-'a'] = py; - return dual(h->Calc(var), -h->CalcD(var,'i')); + return ddual(h->Calc(var), -h->CalcD(var,'i')); } //----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_qo2d_solve_c(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy) @@ -480,12 +498,12 @@ HMDT MGL_EXPORT mgl_qo2d_solve(const char *ham, HCDT ini_re, HCDT ini_im, HCDT r //----------------------------------------------------------------------------- struct mgl_qo3d_ham { - dual *hxy, *huv, *hxv, *huy, *a; - dual *hx, *hy, *hu, *hv, h0; - mreal *dmp; - mreal *r, dr, dk; + ddual *hxy, *huv, *hxv, *huy, *a; + ddual *hx, *hy, *hu, *hv, h0; + double *dmp, dr, dk; + mreal *r; mgl_ap *ra; - dual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par); + ddual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par); void *par; }; //----------------------------------------------------------------------------- @@ -549,7 +567,7 @@ MGL_NO_EXPORT void *mgl_qo3d_post(void *par) return 0; } //----------------------------------------------------------------------------- -HADT MGL_EXPORT mgl_qo3d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz) +HADT MGL_EXPORT mgl_qo3d_func_c(ddual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz) { const mglData *ray=dynamic_cast(ray_dat); // NOTE: Ray must be mglData! if(!ray) return 0; @@ -557,18 +575,18 @@ HADT MGL_EXPORT mgl_qo3d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal z, if(nx<2 || ini_re->GetNx()!=nx || ini_im->GetNx()*ini_im->GetNy()!=nx*nx || nt<2) return 0; mglDataC *res=new mglDataC(nx,nx,nt); - dual *a=new dual[4*nx*nx], *huv=new dual[4*nx*nx], *hxy=new dual[4*nx*nx], *huy=new dual[4*nx*nx], *hxv=new dual[4*nx*nx]; - dual *hu=new dual[2*nx], *hx=new dual[2*nx], *hy=new dual[2*nx], *hv=new dual[2*nx]; - mreal *dmp=new mreal[4*nx*nx]; + ddual *a=new ddual[4*nx*nx], *huv=new ddual[4*nx*nx], *hxy=new ddual[4*nx*nx], *huy=new ddual[4*nx*nx], *hxv=new ddual[4*nx*nx]; + ddual *hu=new ddual[2*nx], *hx=new ddual[2*nx], *hy=new ddual[2*nx], *hv=new ddual[2*nx]; + double *dmp=new double[4*nx*nx]; mgl_ap *ra = new mgl_ap[nt]; mgl_init_ra(nt, n7, ray->a, ra); // prepare ray - mreal dr = r/(nx-1), dk = M_PI*(nx-1)/(k0*r*nx); - memset(dmp,0,4*nx*nx*sizeof(mreal)); + double dr = r/(nx-1), dk = M_PI*(nx-1)/(k0*r*nx); + memset(dmp,0,4*nx*nx*sizeof(double)); #pragma omp parallel for collapse(2) for(long i=0;ia+n7*k; tmp.ra=ra+k; mglStartThread(mgl_qo3d_hprep,0,2*nx,0,0,0,0,&tmp); tmp.h0 = huv[0]; -#pragma omp parallel for for(long i=0;i<2*nx;i++) // fill intermediate arrays { tmp.hx[i] = hxv[i]; tmp.hy[i] = huy[i*2*nx]; @@ -609,7 +626,7 @@ HADT MGL_EXPORT mgl_qo3d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal z, } mglStartThread(mgl_qo3d_post,0,2*nx,0,0,0,0,&tmp); // Step for field - dual dt = dual(0, -ra[k].dt*k0); // TODO: this part can be paralleled + ddual dt = ddual(0, -ra[k].dt*k0); #pragma omp parallel { void *wsx = mgl_fft_alloc_thr(2*nx); @@ -666,19 +683,19 @@ HADT MGL_EXPORT mgl_qo3d_func_c(dual (*ham)(mreal u, mreal x, mreal y, mreal z, return res; } //----------------------------------------------------------------------------- -HMDT MGL_EXPORT mgl_qo3d_func(dual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz) +HMDT MGL_EXPORT mgl_qo3d_func(ddual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz) { HADT res = mgl_qo3d_func_c(ham,par,ini_re,ini_im,ray_dat,r,k0,xx,yy,zz); HMDT out = mgl_datac_abs(res); delete res; return out; } //----------------------------------------------------------------------------- -dual MGL_NO_EXPORT mgl_ham3d(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par) +ddual MGL_NO_EXPORT mgl_ham3d(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par) { mglFormula *h = (mglFormula *)par; mreal var[MGL_VS]; memset(var,0,MGL_VS*sizeof(mreal)); var['x'-'a'] = x; var['y'-'a'] = y; var['z'-'a'] = z; var['u'-'a'] = u; var['p'-'a'] = px; var['q'-'a'] = py; var['v'-'a'] = pz; - return dual(h->Calc(var), -h->CalcD(var,'i')); + return ddual(h->Calc(var), -h->CalcD(var,'i')); } //----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_qo3d_solve_c(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray_dat, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz) @@ -768,7 +785,7 @@ HMDT MGL_EXPORT mgl_jacobian_3d(HCDT x, HCDT y, HCDT z) { int nx = x->GetNx(), ny=x->GetNy(), nz=x->GetNz(), nn = nx*ny*nz; if(nx<2 || ny<2 || nz<2) return 0; - if(nn!=y->GetNx()*y->GetNy()*y->GetNz() || nn!=z->GetNx()*z->GetNy()*z->GetNz()) return 0; + if(nn!=y->GetNN() || nn!=z->GetNN()) return 0; mglData *r=new mglData(nx,ny,nz); const mglData *xx=dynamic_cast(x); const mglData *yy=dynamic_cast(y); diff --git a/src/pixel.cpp b/src/pixel.cpp index f300239..7903080 100644 --- a/src/pixel.cpp +++ b/src/pixel.cpp @@ -20,18 +20,44 @@ #include #include "mgl2/canvas.h" #include "mgl2/thread.h" + +inline mreal get_persp(float pf, float z, float Depth) +//{ return (1-pf)/(1-pf*z/Depth); } +{ return (1-pf/1.37)/(1-pf*z/Depth); } +inline mreal get_pfact(float pf, float Depth) +//{ return pf/(1-pf)/Depth; } +{ return pf/(1-pf/1.37)/Depth; } //----------------------------------------------------------------------------- -void mglCanvas::SetSize(int w,int h) +void mglCanvas::SetSize(int w,int h,bool clf) { if(w<=0 || h<=0) { SetWarn(mglWarnSize,"SetSize"); return; } + double dx = double(w)/Width, dy = double(h)/Height, dz = sqrt(double(w*h))/Depth; Width = w; Height = h; Depth = long(sqrt(double(w*h))); - if(G) { delete []G; delete []C; delete []Z; delete []G4;delete []OI; } - G = new unsigned char[w*h*3]; - G4= new unsigned char[w*h*4]; - C = new unsigned char[w*h*12]; - Z = new float[w*h*3]; // only 3 planes - OI= new int[w*h]; - InPlot(0,1,0,1,false); Clf(); + long s = long(w)*long(h); +#pragma omp critical(rgb) + if(G) { delete []G; delete []C; delete []Z; delete []G4;delete []GB;delete []OI; G=0; } + G = new unsigned char[s*3]; + G4= new unsigned char[s*4]; + GB= new unsigned char[s*4]; + C = new unsigned char[s*12]; + Z = new float[s*3]; // only 3 planes + OI= new int[s]; +#pragma omp parallel for + for(long i=0;ix2 - d->x1; - register long i,j; - for(j=d->y1;jy2;j++) + if(gr) { - i = d->x1+Width*(Height-1-j); - memcpy(OI+i,gr->OI+i,dd*sizeof(int)); - memcpy(Z+3*i,gr->Z+3*i,3*dd*sizeof(float)); - memcpy(C+12*i,gr->C+12*i,12*dd); + int dd = d->x2 - d->x1; + for(long j=d->y1;jy2;j++) + { + register long i = d->x1+Width*(Height-1-j); + memcpy(OI+i,gr->OI+i,dd*sizeof(int)); + memcpy(Z+3*i,gr->Z+3*i,3*dd*sizeof(float)); + memcpy(C+12*i,gr->C+12*i,12*dd); + } } } //----------------------------------------------------------------------------- void mglCanvas::PostScale(const mglMatrix *M, mglPoint &p) const { - mglPoint q=p/(2*M->pf); - p.x = M->x + q.x*M->b[0] + q.y*M->b[1] + q.z*M->b[2]; - p.y = M->y + q.x*M->b[3] + q.y*M->b[4] + q.z*M->b[5]; - p.z = M->z + q.x*M->b[6] + q.y*M->b[7] + q.z*M->b[8]; + register mreal f = 1./(2*M->pf),x=p.x,y=p.y,z=p.z; + const mreal *b=M->b; + p.x = M->x + f*(x*b[0] + y*b[1] + z*b[2]); + p.y = M->y + f*(x*b[3] + y*b[4] + z*b[5]); + p.z = M->z + f*(x*b[6] + y*b[7] + z*b[8]); } //----------------------------------------------------------------------------- bool mglCanvas::ScalePoint(const mglMatrix *M, mglPoint &p, mglPoint &n, bool use_nan) const { bool res = get(MGL_DISABLE_SCALE) || mglBase::ScalePoint(M,p,n,use_nan); -// if(TernAxis&4) return res; PostScale(M,p); - mglPoint y=n; - n.x = y.x*M->b[0] + y.y*M->b[1] + y.z*M->b[2]; // simpler for rotation only - n.y = y.x*M->b[3] + y.y*M->b[4] + y.z*M->b[5]; - n.z = y.x*M->b[6] + y.y*M->b[7] + y.z*M->b[8]; + register mreal nx=n.x, ny=n.y, nz=n.z; + const mreal *b=M->b; + n.x = nx*b[0] + ny*b[1] + nz*b[2]; // simpler for rotation only + n.y = nx*b[3] + ny*b[4] + nz*b[5]; + n.z = nx*b[6] + ny*b[7] + nz*b[8]; n.Normalize(); return res; } @@ -92,15 +120,17 @@ long mglCanvas::ProjScale(int nf, long id, bool text) else if(nf==2) { p.x = xx+w + q.z*w; p.y = yy + q.y*h; p.z = B1.z+ q.x*d; n = mglPoint(u.z,u.y,u.x); } else - { p.x = xx+w + q.x*B.b[0]/2 + q.y*B.b[1]/2 + q.z*B.b[2]/2; n = nn; - p.y = yy+h + q.x*B.b[3]/2 + q.y*B.b[4]/2 + q.z*B.b[5]/2; - p.z = B.z + q.x*B.b[6]/2 + q.y*B.b[7]/2 + q.z*B.b[8]/2; } + { + const mreal *b=B.b; n = nn; + p.x = xx+w + q.x*b[0]/2 + q.y*b[1]/2 + q.z*b[2]/2; + p.y = yy+h + q.x*b[3]/2 + q.y*b[4]/2 + q.z*b[5]/2; + p.z = B.z + q.x*b[6]/2 + q.y*b[7]/2 + q.z*b[8]/2; + } return CopyProj(id,p,text?n:nn); } //----------------------------------------------------------------------------- void mglCanvas::LightScale(const mglMatrix *M) { -//#pragma omp parallel for for(long i=0;i<10;i++) { if(!light[i].n) continue; @@ -117,30 +147,31 @@ mglPoint mglCanvas::RestorePnt(mglPoint ps, bool norm) const mglPoint p; mreal W=Width/2, H=Height/2, D=Depth/2; - mreal cx = B.z*Bp.b[2]+B.y*Bp.b[1]+B.x*Bp.b[0]-Bp.x*W-Bp.b[0]*W+W-Bp.b[1]*H-Bp.b[2]*D; - mreal c0 = B.b[6]*Bp.b[2]+B.b[3]*Bp.b[1]+B.b[0]*Bp.b[0]; - mreal c1 = B.b[7]*Bp.b[2]+B.b[4]*Bp.b[1]+B.b[1]*Bp.b[0]; - mreal c2 = B.b[8]*Bp.b[2]+B.b[5]*Bp.b[1]+B.b[2]*Bp.b[0]; - mreal cy = B.z*Bp.b[5]+B.y*Bp.b[4]+B.x*Bp.b[3]-Bp.b[3]*W-Bp.y*H-Bp.b[4]*H+H-Bp.b[5]*D; - mreal c3 = B.b[6]*Bp.b[5]+B.b[3]*Bp.b[4]+B.b[0]*Bp.b[3]; - mreal c4 = B.b[7]*Bp.b[5]+B.b[4]*Bp.b[4]+B.b[1]*Bp.b[3]; - mreal c5 = B.b[8]*Bp.b[5]+B.b[5]*Bp.b[4]+B.b[2]*Bp.b[3]; - mreal cz = B.z*Bp.b[8]+B.y*Bp.b[7]+B.x*Bp.b[6]-Bp.b[6]*W-Bp.b[7]*H-Bp.z*D-Bp.b[8]*D+D; - mreal c6 = B.b[6]*Bp.b[8]+B.b[3]*Bp.b[7]+B.b[0]*Bp.b[6]; - mreal c7 = B.b[7]*Bp.b[8]+B.b[4]*Bp.b[7]+B.b[1]*Bp.b[6]; - mreal c8 = B.b[8]*Bp.b[8]+B.b[5]*Bp.b[7]+B.b[2]*Bp.b[6]; + const mreal *b=B.b,*d=Bp.b; + mreal cx = B.z*d[2]+B.y*d[1]+B.x*d[0]-Bp.x*W-d[0]*W+W-d[1]*H-d[2]*D; + mreal c0 = b[6]*d[2]+b[3]*d[1]+b[0]*d[0]; + mreal c1 = b[7]*d[2]+b[4]*d[1]+b[1]*d[0]; + mreal c2 = b[8]*d[2]+b[5]*d[1]+b[2]*d[0]; + mreal cy = B.z*d[5]+B.y*d[4]+B.x*d[3]-d[3]*W-Bp.y*H-d[4]*H+H-d[5]*D; + mreal c3 = b[6]*d[5]+b[3]*d[4]+b[0]*d[3]; + mreal c4 = b[7]*d[5]+b[4]*d[4]+b[1]*d[3]; + mreal c5 = b[8]*d[5]+b[5]*d[4]+b[2]*d[3]; + mreal cz = B.z*d[8]+B.y*d[7]+B.x*d[6]-d[6]*W-d[7]*H-Bp.z*D-d[8]*D+D; + mreal c6 = b[6]*d[8]+b[3]*d[7]+b[0]*d[6]; + mreal c7 = b[7]*d[8]+b[4]*d[7]+b[1]*d[6]; + mreal c8 = b[8]*d[8]+b[5]*d[7]+b[2]*d[6]; if(norm) cx=cy=cz=0; - if(ps.z==ps.z) // try to take into account perspective if z-value is provided + if(mgl_isnum(ps.z)) // try to take into account perspective if z-value is provided { - register float d = (1-Bp.pf)/(1-Bp.pf*ps.z/Depth); - ps.x = Width/2 + (ps.x-Width/2)/d; - ps.y = Height/2+ (ps.y-Height/2)/d; + register float dd = get_persp(Bp.pf,ps.z,Depth); + ps.x = Width/2 + (ps.x-Width/2)/dd; + ps.y = Height/2+ (ps.y-Height/2)/dd; } mreal xx = ps.x-cx, yy = ps.y-cy, zz = ps.z-cz; mreal d1=c0*c4-c1*c3, d2=c1*c5-c2*c4, d3=c0*c5-c2*c3; - if(zz==zz) // try to use z-values + if(mgl_isnum(zz)) // try to use z-values { // put inverse matrix here: [x,y,z]=B^(-1)[xx,yy,zz] mreal det = (-c0*c4*c8+c1*c3*c8+c0*c5*c7-c2*c3*c7-c1*c5*c6+c2*c4*c6)/s3; @@ -191,28 +222,46 @@ void mglCanvas::CalcScr(mglPoint p, int *xs, int *ys) const mglPoint mglCanvas::CalcScr(mglPoint p) const { int x,y; CalcScr(p,&x,&y); return mglPoint(x,y); } //----------------------------------------------------------------------------- -MGL_NO_EXPORT int mgl_type_prior[8]={1,2,4,5, 0,3,0, 7}; -bool mglCreationOrder=false; -bool operator<(const mglPrim &a, const mglPrim &b) +void MGL_NO_EXPORT mgl_prm_swap(mglPrim &s1,mglPrim &s2,mglPrim *buf) { - if(mglCreationOrder) return a.n1 t2; - if(a.w!=b.w) return a.w > b.w; - return a.n3 > b.n3; + memcpy(buf, &s1, sizeof(mglPrim)); + memcpy(&s1, &s2, sizeof(mglPrim)); + memcpy(&s2, buf, sizeof(mglPrim)); } -//----------------------------------------------------------------------------- -bool operator>(const mglPrim &a, const mglPrim &b) +void MGL_NO_EXPORT sort_prm_c(size_t l0, size_t r0, mglStack &s, mglPrim *buf) { - if(mglCreationOrder) return a.n1>b.n1; - register int t1 = mgl_type_prior[a.type], t2 = mgl_type_prior[b.type]; - if(a.z!=b.z) return a.z > b.z; - if(t1!=t2) return t1 < t2; - if(a.w!=b.w) return a.w < b.w; - return a.n3 < b.n3; + if(l0==r0) return; + if(l0+1==r0) + { + if(s[r0].n1l) mgl_prm_swap(s[i],s[l],buf); + l++; + } + r=l; + for(size_t i=l;i<=r0;i++) // now collect =0 + if(s[i].n1==v) + { + if(i>r) mgl_prm_swap(s[i],s[r],buf); + r++; + } + + if(l>l0+1) sort_prm_c(l0,l-1,s,buf); + if(rgr->*(t->f))(t->id, t->n, t->p); return NULL; } void mglStartThread(void (mglCanvas::*func)(long i, long n, const void *p), mglCanvas *gr, long n, const void *p=NULL) @@ -238,14 +287,16 @@ void mglStartThread(void (mglCanvas::*func)(long i, long n, const void *p), mglC //----------------------------------------------------------------------------- void mglCanvas::pxl_combine(long id, long n, const void *) { - unsigned char c[4],*cc; #if !MGL_HAVE_PTHREAD -#pragma omp parallel for private(c,cc) +#pragma omp parallel for #endif for(long i=id;iPrmCmp(*(const long *)i, *(const long *)j); +} +//----------------------------------------------------------------------------- void mglCanvas::PreparePrim(int fast) { if(fast!=2) @@ -371,24 +429,21 @@ void mglCanvas::PreparePrim(int fast) mglStartThread(&mglCanvas::pxl_transform,this,Pnt.size()); if(fast==0) mglStartThread(&mglCanvas::pxl_setz,this,Prm.size()); else mglStartThread(&mglCanvas::pxl_setz_adv,this,Prm.size()); - mglCreationOrder = false; - std::sort(Prm.begin(), Prm.end()); +#pragma omp critical + { + ClearPrmInd(); mgl_qsort_gr = this; + register size_t n = Prm.size(); + PrmInd = new long[n]; + for(size_t i=0;i0) { - mglStartThread(&mglCanvas::pxl_pntcol,this,Pnt.size()); - mglStartThread(&mglCanvas::pxl_prmcol,this,Prm.size()); - } -} -//----------------------------------------------------------------------------- -void mglBase::resort() -{ #pragma omp critical - { - mglCreationOrder = true; - std::sort(Prm.begin(), Prm.end()); - mglCreationOrder = false; - clr(MGL_FINISHED); + { if(pnt_col) delete []pnt_col; pnt_col = new uint32_t[Pnt.size()]; } + mglStartThread(&mglCanvas::pxl_pntcol,this,Pnt.size()); } } //----------------------------------------------------------------------------- @@ -396,30 +451,86 @@ void mglCanvas::pxl_primdr(long id, long , const void *) { #define Q 4 // should be >= sqrt(2*num_thr) ??? int nx=Q,ny=Q; // TODO find dependence on Q for 1, 2, 4, 8 threads. Try to select optimal + if(!(Quality&3)) #if !MGL_HAVE_PTHREAD #pragma omp parallel for #endif - for(long i=id;i0) - clr(MGL_FINISHED); - if(get(MGL_FINISHED)) return; // nothing to do -/* static bool working=false; - if(working) return; - working = true;*/ - if(!(Quality&MGL_DRAW_LMEM) && Prm.size()>0) + else { - PreparePrim(0); bp=Bp; - clr(MGL_FINISHED); - mglStartThread(&mglCanvas::pxl_primdr,this,Prm.size()); + if((Quality&MGL_DRAW_LMEM) || (memcmp(&Bp,&bp,sizeof(mglMatrix)) && !(Quality&MGL_DRAW_LMEM) && Prm.size()>0)) + clr(MGL_FINISHED); + if(!get(MGL_FINISHED)) + { + if(!(Quality&MGL_DRAW_LMEM) && Prm.size()>0) + { + PreparePrim(0); bp=Bp; + clr(MGL_FINISHED); + mglStartThread(&mglCanvas::pxl_primdr,this,Prm.size()); + } + size_t n=Width*Height; + BDef[3] = (Flag&3)!=2 ? 0:255; + if(Quality&MGL_DRAW_NORM) mglStartThread(&mglCanvas::pxl_combine,this,n); + else mglStartThread(&mglCanvas::pxl_memcpy,this,n); + BDef[3] = 255; + mglStartThread(&mglCanvas::pxl_backgr,this,n); + set(MGL_FINISHED); + } } - size_t n=Width*Height; - BDef[3] = (Flag&3)!=2 ? 0:255; - if(Quality&MGL_DRAW_NORM) mglStartThread(&mglCanvas::pxl_combine,this,n); - else mglStartThread(&mglCanvas::pxl_memcpy,this,n); - BDef[3] = 255; - mglStartThread(&mglCanvas::pxl_backgr,this,n); - set(MGL_FINISHED); -// working = false; +#if MGL_HAVE_PTHREAD + pthread_mutex_unlock(&mutexClf); +#elif MGL_HAVE_OMP + omp_unset_lock(&lockClf); +#endif } //----------------------------------------------------------------------------- void mglCanvas::ClfZB(bool force) @@ -523,30 +645,46 @@ void mglCanvas::ClfZB(bool force) //----------------------------------------------------------------------------- void mglCanvas::Clf(mglColor Back) { - Fog(0); PDef = 0xffff; pPos = 0; StartAutoGroup(NULL); - Pnt.clear(); Prm.clear(); Ptx.clear(); Glf.clear(); - Sub.clear(); Leg.clear(); Grp.clear(); Act.clear(); - pnt_col.clear(); prm_col.clear(); - -#pragma omp critical(txt) - { - Txt.clear(); Txt.reserve(3); - mglTexture t1(MGL_DEF_PAL,-1), t2(MGL_DEF_SCH,1); - MGL_PUSH(Txt,t1,mutexTxt); - MGL_PUSH(Txt,t2,mutexTxt); - } - -// if(Back==NC) Back = mglColor(1,1,1); - if((Flag&3)==2) Back = mglColor(0,0,0); - if(Back!=NC) - { BDef[0]=Back.r*255; BDef[1]=Back.g*255;BDef[2]=Back.b*255; BDef[3]=0; } - ClfZB(true); + Fog(0); PDef = 0xffff; pPos = 0; + ClearFrame(); + if((Flag&3)==2) Back = mglColor(0,0,0,0); + if(Back!=NC) FillBackground(Back); +} +//----------------------------------------------------------------------------- +void mglCanvas::Clf(const char *col) +{ + Fog(0); PDef = 0xffff; pPos = 0; + ClearFrame(); + mglTexture txt(col,0,0); + FillBackground(txt.col[1]); +} +//----------------------------------------------------------------------------- +void mglCanvas::Rasterize() +{ + Finish(); + memcpy(GB,G4,4*Width*Height); +} +//----------------------------------------------------------------------------- +bool MGL_NO_EXPORT mgl_read_image(unsigned char *g, int w, int h, const char *fname); +void mglCanvas::LoadBackground(const char *fname, double alpha) +{ + mgl_read_image(GB,Width,Height,fname); + if(alpha<1 && alpha>0) +#pragma omp parallel for + for(long i=0;iWidth || Height!=gr->Height) return; // wrong sizes + if(Width!=gr->Width || Height!=gr->Height || !gr) return; // wrong sizes mglStartThread(&mglCanvas::pxl_other,this,Width*Height,gr); } //----------------------------------------------------------------------------- void mglCanvas::pnt_plot(long x,long y,mreal z,const unsigned char ci[4], int obj_id) { - long i0=x+Width*(Height-1-y); - if(ci[3]==0) return; - unsigned char *cc = C+12*i0, c[4]; - memcpy(c,ci,4); - float *zz = Z+3*i0, zf = FogDist*(z/Depth-0.5-FogDz); - if(zf<0) // add fog - { - int d = int(255.f-255.f*exp(5.f*zf)); - unsigned char cb[4] = {BDef[0], BDef[1], BDef[2], (unsigned char)d}; - if(d==255) return; - combine(c,cb); - } - if(Quality&MGL_DRAW_NORM) + if(ci[3]) { - if(z>=zz[1]) // shift point on slice down and paste new point + long i0=x+Width*(Height-1-y); + unsigned char *cc = C+12*i0, c[4]; + memcpy(c,ci,4); + float *zz = Z+3*i0, zf = FogDist*(z/Depth-0.5-FogDz); + if(zf<0) // add fog + { + int d = int(255.f-255.f*exp(5.f*zf)); + unsigned char cb[4] = {BDef[0], BDef[1], BDef[2], (unsigned char)d}; + if(d==255) return; + combine(c,cb); + } + if(Quality&MGL_DRAW_NORM) { - zz[2] = zz[1]; combine(cc+8,cc+4); - if(z>=zz[0]) - { zz[1] = zz[0]; zz[0] = z; OI[i0]=obj_id; - memcpy(cc+4,cc,4); memcpy(cc,c,4); } - else { zz[1] = z; memcpy(cc+4,c,4); } + if(z>=zz[1]) // shift point on slice down and paste new point + { + zz[2] = zz[1]; combine(cc+8,cc+4); + if(z>=zz[0]) + { zz[1] = zz[0]; zz[0] = z; OI[i0]=obj_id; + memcpy(cc+4,cc,4); memcpy(cc,c,4); } + else { zz[1] = z; memcpy(cc+4,c,4); } + } + else + { + if(z>=zz[2]) // shift point on slice down and paste new point + { zz[2] = z; combine(cc+8,c); } + else // point below the background + { combine(c,cc+8); memcpy(cc+8,c,4); } + } } else { - if(z>=zz[2]) // shift point on slice down and paste new point - { zz[2] = z; combine(cc+8,c); } - else // point below the background - { combine(c,cc+8); memcpy(cc+8,c,4); } + if(z>=zz[0]) // point upper the background + { zz[0]=z; memcpy(cc,c,4); OI[i0]=obj_id; } } } - else - { - if(z>=zz[0]) // point upper the background - { zz[0]=z; memcpy(cc,c,4); OI[i0]=obj_id; } - } } //----------------------------------------------------------------------------- -unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id) +unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id) const { - if(!r) return r; +// if(!r) return r; // NOTE r must be provided! if(p.a<=0) { memset(r,0,4); return r; } register float b0=0,b1=0,b2=0, ar,ag,ab; ar = ag = ab = AmbBr; -// if(get(MGL_ENABLE_LIGHT) && mgl_isnum(p.u)) if(mgl_isnum(p.u+p.v+p.w)) { float d0,d1,d2,nn; @@ -684,32 +823,35 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id) } //----------------------------------------------------------------------------- /// color mixing: color c1 is under color c2 !!! -void mglCanvas::combine(unsigned char *c1, const unsigned char *c2) +void mglCanvas::combine(unsigned char *c1, const unsigned char *c2) const { - if(!c2[3]) return; - register unsigned int a1=c1[3], a2=c2[3],b1=255-a2; - if(a1==0 || a2==255) { memcpy(c1,c2,4); return; } - if((Flag&3)==0) - { - c1[0] = (c1[0]*b1 + c2[0]*a2)/256; - c1[1] = (c1[1]*b1 + c2[1]*a2)/256; - c1[2] = (c1[2]*b1 + c2[2]*a2)/256; - c1[3] = (unsigned char)(a2+a1*b1/255); - } - else if((Flag&3)==1) - { - c1[0] = (unsigned char)((255-a1*(255-c1[0])/256)*(255-a2*(255-c2[0])/256)/256); - c1[1] = (unsigned char)((255-a1*(255-c1[1])/256)*(255-a2*(255-c2[1])/256)/256); - c1[2] = (unsigned char)((255-a1*(255-c1[2])/256)*(255-a2*(255-c2[2])/256)/256); - c1[3] = 255; - } - else if((Flag&3)==2) + if(c2[3]) { - unsigned int b2,b3; - b1 = (c1[0]*a1 + c2[0]*a2)/256; c1[0] = b1<255 ? b1 : 255; - b2 = (c1[1]*a1 + c2[1]*a2)/256; c1[1] = b2<255 ? b2 : 255; - b3 = (c1[2]*a1 + c2[2]*a2)/256; c1[2] = b3<255 ? b3 : 255; - c1[3] = a1+a2>255? 255 : a1+a2; + register unsigned a1=c1[3], a2=c2[3]; + if(a2==255 || a1==0) { memcpy(c1,c2,4); return; } + if((Flag&3)==0) + { + register unsigned b1=255-a2; + c1[0] = (c1[0]*b1 + c2[0]*a2)/256; + c1[1] = (c1[1]*b1 + c2[1]*a2)/256; + c1[2] = (c1[2]*b1 + c2[2]*a2)/256; + c1[3] = (unsigned char)(a2+a1*b1/255); + } + else if((Flag&3)==1) + { + c1[0] = (unsigned char)((255-a1*(255-c1[0])/256)*(255-a2*(255-c2[0])/256)/256); + c1[1] = (unsigned char)((255-a1*(255-c1[1])/256)*(255-a2*(255-c2[1])/256)/256); + c1[2] = (unsigned char)((255-a1*(255-c1[2])/256)*(255-a2*(255-c2[2])/256)/256); + c1[3] = 255; + } + else if((Flag&3)==2) + { + register unsigned b1,b2,b3; + b1 = (c1[0]*a1 + c2[0]*a2)/256; c1[0] = b1<255 ? b1 : 255; + b2 = (c1[1]*a1 + c2[1]*a2)/256; c1[1] = b2<255 ? b2 : 255; + b3 = (c1[2]*a1 + c2[2]*a2)/256; c1[2] = b3<255 ? b3 : 255; + c1[3] = a1+a2>255? 255 : a1+a2; + } } } //----------------------------------------------------------------------------- @@ -720,17 +862,17 @@ unsigned char **mglCanvas::GetRGBLines(long &w, long &h, unsigned char *&f, bool p = (unsigned char **)malloc(Height * sizeof(unsigned char *)); long d = (alpha ? 4:3)*Width; unsigned char *gg = (alpha?G4:G); -#pragma omp parallel for for(long i=0;ip2.x?p1.x:p2.x, p3.x>p4.x?p3.x:p4.x)); - y2 = long(fmax(p1.y>p2.y?p1.y:p2.y, p3.y>p4.y?p3.y:p4.y)); - x1=x1>d->x1?x1:d->x1; x2=x2x2?x2:d->x2; - y1=y1>d->y1?y1:d->y1; y2=y2y2?y2:d->y2; - if(x1>x2 || y1>y2) return; + if((d1.x==0 && d1.y==0) || (d2.x==0 && d2.y==0)) + { trig_draw(p1,p2,p4,true,d); trig_draw(p1,p3,p4,true,d); return; } + + x1 = long(mgl_min(mgl_min(p1.x,p2.x), mgl_min(p3.x,p4.x))); // bounding box + y1 = long(mgl_min(mgl_min(p1.y,p2.y), mgl_min(p3.y,p4.y))); + x2 = long(mgl_max(mgl_max(p1.x,p2.x), mgl_max(p3.x,p4.x))); + y2 = long(mgl_max(mgl_max(p1.y,p2.y), mgl_max(p3.y,p4.y))); + x1=mgl_max(x1,d->x1); x2=mgl_min(x2,d->x2); + y1=mgl_max(y1,d->y1); y2=mgl_min(y2,d->y2); +// if(x1>x2 || y1>y2) return; dd = d1.x*d2.y-d1.y*d2.x; dsx =-4*(d2.y*d3.x - d2.x*d3.y)*d1.y; dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x; - if((d1.x==0 && d1.y==0) || (d2.x==0 && d2.y==0) || !(Quality&MGL_DRAW_NORM)) - { trig_draw(p1,p2,p4,true,d); trig_draw(p1,p3,p4,true,d); return; } - mglPoint n1 = mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z); mglPoint n2 = mglPoint(p2.x-p4.x,p2.y-p4.y,p2.z-p4.z)^mglPoint(p3.x-p4.x,p3.y-p4.y,p3.z-p4.z); mglPoint nr = (n1+n2)*0.5; float x0 = p1.x, y0 = p1.y; - for(long i=x1;i<=x2;i++) for(long j=y1;j<=y2;j++) + int oi = d->ObjId, ang=d->angle; + mreal pw = d->PenWidth; + uint64_t pd = d->PDef; + for(long j=y1;j<=y2;j++) for(long i=x1;i<=x2;i++) { - if(!visible(i,j,d->m, d->PenWidth,d->angle)) continue; - register float xx = (i-x0), yy = (j-y0), s; - s = dsx*xx + dsy*yy + (dd+d3.y*xx-d3.x*yy)*(dd+d3.y*xx-d3.x*yy); - if(s<0) continue; // no solution - s = sqrt(s); - register float qu = d3.x*yy - d3.y*xx + dd + s, u=-1; - register float qv = d3.y*xx - d3.x*yy + dd + s, v=-1; -// if(qu && qv) - { - u = 2.f*(d2.y*xx - d2.x*yy)/qu; - v = 2.f*(d1.x*yy - d1.y*xx)/qv; - } - if(u*(1.f-u)<0.f || v*(1.f-v)<0.f) // first root bad + if(pd==MGL_SOLID_MASK || visible(i,j,d->m, pw,ang)) { - qu = d3.x*yy - d3.y*xx + dd - s; - qv = d3.y*xx - d3.x*yy + dd - s; - u = v = -1.f; -// if(qu && qv) + register float xx = (i-x0), yy = (j-y0), s; + s = dsx*xx + dsy*yy + (dd+d3.y*xx-d3.x*yy)*(dd+d3.y*xx-d3.x*yy); + if(s>=0) { - u = 2.f*(d2.y*xx - d2.x*yy)/qu; - v = 2.f*(d1.x*yy - d1.y*xx)/qv; + s = sqrt(s); + register float qu = d3.x*yy - d3.y*xx + dd + s; + register float qv = d3.y*xx - d3.x*yy + dd + s; + register float u = 2.f*(d2.y*xx - d2.x*yy)/qu; + register float v = 2.f*(d1.x*yy - d1.y*xx)/qv; + if(u*(1.f-u)<0.f || v*(1.f-v)<0.f) // first root bad + { + qu = d3.x*yy - d3.y*xx + dd - s; + qv = d3.y*xx - d3.x*yy + dd - s; +// u = v = -1.f; + u = 2.f*(d2.y*xx - d2.x*yy)/qu; v = 2.f*(d1.x*yy - d1.y*xx)/qv; + if(u*(1.f-u)<0.f || v*(1.f-v)<0.f) continue; // second root bad + } + p = p1+d1*u+d2*v+d3*(u*v); + if(mgl_isnan(p.u) && mgl_isnum(p.v)) + { p.u = nr.x; p.v = nr.y; p.w = nr.z; } + pnt_plot(i,j,p.z,col2int(p,r,oi),oi); } - if(u*(1.f-u)<0.f || v*(1.f-v)<0.f) continue; // second root bad } - p = p1+d1*u+d2*v+d3*(u*v); - if(mgl_isnan(p.u) && mgl_isnum(p.v)) - { p.u = nr.x; p.v = nr.y; p.w = nr.z; } - pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId); } } //----------------------------------------------------------------------------- @@ -853,10 +995,7 @@ void mglCanvas::quad_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, con void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, const mglDrawReg *d) { if(!(Quality&3) && anorm) - { - fast_draw(p1,p2,d); fast_draw(p1,p3,d); - fast_draw(p2,p3,d); return; - } + { fast_draw(p1,p2,d); fast_draw(p1,p3,d); fast_draw(p2,p3,d); return; } unsigned char r[4]; long y1,x1,y2,x2; float dxu,dxv,dyu,dyv; @@ -867,34 +1006,48 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, dyv =-d1.x/dxu; dxv = d1.y/dxu; dyu = d2.x/dxu; dxu =-d2.y/dxu; - x1 = long(fmin(p1.xp2.x?p1.x:p2.x, p3.x)); - y2 = long(fmax(p1.y>p2.y?p1.y:p2.y, p3.y)); + x1 = long(mgl_min(p1.xp2.x?p1.x:p2.x, p3.x)); + y2 = long(mgl_max(p1.y>p2.y?p1.y:p2.y, p3.y)); x1=x1>d->x1?x1:d->x1; x2=x2x2?x2:d->x2; y1=y1>d->y1?y1:d->y1; y2=y2y2?y2:d->y2; - if(x1>x2 || y1>y2) return; +// if(x1>x2 || y1>y2) return; // default normale mglPoint nr = mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z); float x0 = p1.x, y0 = p1.y; - if(Quality&MGL_DRAW_NORM) for(long i=x1;i<=x2;i++) for(long j=y1;j<=y2;j++) + float dz = Width>2 ? 1 : 1e-5*Width; // provide additional height to be well visible on the surfaces + if(anorm) dz=0; + int oi = d->ObjId, ang=d->angle; + mreal pw = d->PenWidth; + uint64_t pd = d->PDef; + if(Quality&MGL_DRAW_NORM) for(long j=y1;j<=y2;j++) for(long i=x1;i<=x2;i++) { - if(!visible(i,j,d->m, d->PenWidth,d->angle)) continue; - register float xx = (i-x0), yy = (j-y0); - register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy; - if(u<0 || v<0 || u+v>1) continue; - p = p1+d1*u+d2*v; - if(mgl_isnan(p.u) && mgl_isnum(p.v) && anorm) - { p.u = nr.x; p.v = nr.y; p.w = nr.z; } - pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId); + if(pd==MGL_SOLID_MASK || visible(i,j,d->m, pw,ang)) + { + register float xx = (i-x0), yy = (j-y0); + register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy; + if(u<0 || v<0 || u+v>1) continue; + p = p1+d1*u+d2*v; + if(mgl_isnan(p.u) && mgl_isnum(p.v) && anorm) + { p.u = nr.x; p.v = nr.y; p.w = nr.z; } + pnt_plot(i,j,p.z+dz,col2int(p,r,oi),oi); + } } - else for(long i=x1;i<=x2;i++) for(long j=y1;j<=y2;j++) + else { - if(!visible(i,j,d->m, d->PenWidth,d->angle)) continue; - register float xx = (i-x0), yy = (j-y0); - register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy; - if(u<0 || v<0 || u+v>1) continue; - pnt_plot(i,j,p1.z,col2int(p1,r,d->ObjId),d->ObjId); + col2int(p1,r,oi); + float zz = p1.z+dz; + for(long j=y1;j<=y2;j++) for(long i=x1;i<=x2;i++) + { + if(pd==MGL_SOLID_MASK || visible(i,j,d->m, pw,ang)) + { + register float xx = (i-x0), yy = (j-y0); + register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy; + if(u<0 || v<0 || u+v>1) continue; + pnt_plot(i,j,zz,r,oi); + } + } } } //----------------------------------------------------------------------------- @@ -916,7 +1069,6 @@ void mglCanvas::trig_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, con pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId); } //----------------------------------------------------------------------------- -//#define mgl_sline(c,x) (unsigned char)((c)/cosh(x)) inline unsigned char mgl_sline(unsigned char c,float x) { x*=x/2; return (unsigned char)((c)/(1+x+x*x/5)); } void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *dr) @@ -927,8 +1079,9 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg * float pw=dr->PenWidth, dxu,dxv,dyu,dyv,dd,dpw=3; float dz = Width>2 ? 1 : 1e-5*Width; // provide additional height to be well visible on the surfaces + int oi = dr->ObjId; - if(dr->ObjId==HighId) { pw *= 2; dpw=2; } + if(oi==HighId) { pw *= 2; dpw=2; } mglPnt d=p2-p1, p; bool hor = fabs(d.x)>fabs(d.y); @@ -939,11 +1092,14 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg * x1=x1>dr->x1?x1:dr->x1; x2=x2x2?x2:dr->x2; y1=y1>dr->y1?y1:dr->y1; y2=y2y2?y2:dr->y2; dd = hypot(d.x, d.y); - if(x1>x2 || y1>y2 || dd<1e-5) return; +// if(x1>x2 || y1>y2 || dd<1e-5) return; + if(dd<1e-5) return; dxv = d.y/dd; dyv =-d.x/dd; dxu = d.x/dd; dyu = d.y/dd; + uint64_t pd = dr->PDef; + mreal pp = dr->pPos; if(hor) for(long i=x1;i<=x2;i++) { y1 = int(p1.y+d.y*(i-p1.x)/d.x - pw - 3.5); @@ -957,10 +1113,10 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg * if(u<0) v += u*u; else if(u>dd) v += (u-dd)*(u-dd); if(v>pw*pw) continue; - if(!(dr->PDef & ( 1<pPos+u/pw/1.5, 16)) ) )) continue; - p = p1+d*(u/dd); col2int(p,r,dr->ObjId); + if(!(pd & ( 1<ObjId); + pnt_plot(i,j,p.z+dz,r,oi); } } else for(long j=y1;j<=y2;j++) @@ -977,10 +1133,10 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg * if(u<0) v += u*u; else if(u>dd) v += (u-dd)*(u-dd); if(v>pw*pw) continue; - if(!(dr->PDef & (1<pPos+u/pw/1.5, 16))))) continue; - p = p1+d*(u/dd); col2int(p,r,dr->ObjId); + if(!(pd & (1<ObjId); + pnt_plot(i,j,p.z+dz,r,oi); } } } @@ -996,7 +1152,8 @@ void mglCanvas::fast_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg * { if(p1.x==p2.x && p1.y==p2.y) return; mglPnt d=p2-p1; - unsigned char r[4]; col2int(p1,r,dr->ObjId); + int oi = dr->ObjId; + unsigned char r[4]; col2int(p1,r,oi); long y1,x1,y2,x2; bool hor = fabs(d.x)>fabs(d.y); @@ -1012,13 +1169,13 @@ void mglCanvas::fast_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg * { register long c = long(p1.y+d.y*(i-p1.x)/d.x); if(c>=y1 && c<=y2) - pnt_fast(i, c, p1.z+d.z*(i-p1.x)/d.x+dz, r,dr->ObjId); + pnt_fast(i, c, p1.z+d.z*(i-p1.x)/d.x+dz, r,oi); } else for(long i=y1;i<=y2;i++) { register long c = long(p1.x+d.x*(i-p1.y)/d.y); if(c>=x1 && c<=x2) - pnt_fast(c, i, p1.z+d.z*(i-p1.y)/d.y+dz, r,dr->ObjId); + pnt_fast(c, i, p1.z+d.z*(i-p1.y)/d.y+dz, r,oi); } } //----------------------------------------------------------------------------- @@ -1046,23 +1203,24 @@ void mglCanvas::pnt_draw(const mglPnt &p, const mglDrawReg *dr) { // if(k<0 || !dr) return; float pw=3*dr->PenWidth,dpw=3; - if(dr->ObjId==HighId) { pw *= 2; dpw=2; } + int oi = dr->ObjId; + if(oi==HighId) { pw *= 2; dpw=2; } unsigned char cs[4], cc; - col2int(p,cs,dr->ObjId); cc = cs[3]; + col2int(p,cs,oi); cc = cs[3]; if(cc==0) return; long s = long(5.5+fabs(pw)); - long i1=fmax(-s,dr->x1-p.x),i2=fmin(s,dr->x2-p.x), j1=fmax(-s,dr->y1-p.y),j2=fmin(s,dr->y2-p.y); + long i1=mgl_max(-s,dr->x1-p.x),i2=mgl_min(s,dr->x2-p.x), j1=mgl_max(-s,dr->y1-p.y),j2=mgl_min(s,dr->y2-p.y); if(!(Quality&3)) for(long j=j1;j<=j2;j++) for(long i=i1;i<=i2;i++) // fast draw { register float v = i*i+j*j; if(v>1+(pw-1)*(pw-1)/4) continue; - pnt_plot(p.x+i,p.y+j,p.z,cs,dr->ObjId); + pnt_plot(p.x+i,p.y+j,p.z,cs,oi); } else for(long j=j1;j<=j2;j++) for(long i=i1;i<=i2;i++) { register float v = i*i+j*j; cs[3] = v<(pw-1)*(pw-1)/4 ? cc : mgl_sline(cc,dpw*(sqrt(v)+(1-pw)/2)); - pnt_plot(p.x+i,p.y+j,p.z,cs,dr->ObjId); + pnt_plot(p.x+i,p.y+j,p.z,cs,oi); } } //----------------------------------------------------------------------------- @@ -1080,7 +1238,8 @@ void mglCanvas::pnt_pix(long i, long j, const mglPnt &p, const mglDrawReg *dr) //----------------------------------------------------------------------------- void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) { - unsigned char cs[4], ca; col2int(q,cs,d->ObjId); ca = cs[3];// = size>0 ? 255 : 255*q.t; + int oi = d->ObjId; + unsigned char cs[4], ca; col2int(q,cs,oi); ca = cs[3];// = size>0 ? 255 : 255*q.t; mreal ss=fabs(size), pw=1,dpw=3; if(type=='.' || ss==0) @@ -1093,13 +1252,13 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) y1=y1>d->y1?y1:d->y1; y2=y2y2?y2:d->y2; if(x1>x2 || y1>y2) return; - if(d->ObjId==HighId) { pw *= 2; dpw=2; } + if(oi==HighId) { pw *= 2; dpw=2; } for(long j=y1;j<=y2;j++) for(long i=x1;i<=x2;i++) { register float dx=i-q.x, dy=j-q.y, v=dx*dx+dy*dy; register int sum = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } } else @@ -1107,11 +1266,11 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) if(d) { d->PDef = MGL_SOLID_MASK; d->angle = 0; - pw = d->PenWidth*fabs(50*size); + pw = d->PenWidth*sqrt(fabs(50*size)); if(pw<1) pw=1; } if(!strchr("xsSoO",type)) ss *= 1.1; - if(d->ObjId==HighId) { pw *= 2; dpw=2; } + if(oi==HighId) { pw *= 2; dpw=2; } register mreal dd = ss+pw+3.5; long x1 = long(q.x-dd), y1 = long(q.y-dd); // bounding box @@ -1140,7 +1299,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(dx)-ss; v = dy*dy+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case '+': @@ -1153,7 +1312,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(dx)-ss; v = dy*dy+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'X': @@ -1176,7 +1335,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'x': @@ -1189,7 +1348,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(dx-dy)-2*ss; v = dx+dy; v = v*v+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'S': @@ -1200,7 +1359,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) v = fabs(dx)-ss; if(v<0) v=0; v = u*u+v*v; register int sum = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 's': @@ -1217,7 +1376,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(dx)-ss; v = (dy+ss)*(dy+ss)+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'D': @@ -1228,7 +1387,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) v = fabs(dx+dy)-ss; if(v<0) v=0; v = u*u+v*v; register int sum = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'd': @@ -1245,7 +1404,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(dx-dy)-ss; v = (dx+dy+ss)*(dx+dy+ss)+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'Y': @@ -1260,7 +1419,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(-0.87*dx+0.5*dy-ss/2)-ss/2; v = (0.5*dx+0.87*dy)*(0.5*dx+0.87*dy)+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case '*': @@ -1275,7 +1434,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(-0.87*dx+0.5*dy)-ss; v = (0.5*dx+0.87*dy)*(0.5*dx+0.87*dy)+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'T': @@ -1295,7 +1454,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; } - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case '^': @@ -1310,7 +1469,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(0.55*dx-0.83*dy)-0.9*ss; v = 0.83*dx+0.55*dy-0.55*ss; v = v*v+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'V': @@ -1330,7 +1489,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; } - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'v': @@ -1345,7 +1504,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(0.55*dx-0.83*dy)-0.9*ss; v = 0.83*dx+0.55*dy+0.55*ss; v = v*v+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'L': @@ -1365,7 +1524,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; } - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case '<': @@ -1380,7 +1539,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(0.55*dy-0.83*dx)-0.9*ss; v = 0.83*dy+0.55*dx+0.55*ss; v = v*v+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'R': @@ -1400,7 +1559,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; } - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case '>': @@ -1415,7 +1574,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) u = fabs(0.55*dy-0.83*dx)-0.9*ss; v = 0.83*dy+0.55*dx-0.55*ss; v = v*v+(u<0?0:u*u); sum += v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); sum = sum>255?255:sum; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'O': @@ -1425,7 +1584,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) v = hypot(dx,dy)-ss; v=v<0?0:v*v; register int sum = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'o': @@ -1435,7 +1594,7 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) v = hypot(dx,dy)-ss; v=v*v; register int sum = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + pnt_plot(i,j,q.z+1,cs,oi); } break; case 'C': @@ -1446,8 +1605,8 @@ void mglCanvas::mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d) register int sum = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); v = dx*dx+dy*dy; sum += v<(2*pw-1)*(2*pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-2*pw)/2)); - sum = sum>255?255:sum; cs[3] = ca*sum/255; cs[3] = ca*sum/255; - pnt_plot(i,j,q.z+1,cs,d->ObjId); + sum = sum>255?255:sum; cs[3] = ca*sum/255; + pnt_plot(i,j,q.z+1,cs,oi); } break; } @@ -1576,15 +1735,14 @@ void mglCanvas::mark_pix(long i, long j, const mglPnt &q, char type, mreal size, register float xx = (i-q.x), yy = (j-q.y); register float dz = Width>2 ? 1 : 1e-5*Width; // provide additional height to be well visible on the surfaces if(xx*xx+yy*yyObjId); - // TODO add edge smoothing here? } case 'o': { - register float pw=d->PenWidth, dpw=2; + register float pw=d->PenWidth; register float xx = (i-q.x), yy = (j-q.y), v = hypot(xx,yy); v = (v-ss)*(v-ss); if(v>pw*pw) return; - if(v>(pw-1)*(pw-1)/4) cs[3] = mgl_sline(cs[3],dpw*(sqrt(v)+(1-pw)/2)); + if(v>(pw-1)*(pw-1)/4) cs[3] = mgl_sline(cs[3],2*(sqrt(v)+(1-pw)/2)); register float dz = Width>2 ? 1 : 1e-5*Width; // provide additional height to be well visible on the surfaces pnt_plot(i,j,q.z+dz,cs,d->ObjId); } @@ -1592,11 +1750,11 @@ void mglCanvas::mark_pix(long i, long j, const mglPnt &q, char type, mreal size, case 'C': pnt_pix(i,j,q,d); { - register float pw=d->PenWidth, dpw=2; + register float pw=d->PenWidth; register float xx = (i-q.x), yy = (j-q.y), v = hypot(xx,yy); v = (v-ss)*(v-ss); if(v>pw*pw) return; - if(v>(pw-1)*(pw-1)/4) cs[3] = mgl_sline(cs[3],dpw*(sqrt(v)+(1-pw)/2)); + if(v>(pw-1)*(pw-1)/4) cs[3] = mgl_sline(cs[3],2*(sqrt(v)+(1-pw)/2)); register float dz = Width>2 ? 1 : 1e-5*Width; // provide additional height to be well visible on the surfaces pnt_plot(i,j,q.z+dz,cs,d->ObjId); } @@ -1617,8 +1775,8 @@ float mglCanvas::GetGlyphPhi(const mglPnt &q, float phi) y = Bp.b[3]*q.u + Bp.b[4]*q.v + Bp.b[5]*q.w; z = Bp.b[6]*q.u + Bp.b[7]*q.v + Bp.b[8]*q.w; - register float dv = (1-Bp.pf)/(1-Bp.pf*q.z/Depth); - register float c=Bp.pf/(1-Bp.pf)/Depth; + register float dv= get_persp(Bp.pf,q.z,Depth); + register float c = get_pfact(Bp.pf,Depth); x += (q.x-Width/2)*z*c*dv; y += (q.y-Height/2)*z*c*dv; } @@ -1627,7 +1785,7 @@ float mglCanvas::GetGlyphPhi(const mglPnt &q, float phi) if(ll==ll && phi<1e4) { phi = -atan2(y,x)*180/M_PI; - if(fabs(phi)>90) phi+=180; +// if(fabs(phi)>90) phi+=180; // NOTE this is 2nd part of rotation changes (see also text_plot()) } else phi=0; return phi; @@ -1641,7 +1799,8 @@ void mglCanvas::glyph_draw(const mglPrim &P, mglDrawReg *d) if(d) { d->PDef = MGL_SOLID_MASK; d->angle = 0; d->PenWidth=0.6; } mglPnt p=Pnt[P.n1]; // NOTE check this later for mglInPlot - mreal pf=p.sub<0?1:sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2), f = P.p*pf; + mreal fact = get_persp(Bp.pf,p.z,Depth); + mreal pf=(p.sub<0?1:sqrt((Bp.b[0]*Bp.b[0]+Bp.b[1]*Bp.b[1]+Bp.b[3]*Bp.b[3]+Bp.b[4]*Bp.b[4])/2))*fact, f = P.p*pf; mglMatrix M; M.b[0] = M.b[4] = M.b[8] = P.s; @@ -1686,7 +1845,6 @@ void mglCanvas::glyph_wire(const mglMatrix *M, const mglPnt &pp, mreal f, const long il=0; mglPnt q0=pp, q1=pp; q0.u=q0.v=q1.u=q1.v=NAN; mglPoint p1,p2; -//#pragma omp parallel for firstprivate(q0,q1,i1) private(p1,p2) for(long ik=0;ikMax.y - gr->Min.y)/nd; -#define islog(a, b) (((a)>0 && (b)>10*(a)) || ((b)<0 && (a)<10*(b))) // initial data filling if(gr->Min.x>0 && gr->Max.x>100*gr->Min.x) { mreal d = log(2*gr->Max.x/gr->Min.x)/(n-1); -#pragma omp parallel for for(long i=0;iMax.x*exp(d*i)/(2*gr->Max.x/gr->Min.x+exp(d*i)); y[i]=eq->Calc(x[i]); } } else if(gr->Max.x<0 && gr->Min.x<100*gr->Max.x) { mreal d = log(2*gr->Min.x/gr->Max.x)/(n-1); -#pragma omp parallel for for(long i=0;iMin.x*exp(d*i)/(2*gr->Min.x/gr->Max.x+exp(d*i)); y[i]=eq->Calc(x[i]); } } else { mreal d = (gr->Max.x - gr->Min.x)/(n-1.); -#pragma omp parallel for for(long i=0;iMin.x + i*d; y[i]=eq->Calc(x[i]); } } for(long i=0;iStop) { free(x); free(y); delete eq; return; } + if((i&0xfff)==0 && gr->NeedStop()) + { free(x); free(y); delete eq; return; } xs=(x[i]+x[i+1])/2; ys=(y[i]+y[i+1])/2; yr=eq->Calc(xs); if(fabs(yr-ys)>ym) // bad approximation here @@ -78,9 +75,8 @@ void MGL_EXPORT mgl_fplot(HMGL gr, const char *eqY, const char *pen, const char } delete eq; - mglData yy,xx; - xx.Set(x,n); free(x); - yy.Set(y,n); free(y); + mglData yy(y,n),xx(x,n); + free(x); free(y); mgl_plot_xy(gr,&xx,&yy,pen,0); } //----------------------------------------------------------------------------- @@ -98,10 +94,8 @@ void MGL_EXPORT mgl_fplot_xyz(HMGL gr, const char *eqX, const char *eqY, const c ey = new mglFormula(eqY ? eqY : "0"); ez = new mglFormula(eqZ ? eqZ : "0"); mreal ts, xs, ys, zs, xr, yr, zr, xm=fabs(gr->Max.x - gr->Min.x)/1000, ym=fabs(gr->Max.y - gr->Min.y)/1000, zm=fabs(gr->Max.z - gr->Min.z)/1000; -#pragma omp parallel for for(long i=0;iStop) continue; t[i] = i/(n-1.); x[i] = ex->Calc(0,0,t[i]); y[i] = ey->Calc(0,0,t[i]); @@ -110,7 +104,7 @@ void MGL_EXPORT mgl_fplot_xyz(HMGL gr, const char *eqX, const char *eqY, const c for(long i=0;iStop) + if((i&0xfff)==0 && gr->NeedStop()) { free(x); free(y); free(z); free(t); delete ex; delete ey; delete ez; return; @@ -135,8 +129,7 @@ void MGL_EXPORT mgl_fplot_xyz(HMGL gr, const char *eqX, const char *eqY, const c } delete ex; delete ey; delete ez; - mglData xx,yy,zz; - xx.Set(x,n); yy.Set(y,n); zz.Set(z,n); + mglData xx(x,n),yy(y,n),zz(z,n); free(x); free(y); free(z); free(t); mgl_plot_xyz(gr,&xx,&yy,&zz,pen,0); } @@ -169,11 +162,9 @@ void MGL_EXPORT mgl_radar(HMGL gr, HCDT a, const char *pen, const char *opt) mreal m=a->Minimal(), r=gr->SaveState(opt); if(mgl_isnan(r) || r<0) r = m<0 ? -m:0; mreal *co=new mreal[2*n]; -#pragma omp parallel for for(long i=0;iv(i,j); @@ -195,7 +186,6 @@ void MGL_EXPORT mgl_radar(HMGL gr, HCDT a, const char *pen, const char *opt) if(r>0) { x.Create(101); y.Create(101); -#pragma omp parallel for for(long i=0;i<91;i++) { x.a[i]=r*mgl_cos[(4*i)%360]; y.a[i]=r*mgl_cos[(270+4*i)%360]; } mgl_plot_xy(gr,&x,&y,"k",0); @@ -233,10 +223,8 @@ void MGL_EXPORT mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT if(mglchr(pen,'^')) dv = 0; if(mglchr(pen,'>')) dv = -1; mreal zm = gr->AdjustZMin(); -#pragma omp parallel for for(long i=0;iStop) continue; mreal m1=v1->v(i), m2 = v2->v(i), xx = x->v(i); mreal d = iv(i+1)-xx : xx-x->v(i-1); mreal x1 = xx + d/2*(dv-gr->BarWidth); @@ -264,7 +252,7 @@ void MGL_EXPORT mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT void MGL_EXPORT mgl_candle_yv(HMGL gr, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt) { gr->SaveState(opt); - mglData x(v1->GetNx()+1); + mglDataV x(v1->GetNx()+1); x.Fill(gr->Min.x,gr->Max.x); mgl_candle_xyv(gr,&x,v1,v2,y1,y2,pen,0); } @@ -296,29 +284,42 @@ void MGL_EXPORT mgl_candle_(uintptr_t *gr, uintptr_t *y, uintptr_t *y1, uintptr_ // Plot series // //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_mark(HMGL gr, double x, double y, double z,const char *mark); void MGL_EXPORT mgl_plot_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt) { - long j,m,mx,my,mz,n=y->GetNx(),pal; + static int cgid=1; + long n=y->GetNx(),pal; + if(n<2 && !mgl_check_dim0(gr,x,y,z,0,"Plot")) + { + gr->StartGroup("Plot",cgid++); + gr->SaveState(opt); + + char mk = gr->SetPenPal(pen); + if(mk) + { + long k = gr->AddPnt(mglPoint(x->v(0),y->v(0),z->v(0)),gr->CDef,mglPoint(NAN),-1,3); + gr->mark_plot(k,mk,gr->GetPenWidth()); gr->AddActive(k); + } + gr->EndGroup(); return; + } if(mgl_check_dim1(gr,x,y,z,0,"Plot")) return; - static int cgid=1; gr->StartGroup("Plot",cgid++); + gr->StartGroup("Plot",cgid++); gr->SaveState(opt); - m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; + long m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); - bool t1,t2,t3; mglPoint p1,nn,p2,pt; long n1=-1,n2=-1,n3=-1; bool sh = mglchr(pen,'!'); - for(j=0;jGetNy() ? j:0; my = jGetNy() ? j:0; - mz = jGetNy() ? j:0; gr->NextColor(pal); - t1 = t2 = false; - register long i; - for(i=0;iNeedStop()) break; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0, mz = jGetNy() ? j:0; + gr->NextColor(pal); + bool t1 = false, t2 = false; + for(long i=0;iStop) return; if(i>0) { n2=n1; p2 = p1; t2=t1; } p1 = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz)); mreal c = sh ? gr->NextColor(pal,i):gr->CDef; @@ -340,7 +341,7 @@ void MGL_EXPORT mgl_plot_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c pt.x = p1.x*ii+p2.x*(1-ii); pt.y = p1.y*ii+p2.y*(1-ii); pt.z = p1.z*ii+p2.z*(1-ii); p=pt; - t3 = gr->ScalePoint(gr->GetB(),p,q,false); + bool t3 = gr->ScalePoint(gr->GetB(),p,q,false); if((t1 && t3) || (t2 && !t3)) i2 = ii; else i1 = ii; } while(fabs(i2-i1)>1e-3); @@ -356,8 +357,7 @@ void MGL_EXPORT mgl_plot_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c void MGL_EXPORT mgl_plot_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) { gr->SaveState(opt); - mglData z(y->GetNx()); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV z(y->GetNx()); z.Fill(gr->AdjustZMin()); mgl_plot_xyz(gr,x,y,&z,pen,0); } //----------------------------------------------------------------------------- @@ -366,9 +366,8 @@ void MGL_EXPORT mgl_plot(HMGL gr, HCDT y, const char *pen, const char *opt) register long n=y->GetNx(); if(n<2) { gr->SetWarn(mglWarnLow,"Plot"); return; } gr->SaveState(opt); - mglData x(n), z(n); - x.Fill(gr->Min.x,gr->Max.x); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV x(n), z(n); + x.Fill(gr->Min.x,gr->Max.x); z.Fill(gr->AdjustZMin()); mgl_plot_xyz(gr,&x,y,&z,pen,0); } //----------------------------------------------------------------------------- @@ -393,7 +392,7 @@ void MGL_EXPORT mgl_plot_(uintptr_t *gr, uintptr_t *y, const char *pen, const ch //----------------------------------------------------------------------------- void MGL_EXPORT mgl_tens_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *pen, const char *opt) { - long j,m,mx,my,mz,mc,n=y->GetNx(), pal; + long m,n=y->GetNx(), pal; if(mgl_check_dim1(gr,x,y,z,0,"Tens")) return; gr->SaveState(opt); @@ -401,19 +400,18 @@ void MGL_EXPORT mgl_tens_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; char mk=gr->SetPenPal(pen, &pal); gr->Reserve(2*n*m); long ss=gr->AddTexture(pen); - bool t1,t2,t3; mglPoint p1,p2,pt,nn; long n1=-1,n2=-1,n3=-1; - for(j=0;jGetNy() ? j:0; my = jGetNy() ? j:0; - mz = jGetNy() ? j:0; mc = jGetNy() ? j:0; + if(gr->NeedStop()) break; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; + long mz = jGetNy() ? j:0, mc = jGetNy() ? j:0; register long i; - t1 = t2 = false; + bool t1 = false, t2 = false; for(i=0;iStop) return; if(i>0) { n2=n1; p2=p1; t2=t1; } p1 = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz), c->v(i,mc)); n1 = gr->AddPnt(p1,gr->GetC(ss,p1.c)); t1 = n1>=0; @@ -435,7 +433,7 @@ void MGL_EXPORT mgl_tens_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char pt.y = p1.y*ii+p2.y*(1-ii); pt.z = p1.z*ii+p2.z*(1-ii); p=pt; pt.c = p1.c*ii+p2.c*(1-ii); - t3 = gr->ScalePoint(gr->GetB(),p,q,false); + bool t3 = gr->ScalePoint(gr->GetB(),p,q,false); if((t1 && t3) || (t2 && !t3)) i2 = ii; else i1 = ii; } while(fabs(i2-i1)>1e-3); @@ -451,8 +449,7 @@ void MGL_EXPORT mgl_tens_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char void MGL_EXPORT mgl_tens_xy(HMGL gr, HCDT x, HCDT y, HCDT c, const char *pen, const char *opt) { gr->SaveState(opt); - mglData z(y->GetNx()); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV z(y->GetNx()); z.Fill(gr->AdjustZMin()); mgl_tens_xyz(gr,x,y,&z,c,pen,0); } //----------------------------------------------------------------------------- @@ -461,9 +458,8 @@ void MGL_EXPORT mgl_tens(HMGL gr, HCDT y, HCDT c, const char *pen, const char *o register long n=y->GetNx(); if(n<2) { gr->SetWarn(mglWarnLow,"Tens"); return; } gr->SaveState(opt); - mglData x(n), z(n); - x.Fill(gr->Min.x,gr->Max.x); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV x(n), z(n); + x.Fill(gr->Min.x,gr->Max.x); z.Fill(gr->AdjustZMin()); mgl_tens_xyz(gr,&x,y,&z,c,pen,0); } //----------------------------------------------------------------------------- @@ -488,7 +484,7 @@ void MGL_EXPORT mgl_tens_(uintptr_t *gr, uintptr_t *y, uintptr_t *c, const char //----------------------------------------------------------------------------- void MGL_EXPORT mgl_area_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt) { - long i,j,n=y->GetNx(),m,mx,my,mz,pal; + long n=y->GetNx(),m,pal; if(mgl_check_dim1(gr,x,y,z,0,"Area")) return; gr->SaveState(opt); @@ -500,22 +496,21 @@ void MGL_EXPORT mgl_area_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c mreal z0=gr->GetOrgZ('x'); mreal c1,c2; mglPoint p1,p2,p3,p4,nn; - long n1,n2,n3,n4; gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); -// long s=gr->AddTexture(pen,1); - for(j=0;jNeedStop()) break; c2=c1=gr->NextColor(pal); if(gr->GetNumPal(pal)==2*m && !sh) c2 = gr->NextColor(pal); - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; mz = jGetNy() ? j:0; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0, mz = jGetNy() ? j:0; nn = mglPoint(-y->dvx(0,my),x->dvx(0,mx)); mglPoint p = mglPoint(x->v(0,mx),y->v(0,my),z->v(0,mz)); - n1 = gr->AddPnt(p,c1,nn,-1,11); p.z = z0; n2 = gr->AddPnt(p,c2,nn,-1,11); - for(i=1;iAddPnt(p,c1,nn,-1,11); p.z = z0; + long n2 = gr->AddPnt(p,c2,nn,-1,11); + for(long i=1;iStop) return; - n3=n1; n4=n2; + long n3=n1, n4=n2; nn = mglPoint(-y->dvx(i,my),x->dvx(i,mx)); p = mglPoint(x->v(i,mx),y->v(i,my),z->v(i,mz)); if(sh) c2=c1=gr->NextColor(pal,i); @@ -533,34 +528,34 @@ void MGL_EXPORT mgl_area_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c //----------------------------------------------------------------------------- void MGL_EXPORT mgl_area_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) { - long i,j,n=y->GetNx(),m=y->GetNy(),mx,my,pal; + long n=y->GetNx(),m=y->GetNy(),pal; if(mgl_check_dim1(gr,x,y,0,0,"Area")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Curve",cgid++); mreal zm = gr->AdjustZMin(); - mreal y0=gr->GetOrgY('x'), z0; + mreal y0=gr->GetOrgY('x'); mreal c1,c2; mglPoint nn=mglPoint(0,0,1); - long n1,n2,n3,n4; bool sh = mglchr(pen,'!'); bool wire = mglchr(pen,'#'); gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); // long s=gr->AddTexture(pen,1); - for(j=0;jNeedStop()) break; c2=c1=gr->NextColor(pal); if(gr->GetNumPal(pal)==2*m && !sh) c2=gr->NextColor(pal); - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; - z0 = zm + (m-1-j)*(gr->Max.z-zm)/m; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; + mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m; mglPoint p = mglPoint(x->v(0,mx),y->v(0,my),z0); - n1 = gr->AddPnt(p,c1,nn,-1,11); p.y = y0; n2 = gr->AddPnt(p,c2,nn,-1,11); - for(i=1;iAddPnt(p,c1,nn,-1,11); p.y = y0; + long n2 = gr->AddPnt(p,c2,nn,-1,11); + for(long i=1;iStop) return; - n3=n1; n4=n2; + long n3=n1, n4=n2; p = mglPoint(x->v(i,mx),y->v(i,my),z0); if(sh) c2=c1=gr->NextColor(pal,i); n1 = gr->AddPnt(p,c1,nn,-1,11); p.y = y0; n2 = gr->AddPnt(p,c2,nn,-1,11); @@ -578,8 +573,7 @@ void MGL_EXPORT mgl_area_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char void MGL_EXPORT mgl_area(HMGL gr, HCDT y, const char *pen, const char *opt) { gr->SaveState(opt); - mglData x(y->GetNx()); - x.Fill(gr->Min.x,gr->Max.x); + mglDataV x(y->GetNx()); x.Fill(gr->Min.x,gr->Max.x); mgl_area_xy(gr,&x,y,pen,0); } //----------------------------------------------------------------------------- @@ -604,7 +598,7 @@ void MGL_EXPORT mgl_area_(uintptr_t *gr, uintptr_t *y, const char *pen, const ch //----------------------------------------------------------------------------- void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT y2, HCDT z2, const char *pen, const char *opt) { - long i,j, n=y1->GetNx(), m, mx, my, mz, pal; + long n=y1->GetNx(), m, pal; if(mgl_check_dim1(gr,x1,y1,z1,0,"Region")) return; if(mgl_check_dim1(gr,x1,x2,y2,z2,"Region")) return; m = x1->GetNy() > y1->GetNy() ? x1->GetNy() : y1->GetNy(); m = z1->GetNy() > m ? z1->GetNy() : m; @@ -618,28 +612,25 @@ void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT static int cgid=1; gr->StartGroup("Region",cgid++); mreal c1,c2; mglPoint nn=mglPoint(0,0,1); - long n1,n2,n3,n4; mreal zm = gr->AdjustZMin(); // bool inside = (mglchr(pen,'i')); // NOTE: check if 'i' is free (used here for inside flag) bool sh = mglchr(pen,'!'); gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); -// long s=gr->AddTexture(pen,1); - for(j=0;jNeedStop()) break; c2=c1=gr->NextColor(pal); if(gr->GetNumPal(pal)==2*m && !sh) c2=gr->NextColor(pal); - mx = jGetNy() ? j:0; - my = jGetNy() ? j:0; - mz = (zhave && jGetNy()) ? j:0; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; + long mz = (zhave && jGetNy()) ? j:0; mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m; - n1 = gr->AddPnt(mglPoint(x1->v(0,mx),y1->v(0,my),zhave?z1->v(0,mz):z0),c1,nn,-1,11); - n2 = gr->AddPnt(mglPoint(x2->v(0,mx),y2->v(0,my),zhave?z2->v(0,mz):z0),c2,nn,-1,11); - for(i=1;iAddPnt(mglPoint(x1->v(0,mx),y1->v(0,my),zhave?z1->v(0,mz):z0),c1,nn,-1,11); + long n2 = gr->AddPnt(mglPoint(x2->v(0,mx),y2->v(0,my),zhave?z2->v(0,mz):z0),c2,nn,-1,11); + for(long i=1;iStop) return; - n3=n1; n4=n2; + long n3=n1, n4=n2; if(sh) c2=c1=gr->NextColor(pal,i); n1 = gr->AddPnt(mglPoint(x1->v(i,mx),y1->v(i,my),zhave?z1->v(i,mz):z0),c1,nn,-1,11); n2 = gr->AddPnt(mglPoint(x2->v(i,mx),y2->v(i,my),zhave?z2->v(i,mz):z0),c2,nn,-1,11); @@ -651,7 +642,7 @@ void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT //----------------------------------------------------------------------------- void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen, const char *opt) { - long i,j, n=y1->GetNx(), m=y1->GetNy(), mx, pal; + long n=y1->GetNx(), m=y1->GetNy(), pal; if(mgl_check_dim1(gr,x,y1,y2,0,"Region")) return; if(y2->GetNy()!=m) { gr->SetWarn(mglWarnDim,"Region"); return; } @@ -659,28 +650,27 @@ void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen static int cgid=1; gr->StartGroup("Region",cgid++); mreal c1,c2; mglPoint nn=mglPoint(0,0,1); - long n1,n2,n3,n4; - mreal xx,f1,f2,f3,f4; mreal zm = gr->AdjustZMin(); bool inside = (mglchr(pen,'i')); // NOTE: check if 'i' is free (used here for inside flag) bool sh = mglchr(pen,'!'); gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); // long s=gr->AddTexture(pen,1); - for(j=0;jNeedStop()) break; c2=c1=gr->NextColor(pal); if(gr->GetNumPal(pal)==2*m && !sh) c2=gr->NextColor(pal); - mx = jGetNy() ? j:0; + long mx = jGetNy() ? j:0; mreal z0 = zm + (m-1-j)*(gr->Max.z-zm)/m; - f1 = y1->v(0,j); f2 = y2->v(0,j); xx = x->v(0,mx); - n1 = gr->AddPnt(mglPoint(xx,f1,z0),c1,nn,-1,11); - n2 = gr->AddPnt(mglPoint(xx,f2,z0),c2,nn,-1,11); - for(i=1;iv(0,j), f2 = y2->v(0,j), xx = x->v(0,mx); + long n1 = gr->AddPnt(mglPoint(xx,f1,z0),c1,nn,-1,11); + long n2 = gr->AddPnt(mglPoint(xx,f2,z0),c2,nn,-1,11); + for(long i=1;iStop) return; - n3=n1; n4=n2; f3=f1; f4=f2; + long n3=n1, n4=n2; + mreal f3=f1, f4=f2; f1 = y1->v(i,j); f2 = y2->v(i,j); xx = x->v(i,mx); if(sh) c2=c1=gr->NextColor(pal,i); n1 = gr->AddPnt(mglPoint(xx,f1,z0),c1,nn,-1,11); @@ -694,8 +684,7 @@ void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen void MGL_EXPORT mgl_region(HMGL gr, HCDT y1, HCDT y2, const char *pen, const char *opt) { gr->SaveState(opt); - mglData x(y1->GetNx()); - x.Fill(gr->Min.x, gr->Max.x); + mglDataV x(y1->GetNx()); x.Fill(gr->Min.x, gr->Max.x); mgl_region_xy(gr,&x,y1,y2,pen,0); } //----------------------------------------------------------------------------- @@ -720,7 +709,7 @@ void MGL_EXPORT mgl_region_(uintptr_t *gr, uintptr_t *y1, uintptr_t *y2, const c //----------------------------------------------------------------------------- void MGL_EXPORT mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt) { - long i,j,m,mx,my,mz,n=y->GetNx(), pal; + long m,n=y->GetNx(), pal; if(mgl_check_dim1(gr,x,y,z,0,"Step")) return; gr->SaveState(opt); @@ -729,18 +718,17 @@ void MGL_EXPORT mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c bool sh = mglchr(pen,'!'); char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); - long n1,n2; mglPoint p; - for(j=0;jGetNy() ? j:0; my = jGetNy() ? j:0; - mz = jGetNy() ? j:0; gr->NextColor(pal); - n1 = gr->AddPnt(mglPoint(x->v(0,mx), y->v(0,my), z->v(0,mz))); + if(gr->NeedStop()) break; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0, mz = jGetNy() ? j:0; + gr->NextColor(pal); + long n1 = gr->AddPnt(mglPoint(x->v(0,mx), y->v(0,my), z->v(0,mz))); if(mk) gr->mark_plot(n1,mk); - for(i=1;iStop) return; - n2 = n1; // horizontal + long n2 = n1; // horizontal p = mglPoint(x->v(i,mx), y->v(i,my), z->v(i-1,mz)); mreal c = sh ? gr->NextColor(pal,i):gr->CDef; n1 = gr->AddPnt(p,c); gr->line_plot(n1,n2); @@ -758,7 +746,7 @@ void MGL_EXPORT mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c //----------------------------------------------------------------------------- void MGL_EXPORT mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) { - long i,j,m,mx,my,n=y->GetNx(), pal; + long m,n=y->GetNx(), pal; if(mgl_check_dim1(gr,x,y,0,0,"Step")) return; gr->SaveState(opt); @@ -768,18 +756,17 @@ void MGL_EXPORT mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char mreal zVal =gr->AdjustZMin(); char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); - long n1,n2; mglPoint p; - for(j=0;jGetNy() ? j:0; my = jGetNy() ? j:0; + if(gr->NeedStop()) break; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; gr->NextColor(pal); - n1 = gr->AddPnt(mglPoint(x->v(0,mx), y->v(0,my), zVal)); + long n1 = gr->AddPnt(mglPoint(x->v(0,mx), y->v(0,my), zVal)); if(mk) gr->mark_plot(n1,mk); - for(i=1;iStop) return; - n2 = n1; // horizontal + long n2 = n1; // horizontal p = mglPoint(x->v(i,mx), y->v(i-1,my), zVal); mreal c = sh ? gr->NextColor(pal,i):gr->CDef; n1 = gr->AddPnt(p,c); gr->line_plot(n1,n2); @@ -798,8 +785,7 @@ void MGL_EXPORT mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char void MGL_EXPORT mgl_step(HMGL gr, HCDT y, const char *pen, const char *opt) { gr->SaveState(opt); - mglData x(y->GetNx()); - x.Fill(gr->Min.x,gr->Max.x); + mglDataV x(y->GetNx()); x.Fill(gr->Min.x,gr->Max.x); mgl_step_xy(gr,&x,y,pen,0); } //----------------------------------------------------------------------------- @@ -824,7 +810,7 @@ void MGL_EXPORT mgl_step_(uintptr_t *gr, uintptr_t *y, const char *pen, const ch //----------------------------------------------------------------------------- void MGL_EXPORT mgl_stem_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt) { - long m,mx,my,mz,n=y->GetNx(), pal; + long m,n=y->GetNx(), pal; if(mgl_check_dim0(gr,x,y,z,0,"Stem")) return; gr->SaveState(opt); @@ -836,12 +822,11 @@ void MGL_EXPORT mgl_stem_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); for(long j=0;jGetNy() ? j:0; my = jGetNy() ? j:0; - mz = jGetNy() ? j:0; gr->NextColor(pal); -#pragma omp parallel for + if(gr->NeedStop()) break; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0, mz = jGetNy() ? j:0; + gr->NextColor(pal); for(long i=0;iStop) continue; mreal c = sh ? gr->NextColor(pal,i):gr->CDef; long n1 = gr->AddPnt(mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz)),c); if(mk) gr->mark_plot(n1,mk); @@ -854,7 +839,7 @@ void MGL_EXPORT mgl_stem_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c //----------------------------------------------------------------------------- void MGL_EXPORT mgl_stem_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) { - long m,mx,my,n=y->GetNx(), pal; + long m,n=y->GetNx(), pal; if(mgl_check_dim0(gr,x,y,0,0,"Stem")) return; gr->SaveState(opt); @@ -866,12 +851,11 @@ void MGL_EXPORT mgl_stem_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char char mk=gr->SetPenPal(pen,&pal); gr->Reserve(2*n*m); for(long j=0;jGetNy() ? j:0; my = jGetNy() ? j:0; + if(gr->NeedStop()) break; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; gr->NextColor(pal); -#pragma omp parallel for for(long i=0;iStop) continue; mreal vv = x->v(i,mx); mreal c = sh ? gr->NextColor(pal,i):gr->CDef; long n1 = gr->AddPnt(mglPoint(vv, y->v(i,my), zVal),c); @@ -886,8 +870,7 @@ void MGL_EXPORT mgl_stem_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char void MGL_EXPORT mgl_stem(HMGL gr, HCDT y, const char *pen, const char *opt) { gr->SaveState(opt); - mglData x(y->GetNx()); - x.Fill(gr->Min.x,gr->Max.x); + mglDataV x(y->GetNx()); x.Fill(gr->Min.x,gr->Max.x); mgl_stem_xy(gr,&x,y,pen,0); } //----------------------------------------------------------------------------- @@ -912,7 +895,7 @@ void MGL_EXPORT mgl_stem_(uintptr_t *gr, uintptr_t *y, const char *pen, const ch //----------------------------------------------------------------------------- void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt) { - long m,mx,my,mz,n=z->GetNx(), pal,nx=x->GetNx(),ny=y->GetNx(); + long m,n=z->GetNx(), pal,nx=x->GetNx(),ny=y->GetNx(); if(mgl_check_dim1(gr,x,z,y,0,"Bars",true)) return; gr->SaveState(opt); @@ -935,14 +918,13 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c gr->Reserve(4*n*m); for(long j=0;jNeedStop()) break; c2=c1=gr->NextColor(pal); if(gr->GetNumPal(pal)==2*m && !sh) c2 = gr->NextColor(pal); - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; mz = jGetNy() ? j:0; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0, mz = jGetNy() ? j:0; zp = z0 = gr->GetOrgZ('x'); -#pragma omp parallel for ordered for(long i=0;iStop) continue; if(sh) c2=c1=gr->NextColor(pal,i); mreal vv = x->v(i,mx), d = iv(i+1,mx)-vv : vv-x->v(i-1,mx), zz; mreal x1 = vv + d/2*(dv-gr->BarWidth), x2 = x1 + gr->BarWidth*d; @@ -955,11 +937,8 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c y2 = (y2-y1)/m; y1 += j*y2; y2 += y1; } else -#pragma omp ordered { z0 = gr->GetOrgZ('x') + dd[i]; dd[i] += zz; zz += z0; } - if(fall) -#pragma omp ordered - { z0 = zp; zz += z0; zp = zz; } + if(fall) { z0 = zp; zz += z0; zp = zz; } mreal c = vv<0 ? c1 : c2; mglPoint nn = mglPoint(-y->dvx(i,my),x->dvx(i,mx)); @@ -980,7 +959,7 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c //----------------------------------------------------------------------------- void MGL_EXPORT mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) { - long m,mx,my,n=y->GetNx(),nx=x->GetNx(),pal; + long m,n=y->GetNx(),nx=x->GetNx(),pal; if(mgl_check_dim1(gr,x,y,0,0,"Bars",true)) return; gr->SaveState(opt); @@ -1003,14 +982,13 @@ void MGL_EXPORT mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char gr->Reserve(4*n*m); for(long j=0;jNeedStop()) break; c2=c1=gr->NextColor(pal); if(gr->GetNumPal(pal)==2*m && !sh) c2 = gr->NextColor(pal); - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; yp = y0 = gr->GetOrgY('x'); -#pragma omp parallel for ordered for(long i=0;iStop) continue; if(sh) c2=c1=gr->NextColor(pal,i); mreal vv = x->v(i,mx), d = iv(i+1,mx)-vv : vv-x->v(i-1,mx), yy; mreal x1 = vv + d/2*(dv-gr->BarWidth), x2 = x1 + gr->BarWidth*d; @@ -1018,11 +996,8 @@ void MGL_EXPORT mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char if(!above) { x2 = (x2-x1)/m; x1 += j*x2; x2 += x1; } else -#pragma omp ordered { y0 = gr->GetOrgY('x') + dd[i]; dd[i] += yy; yy += y0; } - if(fall) -#pragma omp ordered - { y0 = yp; yy += y0; yp = yy; } + if(fall) { y0 = yp; yy += y0; yp = yy; } mreal c = vv<0 ? c1 : c2; long n1 = gr->AddPnt(mglPoint(x1,yy,zm),c); @@ -1043,8 +1018,7 @@ void MGL_EXPORT mgl_bars_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char void MGL_EXPORT mgl_bars(HMGL gr, HCDT y, const char *pen, const char *opt) { gr->SaveState(opt); - mglData x(y->GetNx()+1); - x.Fill(gr->Min.x,gr->Max.x); + mglDataV x(y->GetNx()+1); x.Fill(gr->Min.x,gr->Max.x); mgl_bars_xy(gr,&x,y,pen,0); } //----------------------------------------------------------------------------- @@ -1069,7 +1043,7 @@ void MGL_EXPORT mgl_bars_(uintptr_t *gr, uintptr_t *y, const char *pen, const ch //----------------------------------------------------------------------------- void MGL_EXPORT mgl_barh_yx(HMGL gr, HCDT y, HCDT v, const char *pen, const char *opt) { - long m,mx,my,n=v->GetNx(),ny=y->GetNx(),pal; + long m,n=v->GetNx(),ny=y->GetNx(),pal; if(mgl_check_dim1(gr,y,v,0,0,"Barh",true)) return; gr->SaveState(opt); @@ -1092,14 +1066,13 @@ void MGL_EXPORT mgl_barh_yx(HMGL gr, HCDT y, HCDT v, const char *pen, const char gr->Reserve(4*n*m); for(long j=0;jNeedStop()) break; c2=c1=gr->NextColor(pal); if(gr->GetNumPal(pal)==2*m && !sh) c2 = gr->NextColor(pal); - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; xp = x0 = gr->GetOrgX('y'); -#pragma omp parallel for ordered for(long i=0;iStop) continue; if(sh) c2=c1=gr->NextColor(pal,i); mreal vv = y->v(i,my), d = iv(i+1,my)-vv : vv-y->v(i-1,my), xx; mreal y1 = vv + d/2*(dv-gr->BarWidth), y2 = y1 + gr->BarWidth*d; @@ -1107,11 +1080,8 @@ void MGL_EXPORT mgl_barh_yx(HMGL gr, HCDT y, HCDT v, const char *pen, const char if(!above) { y2 = (y2-y1)/m; y1 += j*y2; y2 += y1; } else -#pragma omp ordered { x0 = gr->GetOrgX('y') + dd[i]; dd[i] += xx; xx += x0; } - if(fall) -#pragma omp ordered - { x0 = xp; xx += x0; xp = xx; } + if(fall) { x0 = xp; xx += x0; xp = xx; } mreal c = vv<0 ? c1 : c2; long n1 = gr->AddPnt(mglPoint(xx,y1,zm),c); @@ -1132,8 +1102,7 @@ void MGL_EXPORT mgl_barh_yx(HMGL gr, HCDT y, HCDT v, const char *pen, const char void MGL_EXPORT mgl_barh(HMGL gr, HCDT v, const char *pen, const char *opt) { gr->SaveState(opt); - mglData y(v->GetNx()+1); - y.Fill(gr->Min.y,gr->Max.y); + mglDataV y(v->GetNx()+1); y.Fill(gr->Min.y,gr->Max.y); mgl_barh_yx(gr,&y,v,pen,0); } //----------------------------------------------------------------------------- @@ -1169,12 +1138,11 @@ void MGL_EXPORT mgl_ohlc_x(HMGL gr, HCDT x, HCDT open, HCDT high, HCDT low, HCDT gr->SetPenPal(pen,&pal); gr->Reserve(6*n*m); for(long j=0;jNeedStop()) break; cc=gr->NextColor(pal); mx = jGetNy() ? j:0; -#pragma omp parallel for private(vv,dd,x1,x2) for(long i=0;iStop) continue; vv = x->v(i,mx); dd = iv(i+1)-vv : vv-x->v(i-1); x1 = vv + dd/2*(dv-gr->BarWidth); x2 = x1 + gr->BarWidth*dd; x2 = (x2-x1)/m; x1 += j*x2; x2 += x1; vv = (x2+x1)/2; @@ -1200,8 +1168,7 @@ void MGL_EXPORT mgl_ohlc_x(HMGL gr, HCDT x, HCDT open, HCDT high, HCDT low, HCDT void MGL_EXPORT mgl_ohlc(HMGL gr, HCDT open, HCDT high, HCDT low, HCDT close, const char *pen, const char *opt) { gr->SaveState(opt); - mglData x(open->GetNx()+1); - x.Fill(gr->Min.x,gr->Max.x); + mglDataV x(open->GetNx()+1); x.Fill(gr->Min.x,gr->Max.x); mgl_ohlc_x(gr,&x,open,high,low,close,pen,0); } //----------------------------------------------------------------------------- @@ -1239,42 +1206,35 @@ void MGL_EXPORT mgl_boxplot_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const c if(mglchr(pen,'>')) dv = -1; mreal zVal = gr->AdjustZMin(), vv; bool sh = mglchr(pen,'!'); -#pragma omp parallel + mreal *d = new mreal[m]; + for(long i=0;iStop) continue; - register long mm,k,j; - for(mm=j=0;jv(i,j); - if(mgl_isnum(vv)) { d[mm]=vv; mm++; } - } -// if(m==0) { b[i]=NAN; break; } - qsort(d, mm, sizeof(mreal), mgl_cmp_flt); - b[i] = d[0]; b[i+4*n] = d[mm-1]; k = mm/4; - b[i+n] = (mm%4) ? d[k] : (d[k]+d[k-1])/2.; - b[i+2*n] = (mm%2) ? d[mm/2] : (d[mm/2]+d[mm/2-1])/2.; - b[i+3*n] = (mm%4) ? d[mm-k-1] : (d[mm-k-1]+d[mm-k])/2.; + mreal vv = y->v(i,j); + if(mgl_isnum(vv)) { d[mm]=vv; mm++; } } - delete []d; +// if(m==0) { b[i]=NAN; break; } + qsort(d, mm, sizeof(mreal), mgl_cmp_flt); + b[i] = d[0]; b[i+4*n] = d[mm-1]; k = mm/4; + b[i+n] = (mm%4) ? d[k] : (d[k]+d[k-1])/2.; + b[i+2*n] = (mm%2) ? d[mm/2] : (d[mm/2]+d[mm/2-1])/2.; + b[i+3*n] = (mm%4) ? d[mm-k-1] : (d[mm-k-1]+d[mm-k])/2.; } + delete []d; long pal; gr->SetPenPal(pen,&pal); gr->NextColor(pal); gr->Reserve(18*n); -#pragma omp parallel for private(vv,dd,x1,x2) for(long i=0;iStop) continue; vv = x->v(i); dd = iv(i+1)-vv : vv-x->v(i-1); x1 = vv + dd/2*(dv-gr->BarWidth); x2 = x1 + gr->BarWidth*dd; mreal c = sh ? gr->NextColor(pal,i):gr->CDef; register long n1,n2; - // TODO why boxplot fail if I use for() + n1=gr->AddPnt(mglPoint(x1,b[i],zVal),c); // horizontal lines n2=gr->AddPnt(mglPoint(x2,b[i],zVal),c); gr->line_plot(n1,n2); @@ -1311,8 +1271,7 @@ void MGL_EXPORT mgl_boxplot_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const c void MGL_EXPORT mgl_boxplot(HMGL gr, HCDT y, const char *pen, const char *opt) { gr->SaveState(opt); - mglData x(y->GetNx()+1); - x.Fill(gr->Min.x,gr->Max.x); + mglDataV x(y->GetNx()+1); x.Fill(gr->Min.x,gr->Max.x); mgl_boxplot_xy(gr,&x,y,pen,0); } //----------------------------------------------------------------------------- @@ -1332,7 +1291,7 @@ void MGL_EXPORT mgl_boxplot_(uintptr_t *gr, uintptr_t *y, const char *pen, const //----------------------------------------------------------------------------- void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const char *pen, const char *opt) { - long m,mx,my,m1,m2,n=ey->GetNx(),pal; + long m,n=ey->GetNx(),pal; if(mgl_check_dim0(gr,x,y,ey,ex,"Error")) return; gr->SaveState(opt); @@ -1351,57 +1310,50 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c mglPoint q(NAN,NAN); for(long j=0;jStop) return; - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; - m1 = jGetNy() ? j:0; m2 = jGetNy() ? j:0; + if(gr->NeedStop()) break; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; + long m1 = jGetNy() ? j:0,m2 = jGetNy() ? j:0; gr->NextColor(pal); if(ma) { - if(strchr("PXsS",mk)) -#pragma omp parallel for - for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); - mreal c = sh ? gr->NextColor(pal,i):gr->CDef; - long n1 = gr->AddPnt(mglPoint(vx-ve, vy+vf, zVal),c,q,-1,11); - long n2 = gr->AddPnt(mglPoint(vx-ve, vy-vf, zVal),c,q,-1,11); - long n3 = gr->AddPnt(mglPoint(vx+ve, vy+vf, zVal),c,q,-1,11); - long n4 = gr->AddPnt(mglPoint(vx+ve, vy-vf, zVal),c,q,-1,11); - gr->line_plot(n1,n2); gr->line_plot(n1,n3); - gr->line_plot(n4,n2); gr->line_plot(n4,n3); - } - if(strchr("dD",mk)) -#pragma omp parallel for - for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); + mreal c = sh ? gr->NextColor(pal,i):gr->CDef; + long n1 = gr->AddPnt(mglPoint(vx-ve, vy+vf, zVal),c,q,-1,11); + long n2 = gr->AddPnt(mglPoint(vx-ve, vy-vf, zVal),c,q,-1,11); + long n3 = gr->AddPnt(mglPoint(vx+ve, vy+vf, zVal),c,q,-1,11); + long n4 = gr->AddPnt(mglPoint(vx+ve, vy-vf, zVal),c,q,-1,11); + gr->line_plot(n1,n2); gr->line_plot(n1,n3); + gr->line_plot(n4,n2); gr->line_plot(n4,n3); + } + if(strchr("dD",mk)) for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); + mreal c = sh ? gr->NextColor(pal,i):gr->CDef; + long n1 = gr->AddPnt(mglPoint(vx, vy+vf, zVal),c,q,-1,11); + long n2 = gr->AddPnt(mglPoint(vx-ve, vy, zVal),c,q,-1,11); + long n3 = gr->AddPnt(mglPoint(vx, vy-vf, zVal),c,q,-1,11); + long n4 = gr->AddPnt(mglPoint(vx+ve, vy, zVal),c,q,-1,11); + gr->line_plot(n1,n2); gr->line_plot(n2,n3); + gr->line_plot(n3,n4); gr->line_plot(n4,n1); + } + if(strchr("oOC",mk)) for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); + mreal c = sh ? gr->NextColor(pal,i):gr->CDef; + long n1,n2,k; + for(k=0,n2=-1;k<=40;k++) { - mreal vx=x->v(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); - mreal c = sh ? gr->NextColor(pal,i):gr->CDef; - long n1 = gr->AddPnt(mglPoint(vx, vy+vf, zVal),c,q,-1,11); - long n2 = gr->AddPnt(mglPoint(vx-ve, vy, zVal),c,q,-1,11); - long n3 = gr->AddPnt(mglPoint(vx, vy-vf, zVal),c,q,-1,11); - long n4 = gr->AddPnt(mglPoint(vx+ve, vy, zVal),c,q,-1,11); - gr->line_plot(n1,n2); gr->line_plot(n2,n3); - gr->line_plot(n3,n4); gr->line_plot(n4,n1); - } - if(strchr("oOC",mk)) -#pragma omp parallel for - for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); - mreal c = sh ? gr->NextColor(pal,i):gr->CDef; - long n1,n2,k; - for(k=0,n2=-1;k<=40;k++) - { - n1 = n2; - n2 = gr->AddPnt(mglPoint(vx+ve*mgl_cos[(18*k)%360], - vy+vf*mgl_cos[(270+18*k)%360], zVal),c,q,-1,11); - if(k>0) gr->line_plot(n1,n2); - } + n1 = n2; + n2 = gr->AddPnt(mglPoint(vx+ve*mgl_cos[(18*k)%360], + vy+vf*mgl_cos[(270+18*k)%360], zVal),c,q,-1,11); + if(k>0) gr->line_plot(n1,n2); } + } switch(mk) { case 'P': case '+': -#pragma omp parallel for for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); @@ -1413,7 +1365,6 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c gr->line_plot(n1,n3); gr->line_plot(n2,n4); } break; case 'X': case 'x': -#pragma omp parallel for for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); @@ -1425,7 +1376,6 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c gr->line_plot(n1,n4); gr->line_plot(n2,n3); } break; case 'S': -#pragma omp parallel for for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); @@ -1437,7 +1387,6 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c gr->quad_plot(n1,n2,n3,n4); } break; case 'D': -#pragma omp parallel for for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); @@ -1449,7 +1398,6 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c gr->quad_plot(n1,n4,n2,n3); } break; case 'O': -#pragma omp parallel for for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); @@ -1471,22 +1419,20 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c } } } - else -#pragma omp parallel for - for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); - mreal c = sh ? gr->NextColor(pal,i):gr->CDef; - if(mk) gr->mark_plot(gr->AddPnt(mglPoint(vx,vy,zVal),c), mk); + else for(long i=0;iv(i,mx), ve=ex->v(i,m1), vy=y->v(i,my), vf=ey->v(i,m2); + mreal c = sh ? gr->NextColor(pal,i):gr->CDef; + if(mk) gr->mark_plot(gr->AddPnt(mglPoint(vx,vy,zVal),c), mk); - long n1 = gr->AddPnt(mglPoint(vx, vy+vf, zVal),c,q,-1,11); - long n2 = gr->AddPnt(mglPoint(vx, vy-vf, zVal),c,q,-1,11); - gr->line_plot(n1,n2); gr->arrow_plot(n1,n2,'I'); gr->arrow_plot(n2,n1,'I'); + long n1 = gr->AddPnt(mglPoint(vx, vy+vf, zVal),c,q,-1,11); + long n2 = gr->AddPnt(mglPoint(vx, vy-vf, zVal),c,q,-1,11); + gr->line_plot(n1,n2); gr->arrow_plot(n1,n2,'I'); gr->arrow_plot(n2,n1,'I'); - n1 = gr->AddPnt(mglPoint(vx+ve, vy, zVal),-1,q,c,11); - n2 = gr->AddPnt(mglPoint(vx-ve, vy, zVal),-1,q,c,11); - gr->line_plot(n1,n2); gr->arrow_plot(n1,n2,'I'); gr->arrow_plot(n2,n1,'I'); - } + n1 = gr->AddPnt(mglPoint(vx+ve, vy, zVal),-1,q,c,11); + n2 = gr->AddPnt(mglPoint(vx-ve, vy, zVal),-1,q,c,11); + gr->line_plot(n1,n2); gr->arrow_plot(n1,n2,'I'); gr->arrow_plot(n2,n1,'I'); + } } gr->EndGroup(); } @@ -1494,17 +1440,16 @@ void MGL_EXPORT mgl_error_exy(HMGL gr, HCDT x, HCDT y, HCDT ex, HCDT ey, const c void MGL_EXPORT mgl_error_xy(HMGL gr, HCDT x, HCDT y, HCDT ey, const char *pen, const char *opt) { gr->SaveState(opt); - mglData ex(y->GetNx()); - ex.Fill(NAN,NAN); + mglDataV ex(y->GetNx()); ex.Fill(NAN); mgl_error_exy(gr,x,y,&ex,ey,pen,0); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_error(HMGL gr, HCDT y, HCDT ey, const char *pen, const char *opt) { gr->SaveState(opt); - mglData x(y->GetNx()); - x.Fill(gr->Min.x,gr->Max.x); - mgl_error_xy(gr,&x,y,ey,pen,0); + mglDataV x(y->GetNx()), ex(y->GetNx()); + x.Fill(gr->Min.x,gr->Max.x); ex.Fill(NAN); + mgl_error_exy(gr,&x,y,&ex,ey,pen,0); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_error_(uintptr_t *gr, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int l,int lo) @@ -1534,10 +1479,8 @@ void face_plot(mglBase *gr, mglPoint o, mglPoint d1, mglPoint d2, mreal c, bool d1 = d1/num; d2 = d2/num; long n=num+1, *id=new long[n*n]; gr->Reserve(n*n); -#pragma omp parallel for collapse(2) for(long j=0;jAddPnt(o+d1*i+d2*j,c,nn); -#pragma omp parallel for collapse(2) for(long j=0;jGetNy();j++) { + if(gr->NeedStop()) break; y1 = gr->Min.y + dy*j; for(i=0,ss=0;iv(i,j); if(ss==0) continue; for(cs=0,i=0;iStop) { delete []c; return; } vv = a->v(i,j); dx = vv/ss; cc = c[i%nc]; if(dx==0) continue; x1 = gr->Min.x + (gr->Max.x-gr->Min.x)*cs/ss; dx *= (gr->Max.x-gr->Min.x); @@ -1623,7 +1566,7 @@ void MGL_EXPORT mgl_chart_(uintptr_t *gr, uintptr_t *a, const char *col, const c //----------------------------------------------------------------------------- void MGL_EXPORT mgl_mark_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, const char *opt) { - long j,m,mx,my,mz,mr,n=y->GetNx(),pal; + long m,n=y->GetNx(),pal; if(mgl_check_dim0(gr,x,y,z,r,"Mark")) return; gr->SaveState(opt); @@ -1634,14 +1577,14 @@ void MGL_EXPORT mgl_mark_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char if(mk==0) return; bool sh = mglchr(pen,'!'); - for(j=0;jNeedStop()) break; gr->NextColor(pal); - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; - mz = jGetNy() ? j:0; mr = jGetNy() ? j:0; - for(int i=0;iGetNy() ? j:0, my = jGetNy() ? j:0; + long mz = jGetNy() ? j:0, mr = jGetNy() ? j:0; + for(long i=0;iStop) return; mreal c = sh ? gr->NextColor(pal,i):gr->CDef; gr->mark_plot(gr->AddPnt(mglPoint(x->v(i,mx),y->v(i,my),z->v(i,mz)),c), mk, fabs(r->v(i,mr))); } @@ -1652,8 +1595,7 @@ void MGL_EXPORT mgl_mark_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char void MGL_EXPORT mgl_mark_xy(HMGL gr, HCDT x, HCDT y, HCDT r, const char *pen, const char *opt) { gr->SaveState(opt); - mglData z(y->GetNx()); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV z(y->GetNx()); z.Fill(gr->AdjustZMin()); mgl_mark_xyz(gr,x,y,&z,r,pen,0); } //----------------------------------------------------------------------------- @@ -1661,9 +1603,8 @@ void MGL_EXPORT mgl_mark_y(HMGL gr, HCDT y, HCDT r, const char *pen, const char { register long n=y->GetNx(); gr->SaveState(opt); - mglData x(n), z(n); - x.Fill(gr->Min.x,gr->Max.x); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV x(n), z(n); + x.Fill(gr->Min.x,gr->Max.x); z.Fill(gr->AdjustZMin()); mgl_mark_xyz(gr,&x,y,&z,r,pen,0); } //----------------------------------------------------------------------------- @@ -1689,7 +1630,7 @@ void MGL_EXPORT mgl_mark_y_(uintptr_t *gr, uintptr_t *y, uintptr_t *r, const cha //----------------------------------------------------------------------------- void MGL_EXPORT mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, const char *opt) { - long j,m,mx,my,mz,mr,n=y->GetNx(),pal; + long m,n=y->GetNx(),pal; if(mgl_check_dim1(gr,x,y,z,r,"Tube")) return; gr->SaveState(opt); @@ -1706,11 +1647,12 @@ void MGL_EXPORT mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const cha mglPoint p,l,t,u,q,d; long *nn=new long[2*num]; memset(nn,-1,2*num*sizeof(long)); - for(j=0;jNeedStop()) break; gr->NextColor(pal); - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; - mz = jGetNy() ? j:0; mr = jGetNy() ? j:0; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; + long mz = jGetNy() ? j:0, mr = jGetNy() ? j:0; for(long i=0;idvx(i,mx),y->dvx(i,my),z->dvx(i,mz)); @@ -1720,7 +1662,6 @@ void MGL_EXPORT mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const cha mreal c = sh ? gr->NextColor(pal,i):gr->CDef; for(long k=0;kStop) { delete []nn; return; } register int kk = k*360/(num-1); register float co = mgl_cos[(kk)%360], si = mgl_cos[(270+kk)%360]; p = q + t*(rr*co) + u*(rr*si); @@ -1738,8 +1679,7 @@ void MGL_EXPORT mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const cha void MGL_EXPORT mgl_tube_xyr(HMGL gr, HCDT x, HCDT y, HCDT r, const char *pen, const char *opt) { gr->SaveState(opt); - mglData z(y->GetNx()); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV z(y->GetNx()); z.Fill(gr->AdjustZMin()); mgl_tube_xyzr(gr,x,y,&z,r,pen,0); } //----------------------------------------------------------------------------- @@ -1748,9 +1688,8 @@ void MGL_EXPORT mgl_tube_r(HMGL gr, HCDT y, HCDT r, const char *pen, const char register long n=y->GetNx(); if(n<2) { gr->SetWarn(mglWarnLow,"Tube"); return; } gr->SaveState(opt); - mglData x(n), z(n); - x.Fill(gr->Min.x,gr->Max.x); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV x(n), z(n); + x.Fill(gr->Min.x,gr->Max.x); z.Fill(gr->AdjustZMin()); mgl_tube_xyzr(gr,&x,y,&z,r,pen,0); } //----------------------------------------------------------------------------- @@ -1759,10 +1698,9 @@ void MGL_EXPORT mgl_tube(HMGL gr, HCDT y, double rr, const char *pen, const char register long n=y->GetNx(); if(n<2) { gr->SetWarn(mglWarnLow,"Tube"); return; } gr->SaveState(opt); - mglData x(n), r(n), z(n); + mglDataV x(n), r(n), z(n); x.Fill(gr->Min.x,gr->Max.x); - r.Fill(rr,rr); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + r.Fill(rr); z.Fill(gr->AdjustZMin()); mgl_tube_xyzr(gr,&x,y,&z,&r,pen,0); } //----------------------------------------------------------------------------- @@ -1771,17 +1709,15 @@ void MGL_EXPORT mgl_tube_xy(HMGL gr, HCDT x, HCDT y, double rr, const char *pen, register long n=y->GetNx(); if(n<2) { gr->SetWarn(mglWarnLow,"Tube"); return; } gr->SaveState(opt); - mglData r(n), z(n); - r.Fill(rr,rr); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV r(n), z(n); + r.Fill(rr); z.Fill(gr->AdjustZMin()); mgl_tube_xyzr(gr,x,y,&z,&r,pen,0); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_tube_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, double rr, const char *pen, const char *opt) { gr->SaveState(opt); - mglData r(y->GetNx()); - r.Fill(rr,rr); + mglDataV r(y->GetNx()); r.Fill(rr); mgl_tube_xyzr(gr,x,y,z,&r,pen,0); } //----------------------------------------------------------------------------- @@ -1823,7 +1759,7 @@ void MGL_EXPORT mgl_tube_(uintptr_t *gr, uintptr_t *y, mreal *r, const char *pen //----------------------------------------------------------------------------- void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt) { - long j,m,mx,my,mz,n=y->GetNx(),pal; + long m,n=y->GetNx(),pal; if(mgl_check_dim1(gr,x,y,z,0,"Tape")) return; static int cgid=1; gr->StartGroup("Tape",cgid++); @@ -1837,11 +1773,12 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c if(!xo && !zo) xo = zo = true; mreal c1,c2; - for(j=0;jNeedStop()) break; c2=c1=gr->NextColor(pal); if(gr->GetNumPal(pal)==2*m && !sh) c2 = gr->NextColor(pal); - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; mz = jGetNy() ? j:0; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0, mz = jGetNy() ? j:0; // initial values for normales p2 = mglPoint(x->v(0,mx), y->v(0,my), z->v(0,mz)); l = mglPoint(x->v(1,mx), y->v(1,my), z->v(1,mz)) - p2; l /= mgl_norm(l); @@ -1857,7 +1794,6 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c register long i; for(i=1;iStop) return; p1 = p2; p2 = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz)); l = p2-p1; l /= mgl_norm(l); q1 -= l*(l*q1); q1/= mgl_norm(q1); q2 = (q1^l); @@ -1888,8 +1824,7 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c void MGL_EXPORT mgl_tape_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char *opt) { gr->SaveState(opt); - mglData z(y->GetNx()); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV z(y->GetNx()); z.Fill(gr->AdjustZMin()); mgl_tape_xyz(gr,x,y,&z,pen,0); } //----------------------------------------------------------------------------- @@ -1898,9 +1833,8 @@ void MGL_EXPORT mgl_tape(HMGL gr, HCDT y, const char *pen, const char *opt) register long n=y->GetNx(); if(n<2) { gr->SetWarn(mglWarnLow,"Plot"); return; } gr->SaveState(opt); - mglData x(n), z(n); - x.Fill(gr->Min.x,gr->Max.x); - mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); + mglDataV x(n), z(n); + x.Fill(gr->Min.x,gr->Max.x); z.Fill(gr->AdjustZMin()); mgl_tape_xyz(gr,&x,y,&z,pen,0); } //----------------------------------------------------------------------------- diff --git a/src/prc.cpp b/src/prc.cpp index 74c7fde..f2d2563 100644 --- a/src/prc.cpp +++ b/src/prc.cpp @@ -256,7 +256,7 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/, for(size_t i=0;iGetPrmNum());i++) // collect data for groups // it is rather expensive (extra 4b per primitive) but need for export to 3D { - m = gr->GetPrm(i).id-mmin; + m = gr->GetPrm(i,false).id-mmin; if(m>=0 && mGrp[ng[m]].p.push_back(i); } delete []ng; @@ -373,7 +373,7 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/, file.begingroup(grp.Lbl.c_str(),&grpopt); for(size_t j=0;jGetPrm(prm[j]); + const mglPrim &q=gr->GetPrm(prm[j],false); const double w = (q.w>1)?(q.w*sqrt(gr->FontFactor()/400.)):1; const mglPnt p = gr->GetPnt(q.n1) - p0; @@ -921,7 +921,7 @@ void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char* /*descr*/, // const HPDF_REAL height = dynamic_cast(gr)->GetHeight(); // const HPDF_REAL depth = sqrt(width*height); - const HPDF_Rect rect = {0, 0, width, height}; + const HPDF_Rect rect = {0, 0, HPDF_REAL(width), HPDF_REAL(height)}; HPDF_Doc pdf; HPDF_Page page; diff --git a/src/prim.cpp b/src/prim.cpp index 20f97e5..f9f1481 100644 --- a/src/prim.cpp +++ b/src/prim.cpp @@ -20,6 +20,7 @@ #include "mgl2/canvas.h" #include "mgl2/prim.h" #include "mgl2/data.h" +std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt); //----------------------------------------------------------------------------- // // Mark & Curve series @@ -60,14 +61,12 @@ void MGL_EXPORT mgl_line(HMGL gr, double x1, double y1, double z1, double x2, do gr->SetPenPal(pen); n = (n<2) ? 2 : n; - register long i,k1,k2; - register mreal s; gr->Reserve(n); - k1 = gr->AddPnt(p,gr->CDef,nn,-1,3); gr->AddActive(k1); - for(i=1;iAddPnt(p,gr->CDef,nn,-1,3); gr->AddActive(k1); + for(long i=1;iStop) return; - s = i/mreal(n-1); p = p1*(1-s)+p2*s; k2 = k1; + mreal s = i/mreal(n-1); p = p1*(1-s)+p2*s; + long k2 = k1; k1 = gr->AddPnt(p,gr->CDef,nn,-1,3); gr->line_plot(k2,k1); if(i==1) gr->arrow_plot(k2,k1,gr->Arrow1); @@ -89,14 +88,12 @@ void MGL_EXPORT mgl_curve(HMGL gr, double x1, double y1, double z1, double dx1, n = (n<2) ? 2 : n; gr->SetPenPal(pen); - register long i,k1,k2; - register mreal s; gr->Reserve(n); - k1=gr->AddPnt(p,gr->CDef,nn,-1,3); gr->AddActive(k1); - for(i=1;iAddPnt(p,gr->CDef,nn,-1,3); gr->AddActive(k1); + for(long i=1;iStop) return; - s = i/(n-1.); p = p1+s*(d1+s*(a+s*b)); k2 = k1; + mreal s = i/(n-1.); p = p1+s*(d1+s*(a+s*b)); + long k2 = k1; k1 = gr->AddPnt(p,gr->CDef,nn,-1,3); gr->line_plot(k2,k1); if(i==1) gr->arrow_plot(k2,k1,gr->Arrow1); @@ -215,8 +212,15 @@ void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, do static int cgid=1; gr->StartGroup("Cone",cgid++); mglPoint p1(x1,y1,z1), p2(x2,y2,z2), p,q(NAN,NAN),t(NAN,NAN), d=p2-p1,a,b; a=!d; a.Normalize(); b=d^a; b.Normalize(); - long ss=gr->AddTexture(stl); - mreal c1=gr->GetC(ss,p1.z), c2=gr->GetC(ss,p2.z), dr=r2-r1; + mreal c1,c2,dr=r2-r1; + const char *s; + if((s=strstr(stl,"{&"))!=0) c1 = c2 = atof(s+2); + else + { + register long ss=gr->AddTexture(stl); + c1=gr->GetC(ss,p1.z); + c2=gr->GetC(ss,p2.z); + } long *kk=new long[164],k1=-1,k2=-1; bool edge = mglchr(stl,'@'); bool wire = mglchr(stl,'#'); @@ -233,10 +237,8 @@ void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, do bool refr = n>6; if(refr) t=d; -#pragma omp parallel for firstprivate(p,q) for(long i=0;i<2*n+1;i++) { - if(gr->Stop) continue; register int f = n!=4?(2*i+1)*90/n:45*i; register mreal co = mgl_cos[f%360], si = mgl_cos[(f+270)%360]; p = p1+(r1*co)*a+(r1*si)*b; @@ -247,26 +249,22 @@ void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, do kk[i+2*n+1] = gr->AddPnt(p,c2,q,-1,3); if(edge && !wire) kk[i+123] = gr->AddPnt(p,c2,t,-1,3); } - if(wire) -//#pragma omp parallel for // useless - for(long i=0;i<2*n;i++) - { - gr->line_plot(kk[i],kk[i+1]); - gr->line_plot(kk[i],kk[i+2*n+1]); - gr->line_plot(kk[i+2*n+2],kk[i+1]); - gr->line_plot(kk[i+2*n+2],kk[i+2*n+1]); - } - else -#pragma omp parallel for - for(long i=0;i<2*n;i++) + if(wire) for(long i=0;i<2*n;i++) + { + gr->line_plot(kk[i],kk[i+1]); + gr->line_plot(kk[i],kk[i+2*n+1]); + gr->line_plot(kk[i+2*n+2],kk[i+1]); + gr->line_plot(kk[i+2*n+2],kk[i+2*n+1]); + } + else for(long i=0;i<2*n;i++) + { + gr->quad_plot(kk[i],kk[i+1],kk[i+2*n+1],kk[i+2*n+2]); + if(edge) { - gr->quad_plot(kk[i],kk[i+1],kk[i+2*n+1],kk[i+2*n+2]); - if(edge) - { - gr->trig_plot(k1,kk[i+82],kk[i+83]); - gr->trig_plot(k2,kk[i+123],kk[i+124]); - } + gr->trig_plot(k1,kk[i+82],kk[i+83]); + gr->trig_plot(k2,kk[i+123],kk[i+124]); } + } gr->EndGroup(); delete []kk; } //----------------------------------------------------------------------------- @@ -280,7 +278,7 @@ void MGL_EXPORT mgl_cone_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal //----------------------------------------------------------------------------- void MGL_EXPORT mgl_cones_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt) { - long i=5,j,m,mx,my,mz,n=z->GetNx(),nx=x->GetNx(), nz=z->GetNy(), pal; + long m,n=z->GetNx(),nx=x->GetNx(), nz=z->GetNy(), pal; if(mgl_check_dim1(gr,x,z,y,0,"Cones",true)) return; gr->SaveState(opt); @@ -296,39 +294,40 @@ void MGL_EXPORT mgl_cones_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, if(mglchr(pen,'>')) dv = -1; gr->SetPenPal(pen,&pal); - char c1[8]; memset(c1,0,8); c1[0] ='@'; - char c2[8]; memset(c2,0,8); c2[0] ='@'; - if(wire) { c1[5]=c2[5]='#'; i++; } - if(mglchr(pen,'&')) c1[i]=c2[i]='4'; - else if(mglchr(pen,'4')) c1[i]=c2[i]='4'; - else if(mglchr(pen,'6')) c1[i]=c2[i]='6'; - else if(mglchr(pen,'8')) c1[i]=c2[i]='8'; + std::string cb="@"; + if(wire) cb += '#'; + if(mglchr(pen,'4')) cb+='4'; + else if(mglchr(pen,'6')) cb+='6'; + else if(mglchr(pen,'8')) cb+='8'; + memset(dd,0,2*n*sizeof(mreal)); z0 = gr->GetOrgZ('x'); - for(i=0;iv(i, jv(i, jNextColor(pal); memcpy(c1+1,gr->last_line(),4); + if(gr->NeedStop()) break; + sprintf(buf,"{&%g}",gr->NextColor(pal)); + std::string c1=cb+buf, c2=c1; if(gr->GetNumPal(pal)==2*m) - { gr->NextColor(pal); memcpy(c2+1,gr->last_line(),4); } - else memcpy(c2,c1,8); - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; mz = jNextColor(pal)); c2 = cb+buf; } + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0, mz = jStop) { delete []dd; return; } vx=x->v(i,mx); vy=y->v(i,my); vz=z->v(i,mz); v0=y->v(i,0); v1=iv(i+1,mx):x->v(i-1,mx); d = iBarWidth); // TODO + x1 = vx + d/2*(dv-0.*gr->BarWidth); d *= 0.7*gr->BarWidth; if(above) { zz = j>0?dd[i+n]:z0; dd[i+n] += vz; mgl_cone(gr, x1,v0,zz, x1,v0,dd[i+n], tube?d:d*(dd[i]-zz)/(dd[i]-z0), - tube?d:d*(dd[i]-dd[i+n])/(dd[i]-z0), c1); + tube?d:d*(dd[i]-dd[i+n])/(dd[i]-z0), c1.c_str()); } - else mgl_cone(gr, x1,vy,z0, x1,vy,vz, d,tube?d:0, vz<0?c1:c2); + else mgl_cone(gr, x1,vy,z0, x1,vy,vz, d,tube?d:0, vz<0?c1.c_str():c2.c_str()); } } gr->EndGroup(); delete []dd; @@ -369,10 +368,88 @@ void MGL_EXPORT mgl_cones_(uintptr_t *gr, uintptr_t *y, const char *pen, const c // Ellipse & Rhomb // //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_polygon(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, int n, const char *stl) +{ + if(n<3) return; + long pal=0, n0,n1,n2,np,k1=-1,kp=-1; + static int cgid=1; gr->StartGroup("Polygon",cgid++); + gr->SetPenPal(stl,&pal); + mreal c=gr->NextColor(pal); + mreal k=(gr->GetNumPal(pal)>1)?gr->NextColor(pal):gr->AddTexture('k'); + bool fill = !mglchr(stl,'#'), box = mglchr(stl,'@') || !fill; + if(!fill) k=c; + gr->Reserve(box?2*n+1:n+1); + if(mgl_isnan(z1) || mgl_isnan(z2)) z1=z2=2*gr->Max.z-gr->Min.z; + mglPoint p1(x1,y1,z1), p2(x2,y2,z2), d=p2-p1, u=!d, p,qq; + n0 = gr->AddPnt(p1,c,qq,-1,11); + u = (d.norm()/u.norm())*u; + n1 = np = gr->AddPnt(p2,c,qq,-1,11); + gr->AddActive(n0,0); gr->AddActive(n1,1); + if(box) k1 = kp = gr->CopyNtoC(n1,k); + for(long i=1;iAddPnt(p,c,qq,-1,11); + if(fill) gr->trig_plot(n0,n1,n2); + if(box) + { + long kk = gr->CopyNtoC(n2,k); + gr->line_plot(k1, kk); k1 = kk; + } + n1 = n2; + } + if(fill) gr->trig_plot(n0,n2,np); + if(box) gr->line_plot(k1, kp); + gr->EndGroup(); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_arc_ext(HMGL gr, double x0, double y0, double z0, double xr, double yr, double zr, double x1, double y1, double z1, double a, const char* stl) +{ + long pal=0, n = long(fabs(a)/9+1.5); a *= M_PI/180; + static int cgid=1; gr->StartGroup("Arc",cgid++); + gr->SetPenPal(stl,&pal); + mreal c=gr->NextColor(pal); + gr->Reserve(n+2); + if(mgl_isnan(z0) || mgl_isnan(z1)) z0=z1=2*gr->Max.z-gr->Min.z; + mglPoint p0(x0,y0,z0), p1(x1,y1,z1), d=p1-p0, u=mglPoint(xr,yr,zr)^d, p,qq; + if(u.norm()==0) return; // wrong vector orientation + u = (d.norm()/u.norm())*u; + gr->AddActive(gr->AddPnt(p0,gr->CDef,qq,-1,3),0); + long n1 = gr->AddPnt(p1,c,qq,-1,11); gr->AddActive(n1,1); + for(long i=1;iAddPnt(p,c,qq,-1,11); + if(i==1) gr->arrow_plot(n1,n2,gr->Arrow1); + if(i==n-1) { gr->arrow_plot(n2,n1,gr->Arrow2); gr->AddActive(n2,2); } + gr->line_plot(n1,n2); n1 = n2; + } + gr->EndGroup(); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_arc(HMGL gr, double x0, double y0, double x1, double y1, double a, const char* stl) +{ mgl_arc_ext(gr,x0,y0,NAN,0,0,1,x1,y1,NAN,a,stl); } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_polygon_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, int *n, const char *stl,int l) +{ char *s=new char[l+1]; memcpy(s,stl,l); s[l]=0; + mgl_polygon(_GR_,*x1,*y1,*z1,*x2,*y2,*z2,*n,s); delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_arc_ext_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl,int l) +{ char *s=new char[l+1]; memcpy(s,stl,l); s[l]=0; + mgl_arc_ext(_GR_,*x0,*y0,*z0,*x1,*y1,*z1,*x2,*y2,*z2,*r,s); delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_arc_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *x1, mreal *y1, mreal *a, const char *stl,int l) +{ char *s=new char[l+1]; memcpy(s,stl,l); s[l]=0; + mgl_arc(_GR_,*x0,*y0,*x1,*y1,*a,s); delete []s; } +//----------------------------------------------------------------------------- +// +// Ellipse & Rhomb +// +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl) { const int n = 41; - long pal=0,n0,n1=-1,n2,m1=-1,m2; + long pal=0,n0,n1=-1,m1=-1; static int cgid=1; gr->StartGroup("Ellipse",cgid++); gr->SetPenPal(stl,&pal); mreal c=gr->NextColor(pal), d; @@ -392,12 +469,11 @@ void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2, gr->AddActive(gr->AddPnt(p2,c,q,-1,11),1); for(long i=0;iStop) return; register int t=i*360/(n-1); p = s+v*mgl_cos[t%360]+u*mgl_cos[(270+t)%360]; - n2 = n1; n1 = gr->AddPnt(p,c,q,-1,11); + long n2 = n1; n1 = gr->AddPnt(p,c,q,-1,11); if(i==n/4) gr->AddActive(n1,2); - m2 = m1; m1 = gr->CopyNtoC(n1,k); + long m2 = m1; m1 = gr->CopyNtoC(n1,k); if(i>0) { if(fill) gr->trig_plot(n0,n1,n2); @@ -419,12 +495,12 @@ void MGL_EXPORT mgl_rhomb(HMGL gr, double x1, double y1, double z1, double x2, d if(!fill) k=c; gr->Reserve(8); if(mgl_isnan(z1) || mgl_isnan(z2)) z1=z2=2*gr->Max.z-gr->Min.z; - mglPoint p1(x1,y1,z1), p2(x2,y2,z2), u=mglPoint(0,0,1)^(p1-p2), q=u^(p1-p2), p, s,qq; + mglPoint p1(x1,y1,z1), p2(x2,y2,z2), u=!(p1-p2), p, s,qq; u = (r/u.norm())*u; s = (p1+p2)/2.; - p = p1; q = qq; n1 = gr->AddPnt(p,c,qq,-1,11); - p = s+u;q = qq; n2 = gr->AddPnt(p,b==c?c:k,qq,-1,11); - p = p2; q = qq; n3 = gr->AddPnt(p,b,qq,-1,11); - p = s-u;q = qq; n4 = gr->AddPnt(p,b==c?c:k,qq,-1,11); + p = p1; n1 = gr->AddPnt(p,c,qq,-1,11); + p = s+u; n2 = gr->AddPnt(p,b==c?c:k,qq,-1,11); + p = p2; n3 = gr->AddPnt(p,b,qq,-1,11); + p = s-u; n4 = gr->AddPnt(p,b==c?c:k,qq,-1,11); gr->AddActive(n1,0); gr->AddActive(n2,2); gr->AddActive(n3,1); if(fill) gr->quad_plot(n1,n2,n4,n3); n1 = gr->CopyNtoC(n1,k); n2 = gr->CopyNtoC(n2,k); @@ -471,7 +547,6 @@ void MGL_EXPORT mgl_drop(HMGL gr, mglPoint p, mglPoint q, double r, double c, do for(long i=0;i<=m;i++) for(long j=0;j not for omp { - if(gr->Stop) continue; if(i>0 && iMeshNum>1) { tx=(n-1)/(gr->MeshNum-1); ty=(m-1)/(gr->MeshNum-1); } if(tx<1) tx=1; if(ty<1) ty=1; -#pragma omp parallel + for(long k=0;kGetNz();k++) for(long j=0;jGetNz();k++) for(long j=0;jv(i,j,k)*ax->v(i,j,k)+ay->v(i,j,k)*ay->v(i,j,k)); - xm1 = xm1>ym ? xm1 : ym; - } -#pragma omp critical(max_vec) - {xm = xm>xm1 ? xm:xm1;} + register mreal ym = sqrt(ax->v(i,j,k)*ax->v(i,j,k)+ay->v(i,j,k)*ay->v(i,j,k)); + xm = xm>ym ? xm : ym; } xm = 1./MGL_FEPSILON/(xm==0 ? 1:xm); for(long k=0;kGetNz();k++) { if(ax->GetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1); -//#pragma omp parallel for collapse(2) // gain looks negligible?!? for(long i=0;iStop) continue; + if(gr->NeedStop()) { gr->EndGroup(); return; } register mreal xx=GetX(x,i,j,k).x, yy=GetY(y,i,j,k).x, dd; register mreal dx = iGetNx(); + long m,n=y->GetNx(); if(mgl_check_dim0(gr,x,y,z,r,"TextMark")) return; gr->SaveState(opt); @@ -642,12 +709,11 @@ void MGL_EXPORT mgl_textmarkw_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, cons mglPoint p,q(NAN); for(long j=0;jGetNy() ? j:0; my = jGetNy() ? j:0; - mz = jGetNy() ? j:0; mr = jGetNy() ? j:0; -#pragma omp parallel for private(p) // NOTE this should be useless ?!? + if(gr->NeedStop()) break; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0; + long mz = jGetNy() ? j:0, mr = jGetNy() ? j:0; for(long i=0;iStop) continue; p = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz)); register long k = gr->AddPnt(p,-1,q); gr->text_plot(k, text, fnt, -0.5*fabs(r->v(i,mr))); @@ -726,22 +792,26 @@ void MGL_EXPORT mgl_textmark_(uintptr_t *gr, uintptr_t *y, const char *text, con //----------------------------------------------------------------------------- void MGL_EXPORT mgl_labelw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const wchar_t *text, const char *fnt, const char *opt) { - long m,mx,my,mz,n=y->GetNx(); - if(mgl_check_dim1(gr,x,y,z,0,"Label")) return; + long m,n=y->GetNx(); + if(mgl_check_dim0(gr,x,y,z,0,"Label")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Label",cgid++); m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; mglPoint q(NAN); - wchar_t tmp[32]; + + char fmt[8]="2",ss[2]=" "; + std::string Tstl; + for(const char *s="0123456789";*s;s++) if(mglchr(fnt,*s)) fmt[0] = *s; + for(const char *s="f+E-F";*s;s++) if(mglchr(fnt,*s)) + { ss[0] = *s; strcat(fmt,ss); } for(long j=0;jGetNy() ? j:0; my = jGetNy() ? j:0; mz = jGetNy() ? j:0; -#pragma omp parallel for private(tmp) + if(gr->NeedStop()) break; + long mx = jGetNy() ? j:0, my = jGetNy() ? j:0, mz = jGetNy() ? j:0; for(long i=0;iStop) continue; mreal xx=x->v(i,mx), yy=y->v(i,my), zz=z->v(i,mz); register long kk = gr->AddPnt(mglPoint(xx,yy,zz),-1,q),k,l; std::wstring buf; @@ -749,13 +819,13 @@ void MGL_EXPORT mgl_labelw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const wchar_t *t { if(text[k]!='%' || (k>0 && text[k-1]=='\\')) { buf += text[k]; continue; } - else if(text[k+1]=='%') { buf+='%'; k++; continue; } - else if(text[k+1]=='n') mglprintf(tmp,32,L"%ld",i); - else if(text[k+1]=='x') mglprintf(tmp,32,L"%.2g",xx); - else if(text[k+1]=='y') mglprintf(tmp,32,L"%.2g",yy); - else if(text[k+1]=='z') mglprintf(tmp,32,L"%.2g",zz); - else { buf+='%'; continue; } - buf += tmp; k++; + else if(text[k+1]=='%') buf+=L"%"; + else if(text[k+1]=='n') { wchar_t tmp[32]; mglprintf(tmp,32,L"%ld",i); buf += tmp; } + else if(text[k+1]=='x') buf += mgl_ftoa(xx,fmt); + else if(text[k+1]=='y') buf += mgl_ftoa(yy,fmt); + else if(text[k+1]=='z') buf += mgl_ftoa(zz,fmt); + else { buf+=L"%"; continue; } + k++; } gr->text_plot(kk, buf.c_str(), fnt, -0.7, 0.05); } diff --git a/src/s_hull/s_hull_pro.cpp b/src/s_hull/s_hull_pro.cpp index 4a11f51..2ff4236 100644 --- a/src/s_hull/s_hull_pro.cpp +++ b/src/s_hull/s_hull_pro.cpp @@ -25,11 +25,11 @@ using namespace std; */ -// Global replace int->long by A.Balakin 7 August 2012 -- 64bit version can handle huge data arrays +// Global replace int->long by A.Balakin 21 April 2014 -- 64bit version can handle huge data arrays -void circle_cent2(float r1,float c1, float r2,float c2, float r3,float c3, - float &r,float &c, float &ro2) +void circle_cent2(double r1,double c1, double r2,double c2, double r3,double c3, + double &r,double &c, double &ro2) { /* * function to return the center of a circle and its radius @@ -37,28 +37,28 @@ void circle_cent2(float r1,float c1, float r2,float c2, float r3,float c3, * but will return r0 = -1 if it is. */ - float v1 = 2*(r2-r1), v2 = 2*(c2-c1), v3 = r2*r2 - r1*r1 + c2*c2 - c1*c1; - float v4 = 2*(r3-r1), - v5 = 2*(c3-c1), - v6 = r3*r3 - r1*r1 + c3*c3 - c1*c1, + double a1 = (r1+r2)/2.0; + double a2 = (c1+c2)/2.0; + double b1 = (r3+r2)/2.0; + double b2 = (c3+c2)/2.0; - v7 = v2*v4 - v1*v5; - if( v7 == 0 ) - { - r=0; - c=0; - ro2 = -1; - return; - } + double e2 = r1-r2; + double e1 = -c1+c2; - c = (v4*v3 - v1*v6)/v7; - if( v1 != 0 ) - r = (v3 - c*v2)/v1; - else - r = (v6 - c*v5)/v4; + double q2 = r3-r2; + double q1 = -c3+c2; - ro2 = ( (r-r1)*(r-r1) + (c-c1)*(c-c1) ); + r=0; + c=0; + ro2=-1; + if( e1*-q2 + e2*q1 == 0 ) return; + double beta = (-e2*(b1-a1) + e1*(b2-a2))/( e2*q1-e1*q2); + + r = b1 + q1*beta; + c = b2 + q2*beta; + + ro2 = (r1-r)*(r1-r) + (c1-c)*(c1-c); return; } @@ -78,7 +78,7 @@ long read_Shx(std::vector &pts, char * fname) { char s0[513]; long nump =0; - float p1,p2; + double p1,p2; Shx pt; @@ -105,9 +105,8 @@ long read_Shx(std::vector &pts, char * fname) { copy( line.begin(), line.end(), s0); s0[line.length()] = 0; - long v = sscanf( s0, "%g %g", &p1,&p2); - if( v>0 ) - { + long v = sscanf( s0, "%lg %lg", &p1,&p2); + if( v>0 ) { pt.id = nump; nump++; pt.r = p1; @@ -123,7 +122,7 @@ long read_Shx(std::vector &pts, char * fname) { copy( line.begin(), line.end(), s0); s0[line.length()] = 0; - long v = sscanf( s0, "%g %g", &p1,&p2); + long v = sscanf( s0, "%lg %lg", &p1,&p2); if( v>0 ) { pt.id = nump; @@ -141,7 +140,7 @@ long read_Shx(std::vector &pts, char * fname) { copy( line.begin(), line.end(), s0); s0[line.length()] = 0; - long v = sscanf( s0, "%g %g", &p1,&p2); + long v = sscanf( s0, "%lg %lg", &p1,&p2); if( v>0 ) { pt.id = nump; @@ -222,18 +221,18 @@ long s_hull_pro( std::vector &pts, std::vector &triads) if( nump < 3 ) { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "less than 3 points, aborting " << endl; return(-1); } - float r = pts[0].r; - float c = pts[0].c; + double r = pts[0].r; + double c = pts[0].c; for( long k=0; k &pts, std::vector &triads) sort( pts.begin(), pts.end() ); - float r1 = pts[0].r; - float c1 = pts[0].c; + double r1 = pts[0].r; + double c1 = pts[0].c; - float r2 = pts[1].r; - float c2 = pts[1].c; + double r2 = pts[1].r; + double c2 = pts[1].c; long mid = -1; - float romin2 = 100000000.0, ro2, R=0,C=0; // added by A.Balakin 6 July 2012 -- uninitialised variable + double romin2 = 9.0e20, ro2, R=0,C=0; // added by A.Balakin 21 April 2014 -- uninitialised variable long k=2; while (k &pts, std::vector &triads) if( mid < 0 ) { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "linear structure, aborting " << endl; return(-2); } @@ -287,8 +286,8 @@ long s_hull_pro( std::vector &pts, std::vector &triads) for( long k=0; k &pts, std::vector &triads) pts.insert(pts.begin(), pt1); pts.insert(pts.begin(), pt0); - // long slump [nump]; -// long * slump = new long [nump]; std::vector slump; slump.resize(nump); @@ -325,13 +322,13 @@ long s_hull_pro( std::vector &pts, std::vector &triads) std::vector hull; - r = (pts[0].r + pts[1].r + pts[2].r )/(float) 3.0; - c = (pts[0].c + pts[1].c + pts[2].c )/(float) 3.0; + r = (pts[0].r + pts[1].r + pts[2].r )/(double) 3.0; + c = (pts[0].c + pts[1].c + pts[2].c )/(double) 3.0; - float dr0 = pts[0].r - r, dc0 = pts[0].c - c; - float tr01 = pts[1].r - pts[0].r, tc01 = pts[1].c - pts[0].c; + double dr0 = pts[0].r - r, dc0 = pts[0].c - c; + double tr01 = pts[1].r - pts[0].r, tc01 = pts[1].c - pts[0].c; - float df = -tr01* dc0 + tc01*dr0; + double df = -tr01* dc0 + tc01*dr0; if( df < 0 ) // [ 0 1 2 ] { pt0.tr = pt1.r-pt0.r; @@ -386,9 +383,9 @@ long s_hull_pro( std::vector &pts, std::vector &triads) // and creating triangles.... // that will need to be flipped. - float dr, dc, rx,cx; + double dr, dc, rx,cx; Shx ptx; - long numt=0; // added by A.Balakin 6 July 2012 -- uninitialised variable + long numt=0; // added by A.Balakin 21 April 2014 -- uninitialised variable for( long k=3; k &pts, std::vector &triads) ptx.c = cx; ptx.id = pts[k].id; - long numh = (long) hull.size()/*, numh_old = numh*/; // commented by A.Balakin 6 July 2012 -- unused variable + long numh = (long) hull.size()/*, numh_old = numh*/; // commented by A.Balakin 21 April 2014 -- unused variable dr = rx- hull[0].r; dc = cx- hull[0].c; // outwards pointing from hull[0] to pt. @@ -406,10 +403,10 @@ long s_hull_pro( std::vector &pts, std::vector &triads) long hidx; // new hull point location within hull..... - float df = -dc* hull[0].tr + dr*hull[0].tc; // visibility test vector. + double df = -dc* hull[0].tr + dr*hull[0].tc; // visibility test vector. if( df < 0 ) // starting with a visible hull facet !!! { -// long e1 = 1, e2 = numh; // commented by A.Balakin 6 July 2012 -- unused variable +// long e1 = 1, e2 = numh; // commented by A.Balakin 21 April 2014 -- unused variable hidx = 0; // check to see if segment numh is also visible @@ -678,17 +675,17 @@ long s_hull_pro( std::vector &pts, std::vector &triads) } -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "of triangles " << triads.size() << " to be flipped. "<< endl; // write_Triads(triads, "tris0.mat"); - std::set ids, ids2; + std::set ids; long tf = T_flip_pro( pts, triads, slump, numt, 0, ids); if( tf < 0 ) { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "cannot triangualte this set " << endl; return(-3); } @@ -704,7 +701,25 @@ long s_hull_pro( std::vector &pts, std::vector &triads) nit ++; if( tf < 0 ) { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything +// cerr << "cannot triangualte this set " << endl; + return(-4); + } + } + + ids.clear(); + nits = T_flip_edge( pts, triads, slump, numt, 0, ids); + nit=0; + + while( nits > 0 && nit < 100) { + + tf = T_flip_pro_idx( pts, triads, slump, ids); + nits = (long) ids.size(); + // cerr << "flipping cycle " << nit << " active triangles " << nits << endl; + nit ++; + if( tf < 0 ) + { +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "cannot triangualte this set " << endl; return(-4); } @@ -713,8 +728,8 @@ long s_hull_pro( std::vector &pts, std::vector &triads) } -void circle_cent4(float r1,float c1, float r2,float c2, float r3,float c3, - float &r,float &c, float &ro2) +void circle_cent4(double r1,double c1, double r2,double c2, double r3,double c3, + double &r,double &c, double &ro2) { /* * function to return the center of a circle and its radius @@ -743,9 +758,9 @@ void circle_cent4(float r1,float c1, float r2,float c2, float r3,float c3, else rd = (v6 - c*v5)/v4; - ro2 = (float) ( (rd-r1)*(rd-r1) + (cd-c1)*(cd-c1) ); - r = (float) rd; - c = (float) cd; + ro2 = (double) ( (rd-r1)*(rd-r1) + (cd-c1)*(cd-c1) ); + r = (double) rd; + c = (double) cd; return; } @@ -756,16 +771,13 @@ void circle_cent4(float r1,float c1, float r2,float c2, float r3,float c3, erase duplicate points, do not change point ids. */ -// Change return type to size_t to be 64 bit compatible -- by A.Balakin 7 August 2012 -size_t de_duplicate( std::vector &pts, std::vector &outx ) -{ +long de_duplicate( std::vector &pts, std::vector &outx ) { - size_t nump = pts.size(); + long nump = (long) pts.size(); std::vector dpx; Dupex d; - for( size_t k=0; k &pts, std::vector &outx ) sort(dpx.begin(), dpx.end()); - for( size_t k=0; k &pts, std::vector &outx ) sort(outx.begin(), outx.end()); - size_t nx = outx.size(); - for( size_t k=nx; k>0; k--) - { - pts.erase(pts.begin()+outx[k-1]); + long nx = (long) outx.size(); + for( long k=nx-1; k>=0; k--) { + pts.erase(pts.begin()+outx[k]); } return(nx); @@ -814,7 +824,7 @@ size_t de_duplicate( std::vector &pts, std::vector &outx ) long T_flip_pro( std::vector &pts, std::vector &triads, std::vector &slump, long numt, long start, std::set &ids) { - float r3,c3; + double r3,c3; long pa,pb,pc, pd, D, L1, L2, L3, L4, T2; Triad tx, tx2; @@ -888,11 +898,16 @@ long T_flip_pro( std::vector &pts, std::vector &triads, std::vector< } else { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "triangle flipping error. " << t << endl; return(-5); } + +// Commented by A.Balakin 21 April 2014 -- unused variable +// if( pd < 0 || pd > 100) +// long dfx = 9; + r3 = pts[pd].r; c3 = pts[pd].c; @@ -1014,7 +1029,7 @@ long T_flip_pro( std::vector &pts, std::vector &triads, std::vector< } else { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "triangle flipping error. " << t << endl; return(-5); } @@ -1143,7 +1158,7 @@ long T_flip_pro( std::vector &pts, std::vector &triads, std::vector< } else { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "triangle flipping error. " << t << endl; return(-5); } @@ -1217,38 +1232,38 @@ long T_flip_pro( std::vector &pts, std::vector &triads, std::vector< /* minimum angle cnatraint for circum circle test. due to Cline & Renka - A -- B + A -- B - | / | + | / | - C -- D + C -- D */ -long Cline_Renka_test(float &Ax, float &Ay, - float &Bx, float &By, - float &Cx, float &Cy, - float &Dx, float &Dy) +long Cline_Renka_test(double &Ax, double &Ay, + double &Bx, double &By, + double &Cx, double &Cy, + double &Dx, double &Dy) { - float v1x = Bx-Ax, v1y = By-Ay, v2x = Cx-Ax, v2y = Cy-Ay, - v3x = Bx-Dx, v3y = By-Dy, v4x = Cx-Dx, v4y = Cy-Dy; - float cosA = v1x*v2x + v1y*v2y; - float cosD = v3x*v4x + v3y*v4y; + double v1x = Bx-Ax, v1y = By-Ay, v2x = Cx-Ax, v2y = Cy-Ay, + v3x = Bx-Dx, v3y = By-Dy, v4x = Cx-Dx, v4y = Cy-Dy; + double cosA = v1x*v2x + v1y*v2y; + double cosD = v3x*v4x + v3y*v4y; if( cosA < 0 && cosD < 0 ) // two obtuse angles return(-1); -// float ADX = Ax-Dx, ADy = Ay-Dy; // commented by A.Balakin 6 July 2012 -- unused variable +// double ADX = Ax-Dx, ADy = Ay-Dy; // commented by A.Balakin 21 April 2014 -- unused variable if( cosA > 0 && cosD > 0 ) // two acute angles return(1); - float sinA = fabs(v1x*v2y - v1y*v2x); - float sinD = fabs(v3x*v4y - v3y*v4x); + double sinA = fabs(v1x*v2y - v1y*v2x); + double sinD = fabs(v3x*v4y - v3y*v4x); if( cosA*sinD + sinA*cosD < 0 ) return(-1); @@ -1266,7 +1281,7 @@ long Cline_Renka_test(float &Ax, float &Ay, long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vector &slump, std::set &ids) { - float r3,c3; + double r3,c3; long pa,pb,pc, pd, D, L1, L2, L3, L4, T2; Triad tx, tx2; @@ -1346,7 +1361,7 @@ long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vec } else { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "triangle flipping error. " << t << " T2: " << T2<< endl; return(-6); } @@ -1473,7 +1488,7 @@ long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vec } else { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "triangle flipping error. " << t << endl; return(-6); } @@ -1599,7 +1614,7 @@ long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vec } else { -// Commented by A.Balakin 2 July 2012 -- library shouldn't print anything +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything // cerr << "triangle flipping error. " << t << endl; return(-6); } @@ -1616,8 +1631,6 @@ long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vec L2 = tri.bc; if( L1 != L3 && L2 != L4 ) // need this check for stability. { - - tx.a = tri.b; tx.b = tri.a; tx.c = D; @@ -1626,19 +1639,15 @@ long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vec tx.ac = T2; tx.bc = L3; - // triangle 2; tx2.a = tri.b; tx2.b = tri.c; tx2.c = D; - - tx2.ab = L2; tx2.ac = t; tx2.bc = L4; - ids2.insert(t); ids2.insert(T2); @@ -1666,8 +1675,6 @@ long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vec } } } - - } ids.clear(); @@ -1676,3 +1683,462 @@ long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vec return(1); } +/* test the seed configuration to see if the center + of the circum circle lies inside the seed triangle. + + if not issue a warning. +*/ + + +long test_center(Shx &pt0, Shx &pt1,Shx &pt2) +{ + double r01 = pt1.r - pt0.r; + double c01 = pt1.c - pt0.c; + + double r02 = pt2.r - pt0.r; + double c02 = pt2.c - pt0.c; + + double r21 = pt1.r - pt2.r; + double c21 = pt1.c - pt2.c; + + double v = r01*r02 + c01*c02; + if( v < 0 ) return(-1); + + v = r21*r02 + c21*c02; + if( v > 0 ) return(-1); + + v = r01*r21 + c01*c21; + if( v < 0 ) return(-1); + + return(1); +} + +long de_duplicateX( std::vector &pts, std::vector &outx,std::vector &pts2 ) +{ + long nump = (long) pts.size(); + std::vector dpx; + Dupex d; + for( long k=0; k &pts, std::vector &triads, std::vector &slump, long numt, long start, std::set &ids) +{ + double r3,c3; + long pa,pb,pc, pd, D, L1, L2, L3, L4, T2; + + Triad tx, tx2; + + + for( long t=start; t= 0 && (tri.ac < 0 || tri.ab < 0) ) + { + pa = slump[tri.a]; + pb = slump[tri.b]; + pc = slump[tri.c]; + + T2 = tri.bc; + Triad &t2 = triads[T2]; + // find relative orientation (shared limb). + if( t2.ab == t ) + { + D = t2.c; + pd = slump[t2.c]; + + if( tri.b == t2.a) + { + L3 = t2.ac; + L4 = t2.bc; + } + else { + L3 = t2.bc; + L4 = t2.ac; + } + } + else if( t2.ac == t ) + { + D = t2.b; + pd = slump[t2.b]; + + if( tri.b == t2.a) + { + L3 = t2.ab; + L4 = t2.bc; + } + else + { + L3 = t2.bc; + L4 = t2.ab; + } + } + else if( t2.bc == t ) + { + D = t2.a; + pd = slump[t2.a]; + + if( tri.b == t2.b) + { + L3 = t2.ab; + L4 = t2.ac; + } + else + { + L3 = t2.ac; + L4 = t2.ab; + } + } + else + { +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything +// cerr << "triangle flipping error. " << t << endl; + return(-5); + } + + +// Commented by A.Balakin 21 April 2014 -- unused variable +// if( pd < 0 || pd > 100) +// long dfx = 9; + + r3 = pts[pd].r; + c3 = pts[pd].c; + + long XX = Cline_Renka_test( pts[pa].r, pts[pa].c, pts[pb].r, pts[pb].c, + pts[pc].r, pts[pc].c, r3, c3 ); + + if( XX < 0 ) { + + L1 = tri.ab; + L2 = tri.ac; + // if( L1 != L3 && L2 != L4 ){ // need this check for stability. + + tx.a = tri.a; + tx.b = tri.b; + tx.c = D; + + tx.ab = L1; + tx.ac = T2; + tx.bc = L3; + + + // triangle 2; + tx2.a = tri.a; + tx2.b = tri.c; + tx2.c = D; + + tx2.ab = L2; + tx2.ac = t; + tx2.bc = L4; + + + ids.insert(t); + ids.insert(T2); + + t2 = tx2; + tri = tx; + flipped = 1; + + // change knock on triangle labels. + if( L3 >= 0 ) + { + Triad &t3 = triads[L3]; + if( t3.ab == T2 ) t3.ab = t; + else if( t3.bc == T2 ) t3.bc = t; + else if( t3.ac == T2 ) t3.ac = t; + } + + if(L2 >= 0 ) + { + Triad &t4 = triads[L2]; + if( t4.ab == t ) t4.ab = T2; + else if( t4.bc == t ) t4.bc = T2; + else if( t4.ac == t ) t4.ac = T2; + } + // } + } + } + + + if( flipped == 0 && tri.ab >= 0 && (tri.ac < 0 || tri.bc < 0)) + { + pc = slump[tri.c]; + pb = slump[tri.b]; + pa = slump[tri.a]; + + T2 = tri.ab; + Triad &t2 = triads[T2]; + // find relative orientation (shared limb). + if( t2.ab == t ) + { + D = t2.c; + pd = slump[t2.c]; + + if( tri.a == t2.a) + { + L3 = t2.ac; + L4 = t2.bc; + } + else + { + L3 = t2.bc; + L4 = t2.ac; + } + } + else if( t2.ac == t ) + { + D = t2.b; + pd = slump[t2.b]; + + if( tri.a == t2.a) + { + L3 = t2.ab; + L4 = t2.bc; + } + else + { + L3 = t2.bc; + L4 = t2.ab; + } + } + else if( t2.bc == t ) + { + D = t2.a; + pd = slump[t2.a]; + + if( tri.a == t2.b) + { + L3 = t2.ab; + L4 = t2.ac; + } + else + { + L3 = t2.ac; + L4 = t2.ab; + } + } + else { +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything +// cerr << "triangle flipping error. " << t << endl; + return(-5); + } + + r3 = pts[pd].r; + c3 = pts[pd].c; + + long XX = Cline_Renka_test( pts[pc].r, pts[pc].c, pts[pb].r, pts[pb].c, + pts[pa].r, pts[pa].c,r3, c3); + + if( XX < 0) + { + L1 = tri.ac; + L2 = tri.bc; + // if( L1 != L3 && L2 != L4 ){ // need this check for stability. + + tx.a = tri.c; + tx.b = tri.a; + tx.c = D; + + tx.ab = L1; + tx.ac = T2; + tx.bc = L3; + + // triangle 2; + tx2.a = tri.c; + tx2.b = tri.b; + tx2.c = D; + + tx2.ab = L2; + tx2.ac = t; + tx2.bc = L4; + + ids.insert(t); + ids.insert(T2); + + t2 = tx2; + tri = tx; + flipped = 1; + + // change knock on triangle labels. + if( L3 >= 0 ) + { + Triad &t3 = triads[L3]; + if( t3.ab == T2 ) t3.ab = t; + else if( t3.bc == T2 ) t3.bc = t; + else if( t3.ac == T2 ) t3.ac = t; + } + + if(L2 >= 0 ) + { + Triad &t4 = triads[L2]; + if( t4.ab == t ) t4.ab = T2; + else if( t4.bc == t ) t4.bc = T2; + else if( t4.ac == t ) t4.ac = T2; + } + } + } + + + if( flipped == 0 && tri.ac >= 0 && (tri.bc < 0 || tri.ab < 0) ) + { + pc = slump[tri.c]; + pb = slump[tri.b]; + pa = slump[tri.a]; + + T2 = tri.ac; + Triad &t2 = triads[T2]; + // find relative orientation (shared limb). + if( t2.ab == t ) + { + D = t2.c; + pd = slump[t2.c]; + + if( tri.a == t2.a) + { + L3 = t2.ac; + L4 = t2.bc; + } + else + { + L3 = t2.bc; + L4 = t2.ac; + } + } + else if( t2.ac == t ) + { + D = t2.b; + pd = slump[t2.b]; + + if( tri.a == t2.a) + { + L3 = t2.ab; + L4 = t2.bc; + } + else { + L3 = t2.bc; + L4 = t2.ab; + } + } + else if( t2.bc == t ) + { + D = t2.a; + pd = slump[t2.a]; + + if( tri.a == t2.b) + { + L3 = t2.ab; + L4 = t2.ac; + } + else + { + L3 = t2.ac; + L4 = t2.ab; + } + } + else + { +// Commented by A.Balakin 21 April 2014 -- library shouldn't print anything +// cerr << "triangle flipping error. " << t << endl; + return(-5); + } + + r3 = pts[pd].r; + c3 = pts[pd].c; + + long XX = Cline_Renka_test( pts[pb].r, pts[pb].c, pts[pa].r, pts[pa].c, + pts[pc].r, pts[pc].c,r3, c3); + + if( XX < 0 ) + { + L1 = tri.ab; // .ac shared limb + L2 = tri.bc; + // if( L1 != L3 && L2 != L4 ){ // need this check for stability. + + tx.a = tri.b; + tx.b = tri.a; + tx.c = D; + + tx.ab = L1; + tx.ac = T2; + tx.bc = L3; + + + // triangle 2; + tx2.a = tri.b; + tx2.b = tri.c; + tx2.c = D; + + tx2.ab = L2; + tx2.ac = t; + tx2.bc = L4; + + ids.insert(t); + ids.insert(T2); + + t2 = tx2; + tri = tx; + + // change knock on triangle labels. + if( L3 >= 0 ) + { + Triad &t3 = triads[L3]; + if( t3.ab == T2 ) t3.ab = t; + else if( t3.bc == T2 ) t3.bc = t; + else if( t3.ac == T2 ) t3.ac = t; + } + + if(L2 >= 0 ) + { + Triad &t4 = triads[L2]; + if( t4.ab == t ) t4.ab = T2; + else if( t4.bc == t ) t4.bc = T2; + else if( t4.ac == t ) t4.ac = T2; + } + } + } + } + return(1); +} + diff --git a/src/s_hull/s_hull_pro.h b/src/s_hull/s_hull_pro.h index 7d4979a..ceb81b0 100644 --- a/src/s_hull/s_hull_pro.h +++ b/src/s_hull/s_hull_pro.h @@ -1,38 +1,31 @@ #ifndef _structures_h #define _structures_h - - - // for FILE #include #include #include - - /* - for use in s_hull_pro.cpp - -S-hull-pro, Copyright (c) 2012 -Dr David SInclair -Cambridge, UK - -email david@s-hull.org + for use in s_hull_pro.cpp + S-hull-pro, Copyright (c) 2012 + Dr David SInclair + Cambridge, UK + email david@s-hull.org */ -// Global replace int->long by A.Balakin 7 August 2012 -- 64bit version can handle huge data arrays +// Global replace int->long by A.Balakin 21 April 2014 -- 64bit version can handle huge data arrays struct Triad { long a,b, c; long ab, bc, ac; // adjacent edges index to neighbouring triangle. - float ro, R,C; + double ro, R,C; //std::set idx; - Triad() {a=b=c=ab=bc=ac=0; ro=R=C=0;} // added by A.Balakin 6 July 2012 -- uninitialised variable + Triad() {a=b=c=0; ab=bc=ac=-1; ro=-1; R=C=0;} // added by A.Balakin 21 April 2014 -- uninitialised variable Triad(long x, long y) : a(x), b(y),c(0), ab(-1), bc(-1), ac(-1), ro(-1), R(0), C(0) {} Triad(long x, long y, long z) : a(x), b(y), c(z), ab(-1), bc(-1), ac(-1), ro(-1), R(0), C(0) {} Triad(const Triad &p) : a(p.a), b(p.b), c(p.c), ab(p.ab), bc(p.bc), ac(p.ac), ro(p.ro), R(p.R), C(p.C) {} @@ -65,13 +58,12 @@ struct Triad struct Shx { long id, trid; - float r,c, tr,tc ; - float ro; - Shx() {r=c=tr=tc=ro=0; id=trid=0;} // added by A.Balakin 6 July 2012 -- uninitialised variable - Shx(float a, float b) : id(-1), r(a), c(b), tr(0.0), tc(0.0), ro(0.0) - { trid=0; } // added by A.Balakin 6 July 2012 -- uninitialised variable - Shx(float a, float b, float x) : id(-1), r(a), c(b), tr(0), tc(0), ro(x) - { trid=0; } // added by A.Balakin 6 July 2012 -- uninitialised variable + double r,c, tr,tc, ro; + Shx() {r=c=tr=tc=ro=0; id=-1; trid=0;} // added by A.Balakin 21 April 2014 -- uninitialised variable + Shx(double a, double b) : r(a), c(b) + { trid=0; ro=tr=tc=0; id=-1; } // added by A.Balakin 21 April 2014 -- uninitialised variable + Shx(double a, double b, double x) : r(a), c(b), ro(x) + { trid=0; tr=tc=0; id=-1; } // added by A.Balakin 21 April 2014 -- uninitialised variable Shx(const Shx &p) : id(p.id), trid(p.trid), r(p.r), c(p.c), tr(p.tr), tc(p.tc), ro(p.ro) {} Shx &operator=(const Shx &p) @@ -85,27 +77,30 @@ struct Shx ro = p.ro; return *this; } - }; // sort into descending order (for use in corner responce ranking). inline bool operator<(const Shx &a, const Shx &b) { - if( a.ro == b.ro) + if( a.ro == b.ro) { + if( a.r == b.r ) { + return a.c < b.c; + } return a.r < b.r; + } return a.ro < b.ro; -} +}; struct Dupex { long id; - float r,c; + double r,c; - Dupex() {} - Dupex(float a, float b) : id(-1), r(a), c(b) {} - Dupex(float a, float b, long x) : id(x), r(a), c(b) {} + Dupex() { r=c=0; id=-1; } // added by A.Balakin 21 April 2014 -- uninitialised variable + Dupex(double a, double b) : id(-1), r(a), c(b) {} + Dupex(double a, double b, long x) : id(x), r(a), c(b) {} Dupex(const Dupex &p) : id(p.id), r(p.r), c(p.c) {} Dupex &operator=(const Dupex &p) @@ -125,27 +120,28 @@ inline bool operator<(const Dupex &a, const Dupex &b) if( a.r == b.r) return a.c < b.c; return a.r < b.r; -} +}; // from s_hull.C - - long s_hull_pro( std::vector &pts, std::vector &triads); -void circle_cent2(float r1,float c1, float r2,float c2, float r3,float c3,float &r,float &c, float &ro2); -void circle_cent4(float r1,float c1, float r2,float c2, float r3,float c3,float &r,float &c, float &ro2); +void circle_cent2(double r1,double c1, double r2,double c2, double r3,double c3,double &r,double &c, double &ro2); +void circle_cent4(double r1,double c1, double r2,double c2, double r3,double c3,double &r,double &c, double &ro2); void write_Shx(std::vector &pts, char * fname); void write_Triads(std::vector &ts, char * fname); -long Cline_Renka_test(float &Ax, float &Ay, float &Bx, float &By, float &Cx, float &Cy, float &Dx, float &Dy); +long Cline_Renka_test(double &Ax, double &Ay, double &Bx, double &By, double &Cx, double &Cy, double &Dx, double &Dy); long T_flip_pro( std::vector &pts, std::vector &triads, std::vector &slump, long numt, long start, std::set &ids); long T_flip_pro_idx( std::vector &pts, std::vector &triads, std::vector &slump, std::set &ids); long read_Shx(std::vector &pts, char * fname); +long de_duplicate( std::vector &pts, std::vector &outx ); +long de_duplicateX( std::vector &pts, std::vector &outx,std::vector &pts2 ); +long test_center(Shx &pt0, Shx &pt1,Shx &pt2); +long T_flip_edge( std::vector &pts, std::vector &triads, std::vector &slump, long numt, long start, std::set &ids); -size_t de_duplicate( std::vector &pts, std::vector &outx ); #endif diff --git a/src/surf.cpp b/src/surf.cpp index f847657..0890e99 100644 --- a/src/surf.cpp +++ b/src/surf.cpp @@ -27,27 +27,23 @@ void MGL_NO_EXPORT mgl_mesh_plot(mglBase *gr, long *pos, long n, long m, int how { int d = gr->MeshNum>0 ? gr->MeshNum+1 : n*m, dx = n>d?n/d:1, dy = m>d?m/d:1; // NOTE: number of lines in each direction can be reduced too - if(how&1) -#pragma omp parallel for - for(long j=0;j=0 && pos[n*j+i+1]>=0) s++; - d = gr->FaceNum>0 ? gr->FaceNum+1 : n; s = s>d?s/d:1; - for(i=0;iline_plot(pos[n*j+i],pos[n*j+i+s]); + if(how&1) for(long j=0;j=0 && pos[n*j+i+1]>=0) s++; + d = gr->FaceNum>0 ? gr->FaceNum+1 : n; s = s>d?s/d:1; + for(i=0;iline_plot(pos[n*j+i],pos[n*j+i+s]); - } - if(how&2) -#pragma omp parallel for - for(long i=0;i=0 && pos[n*j+i+n]>=0) s++; - d = gr->FaceNum>0 ? gr->FaceNum+1 : n; s = s>d?s/d:1; - for(j=0;jline_plot(pos[n*j+i],pos[n*j+i+s*n]); - } + } + if(how&2) for(long i=0;i=0 && pos[n*j+i+n]>=0) s++; + d = gr->FaceNum>0 ? gr->FaceNum+1 : n; s = s>d?s/d:1; + for(j=0;jline_plot(pos[n*j+i],pos[n*j+i+s*n]); + } } //----------------------------------------------------------------------------- void MGL_NO_EXPORT mgl_surf_plot(mglBase *gr, long *pos, long n, long m) @@ -62,7 +58,6 @@ void MGL_NO_EXPORT mgl_surf_plot(mglBase *gr, long *pos, long n, long m) int d = gr->FaceNum+1,ns=n*s/((n-1)*(m-1)),ms=m*s/((n-1)*(m-1)); dx = ns>d?ns/d:1; dy = ms>d?ms/d:1; } -#pragma omp parallel for collapse(2) for(long j=0;jquad_plot(pos[n*j+i],pos[n*j+i+dx],pos[n*j+i+n*dy],pos[n*j+i+n*dy+dx]); } @@ -71,46 +66,42 @@ void MGL_NO_EXPORT mgl_surf_plot(mglBase *gr, long *pos, long n, long m) // Plot by formulas series // //----------------------------------------------------------------------------- +mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_fsurf(HMGL gr, const char *eqZ, const char *sch, const char *opt) -{ // TODO: Add strong function variation analysis ??? +{ // NOTE Strong function variation analysis can be added here if(eqZ==0 || eqZ[0]==0) return; // nothing to plot mreal r = gr->SaveState(opt); long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5); - mglData z(n,n); - mglFormula *eq = new mglFormula(eqZ); - mreal dx = (gr->Max.x - gr->Min.x)/(n-1.), dy = (gr->Max.y - gr->Min.y)/(n-1.); -#pragma omp parallel for collapse(2) - for(long j=0;jStop) continue; - z.a[i+n*j] = eq->Calc(gr->Min.x+i*dx, gr->Min.y+j*dy); - } + mglData z(n,n),res; + mglDataV x(n,n); x.Fill(gr->Min.x,gr->Max.x,'x'); x.s=L"x"; + mglDataV y(n,n); y.Fill(gr->Min.y,gr->Max.y,'y'); y.s=L"y"; + mglDataV t(n,n); t.s=L"#$mgl"; + std::vector list; + list.push_back(&x); list.push_back(&y); list.push_back(&t); + res.Set(mglFormulaCalc(eqZ,list)); + if(res.nx==1 && res.ny==1) z = res.a[0]; else z = res; mgl_surf(gr, &z, sch,0); - delete eq; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_fsurf_xyz(HMGL gr, const char *eqX, const char *eqY, const char *eqZ, const char *sch, const char *opt) -{ // TODO: Add strong function variation analisys ??? +{ // NOTE Strong function variation analysis can be added here if(eqZ==0 || eqZ[0]==0) return; // nothing to plot mreal r = gr->SaveState(opt); long n = (mgl_isnan(r) || r<=0) ? 100:long(r+0.5); - mglData x(n,n), y(n,n), z(n,n); - if(n<=0) n=100; - mglFormula *ex, *ey, *ez; - ex = new mglFormula(eqX ? eqX : "u"); - ey = new mglFormula(eqY ? eqY : "v"); - ez = new mglFormula(eqZ); -#pragma omp parallel for collapse(2) - for(long j=0;jStop) continue; - register mreal u = j/(n-1.), v = i/(n-1.); - x.a[i+n*j] = ex->Calc(0,v,0,u); - y.a[i+n*j] = ey->Calc(0,v,0,u); - z.a[i+n*j] = ez->Calc(0,v,0,u); - } + mglData z(n,n), x(n,n), y(n,n), res; + mglDataV u(n,n); u.Fill(0,1,'x'); u.s=L"u"; + mglDataV v(n,n); v.Fill(0,1,'y'); v.s=L"v"; + mglDataV t(n,n); t.s=L"#$mgl"; + std::vector list; + list.push_back(&u); list.push_back(&v); list.push_back(&t); + res.Set(mglFormulaCalc(eqX,list)); + if(res.nx==1 && res.ny==1) x = res.a[0]; else x = res; + res.Set(mglFormulaCalc(eqY,list)); + if(res.nx==1 && res.ny==1) y = res.a[0]; else y = res; + res.Set(mglFormulaCalc(eqZ,list)); + if(res.nx==1 && res.ny==1) z = res.a[0]; else z = res; mgl_surf_xy(gr,&x,&y,&z,sch,0); - delete ex; delete ey; delete ez; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_fsurf_(uintptr_t *gr, const char *fy, const char *stl, const char *opt, int ly, int ls, int lo) @@ -148,10 +139,9 @@ void MGL_EXPORT mgl_mesh_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co for(long k=0;kGetNz();k++) { -#pragma omp parallel for collapse(2) + if(gr->NeedStop()) break; for(long j=0;jStop) continue; register mreal zz = z->v(i,j,k); pos[i+n*j] = gr->AddPnt(mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zz),gr->GetC(ss,zz)); } @@ -163,7 +153,7 @@ void MGL_EXPORT mgl_mesh_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co void MGL_EXPORT mgl_mesh(HMGL gr, HCDT z, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()), y(z->GetNy()); + mglDataV x(z->GetNx()), y(z->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_mesh_xy(gr,&x,&y,z,sch,0); @@ -197,10 +187,9 @@ void MGL_EXPORT mgl_fall_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co for(long k=0;kGetNz();k++) { -#pragma omp parallel for collapse(2) + if(gr->NeedStop()) break; for(long j=0;jStop) continue; register mreal zz = z->v(i,j,k); pos[i+n*j] = gr->AddPnt(mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zz),gr->GetC(ss,zz)); } @@ -212,7 +201,7 @@ void MGL_EXPORT mgl_fall_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co void MGL_EXPORT mgl_fall(HMGL gr, HCDT z, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()), y(z->GetNy()); + mglDataV x(z->GetNx()), y(z->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_fall_xy(gr,&x,&y,z,sch,0); @@ -246,13 +235,10 @@ void MGL_EXPORT mgl_grid_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co for(long k=0;kGetNz();k++) { + if(gr->NeedStop()) break; if(z->GetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(z->GetNz()-1); -#pragma omp parallel for collapse(2) for(long j=0;jStop) continue; pos[i+n*j] = gr->AddPnt(mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal),gr->CDef); - } mgl_mesh_plot(gr,pos,n,m,3); } delete []pos; gr->EndGroup(); @@ -261,7 +247,7 @@ void MGL_EXPORT mgl_grid_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co void MGL_EXPORT mgl_grid(HMGL gr, HCDT z,const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()), y(z->GetNy()); + mglDataV x(z->GetNx()), y(z->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_grid_xy(gr,&x,&y,z,sch,0); @@ -296,10 +282,9 @@ void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co mglPoint p,q,s,xx,yy; for(long k=0;kGetNz();k++) { -#pragma omp parallel for private(p,q,s,xx,yy) collapse(2) + if(gr->NeedStop()) break; for(long j=0;jStop) continue; xx = GetX(x,i,j,k); yy = GetY(y,i,j,k); p = mglPoint(xx.x, yy.x, z->v(i,j,k)); q = mglPoint(xx.y, yy.y, z->dvx(i,j,k)); @@ -307,13 +292,11 @@ void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,p.z),q^s); } if(sch && mglchr(sch,'.')) -#pragma omp parallel for for(long i=0;imark_plot(pos[i],'.'); else mgl_surf_plot(gr,pos,n,m); - if(wire && !gr->Stop) + if(wire) { gr->SetPenPal("k-"); -#pragma omp parallel for for(long i=0;iCopyNtoC(pos[i],gr->CDef); mgl_mesh_plot(gr,pos,n,m,3); } @@ -324,7 +307,7 @@ void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co void MGL_EXPORT mgl_surf(HMGL gr, HCDT z, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()), y(z->GetNy()); + mglDataV x(z->GetNx()), y(z->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_surf_xy(gr,&x,&y,z,sch,0); @@ -360,12 +343,11 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co mglPoint p1,p2,q,s,xx,yy; for(long k=0;kGetNz();k++) { + if(gr->NeedStop()) break; if(how) for(long i=0;iStop) continue; xx = GetX(x,i,j,k); yy = GetY(y,i,j,k); p1 = mglPoint(xx.x, yy.x, z->v(i,j,k)); s = mglPoint(xx.z, yy.z, z->dvy(i,j,k)); @@ -379,10 +361,8 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co } else for(long j=0;jStop) continue; xx = GetX(x,i,j,k); yy = GetY(y,i,j,k); p1 = mglPoint(xx.x, yy.x, z->v(i,j,k)); q = mglPoint(xx.y, yy.y, z->dvx(i,j,k)); @@ -401,7 +381,7 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co void MGL_EXPORT mgl_belt(HMGL gr, HCDT z, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()), y(z->GetNy()); + mglDataV x(z->GetNx()), y(z->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_belt_xy(gr,&x,&y,z,sch,0); @@ -439,25 +419,22 @@ void MGL_EXPORT mgl_dens_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co mreal zz, c; for(long k=0;kGetNz();k++) { + if(gr->NeedStop()) break; if(z->GetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(z->GetNz()-1); -#pragma omp parallel for private(p,c,zz) collapse(2) for(long j=0;jStop) continue; p = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal); zz = z->v(i,j,k); c = gr->GetC(ss,zz); if(mgl_isnan(zz)) p.x = NAN; pos[i+n*j] = gr->AddPnt(p,c,s); } if(sch && mglchr(sch,'.')) -#pragma omp parallel for for(long i=0;imark_plot(pos[i],'.'); else mgl_surf_plot(gr,pos,n,m); - if(wire && !gr->Stop) + if(wire) { gr->SetPenPal("k-"); -#pragma omp parallel for for(long i=0;iCopyNtoC(pos[i],gr->CDef); mgl_mesh_plot(gr,pos,n,m,3); } @@ -468,7 +445,7 @@ void MGL_EXPORT mgl_dens_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co void MGL_EXPORT mgl_dens(HMGL gr, HCDT z, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()), y(z->GetNy()); + mglDataV x(z->GetNx()), y(z->GetNy()); x.Fill(gr->Min.x, gr->Max.x); y.Fill(gr->Min.y, gr->Max.y); mgl_dens_xy(gr,&x,&y,z,sch,0); @@ -523,10 +500,9 @@ void MGL_EXPORT mgl_surfc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char mglPoint p,q,s,xx,yy; for(long k=0;kGetNz();k++) { -#pragma omp parallel for private(p,xx,yy,q,s) collapse(2) + if(gr->NeedStop()) break; for(long j=0;jStop) continue; xx = GetX(x,i,j,k); yy = GetY(y,i,j,k); p = mglPoint(xx.x, yy.x, z->v(i,j,k)); q = mglPoint(xx.y, yy.y, z->dvx(i,j,k)); @@ -534,13 +510,11 @@ void MGL_EXPORT mgl_surfc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,c->v(i,j,k)),q^s); } if(sch && mglchr(sch,'.')) -#pragma omp parallel for for(long i=0;imark_plot(pos[i],'.'); else mgl_surf_plot(gr,pos,n,m); - if(wire && !gr->Stop) + if(wire) { gr->SetPenPal("k-"); -#pragma omp parallel for for(long i=0;iCopyNtoC(pos[i],gr->CDef); mgl_mesh_plot(gr,pos,n,m,3); } @@ -551,7 +525,7 @@ void MGL_EXPORT mgl_surfc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char void MGL_EXPORT mgl_surfc(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()), y(z->GetNy()); + mglDataV x(z->GetNx()), y(z->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_surfc_xy(gr,&x,&y,z,c,sch,0); @@ -586,10 +560,9 @@ void MGL_EXPORT mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char mglPoint p,q,s,xx,yy; for(k=0;kGetNz();k++) { -#pragma omp parallel for private(p,xx,yy,q,s) collapse(2) + if(gr->NeedStop()) break; for(long j=0;jStop) continue; xx = GetX(x,i,j,k); yy = GetY(y,i,j,k); mreal vv = z->v(i,j,k); p = mglPoint(xx.x, yy.x, vv); q = mglPoint(xx.y, yy.y, z->dvx(i,j,k)); @@ -597,13 +570,11 @@ void MGL_EXPORT mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,vv),q^s,gr->GetA(c->v(i,j,k))); } if(sch && mglchr(sch,'.')) -#pragma omp parallel for for(long i=0;imark_plot(pos[i],'.'); else mgl_surf_plot(gr,pos,n,m); - if(wire && !gr->Stop) + if(wire) { gr->SetPenPal("k-"); -#pragma omp parallel for for(long i=0;iCopyNtoC(pos[i],gr->CDef); mgl_mesh_plot(gr,pos,n,m,3); } @@ -614,7 +585,7 @@ void MGL_EXPORT mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char void MGL_EXPORT mgl_surfa(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()), y(z->GetNy()); + mglDataV x(z->GetNx()), y(z->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_surfa_xy(gr,&x,&y,z,c,sch,0); @@ -654,9 +625,9 @@ void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co long k1,k2,k3,k4,k5,k6,k7,k8; for(k=0;kGetNz();k++) { + if(gr->NeedStop()) break; for(i=0;iStop) continue; zz = z->v(i,j,k); c = gr->GetC(ss,zz); xx = GetX(x,i,j,k); yy = GetY(y,i,j,k); x1 = iSaveState(opt); - mglData x(z->GetNx()+1), y(z->GetNy()+1); + mglDataV x(z->GetNx()+1), y(z->GetNy()+1); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_boxs_xy(gr,&x,&y,z,sch,0); @@ -757,10 +728,9 @@ void MGL_EXPORT mgl_tile_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co mglPoint s=mglPoint(0,0,1); for(long k=0;kGetNz();k++) { -#pragma omp parallel for collapse(2) + if(gr->NeedStop()) break; for(long j=0;jStop) continue; register mreal zz = z->v(i,j,k), c = gr->GetC(ss,zz); register mreal xx = GetX(x,i,j,k).x, yy = GetY(y,i,j,k).x; register long k1 = gr->AddPnt(mglPoint(xx,yy,zz),c,s); @@ -782,7 +752,7 @@ void MGL_EXPORT mgl_tile_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co void MGL_EXPORT mgl_tile(HMGL gr, HCDT z, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()+1), y(z->GetNy()+1); + mglDataV x(z->GetNx()+1), y(z->GetNy()+1); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_tile_xy(gr,&x,&y,z,sch,0); @@ -819,10 +789,9 @@ void MGL_EXPORT mgl_tiles_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, const char mreal x1,x2,x3,x4,y1,y2,y3,y4; for(long k=0;kGetNz();k++) { -#pragma omp parallel for private(x1,x2,x3,x4,y1,y2,y3,y4) collapse(2) + if(gr->NeedStop()) break; for(long j=0;jStop) continue; register mreal zz = z->v(i,j,k), c = gr->GetC(cc,zz); register mreal ss = (1-gr->GetA(s->v(i,j,k)))/2, sm = 1-ss; @@ -849,7 +818,7 @@ void MGL_EXPORT mgl_tiles_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, const char void MGL_EXPORT mgl_tiles(HMGL gr, HCDT z, HCDT s, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(z->GetNx()+1), y(z->GetNy()+1); + mglDataV x(z->GetNx()+1), y(z->GetNy()+1); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_tiles_xy(gr,&x,&y,z,s,sch,0); @@ -874,12 +843,12 @@ void MGL_EXPORT mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char long n=ax->GetNx(),m=ax->GetNy(); if(mgl_check_dim2(gr,x,y,ax,ay,"Map")) return; - bool both = x->GetNx()==n && y->GetNx()==n && x->GetNy()==m && y->GetNy()==m; + bool nboth = !(x->GetNx()==n && y->GetNx()==n && x->GetNy()==m && y->GetNy()==m); gr->SaveState(opt); static int cgid=1; gr->StartGroup("Map",cgid++); long ss = gr->AddTexture(mgl_have_color(sch)?sch:"rgb",2); - long s = both ? n:1; + long s = nboth ?1:n; mglPoint t=mglPoint(NAN); long *pos = new long[n*m]; @@ -888,7 +857,6 @@ void MGL_EXPORT mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char #pragma omp parallel for collapse(2) for(long j=0;jStop) continue; register long s1 = i>0 ? 1:0, s2 = iv(i+s2,j)-ax->v(i-s1,j))/(GetX(x,i+s2,j).x-GetX(x,i-s1,j).x); register mreal ydx = (ay->v(i+s2,j)-ay->v(i-s1,j))/(GetX(x,i+s2,j).x-GetX(x,i-s1,j).x); @@ -898,22 +866,21 @@ void MGL_EXPORT mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char xdx = xdx*ydy - xdy*ydx; // Jacobian register mreal xx,yy; - if(both) + if(nboth) { - xx = (x->v(i,j) - gr->Min.x)/(gr->Max.x - gr->Min.x); - yy = (y->v(i,j) - gr->Min.y)/(gr->Max.y - gr->Min.y); + xx = (x->v(i) - gr->Min.x)/(gr->Max.x - gr->Min.x); + yy = (y->v(j) - gr->Min.y)/(gr->Max.y - gr->Min.y); } else { - xx = (x->v(i) - gr->Min.x)/(gr->Max.x - gr->Min.x); - yy = (y->v(j) - gr->Min.y)/(gr->Max.y - gr->Min.y); + xx = (x->v(i,j) - gr->Min.x)/(gr->Max.x - gr->Min.x); + yy = (y->v(i,j) - gr->Min.y)/(gr->Max.y - gr->Min.y); } if(xx<0) xx=0; if(xx>=1) xx=1/MGL_FEPSILON; if(yy<0) yy=0; if(yy>=1) yy=1/MGL_FEPSILON; pos[i+n*j] = gr->AddPnt(mglPoint(ax->v(i,j), ay->v(i,j), xdx),gr->GetC(ss,xx,false),t,yy); } if(sch && mglchr(sch,'.')) -#pragma omp parallel for for(long i=0;imark_plot(pos[i],'.'); else mgl_surf_plot(gr,pos,n,m); delete []pos; gr->EndGroup(); @@ -922,7 +889,7 @@ void MGL_EXPORT mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char void MGL_EXPORT mgl_map(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()); + mglDataV x(ax->GetNx()), y(ax->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_map_xy(gr,&x,&y,ax,ay,sch,0); diff --git a/src/tex_table.cpp b/src/tex_table.cpp index 40483f5..e8297d9 100644 --- a/src/tex_table.cpp +++ b/src/tex_table.cpp @@ -20,6 +20,7 @@ #include "mgl2/font.h" /// Table of LaTeX symbols and its UTF8 codes. This array MUST BE sorted!!! +MGL_EXPORT long mgl_tex_num=1881-24; MGL_EXPORT mglTeXsymb mgl_tex_symb[] = { {0x23, L"#"}, {0x25, L"%"}, @@ -349,6 +350,8 @@ MGL_EXPORT mglTeXsymb mgl_tex_symb[] = { {0x2130, L"calE"}, {0x2131, L"calF"}, {0x210b, L"calH"}, + {0x2110, L"calI"}, + {0x2112, L"calL"}, {0x2133, L"calM"}, {0x211b, L"calR"}, {0x2229, L"cap"}, diff --git a/src/vect.cpp b/src/vect.cpp index 5b46c57..66034f2 100644 --- a/src/vect.cpp +++ b/src/vect.cpp @@ -28,17 +28,18 @@ //----------------------------------------------------------------------------- void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt) { - long m,mx,my,mz,nx,ny,nz,n=ax->GetNx(),pal; + long n=ax->GetNx(),pal; if(mgl_check_dim1(gr,x,z,y,ax,"Traj")) return; if(mgl_check_dim1(gr,ax,az,ay,0,"Traj")) return; mreal len=gr->SaveState(opt); if(mgl_isnan(len)) len = 0; static int cgid=1; gr->StartGroup("Traj",cgid++); - register long i, j; // find maximum - i = ax->GetNy()>ay->GetNy() ? ax->GetNy():ay->GetNy(); j = z->GetNy()>az->GetNy() ? z->GetNy():az->GetNy(); - m = x->GetNy()>y->GetNy() ? x->GetNy():y->GetNy(); if(i>m) m=i; if(j>m) m=j; + long m = x->GetNy()>y->GetNy() ? x->GetNy():y->GetNy(); + long i = ax->GetNy()>ay->GetNy() ? ax->GetNy():ay->GetNy(); + long j = z->GetNy()>az->GetNy() ? z->GetNy():az->GetNy(); + if(i>m) m=i; if(j>m) m=j; gr->SetPenPal(sch,&pal); gr->Reserve(4*n*m); mglPoint p1,p2; @@ -49,15 +50,14 @@ void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, xm = xm>da ? xm : da; } xm = 1./(xm ? sqrt(xm):1);*/ - for(j=0;jNeedStop()) break; gr->NextColor(pal); - nx = jGetNy() ? j:0; ny = jGetNy() ? j:0; nz = jGetNy() ? j:0; - mx = jGetNy() ? j:0; my = jGetNy() ? j:0; mz = jGetNy() ? j:0; -#pragma omp parallel for private(p1,p2) + long nx = jGetNy() ? j:0, ny = jGetNy() ? j:0, nz = jGetNy() ? j:0; + long mx = jGetNy() ? j:0,my = jGetNy() ? j:0,mz = jGetNy() ? j:0; for(long i=0;iStop) continue; p1 = mglPoint(x->v(i,nx), y->v(i,ny), z->v(i,nz)); p2 = mglPoint(ax->v(i,mx),ay->v(i,my),az->v(i,mz)); mreal dd = p2.norm(); @@ -80,7 +80,7 @@ void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, void MGL_EXPORT mgl_traj_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt) { gr->SaveState(opt); - mglData z(x->GetNx()), az(x->GetNx()); z.Fill(gr->Min.z,gr->Min.z); + mglDataV z(x->GetNx()), az(x->GetNx()); z.Fill(gr->AdjustZMin()); mgl_traj_xyz(gr,x,y,&z,ax,ay,&az,sch,0); } //----------------------------------------------------------------------------- @@ -148,11 +148,10 @@ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha for(long k=0;kNeedStop()) break; if(ax->GetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1); -#pragma omp parallel for private(d,v,p1,p2) collapse(2) for(long j=0;jStop) continue; d = mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal); v = mglPoint(ax->v(i,j,k),ay->v(i,j,k)); mreal dd = v.norm(), c1, c2; @@ -177,7 +176,7 @@ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha void MGL_EXPORT mgl_vect_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()); + mglDataV x(ax->GetNx()), y(ax->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_vect_xy(gr,&x,&y,ax,ay,sch,0); @@ -247,26 +246,28 @@ void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, ca /= (n*m*l)/(tx*ty*tz); xm = xm?1./xm:0; cm = cm?1./cm:0; -#pragma omp parallel for private(d,v,p1,p2) collapse(3) - for(long k=0;kStop) continue; - d=mglPoint(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x); - v = mglPoint(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k)); - mreal dd = v.norm(),c1,c2; - v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm); + if(gr->NeedStop()) break; + for(long i=0;iv(i,j,k),ay->v(i,j,k),az->v(i,j,k)); + mreal dd = v.norm(),c1,c2; + v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm); - if(end) { p1 = d-v; p2 = d; } - else if(beg) { p1 = d; p2 = d+v; } - else { p1=d-v/2.; p2=d+v/2.; } - if(grd) { c1=gr->GetC(ss,dd*xm-0.5,false); c2=gr->GetC(ss,dd*xm,false); } - else c1 = c2 = gr->GetC(ss,dd*xm,false); - long n1=gr->AddPnt(p1,c1), n2=gr->AddPnt(p2,c2); - // allow vectors outside bounding box - if(n1<0 && n2>=0) n1=gr->AddPnt(p1,c1,mglPoint(NAN),-1,2); - if(n2<0 && n1>=0) n2=gr->AddPnt(p2,c2,mglPoint(NAN),-1,2); - if(dot) { gr->line_plot(n1,n2); gr->mark_plot(n1,'.'); } - else gr->vect_plot(n1,n2); + if(end) { p1 = d-v; p2 = d; } + else if(beg) { p1 = d; p2 = d+v; } + else { p1=d-v/2.; p2=d+v/2.; } + if(grd) { c1=gr->GetC(ss,dd*xm-0.5,false); c2=gr->GetC(ss,dd*xm,false); } + else c1 = c2 = gr->GetC(ss,dd*xm,false); + long n1=gr->AddPnt(p1,c1), n2=gr->AddPnt(p2,c2); + // allow vectors outside bounding box + if(n1<0 && n2>=0) n1=gr->AddPnt(p1,c1,mglPoint(NAN),-1,2); + if(n2<0 && n1>=0) n2=gr->AddPnt(p2,c2,mglPoint(NAN),-1,2); + if(dot) { gr->line_plot(n1,n2); gr->mark_plot(n1,'.'); } + else gr->vect_plot(n1,n2); + } } gr->EndGroup(); } @@ -274,7 +275,7 @@ void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, void MGL_EXPORT mgl_vect_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); + mglDataV x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -395,103 +396,6 @@ void MGL_NO_EXPORT mgl_get_slice(_mgl_vec_slice &s, HCDT x, HCDT y, HCDT z, HCDT } } //----------------------------------------------------------------------------- -void MGL_NO_EXPORT mgl_get_slice_md(_mgl_vec_slice &s, const mglData *x, const mglData *y, const mglData *z, const mglData *ax, const mglData *ay, const mglData *az, char dir, mreal d, bool both) -{ - long n=ax->nx,m=ax->ny,l=ax->nz, nx=1,ny=1,p; - - if(dir=='x') { nx = m; ny = l; if(d<0) d = n/2.; } - if(dir=='y') { nx = n; ny = l; if(d<0) d = m/2.; } - if(dir=='z') { nx = n; ny = m; if(d<0) d = l/2.; } - s.x.Create(nx,ny); s.y.Create(nx,ny); s.z.Create(nx,ny); - s.ax.Create(nx,ny); s.ay.Create(nx,ny); s.az.Create(nx,ny); - p = long(d); d -= p; - if(dir=='x' && p>=n-1) { d+=p-n+2; p=n-2; } - if(dir=='y' && p>=m-1) { d+=p-m+2.; p=m-2; } - if(dir=='z' && p>=l-1) { d+=p-l+2; p=l-2; } - - if(both) - { - if(dir=='x') -#pragma omp parallel for collapse(2) - for(long j=0;ja[i1]*(1-d) + x->a[i1+1]*d; - s.y.a[i0] = y->a[i1]*(1-d) + y->a[i1+1]*d; - s.z.a[i0] = z->a[i1]*(1-d) + z->a[i1+1]*d; - s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+1]*d; - s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+1]*d; - s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+1]*d; - } - if(dir=='y') -#pragma omp parallel for collapse(2) - for(long j=0;ja[i1]*(1-d) + x->a[i1+n]*d; - s.y.a[i0] = y->a[i1]*(1-d) + y->a[i1+n]*d; - s.z.a[i0] = z->a[i1]*(1-d) + z->a[i1+n]*d; - s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+n]*d; - s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+n]*d; - s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+n]*d; - } - if(dir=='z') -#pragma omp parallel for collapse(2) - for(long j=0;ja[i1]*(1-d) + x->a[i1+n*m]*d; - s.y.a[i0] = y->a[i1]*(1-d) + y->a[i1+n*m]*d; - s.z.a[i0] = z->a[i1]*(1-d) + z->a[i1+n*m]*d; - s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+n*m]*d; - s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+n*m]*d; - s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+n*m]*d; - } - } - else // x, y, z -- vectors - { - if(dir=='x') - { - mreal v = x->a[p]*(1-d)+x->a[p+1]*d; -#pragma omp parallel for collapse(2) - for(long j=0;ja[i]; s.z.a[i0] = z->a[j]; - s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+1]*d; - s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+1]*d; - s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+1]*d; - } - } - if(dir=='y') - { - mreal v = y->a[p]*(1-d)+y->a[p+1]*d; -#pragma omp parallel for collapse(2) - for(long j=0;ja[i]; s.z.a[i0] = z->a[j]; - s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+n]*d; - s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+n]*d; - s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+n]*d; - } - } - if(dir=='z') - { - mreal v = z->a[p]*(1-d)+z->a[p+1]*d; -#pragma omp parallel for collapse(2) - for(long j=0;ja[i]; s.y.a[i0] = y->a[j]; - s.ax.a[i0] = ax->a[i1]*(1-d) + ax->a[i1+n*m]*d; - s.ay.a[i0] = ay->a[i1]*(1-d) + ay->a[i1+n*m]*d; - s.az.a[i0] = az->a[i1]*(1-d) + az->a[i1+n*m]*d; - } - } - } -} -//----------------------------------------------------------------------------- void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt) { bool both = mgl_isboth(x,y,z,ax); @@ -511,16 +415,7 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, long ss = gr->AddTexture(sch); _mgl_vec_slice s; - const mglData *mx = dynamic_cast(x); - const mglData *my = dynamic_cast(y); - const mglData *mz = dynamic_cast(z); - const mglData *max = dynamic_cast(ax); - const mglData *may = dynamic_cast(ay); - const mglData *maz = dynamic_cast(az); - if(mx&&my&&mz&&max&&may&&maz) - mgl_get_slice_md(s,mx,my,mz,max,may,maz,dir,sVal,both); - else - mgl_get_slice(s,x,y,z,ax,ay,az,dir,sVal,both); + mgl_get_slice(s,x,y,z,ax,ay,az,dir,sVal,both); long n=s.ax.nx,m=s.ax.ny, tx=1,ty=1; if(gr->MeshNum>1) { tx=(n-1)/(gr->MeshNum-1); ty=(m-1)/(gr->MeshNum-1); } @@ -555,10 +450,8 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, ca /= (n*m)/(tx*ty); xm = xm?1./xm:0; cm = cm?1./cm:0; -#pragma omp parallel for private(d,v,p1,p2) collapse(2) for(long i=0;iStop) continue; register long i0 = i+n*j; d = mglPoint(s.x.a[i0], s.y.a[i0], s.z.a[i0]); v = mglPoint(s.ax.a[i0], s.ay.a[i0], s.az.a[i0]); @@ -583,7 +476,7 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, void MGL_EXPORT mgl_vect3(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()),z(ax->GetNz()); + mglDataV x(ax->GetNx()), y(ax->GetNy()),z(ax->GetNz()); // NOTE mglDataV here is useless x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -608,10 +501,9 @@ void MGL_EXPORT mgl_vect3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, long ss, bool vv) { long n=10*(ax.nx+ax.ny); - bool both = x.nx==ax.nx && y.nx==ax.nx && x.ny==ax.ny && y.ny==ax.ny; + bool nboth = x.nx*x.ny!=ax.nx*ax.ny || y.nx*y.ny!=ax.nx*ax.ny; mglPoint *pp = new mglPoint[n], dp; - mreal *cc = new mreal[n]; mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z)); mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=1; @@ -619,26 +511,25 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD register long k=0,m; bool end = false; do{ - if(gr->Stop) { delete []pp; delete []cc; return; } - pp[k].x = both ? x.Spline1(u,v,0):x.Spline1(u,0,0); - pp[k].y = both ? y.Spline1(u,v,0):y.Spline1(v,0,0); + pp[k].x = nboth ? x.Spline1(u,0,0):x.Spline1(u,v,0); + pp[k].y = nboth ? y.Spline1(v,0,0):y.Spline1(u,v,0); pp[k].z = zVal; for(m=0;mGetC(ss,s*h); + f = ax.Spline1(u,v,0); g = ay.Spline1(u,v,0); + h = hypot(f,g); pp[k].c = gr->GetC(ss,s*h); if(h<1e-5) break; // stationary point k++; // find next point by midpoint method h+=1; ff[0]=f*dt/h; gg[0]=g*dt/h; e = u+ff[0]/2; h = v+gg[0]/2; - f = ax.Linear1(e,h,0); g = ay.Linear1(e,h,0); + f = ax.Spline1(e,h,0); g = ay.Spline1(e,h,0); h = 1+hypot(f,g); ff[1]=f*dt/h; gg[1]=g*dt/h; e = u+ff[1]/2; h = v+gg[1]/2; - f = ax.Linear1(e,h,0); g = ay.Linear1(e,h,0); + f = ax.Spline1(e,h,0); g = ay.Spline1(e,h,0); h = 1+hypot(f,g); ff[2]=f*dt/h; gg[2]=g*dt/h; e = u+ff[2]; h = v+gg[2]; - f = ax.Linear1(e,h,0); g = ay.Linear1(e,h,0); + f = ax.Spline1(e,h,0); g = ay.Spline1(e,h,0); h = 1+hypot(f,g); ff[3]=f*dt/h; gg[3]=g*dt/h; u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6; v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6; @@ -647,11 +538,11 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD } while(!end); if(k>1) { - long i,j,jj,a=long(1./fabs(dt)); - gr->Reserve(k); j = gr->AddPnt(pp[0],cc[0]); - for(i=1;iReserve(k); j = gr->AddPnt(pp[0],pp[0].c); + for(long i=1;iAddPnt(pp[i],cc[i]); + long jj=j; j = gr->AddPnt(pp[i],pp[i].c); if(vv && i%a==0) { if(dt<0) gr->vect_plot(j,jj,a/5); @@ -660,12 +551,11 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD else gr->line_plot(jj,j); } } - delete []pp; delete []cc; + delete []pp; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt) { - mreal u,v; if(mgl_check_dim2(gr,x,y,ax,ay,"Flow")) return; mreal r = gr->SaveState(opt); @@ -681,11 +571,13 @@ void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha for(long k=0;kGetNz();k++) { + if(gr->NeedStop()) break; if(ax->GetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1); -#pragma omp parallel for private(u,v) collapse(2) +//#pragma omp parallel for collapse(2) for(long i=0;iStop) continue; + mreal u,v; + if(gr->NeedStop()) { i=num; s=2; continue; } u = 0; v = (i+1.)/(num+1.); flow(gr, zVal, s*u, s*v, xx, yy, bx, by,ss,vv); u = 1; v = (i+1.)/(num+1.); @@ -709,7 +601,7 @@ void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha void MGL_EXPORT mgl_flow_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()); + mglDataV x(ax->GetNx()), y(ax->GetNy()); // NOTE mglDataV here is useless x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_flow_xy(gr,&x,&y,ax,ay,sch,0); @@ -726,10 +618,10 @@ void MGL_EXPORT mgl_flow_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const //----------------------------------------------------------------------------- void MGL_EXPORT mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt) { - mglPoint p(x0,y0,z0); + if(mgl_isnan(z0)) z0 = gr->Min.z; mreal u,v; long n=ax->GetNx(), m=ax->GetNy(); - bool both = x->GetNx()==n && y->GetNx()==n && x->GetNy()==m && y->GetNy()==m; + bool nboth = x->GetNx()*x->GetNy()!=n*m || y->GetNx()*y->GetNy()!=n*m; if(mgl_check_dim2(gr,x,y,ax,ay,"FlowP")) return; gr->SaveState(opt); @@ -743,38 +635,38 @@ void MGL_EXPORT mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, H long i0=0,j0=0; for(i=0;iv(i,j)-p.x,y->v(i,j)-p.y) : hypot(x->v(i)-p.x,y->v(j)-p.y); + d = nboth ? hypot(x->v(i)-x0,y->v(j)-y0) : hypot(x->v(i,j)-x0,y->v(i,j)-y0); if(dv(i0,j0)-p.x; dy = y->v(i0,j0)-p.y; + dx = x->v(i0)-x0; dy = y->v(j0)-y0; + dxu= x->dvx(i0); dyv= y->dvx(j0); + u = (i0+dx/dxu)/n; v = (j0+dy/dyv)/m; + } + else + { + dx = x->v(i0,j0)-x0; dy = y->v(i0,j0)-y0; dxu= x->dvx(i0,j0); dyu= y->dvx(i0,j0); dxv= x->dvy(i0,j0); dyv= y->dvy(i0,j0); d = dxv*dyu-dxu*dyv; u = (i0+(dxv*dy-dx*dyv)/d)/n; v = (j0-(dxu*dy-dx*dyu)/d)/m; } - else - { - dx = x->v(i0)-p.x; dy = y->v(j0)-p.y; - dxu= x->dvx(i0); dyv= y->dvx(j0); - u = (i0+dx/dxu)/n; v = (j0+dy/dyv)/m; - } } mglData xx(x), yy(y), bx(ax), by(ay); - flow(gr, p.z, u, v, xx, yy, bx, by,ss,vv); + flow(gr, z0, u, v, xx, yy, bx, by,ss,vv); gr->EndGroup(); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_flowp_2d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()); + mglDataV x(ax->GetNx()), y(ax->GetNy()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_flowp_xy(gr,x0,y0,z0,&x,&y,ax,ay,sch,0); @@ -798,9 +690,8 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl { static long n=10*(ax.nx+ax.ny); long nn = ax.nx*ax.ny*ax.nz; - bool both = x.nx*x.ny*x.nz==nn && y.nx*y.ny*y.nz==nn && z.nx*z.ny*z.nz==nn; + bool nboth = x.nx*x.ny*x.nz!=nn || y.nx*y.ny*y.nz!=nn || z.nx*z.ny*z.nz!=nn; mglPoint *pp = new mglPoint[n], dp; - mreal *cc = new mreal[n]; mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z)); nn = (ax.nx > ax.ny ? ax.nx : ax.ny); @@ -811,29 +702,28 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl register long k=0,m; bool end = false; do{ - if(gr->Stop) { delete []pp; delete []cc; return; } - pp[k].x = both ? x.Spline1(u,v,w):x.Spline1(u,0,0); - pp[k].y = both ? y.Spline1(u,v,w):y.Spline1(v,0,0); - pp[k].z = both ? z.Spline1(u,v,w):z.Spline1(w,0,0); + pp[k].x = nboth ? x.Spline1(u,0,0):x.Spline1(u,v,w); + pp[k].y = nboth ? y.Spline1(v,0,0):y.Spline1(u,v,w); + pp[k].z = nboth ? z.Spline1(w,0,0):z.Spline1(u,v,w); for(m=0;mGetC(ss,s*h); + e = ax.Spline1(u,v,w); f = ay.Spline1(u,v,w); g = az.Spline1(u,v,w); + h = sqrt(e*e+f*f+g*g); pp[k].c = gr->GetC(ss,s*h); if(h<1e-5) break; // stationary point k++; // find next point by midpoint method h+=1; ee[0]=e*dt/h; ff[0]=f*dt/h; gg[0]=g*dt/h; u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2; - e = ax.Linear1(u1,v1,w1); f = ay.Linear1(u1,v1,w1); - g = az.Linear1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); + e = ax.Spline1(u1,v1,w1); f = ay.Spline1(u1,v1,w1); + g = az.Spline1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); ee[1]=e*dt/h; ff[1]=f*dt/h; gg[1]=g*dt/h; u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2; - e = ax.Linear1(u1,v1,w1); f = ay.Linear1(u1,v1,w1); - g = az.Linear1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); + e = ax.Spline1(u1,v1,w1); f = ay.Spline1(u1,v1,w1); + g = az.Spline1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); ee[2]=e*dt/h; ff[2]=f*dt/h; gg[2]=g*dt/h; u1 = u+ee[2]; v1 = v+ff[2]; w1 = w+gg[2]; - e = ax.Linear1(u1,v1,w1); f = ay.Linear1(u1,v1,w1); - g = az.Linear1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); + e = ax.Spline1(u1,v1,w1); f = ay.Spline1(u1,v1,w1); + g = az.Spline1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); ee[3]=e*dt/h; ff[3]=f*dt/h; gg[3]=g*dt/h; u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6; v += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6; @@ -843,21 +733,21 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl } while(!end); if(k>1) { - long i,j,jj,a=long(1./fabs(dt)); + long j,a=long(1./fabs(dt)); mreal rr = mgl_norm(gr->Max-gr->Min)*gr->BarWidth/25, ll; mglPoint q1,q2,l; - long n1=-1,n2=-1,n3=-1,n4=-1, m1=-1,m2=-1,m3=-1,m4=-1; + long n1=-1,n2=-1,n3=-1,n4=-1; - gr->Reserve(4*k); j = gr->AddPnt(pp[0],cc[0]); + gr->Reserve(4*k); j = gr->AddPnt(pp[0],pp[0].c); l = pp[1] - pp[0]; l /= mgl_norm(l); q1 = mglPoint(l.y,-l.x,0); ll = mgl_norm(q1); if(ll) q1 /= ll; else q1 = mglPoint(0,1,0); q2 = q1^l; if(xo) { n1 = gr->AddPnt(pp[0],-1,q2); n2 = gr->AddPnt(pp[0]+rr*q1,-1,q2); } if(zo) { n3 = gr->AddPnt(pp[0],-1,q1); n4 = gr->AddPnt(pp[0]+rr*q2,-1,q1); } - for(i=1;iAddPnt(pp[i],cc[i]); + long jj=j; j = gr->AddPnt(pp[i],pp[i].c); if(vv && i%a==0) { if(dt<0) gr->vect_plot(j,jj,a/5); @@ -866,19 +756,18 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl else gr->line_plot(jj,j); l = pp[i]-pp[i-1]; l /= mgl_norm(l); q1 -= l*(l*q1); q1/= mgl_norm(q1); q2 = q1^l; - m1 = n1; m2 = n2; m3 = n3; m4 = n4; + long m1 = n1, m2 = n2, m3 = n3, m4 = n4; if(xo) { n1 = gr->AddPnt(pp[i],-1,q2); n2 = gr->AddPnt(pp[i]+rr*q1,-1,q2); gr->quad_plot(n1,n2,m1,m2); } if(zo) { n3 = gr->AddPnt(pp[i],-1,q1); n4 = gr->AddPnt(pp[i]+rr*q2,-1,q1); gr->quad_plot(n3,n4,m3,m4); } } } - delete []pp; delete []cc; + delete []pp; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt) { - mreal u,v,w; if(mgl_check_vec3(gr,x,y,z,ax,ay,az,"Flow3")) return; mreal r = gr->SaveState(opt); @@ -889,10 +778,11 @@ void MGL_EXPORT mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, bool vv = mglchr(sch,'v'), xo = mglchr(sch,'x'), zo = mglchr(sch,'z'); mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az); -#pragma omp parallel for private(u,v,w) collapse(3) +//#pragma omp parallel for collapse(3) for(long i=0;iStop) continue; + mreal u,v,w; + if(gr->NeedStop()) { i=j=num; s=2; continue; } u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 0; flow(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 1; @@ -921,7 +811,7 @@ void MGL_EXPORT mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, void MGL_EXPORT mgl_flow_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); + mglDataV x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); // NOTE mglDataV here is useless x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -942,7 +832,7 @@ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x, mglPoint p(x0,y0,z0); mreal u,v,w; long n=ax->GetNx(),m=ax->GetNy(),l=ax->GetNz(); - bool both = x->GetNx()*x->GetNy()*x->GetNz()==n*m*l && y->GetNx()*y->GetNy()*y->GetNz()==n*m*l && z->GetNx()*z->GetNy()*z->GetNz()==n*m*l; + bool nboth = !(x->GetNN()==n*m*l && y->GetNN()==n*m*l && z->GetNN()==n*m*l); if(mgl_check_vec3(gr,x,y,z,ax,ay,az,"FlowP3")) return; gr->SaveState(opt); @@ -957,10 +847,10 @@ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x, mreal dx,dy,dz; for(i=0;iv(i,j,k)-p.x; dy = y->v(i,j,k)-p.y; dz = x->v(i,j,k)-p.z; } - else + if(nboth) { dx = x->v(i)-p.x; dy = y->v(j)-p.y; dz = x->v(k)-p.z; } + else + { dx = x->v(i,j,k)-p.x; dy = y->v(i,j,k)-p.y; dz = x->v(i,j,k)-p.z; } d = sqrt(dx*dx+dy*dy+dz*dz); if(dv(i0)-p.x; dy = y->v(j0)-p.y; dz = z->v(k0)-p.z; + dxu= x->dvx(i0); dyv= y->dvx(j0); dzw= z->dvx(k0); + u = (i0+dx/dxu)/n; v = (j0+dy/dyv)/m; w = (k0+dz/dzw)/m; + } + else { dx = x->v(i0,j0,k0)-p.x; dy = y->v(i0,j0,k0)-p.y; dz = z->v(i0,j0,k0)-p.z; dxu= x->dvx(i0,j0,k0); dyu= y->dvx(i0,j0,k0); dzu= z->dvx(i0,j0,k0); @@ -980,12 +876,6 @@ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x, v = (j0-(dx*(dyw*dzu-dyu*dzw)+dxu*(dy*dzw-dyw*dz)+dxw*(dyu*dz-dy*dzu))/d)/m; w = (i0+(dx*(dyv*dzu-dyu*dzv)+dxu*(dy*dzv-dyv*dz)+dxv*(dyu*dz-dy*dzu))/d)/l; } - else - { - dx = x->v(i0)-p.x; dy = y->v(j0)-p.y; dz = z->v(k0)-p.z; - dxu= x->dvx(i0); dyv= y->dvx(j0); dzw= z->dvx(k0); - u = (i0+dx/dxu)/n; v = (j0+dy/dyv)/m; w = (k0+dz/dzw)/m; - } } mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az); flow(gr, u, v, w, xx, yy, zz, bx, by, bz,ss,vv,xo,zo); @@ -995,7 +885,7 @@ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x, void MGL_EXPORT mgl_flowp_3d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); + mglDataV x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); // NOTE mglDataV here is useless x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -1021,7 +911,7 @@ void MGL_EXPORT mgl_grad_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT phi, const ch mglData ax(phi), ay,az,xx,yy,zz; ay.Set(ax); az.Set(ax); xx.Set(ax); yy.Set(ax); zz.Set(ax); long n=xx.nx, m=xx.ny, l=xx.nz, nn = n*m*l; - if(x->GetNx()*x->GetNy()*x->GetNz()==nn && y->GetNx()*y->GetNy()*y->GetNz()==nn && z->GetNx()*z->GetNy()*z->GetNz()==nn) + if(x->GetNN()==nn && y->GetNN()==nn && z->GetNN()==nn) { xx.Set(x); yy.Set(y); zz.Set(z); } // nothing to do else if(x->GetNx()==n && y->GetNx()==m && z->GetNx()==l) #pragma omp parallel for collapse(3) @@ -1052,7 +942,7 @@ void MGL_EXPORT mgl_grad_xy(HMGL gr, HCDT x, HCDT y, HCDT phi, const char *sch, //----------------------------------------------------------------------------- void MGL_EXPORT mgl_grad(HMGL gr, HCDT phi, const char *sch, const char *opt) { - mglData x(phi->GetNx()), y(phi->GetNy()), z(phi->GetNz()); + mglDataV x(phi->GetNx()), y(phi->GetNy()), z(phi->GetNz()); gr->SaveState(opt); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); if(phi->GetNz()==1) mgl_grad_xy(gr,&x,&y,phi,sch,0); @@ -1081,7 +971,7 @@ void MGL_EXPORT mgl_grad_(uintptr_t *gr, uintptr_t *ph, const char *sch, const c void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mglData &x, const mglData &y, const mglData &ax, const mglData &ay, double r0,long sc) { long n=10*(ax.nx+ax.ny); - bool both = x.nx==ax.nx && y.nx==ax.nx && x.ny==ax.ny && y.ny==ax.ny; + bool nboth = x.nx*x.ny!=ax.nx*ax.ny || y.nx*y.ny!=ax.nx*ax.ny; mglPoint *pp = new mglPoint[n], dp; mreal *cc = new mreal[n]; @@ -1093,13 +983,12 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl register long k=0,m; bool end = false; do{ - if(gr->Stop) { delete []pp; delete []cc; return; } - pp[k].x = both ? x.Spline1(u,v,0):x.Spline1(u,0,0); - pp[k].y = both ? y.Spline1(u,v,0):y.Spline1(v,0,0); + pp[k].x = nboth ? x.Spline1(u,0,0):x.Spline1(u,v,0); + pp[k].y = nboth ? y.Spline1(v,0,0):y.Spline1(u,v,0); pp[k].z = zVal; for(m=0;mGetC(sc,s*h); pp[k].c = r0>0 ? r0*sqrt(1e-2+ss*h*h)/2 : -r0/sqrt(1e-2+ss*h*h)/5; if(h<1e-5) break; // stationary point @@ -1107,13 +996,13 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl // find next point by midpoint method h+=1; ff[0]=f*dt/h; gg[0]=g*dt/h; e = u+ff[0]/2; h = v+gg[0]/2; - f = ax.Linear1(e,h,0); g = ay.Linear1(e,h,0); h = 1+hypot(f,g); + f = ax.Spline1(e,h,0); g = ay.Spline1(e,h,0); h = 1+hypot(f,g); ff[1]=f*dt/h; gg[1]=g*dt/h; e = u+ff[1]/2; h = v+gg[1]/2; - f = ax.Linear1(e,h,0); g = ay.Linear1(e,h,0); h = 1+hypot(f,g); + f = ax.Spline1(e,h,0); g = ay.Spline1(e,h,0); h = 1+hypot(f,g); ff[2]=f*dt/h; gg[2]=g*dt/h; e = u+ff[2]; h = v+gg[2]; - f = ax.Linear1(e,h,0); g = ay.Linear1(e,h,0); h = 1+hypot(f,g); + f = ax.Spline1(e,h,0); g = ay.Spline1(e,h,0); h = 1+hypot(f,g); ff[3]=f*dt/h; gg[3]=g*dt/h; u += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6; v += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6; @@ -1161,7 +1050,6 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl //----------------------------------------------------------------------------- void MGL_EXPORT mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt) { - mreal u,v; if(mgl_check_dim2(gr,x,y,ax,ay,"Pipe")) return; mreal r = gr->SaveState(opt); @@ -1177,11 +1065,13 @@ void MGL_EXPORT mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha mglData xx(x), yy(y), bx(ax), by(ay); for(long k=0;kGetNz();k++) { + if(gr->NeedStop()) break; if(ax->GetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1); -#pragma omp parallel for private(u,v) collapse(2) +//#pragma omp parallel for collapse(2) for(long i=0;iStop) continue; + mreal u,v; + if(gr->NeedStop()) { i=num; s=2; continue; } u = 0; v = (i+1.)/(num+1.); flowr(gr, zVal, s*u, s*v, xx, yy, bx, by,r0,ss); u = 1; v = (i+1.)/(num+1.); @@ -1205,7 +1095,7 @@ void MGL_EXPORT mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha void MGL_EXPORT mgl_pipe_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()); + mglDataV x(ax->GetNx()), y(ax->GetNy()); // NOTE mglDataV here is useless x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); mgl_pipe_xy(gr,&x,&y,ax,ay,sch,r0,0); @@ -1228,7 +1118,7 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg { static long n=10*(ax.nx+ax.ny); long nn = ax.nx*ax.ny*ax.nz; - bool both = x.nx*x.ny*x.nz==nn && y.nx*y.ny*y.nz==nn && z.nx*z.ny*z.nz==nn; + bool nboth = x.nx*x.ny*x.nz!=nn || y.nx*y.ny*y.nz!=nn || z.nx*z.ny*z.nz!=nn; mglPoint *pp = new mglPoint[n], dp; mreal *cc = new mreal[n]; mglPoint dx(1/fabs(gr->Max.x-gr->Min.x),1/fabs(gr->Max.y-gr->Min.y),1/fabs(gr->Max.z-gr->Min.z)); @@ -1243,13 +1133,12 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg register long k=0,m; bool end = false; do{ - if(gr->Stop) { delete []pp; delete []cc; return; } - pp[k].x = both ? x.Spline1(u,v,w):x.Spline1(u,0,0); - pp[k].y = both ? y.Spline1(u,v,w):y.Spline1(v,0,0); - pp[k].z = both ? z.Spline1(u,v,w):z.Spline1(w,0,0); + pp[k].x = nboth ? x.Spline1(u,0,0):x.Spline1(u,v,w); + pp[k].y = nboth ? y.Spline1(v,0,0):y.Spline1(u,v,w); + pp[k].z = nboth ? z.Spline1(w,0,0):z.Spline1(u,v,w); for(m=0;mGetC(sc,s*h); pp[k].c = r0>0 ? r0*sqrt(1e-2+ss*h*h)/2 : -r0/sqrt(1e-2+ss*h*h)/5; if(h<1e-5) break; // stationary point @@ -1257,16 +1146,16 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg // find next point by midpoint method h+=1; ee[0]=e*dt/h; ff[0]=f*dt/h; gg[0]=g*dt/h; u1 = u+ee[0]/2; v1 = v+ff[0]/2; w1 = w+gg[0]/2; - e = ax.Linear1(u1,v1,w1); f = ay.Linear1(u1,v1,w1); - g = az.Linear1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); + e = ax.Spline1(u1,v1,w1); f = ay.Spline1(u1,v1,w1); + g = az.Spline1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); ee[1]=e*dt/h; ff[1]=f*dt/h; gg[1]=g*dt/h; u1 = u+ee[1]/2; v1 = v+ff[1]/2; w1 = w+gg[1]/2; - e = ax.Linear1(u1,v1,w1); f = ay.Linear1(u1,v1,w1); - g = az.Linear1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); + e = ax.Spline1(u1,v1,w1); f = ay.Spline1(u1,v1,w1); + g = az.Spline1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); ee[2]=e*dt/h; ff[2]=f*dt/h; gg[2]=g*dt/h; u1 = u+ee[2]; v1 = v+ff[2]; w1 = w+gg[2]; - e = ax.Linear1(u1,v1,w1); f = ay.Linear1(u1,v1,w1); - g = az.Linear1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); + e = ax.Spline1(u1,v1,w1); f = ay.Spline1(u1,v1,w1); + g = az.Spline1(u1,v1,w1); h = 1+sqrt(e*e+f*f+g*g); ee[3]=e*dt/h; ff[3]=f*dt/h; gg[3]=g*dt/h; u += ee[0]/6+ee[1]/3+ee[2]/3+ee[3]/6; v += ff[0]/6+ff[1]/3+ff[2]/3+ff[3]/6; @@ -1315,7 +1204,6 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg //----------------------------------------------------------------------------- void MGL_EXPORT mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt) { - mreal u,v,w; if(mgl_check_vec3(gr,x,y,z,ax,ay,az,"Vect")) return; mreal r = gr->SaveState(opt); @@ -1327,10 +1215,11 @@ void MGL_EXPORT mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, bool cnt=!mglchr(sch,'#'); mglData xx(x), yy(y), zz(z), bx(ax), by(ay), bz(az); -#pragma omp parallel for private(u,v,w) collapse(3) +//#pragma omp parallel for collapse(3) for(long i=0;iStop) continue; + mreal u,v,w; + if(gr->NeedStop()) { i=j=num; s=2; continue; } u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 0; flowr(gr, s*u, s*v, s*w, xx, yy, zz, bx, by, bz,r0,ss); u = (i+1.)/(num+1.); v = (j+1.)/(num+1.); w = 1; @@ -1359,7 +1248,7 @@ void MGL_EXPORT mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, void MGL_EXPORT mgl_pipe_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt) { gr->SaveState(opt); - mglData x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); + mglDataV x(ax->GetNx()), y(ax->GetNy()), z(ax->GetNz()); // NOTE mglDataV here is useless x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); diff --git a/src/volume.cpp b/src/volume.cpp index 2a83031..c4bf96e 100644 --- a/src/volume.cpp +++ b/src/volume.cpp @@ -32,8 +32,8 @@ void MGL_EXPORT mgl_cloud_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha { if(!(gr->GetQuality()&3)) return; // do nothing in fast_draw long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); - bool both = mgl_isboth(x,y,z,a); - if(mgl_check_dim3(gr,both,x,y,z,a,0,"Cloud")) return; + bool nboth = mgl_isnboth(x,y,z,a); + if(mgl_check_dim3(gr,!nboth,x,y,z,a,0,"Cloud")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Cloud",cgid++); @@ -58,35 +58,36 @@ void MGL_EXPORT mgl_cloud_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha long *pos=new long[n*m*l]; gr->Reserve(n*m*l); mglPoint q=mglPoint(NAN); -#pragma omp parallel for collapse(3) - for(long k=0;kStop) continue; - mglPoint p = both ? mglPoint(x->v(i*tx,j*ty,k*tz),y->v(i*tx,j*ty,k*tz),z->v(i*tx,j*ty,k*tz)) : mglPoint(x->v(i*tx),y->v(j*ty),z->v(k*tz)); - mreal aa = gr->GetA(a->v(i*tx,j*ty,k*tz)); - mreal bb = inv ? (1-aa)*(1-aa)*alpha : aa*aa*alpha; - pos[i+n*(j+m*k)] = gr->AddPnt(p,gr->GetC(ss,aa,false),q,bb); + if(gr->NeedStop()) break; + for(long j=0;jv(i*tx),y->v(j*ty),z->v(k*tz)) : mglPoint(x->v(i*tx,j*ty,k*tz),y->v(i*tx,j*ty,k*tz),z->v(i*tx,j*ty,k*tz)); + mreal aa = gr->GetA(a->v(i*tx,j*ty,k*tz)); + mreal bb = inv ? (1-aa)*(1-aa)*alpha : aa*aa*alpha; + pos[i+n*(j+m*k)] = gr->AddPnt(p,gr->GetC(ss,aa,false),q,bb); + } } - if(dot) -#pragma omp parallel for - for(long i=0;imark_plot(pos[i],'.'); - else -#pragma omp parallel for collapse(3) - for(long k=0;kmark_plot(pos[i],'.'); + else for(long k=0;kNeedStop()) break; + for(long j=0;jStop) continue; register long i0 = i+n*(j+m*k); if(iquad_plot(pos[i0],pos[i0+1],pos[i0+n],pos[i0+n+1]); if(iquad_plot(pos[i0],pos[i0+1],pos[i0+n*m],pos[i0+n*m+1]); if(kquad_plot(pos[i0],pos[i0+n],pos[i0+n*m],pos[i0+n+n*m]); } + } delete []pos; gr->EndGroup(); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_cloud(HMGL gr, HCDT a, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -130,21 +131,21 @@ mreal MGL_NO_EXPORT mgl_normal_1d(HCDT a, mreal x, bool inv, long n) return inv ? nx : -nx; } //----------------------------------------------------------------------------- -mglPoint MGL_NO_EXPORT mgl_find_norm(bool both, HCDT x, HCDT y, HCDT z, HCDT a, mglPoint u, bool inv, long n,long m,long l) +mglPoint MGL_NO_EXPORT mgl_find_norm(bool nboth, HCDT x, HCDT y, HCDT z, HCDT a, mglPoint u, bool inv, long n,long m,long l) { mglPoint s = mgl_normal_3d(a,u,inv,n,m,l), t, q; - if(both) - { - t = mgl_normal_3d(x,u,true,n,m,l); q.x = (s*t)/(t*t); - t = mgl_normal_3d(y,u,true,n,m,l); q.y = (s*t)/(t*t); - t = mgl_normal_3d(z,u,true,n,m,l); q.z = (s*t)/(t*t); - } - else + if(nboth) { q.x = s.x/mgl_normal_1d(x,u.x,true,n); q.y = s.y/mgl_normal_1d(y,u.y,true,m); q.z = s.z/mgl_normal_1d(z,u.z,true,l); } + else + { + t = mgl_normal_3d(x,u,true,n,m,l); q.x = (s*t)/(t*t); + t = mgl_normal_3d(y,u,true,n,m,l); q.y = (s*t)/(t*t); + t = mgl_normal_3d(z,u,true,n,m,l); q.z = (s*t)/(t*t); + } return q; } //----------------------------------------------------------------------------- @@ -157,17 +158,15 @@ inline mreal MGL_NO_EXPORT mgl_cos_pp(const mglPoint *kk,long i0,long i1,long i2 //----------------------------------------------------------------------------- void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long *ky1,long *ky2, long *kz, std::vector kk, int wire) { - long id[12],us[12],pd[12],ni; + long id[12],us[12],pd[12]; mglPoint pp[12]; - mreal d,d0; -#pragma omp parallel for private(id,us,pd,pp,ni,d,d0) collapse(2) +#pragma omp parallel for private(id,us,pd,pp) collapse(2) for(long j=0;jStop) continue; register long i0 = i+n*j,ii,jj,k; // find ID of points of Surf3 intersection with cell i0 - memset(id,-1,12*sizeof(long)); ni = 0; + memset(id,-1,12*sizeof(long)); long ni = 0; if(kx1[i0]>=0) id[ni++] = kx1[i0]; if(ky1[i0]>=0) id[ni++] = ky1[i0]; if(kx1[i0+n]>=0) id[ni++] = kx1[i0+n]; @@ -187,7 +186,7 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long * // remove points which is too close to first one for(jj=1;jj1e-5) jj++; else { ni--; for(ii=jj;iid0) { d0=d; i0=ii; } } if(i0<0) break; // no more triangles. NOTE: should be never here @@ -239,11 +239,11 @@ void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, H { long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); long *kx1,*kx2,*ky1,*ky2,*kz; - bool both = mgl_isboth(x,y,z,a); + bool nboth = !mgl_isboth(x,y,z,a); int wire = mglchr(sch,'#')?1:0; if(mglchr(sch,'.')) wire = 2; mreal d; - if(mgl_check_dim3(gr,both,x,y,z,a,0,"Surf3")) return; + if(mgl_check_dim3(gr,!nboth,x,y,z,a,0,"Surf3")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Surf3",cgid++); @@ -262,27 +262,24 @@ void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, H mreal a0; for(k=0;kNeedStop()) break; memcpy(kx1,kx2,n*m*sizeof(long)); memset(kx2,-1,n*m*sizeof(long)); memcpy(ky1,ky2,n*m*sizeof(long)); memset(ky2,-1,n*m*sizeof(long)); memset(kz ,-1,n*m*sizeof(long)); gr->Reserve(n*m); gr->Reserve(n*m); -//#pragma omp parallel for collapse(2) // NOTE: this part require a lot of memory for OpenMP. Omit it. for(j=0;jStop) continue; i1 = i+n*j; a0 = a->v(i,j,k); - p0 = both?mglPoint(x->v(i,j,k), y->v(i,j,k), z->v(i,j,k)) : mglPoint(x->v(i), y->v(j), z->v(k)); + p0 = nboth? mglPoint(x->v(i), y->v(j), z->v(k)) : mglPoint(x->v(i,j,k), y->v(i,j,k), z->v(i,j,k)); if(iv(i+1,j,k)); if(d>=0 && d<1) { - if(both) p = mglPoint(p0.x*(1-d)+x->v(i+1,j,k)*d, - p0.y*(1-d)+y->v(i+1,j,k)*d, - p0.z*(1-d)+z->v(i+1,j,k)*d); - else p = mglPoint(p0.x*(1-d)+x->v(i+1)*d, p0.y, p0.z); + if(nboth) p = mglPoint(p0.x*(1-d)+x->v(i+1)*d, p0.y, p0.z); + else p = mglPoint(p0.x*(1-d)+x->v(i+1,j,k)*d, p0.y*(1-d)+y->v(i+1,j,k)*d, p0.z*(1-d)+z->v(i+1,j,k)*d); u = mglPoint(i+d,j,k); - q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l); + q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l); pos = gr->AddPnt(p,c,q); u.c=pos; if(pos<0) continue; kx2[i1] = kk.size(); kk.push_back(u); @@ -293,12 +290,10 @@ void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, H d = mgl_d(val,a0,a->v(i,j+1,k)); if(d>=0 && d<1) { - if(both) p = mglPoint(p0.x*(1-d)+x->v(i,j+1,k)*d, - p0.y*(1-d)+y->v(i,j+1,k)*d, - p0.z*(1-d)+z->v(i,j+1,k)*d); - else p = mglPoint(p0.x, p0.y*(1-d)+y->v(j+1)*d, p0.z); + if(nboth) p = mglPoint(p0.x, p0.y*(1-d)+y->v(j+1)*d, p0.z); + else p = mglPoint(p0.x*(1-d)+x->v(i,j+1,k)*d, p0.y*(1-d)+y->v(i,j+1,k)*d, p0.z*(1-d)+z->v(i,j+1,k)*d); u = mglPoint(i,j+d,k); - q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l); + q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l); pos = gr->AddPnt(p,c,q); u.c=pos; if(pos<0) continue; ky2[i1] = kk.size(); kk.push_back(u); @@ -309,12 +304,10 @@ void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, H d = mgl_d(val,a->v(i,j,k-1),a0); if(d>=0 && d<1) { - if(both) p = mglPoint(x->v(i,j,k-1)*(1-d)+p0.x*d, - y->v(i,j,k-1)*(1-d)+p0.y*d, - z->v(i,j,k-1)*(1-d)+p0.z*d); - else p = mglPoint(p0.x, p0.y, z->v(k-1)*(1-d)+p0.z*d); + if(nboth) p = mglPoint(p0.x, p0.y, z->v(k-1)*(1-d)+p0.z*d); + else p = mglPoint(x->v(i,j,k-1)*(1-d)+p0.x*d, y->v(i,j,k-1)*(1-d)+p0.y*d, z->v(i,j,k-1)*(1-d)+p0.z*d); u = mglPoint(i,j,k+d-1); - q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l); + q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l); pos = gr->AddPnt(p,c,q); u.c=pos; if(pos<0) continue; kz[i1] = kk.size(); kk.push_back(u); @@ -331,7 +324,7 @@ void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, H void MGL_EXPORT mgl_surf3_val(HMGL gr, double val, HCDT a, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()), z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()), z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -352,7 +345,7 @@ void MGL_EXPORT mgl_surf3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha void MGL_EXPORT mgl_surf3(HMGL gr, HCDT a, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()), z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()), z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -387,11 +380,11 @@ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, { long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); long *kx1,*kx2,*ky1,*ky2,*kz; - bool both = mgl_isboth(x,y,z,a); + bool nboth = mgl_isnboth(x,y,z,a); int wire = mglchr(sch,'#')?1:0; if(mglchr(sch,'.')) wire = 2; mreal d; - if(mgl_check_dim3(gr,both,x,y,z,a,b,"Surf3A")) return; + if(mgl_check_dim3(gr,!nboth,x,y,z,a,b,"Surf3A")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Surf3A",cgid++); @@ -410,30 +403,26 @@ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, mreal a0,b0; for(k=0;kNeedStop()) break; memcpy(kx1,kx2,n*m*sizeof(long)); memset(kx2,-1,n*m*sizeof(long)); memcpy(ky1,ky2,n*m*sizeof(long)); memset(ky2,-1,n*m*sizeof(long)); memset(kz ,-1,n*m*sizeof(long)); gr->Reserve(n*m); gr->Reserve(n*m); -//#pragma omp parallel for collapse(2) // NOTE: this part require a lot of memory for OpenMP. Omit it. for(j=0;jStop) { delete []kx1; delete []kx2; delete []ky1; - delete []ky2; delete []kz; return; } i1 = i+n*j; a0 = a->v(i,j,k); b0 = b->v(i,j,k); - p0 = both?mglPoint(x->v(i,j,k), y->v(i,j,k), z->v(i,j,k)) : mglPoint(x->v(i), y->v(j), z->v(k)); + p0 = nboth? mglPoint(x->v(i), y->v(j), z->v(k)) : mglPoint(x->v(i,j,k), y->v(i,j,k), z->v(i,j,k)); if(iv(i+1,j,k)); if(d>=0 && d<1) { - if(both) p = mglPoint(p0.x*(1-d)+x->v(i+1,j,k)*d, - p0.y*(1-d)+y->v(i+1,j,k)*d, - p0.z*(1-d)+z->v(i+1,j,k)*d); - else p = mglPoint(p0.x*(1-d)+x->v(i+1)*d, p0.y, p0.z); + if(nboth) p = mglPoint(p0.x*(1-d)+x->v(i+1)*d, p0.y, p0.z); + else p = mglPoint(p0.x*(1-d)+x->v(i+1,j,k)*d, p0.y*(1-d)+y->v(i+1,j,k)*d, p0.z*(1-d)+z->v(i+1,j,k)*d); aa = gr->GetA(b0*(1-d)+b->v(i+1,j,k)*d); u = mglPoint(i+d,j,k); - q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l); + q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l); pos = gr->AddPnt(p,c,q,aa); u.c=pos; if(pos<0) continue; kx2[i1] = kk.size(); kk.push_back(u); @@ -444,13 +433,11 @@ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, d = mgl_d(val,a0,a->v(i,j+1,k)); if(d>=0 && d<1) { - if(both) p = mglPoint(p0.x*(1-d)+x->v(i,j+1,k)*d, - p0.y*(1-d)+y->v(i,j+1,k)*d, - p0.z*(1-d)+z->v(i,j+1,k)*d); - else p = mglPoint(p0.x, p0.y*(1-d)+y->v(j+1)*d, p0.z); + if(nboth) p = mglPoint(p0.x, p0.y*(1-d)+y->v(j+1)*d, p0.z); + else p = mglPoint(p0.x*(1-d)+x->v(i,j+1,k)*d, p0.y*(1-d)+y->v(i,j+1,k)*d, p0.z*(1-d)+z->v(i,j+1,k)*d); aa = gr->GetA(b0*(1-d)+b->v(i,j+1,k)*d); u = mglPoint(i,j+d,k); - q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l); + q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l); pos = gr->AddPnt(p,c,q,aa); u.c=pos; if(pos<0) continue; ky2[i1] = kk.size(); kk.push_back(u); @@ -461,13 +448,11 @@ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, d = mgl_d(val,a->v(i,j,k-1),a0); if(d>=0 && d<1) { - if(both) p = mglPoint(x->v(i,j,k-1)*(1-d)+p0.x*d, - y->v(i,j,k-1)*(1-d)+p0.y*d, - z->v(i,j,k-1)*(1-d)+p0.z*d); - else p = mglPoint(p0.x, p0.y, z->v(k-1)*(1-d)+p0.z*d); + if(nboth) p = mglPoint(p0.x, p0.y, z->v(k-1)*(1-d)+p0.z*d); + else p = mglPoint(x->v(i,j,k-1)*(1-d)+p0.x*d, y->v(i,j,k-1)*(1-d)+p0.y*d, z->v(i,j,k-1)*(1-d)+p0.z*d); aa = gr->GetA(b->v(i,j,k-1)*(1-d)+b0*d); u = mglPoint(i,j,k+d-1); - q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l); + q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l); pos = gr->AddPnt(p,c,q,aa); u.c=pos; if(pos<0) continue; kz[i1] = kk.size(); kk.push_back(u); @@ -484,7 +469,7 @@ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, void MGL_EXPORT mgl_surf3a_val(HMGL gr, double val, HCDT a, HCDT b, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -517,7 +502,7 @@ void MGL_EXPORT mgl_surf3a_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, void MGL_EXPORT mgl_surf3a(HMGL gr, HCDT a, HCDT b, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -554,11 +539,11 @@ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, { long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); long *kx1,*kx2,*ky1,*ky2,*kz; - bool both = mgl_isboth(x,y,z,a); + bool nboth = mgl_isnboth(x,y,z,a); int wire = mglchr(sch,'#')?1:0; if(mglchr(sch,'.')) wire = 2; mreal d; - if(mgl_check_dim3(gr,both,x,y,z,a,b,"Surf3C")) return; + if(mgl_check_dim3(gr,!nboth,x,y,z,a,b,"Surf3C")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Surf3C",cgid++); @@ -577,30 +562,26 @@ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, mreal a0,b0; for(k=0;kNeedStop()) break; memcpy(kx1,kx2,n*m*sizeof(long)); memset(kx2,-1,n*m*sizeof(long)); memcpy(ky1,ky2,n*m*sizeof(long)); memset(ky2,-1,n*m*sizeof(long)); memset(kz ,-1,n*m*sizeof(long)); gr->Reserve(n*m); gr->Reserve(n*m); -//#pragma omp parallel for collapse(2) // NOTE: this part require a lot of memory for OpenMP. Omit it. for(j=0;jStop) { delete []kx1; delete []kx2; delete []ky1; - delete []ky2; delete []kz; return; } i1 = i+n*j; a0 = a->v(i,j,k); b0 = b->v(i,j,k); - p0 = both?mglPoint(x->v(i,j,k), y->v(i,j,k), z->v(i,j,k)) : mglPoint(x->v(i), y->v(j), z->v(k)); + p0 = nboth? mglPoint(x->v(i), y->v(j), z->v(k)) : mglPoint(x->v(i,j,k), y->v(i,j,k), z->v(i,j,k)); if(iv(i+1,j,k)); if(d>=0 && d<1) { - if(both) p = mglPoint(p0.x*(1-d)+x->v(i+1,j,k)*d, - p0.y*(1-d)+y->v(i+1,j,k)*d, - p0.z*(1-d)+z->v(i+1,j,k)*d); - else p = mglPoint(p0.x*(1-d)+x->v(i+1)*d, p0.y, p0.z); + if(nboth) p = mglPoint(p0.x*(1-d)+x->v(i+1)*d, p0.y, p0.z); + else p = mglPoint(p0.x*(1-d)+x->v(i+1,j,k)*d, p0.y*(1-d)+y->v(i+1,j,k)*d, p0.z*(1-d)+z->v(i+1,j,k)*d); c = gr->GetC(ss,b0*(1-d)+b->v(i+1,j,k)*d); u = mglPoint(i+d,j,k); - q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l); + q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l); pos = gr->AddPnt(p,c,q); u.c=pos; if(pos<0) continue; kx2[i1] = kk.size(); kk.push_back(u); @@ -611,13 +592,11 @@ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, d = mgl_d(val,a0,a->v(i,j+1,k)); if(d>=0 && d<1) { - if(both) p = mglPoint(p0.x*(1-d)+x->v(i,j+1,k)*d, - p0.y*(1-d)+y->v(i,j+1,k)*d, - p0.z*(1-d)+z->v(i,j+1,k)*d); - else p = mglPoint(p0.x, p0.y*(1-d)+y->v(j+1)*d, p0.z); + if(nboth) p = mglPoint(p0.x, p0.y*(1-d)+y->v(j+1)*d, p0.z); + else p = mglPoint(p0.x*(1-d)+x->v(i,j+1,k)*d, p0.y*(1-d)+y->v(i,j+1,k)*d, p0.z*(1-d)+z->v(i,j+1,k)*d); c = gr->GetC(ss,b0*(1-d)+b->v(i,j+1,k)*d); u = mglPoint(i,j+d,k); - q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l); + q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l); pos = gr->AddPnt(p,c,q); u.c=pos; if(pos<0) continue; ky2[i1] = kk.size(); kk.push_back(u); @@ -628,13 +607,11 @@ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, d = mgl_d(val,a->v(i,j,k-1),a0); if(d>=0 && d<1) { - if(both) p = mglPoint(x->v(i,j,k-1)*(1-d)+p0.x*d, - y->v(i,j,k-1)*(1-d)+p0.y*d, - z->v(i,j,k-1)*(1-d)+p0.z*d); - else p = mglPoint(p0.x, p0.y, z->v(k-1)*(1-d)+p0.z*d); + if(nboth) p = mglPoint(p0.x, p0.y, z->v(k-1)*(1-d)+p0.z*d); + else p = mglPoint(x->v(i,j,k-1)*(1-d)+p0.x*d, y->v(i,j,k-1)*(1-d)+p0.y*d, z->v(i,j,k-1)*(1-d)+p0.z*d); c = gr->GetC(ss,b->v(i,j,k-1)*(1-d)+b0*d); u = mglPoint(i,j,k+d-1); - q = mgl_find_norm(both, x,y,z,a, u, inv,n,m,l); + q = mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l); pos = gr->AddPnt(p,c,q); u.c=pos; if(pos<0) continue; kz[i1] = kk.size(); kk.push_back(u); @@ -651,7 +628,7 @@ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, void MGL_EXPORT mgl_surf3c_val(HMGL gr, double val, HCDT a, HCDT b, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -673,7 +650,7 @@ void MGL_EXPORT mgl_surf3c_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, void MGL_EXPORT mgl_surf3c(HMGL gr, HCDT a, HCDT b, const char *sch, const char *opt) { gr->SaveState(opt); - mglData x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); + mglDataV x(a->GetNx()), y(a->GetNy()),z(a->GetNz()); x.Fill(gr->Min.x,gr->Max.x); y.Fill(gr->Min.y,gr->Max.y); z.Fill(gr->Min.z,gr->Max.z); @@ -709,68 +686,8 @@ void MGL_EXPORT mgl_surf3c_(uintptr_t *gr, uintptr_t *a, uintptr_t *b, const cha // flag & 0x1 -- accompanied coordinates // flag & 0x2 -- project to r*z // flag & 0x4 -- normalize field -void MGL_NO_EXPORT mgl_beam_md(HMGL gr, double val, const mglData *tr, const mglData *g1, const mglData *g2, const mglData *a, double r, const char *stl, int flag) -{ - long n = a->nz,m=a->nx,l=a->ny; - if(n<2 || m<2 || l<2) { gr->SetWarn(mglWarnLow,"Beam"); return; } - if(a->Minimal()<0) { gr->SetWarn(mglWarnNeg,"Beam"); return; } - if(tr->nx<3 || tr->nynx<3 || g1->nynx<3 || g2->nySetWarn(mglWarnDim,"Beam"); return; } - mglData x(a),y(a),z(a),b(a); - mreal asum=1, asum0=0, amax, aa; - r = fabs(r); - if(flag & 4) -#pragma omp parallel for reduction(+:asum0) - for(long j=0;ja[j]*a->a[j]; - if(asum0==0) { gr->SetWarn(mglWarnZero,"Beam"); return; } - for(long i=0;ia[j+m*l*i]; - asum += aa*aa; - amax = amax>aa ? amax : aa; - } - if(amax==0) { asum=0; amax=1; } -#pragma omp parallel for - for(long j=0;jStop) continue; - register long i0 = j+m*(k+l*i); - if(flag & 1) - { - x.a[i0] = 2*j/(m-1.)-1; - y.a[i0] = 2*k/(l-1.)-1; - z.a[i0] = gr->Max.z*i/(n-1.); - } - else - { - x.a[i0] = tr->a[3*i] + g1->a[3*i]*(2*j/(m-1.)-1)*r + g2->a[3*i]*(2*k/(l-1.)-1)*r; - y.a[i0] = tr->a[3*i+1] + g1->a[3*i+1]*(2*j/(m-1.)-1)*r + g2->a[3*i+1]*(2*k/(l-1.)-1)*r; - z.a[i0] = tr->a[3*i+2] + g1->a[3*i+2]*(2*j/(m-1.)-1)*r + g2->a[3*i+2]*(2*k/(l-1.)-1)*r; - } - if(flag & 2) x.a[i0] = hypot(x.a[i0],y.a[i0]); - } - } - mgl_surf3_xyz_val(gr,val,&x,&y,&z,&b,stl,0); -} -//----------------------------------------------------------------------------- void MGL_EXPORT mgl_beam_val(HMGL gr, double val, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int flag) { - - const mglData *dtr=dynamic_cast(tr); - const mglData *dg2=dynamic_cast(g1); - const mglData *dg1=dynamic_cast(g2); - const mglData *da=dynamic_cast(a); - if(dtr&&dg1&&dg2&&da) - { mgl_beam_md(gr,val,dtr,dg1,dg2,da,r,stl,flag); return; } - long n = a->GetNz(),m=a->GetNx(),l=a->GetNy(); if(n<2 || m<2 || l<2) { gr->SetWarn(mglWarnLow,"Beam"); return; } if(a->Minimal()<0) { gr->SetWarn(mglWarnNeg,"Beam"); return; } @@ -778,42 +695,45 @@ void MGL_EXPORT mgl_beam_val(HMGL gr, double val, HCDT tr, HCDT g1, HCDT g2, HCD { gr->SetWarn(mglWarnDim,"Beam"); return; } mglData x(a),y(a),z(a),b(a); register long i,j,k,i0; - mreal asum=1, asum0=1, amax, aa; - r = fabs(r); + mreal asum0=1; r = fabs(r); if(flag & 4) for(j=0;jvthr(j)*a->vthr(j); if(asum0==0) { gr->SetWarn(mglWarnZero,"Beam"); return; } for(i=0;iNeedStop()) break; if(flag & 4) { + mreal asum=0, amax=0; for(j=0;jvthr(j+m*l*i); - asum += aa*aa; - amax = amax>aa ? amax : aa; + register mreal aa = a->vthr(j+m*l*i); + asum += aa*aa; amax = amax>aa ? amax : aa; } - if(amax==0) { asum=0; amax=1; } - for(j=0;jStop) return; - i0 = j+m*(k+l*i); - if(flag & 1) + if(flag & 1) +#pragma omp parallel for collapse(2) + for(j=0;jMax.z*i/(n-1.); } - else + else +#pragma omp parallel for collapse(2) + for(j=0;jv(0,i) + g1->v(0,i)*(2*j/(m-1.)-1)*r + g2->v(0,i)*(2*k/(l-1.)-1)*r; y.a[i0] = tr->v(1,i) + g1->v(1,i)*(2*j/(m-1.)-1)*r + g2->v(1,i)*(2*k/(l-1.)-1)*r; z.a[i0] = tr->v(2,i) + g1->v(2,i)*(2*j/(m-1.)-1)*r + g2->v(2,i)*(2*k/(l-1.)-1)*r; } - if(flag & 2) x.a[i0] = hypot(x.a[i0],y.a[i0]); - } + if(flag & 2) +#pragma omp parallel for collapse(2) + for(j=0;jsize(w,h); } //----------------------------------------------------------------------------- @@ -85,7 +85,7 @@ void mglCanvasWnd::SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par, voi { ResetFrames(); if(get(MGL_CLF_ON_UPD)) DefaultPlotParam(); - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); // use frames for quickly redrawing while adding/changing primitives if(mgl_is_frames(this)) NewFrame(); @@ -96,7 +96,7 @@ void mglCanvasWnd::SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par, voi if(mgl_is_frames(this)) EndFrame(); if(n>=0) SetCurFig(0); - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); } //----------------------------------------------------------------------------- const unsigned char *mglCanvasWnd::GetBits() @@ -114,7 +114,7 @@ void mglCanvasWnd::ReLoad() LoadFunc(FuncPar); // update number of slides ResetFrames(); - setlocale(LC_NUMERIC, "C"); + const std::string loc = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); // use frames for quickly redrawing while adding/changing primitives if(mgl_is_frames(this)) NewFrame(); @@ -122,7 +122,7 @@ void mglCanvasWnd::ReLoad() if(n=0) NumFig = n; if(mgl_is_frames(this)) EndFrame(); - setlocale(LC_NUMERIC, ""); + setlocale(LC_NUMERIC, loc.c_str()); Update(); } } @@ -213,11 +213,11 @@ void MGL_EXPORT mgl_reload_class(void *p) // so stupid way to save mglDraw class void MGL_EXPORT mgl_click_class(void *p) // so stupid way to save mglDraw class inheritance :( { mglWindow *w = (mglWindow *)p; if(w && w->dr) w->dr->Click(); }*/ int MGL_EXPORT mgl_draw_class(HMGL gr, void *p) -{ mglGraph g(gr); mglDraw *dr = (mglDraw *)p; return dr->Draw(&g); } +{ mglGraph g(gr); mglDraw *dr = (mglDraw *)p; return dr?dr->Draw(&g):0; } void MGL_EXPORT mgl_reload_class(void *p) -{ mglDraw *dr = (mglDraw *)p; dr->Reload(); } +{ mglDraw *dr = (mglDraw *)p; if(dr) dr->Reload(); } void MGL_EXPORT mgl_click_class(void *p) -{ mglDraw *dr = (mglDraw *)p; dr->Click(); } +{ mglDraw *dr = (mglDraw *)p; if(dr) dr->Click(); } //----------------------------------------------------------------------------- typedef int (*draw_func)(mglGraph *gr); int MGL_EXPORT mgl_draw_graph(HMGL gr, void *p) @@ -227,21 +227,18 @@ int MGL_EXPORT mgl_draw_graph(HMGL gr, void *p) return func ? func(&g) : 0; } //----------------------------------------------------------------------------- +#if MGL_HAVE_PTHREAD MGL_NO_EXPORT void *mgl_draw_calc(void *p) { -#if MGL_HAVE_PTHREAD - ((mglDraw *)p)->Calc(); -#endif - return 0; + ((mglDraw *)p)->Calc(); return 0; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_draw_thr(void *p) { -#if MGL_HAVE_PTHREAD mglDraw *d = (mglDraw *)p; if(!d || d->running) return; pthread_create(&(d->thr),0,mgl_draw_calc,d); pthread_detach(d->thr); -#endif } +#endif //----------------------------------------------------------------------------- diff --git a/texinfo/CMakeLists.txt b/texinfo/CMakeLists.txt index 20ad882..a57e112 100644 --- a/texinfo/CMakeLists.txt +++ b/texinfo/CMakeLists.txt @@ -8,7 +8,7 @@ several_light solve stem step stereo stfa style surf3a surf3c surf3 surfa surfc surf table tape tens ternary textmark text ticks tile tiles torus traj triangulation triplot tube type0 type1 type2 vect vecta venn - projection5 mask correl refill ohlc ) + projection5 mask correl refill ohlc ode indirect) set(MGL_PNG_N ) set(MGL_PNG_S ) set(MGL_PNG_J ) @@ -24,8 +24,8 @@ file(COPY ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/emblem_sm.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_OUT}) file(COPY ${MGL_TEX}/index.html ${MGL_TEX}/json.html ${MGL_TEX}/mathgl.js DESTINATION ${MGL_OUT}) - set(UDAV_IMG udav_arg.png udav_calc.png udav_cmd.png udav_data.png - udav_gen_set.png udav_help.png udav_light.png udav_main.png udav_opt.png + set(UDAV_IMG udav_arg.png udav_calc.png udav_cmd.png udav_data.png udav_mask.png + udav_gen_set.png udav_help.png udav_light.png udav_main.png udav_opt.png udav_inplot.png udav_pen.png udav_prop.png udav_sch.png udav_txt.png udav_var.png) foreach(SAMPLE ${UDAV_IMG}) file(COPY ${MGL_TEX}/udav/${SAMPLE} DESTINATION ${MGL_OUT}/udav/) @@ -34,7 +34,7 @@ foreach(SAMPLE ${MGL_PNG}) set(MGL_PNG_N ${MGL_PNG_N} ${MGL_OUT}/png/${SAMPLE}.png) add_custom_command(OUTPUT ${MGL_OUT}/png/${SAMPLE}.png - COMMAND mgl_example -kind=${SAMPLE} -web + COMMAND mgl_example -kind=${SAMPLE} DEPENDS mgl_example WORKING_DIRECTORY ${MGL_OUT}/png ) set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png) @@ -46,7 +46,6 @@ if(MGL_HAVE_DOC_JSON) set(MGL_PNG_J ${MGL_PNG_J} ${MGL_OUT}/json/${SAMPLE}.json) add_custom_command(OUTPUT ${MGL_OUT}/json/${SAMPLE}.json COMMAND mgl_example -json -kind=${SAMPLE} -# COMMAND ${CMAKE_BINARY_DIR}/examples/mgl_example -json -kind=${SAMPLE} DEPENDS mgl_example WORKING_DIRECTORY ${MGL_OUT}/json ) endif(MGL_HAVE_DOC_JSON) @@ -62,7 +61,7 @@ endif(MGL_HAVE_DOC_PRC) foreach(SAMPLE ${MGL_EXTRA}) set(MGL_PNG_N ${MGL_PNG_N} ${MGL_OUT}/png/${SAMPLE}.png) add_custom_command(OUTPUT ${MGL_OUT}/png/${SAMPLE}.png - COMMAND mgl_example -kind=${SAMPLE} -web + COMMAND mgl_example -kind=${SAMPLE} DEPENDS mgl_example WORKING_DIRECTORY ${MGL_OUT}/png ) set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png) @@ -156,7 +155,7 @@ endif(MGL_HAVE_DOC_PRC) # TODO: try to install all mathgl*.info* in future!!! install(FILES ${MGL_OUT}/mathgl_en.info ${MGL_OUT}/mathgl_en.info-1 ${MGL_OUT}/mathgl_en.info-2 ${MGL_OUT}/mathgl_en.info-3 DESTINATION ${MGL_INFO_PATH}) endif(MGL_HAVE_DOC_INFO) - + if(MGL_HAVE_DOC_HTML) add_custom_target(doc_html ALL DEPENDS ${MGL_OUT}/mgl_en.html @@ -182,9 +181,9 @@ endif(MGL_HAVE_DOC_PRC) DEPENDS ${MGL_OUT}/mgl_en.pdf DEPENDS ${MGL_OUT}/mathgl_en.pdf ) - install(FILES ${MGL_OUT}/mathgl_en.pdf DESTINATION ${MGL_DOC_PATH}) + install(FILES ${MGL_OUT}/mathgl_en.pdf ${MGL_OUT}/mgl_en.pdf DESTINATION ${MGL_DOC_PATH}) endif(MGL_HAVE_DOC_PDF_EN) - + if(MGL_HAVE_DOC_PDF_RU) add_custom_target(doc_ru ALL # DEPENDS ${MGL_OUT}/mgl_ru.pdf diff --git a/texinfo/concept_en.texi b/texinfo/concept_en.texi index 455d49b..202b454 100644 --- a/texinfo/concept_en.texi +++ b/texinfo/concept_en.texi @@ -40,11 +40,11 @@ In addition to the general concepts I want to comment on some non-trivial or les @section Coordinate axes @nav{} -Two axis representations are used in MathGL. The first one consists of normalizing coordinates of data points in a box @var{Min}x@var{Max} (see @ref{Axis settings}). If @code{SetCut()} is @code{true} then the outlier points are omitted, otherwise they are projected to the bounding box (see @ref{Cutting}). Also, the point will be omitted if it lies inside the box defined by @code{SetCutBox()} or if the value of formula @code{CutOff()} is nonzero for its coordinates. After that, transformation formulas defined by @code{SetFunc()} or @code{SetCoor()} are applied to the data point (see @ref{Curved coordinates}). Finally, the data point is plotted by one of the functions. +Two axis representations are used in MathGL. The first one consists of normalizing coordinates of data points in axis range (see @ref{Axis settings}). If @code{SetCut()} is @code{true} then the outlier points are omitted, otherwise they are projected to the bounding box (see @ref{Cutting}). Also, the point will be omitted if it lies inside the box defined by @code{SetCutBox()} or if the value of formula @code{CutOff()} is nonzero for its coordinates. After that, transformation formulas defined by @code{SetFunc()} or @code{SetCoor()} are applied to the data point (see @ref{Curved coordinates}). Finally, the data point is plotted by one of the functions. The range of @emph{x, y, z}-axis can be specified by @code{SetRange()} or @code{SetRanges()} functions. Its origin is specified by @code{SetOrigin()} function. At this you can you can use @code{NAN} values for selecting axis origin automatically. -There is 4-th axis @emph{c} (color axis or colorbar) in addition to the usual axes @emph{x, y, z}. It sets the range of values for the surface coloring. Its borders are automatically set to values of Min.z, Max.z during the call of @code{SetRanges()} function. Also, one can directly set it by call @code{SetRange('c', ...)}. Use @code{Colorbar()} function for drawing the colorbar. +There is 4-th axis @emph{c} (color axis or colorbar) in addition to the usual axes @emph{x, y, z}. It sets the range of values for the surface coloring. Its borders are automatically set to values of z-range during the call of @code{SetRanges()} function. Also, one can directly set it by call @code{SetRange('c', ...)}. Use @code{Colorbar()} function for drawing the colorbar. The form (appearence) of tick labels is controlled by @code{SetTicks()} function (@pxref{Ticks}). Function @var{SetTuneTicks} switches on/off tick enhancing by factoring out acommon multiplier (for small coordinate values, like 0.001 to 0.002, or large, like from 1000 to 2000) or common component (for narrow range, like from 0.999 to 1.000). Finally, you may use functions @code{SetTickTempl()} for setting templates for tick labels (it supports TeX symbols). Also, there is a possibility to print arbitrary text as tick labels the by help of @code{SetTicksVal()} function. @@ -91,18 +91,18 @@ The line style is defined by the string which may contain specifications for col @html By default palette contain following colors: dark grayH’, blueb’, greeng’, redr’, cyanc’, magentam’, yellowy’, grayh’, green-bluel’, sky-bluen’, orangeq’, green-yellowe’, blue-violetu’, purplep’. -

Dashing style has the following meaning: space – no line (usable for plotting only marks), ‘-’ – solid line (■■■■■■■■■■■■■■■■), ‘|’ – long dashed line (■■■■■■■■□□□□□□□□), ‘;’ – dashed line (■■■■□□□□■■■■□□□□), ‘=’ – small dashed line (■■□□■■□□■■□□■■□□), ‘:’ – dotted line (■□□□■□□□■□□□■□□□), ‘j’ – dash-dotted line (■■■■■■■□□□□■□□□□), ‘i’ – small dash-dotted line (■■■□□■□□■■■□□■□□).

+

Dashing style has the following meaning: space – no line (usable for plotting only marks), ‘-’ – solid line (■■■■■■■■■■■■■■■■), ‘|’ – long dashed line (■■■■■■■■□□□□□□□□), ‘;’ – dashed line (■■■■□□□□■■■■□□□□), ‘=’ – small dashed line (■■□□■■□□■■□□■■□□), ‘:’ – dotted line (■□□□■□□□■□□□■□□□), ‘j’ – dash-dotted line (■■■■■■■□□□□■□□□□), ‘i’ – small dash-dotted line (■■■□□■□□■■■□□■□□), ‘{dNNNN}’ – manual mask style (for v.2.3 and later, like ‘{df090}’ for (■■■■□□□□■□□■□□□□)).

@end html @end ifhtml @ifnothtml By default palette contain following colors: dark gray @samp{H}, blue @samp{b}, green @samp{g}, red @samp{r}, cyan @samp{c}, magenta @samp{m}, yellow @samp{y}, gray @samp{h}, blue-green @samp{l}, sky-blue @samp{n}, orange @samp{q}, yellow-green @samp{e}, blue-violet @samp{u}, purple @samp{p}. -Dashing style has the following meaning: space -- no line (usable for plotting only marks), @samp{-} -- solid line (################), @samp{|} -- long dashed line (########________), @samp{;} -- dashed line (####____####____), @samp{=} -- small dashed line (##__##__##__##__), @samp{:} -- dotted line (#___#___#___#___), @samp{j} -- dash-dotted line (#######____#____), @samp{i} -- small dash-dotted line (###__#__###__#__). +Dashing style has the following meaning: space -- no line (usable for plotting only marks), @samp{-} -- solid line (################), @samp{|} -- long dashed line (########________), @samp{;} -- dashed line (####____####____), @samp{=} -- small dashed line (##__##__##__##__), @samp{:} -- dotted line (#___#___#___#___), @samp{j} -- dash-dotted line (#######____#____), @samp{i} -- small dash-dotted line (###__#__###__#__), @samp{@{dNNNN@}} -- manual mask style (for v.2.3 and later, like @samp{@{df090@}} for (####____#__#____)). @end ifnothtml Marker types are: @samp{o} -- circle, @samp{+} -- cross, @samp{x} -- skew cross, @samp{s} - square, @samp{d} - rhomb (or diamond), @samp{.} -- dot (point), @samp{^} -- triangle up, @samp{v} -- triangle down, @samp{<} -- triangle left, @samp{>} -- triangle right, @samp{#*} -- Y sign, @samp{#+} -- squared cross, @samp{#x} -- squared skew cross, @samp{#.} -- circled dot. If string contain symbol @samp{#} then the solid versions of markers are used. -One may specify to draw a special symbol (an arrow) at the beginning and at the end of line. This is done if the specification string contains one of the following symbols: @samp{A} -- outer arrow, @samp{V} -- inner arrow, @samp{I} -- transverse hatches, @samp{K} -- arrow with hatches, @samp{T} -- triangle, @samp{S} -- square, @samp{D} -- rhombus, @samp{O} -- circle, @samp{_} -- nothing (the default). The following rule applies: the first symbol specifies the arrow at the end of line, the second specifies the arrow at the beginning of the line. For example, @samp{r-A} defines a red solid line with usual arrow at the end, @samp{b|AI} defines a blue dash line with an arrow at the end and with hatches at the beginning, @samp{_O} defines a line with the current style and with a circle at the beginning. These styles are applicable during the graphics plotting as well (for example, @ref{1D plotting}). +One may specify to draw a special symbol (an arrow) at the beginning and at the end of line. This is done if the specification string contains one of the following symbols: @samp{A} -- outer arrow, @samp{V} -- inner arrow, @samp{I} -- transverse hatches, @samp{K} -- arrow with hatches, @samp{T} -- triangle, @samp{S} -- square, @samp{D} -- rhombus, @samp{O} -- circle, @samp{X} -- skew cross, @samp{_} -- nothing (the default). The following rule applies: the first symbol specifies the arrow at the end of line, the second specifies the arrow at the beginning of the line. For example, @samp{r-A} defines a red solid line with usual arrow at the end, @samp{b|AI} defines a blue dash line with an arrow at the end and with hatches at the beginning, @samp{_O} defines a line with the current style and with a circle at the beginning. These styles are applicable during the graphics plotting as well (for example, @ref{1D plotting}). @pfig{style, Color and line styles.} @@ -116,7 +116,7 @@ One may specify to draw a special symbol (an arrow) at the beginning and at the The color scheme is used for determining the color of surfaces, isolines, isosurfaces and so on. The color scheme is defined by the string, which may contain several characters that are color id (@pxref{Line styles}) or characters @samp{#:|}. Symbol @samp{#} switches to mesh drawing or to a wire plot. Symbol @samp{|} disables color interpolation in color scheme, which can be useful, for example, for sharp colors during matrix plotting. Symbol @samp{:} terminate the color scheme parsing. Following it, the user may put styles for the text, rotation axis for curves/isocontours, and so on. Color scheme may contain up to 32 color values. -The final color is a linear interpolation of color array. The color array is constructed from the string ids (including ``bright'' colors, see @ref{Color styles}). The argument is the amplitude normalized between @var{Cmin} -- @var{Cmax} (see @ref{Axis settings}). For example, string containing 4 characters @samp{bcyr} corresponds to a colorbar from blue (lowest value) through cyan (next value) through yellow (next value) to the red (highest value). String @samp{kw} corresponds to a colorbar from black (lowest value) to white (highest value). String @samp{m} corresponds to a simple magenta color. +The final color is a linear interpolation of color array. The color array is constructed from the string ids (including ``bright'' colors, see @ref{Color styles}). The argument is the amplitude normalized in color range (see @ref{Axis settings}). For example, string containing 4 characters @samp{bcyr} corresponds to a colorbar from blue (lowest value) through cyan (next value) through yellow (next value) to the red (highest value). String @samp{kw} corresponds to a colorbar from black (lowest value) to white (highest value). String @samp{m} corresponds to a simple magenta color. There are several useful combinations. String @samp{kw} corresponds to the simplest gray color scheme where higher values are brighter. String @samp{wk} presents the inverse gray color scheme where higher value is darker. Strings @samp{kRryw}, @samp{kGgw}, @samp{kBbcw} present the well-known @emph{hot}, @emph{summer} and @emph{winter} color schemes. Strings @samp{BbwrR} and @samp{bBkRr} allow to view bi-color figure on white or black background, where negative values are blue and positive values are red. String @samp{BbcyrR} gives a color scheme similar to the well-known @emph{jet} color scheme. @@ -133,10 +133,14 @@ Additionally, MathGL can apply mask to face filling at bitmap rendering. The kin However, you can redefine mask for one symbol by specifying new matrix of size 8*8 as second argument for @ref{mask} command. For example, the right-down subplot on the figure above is produced by code@* @ifclear UDAV -@code{gr->SetMask('+', "ff00182424f80000"); gr->Dens(a,"3+");} +@code{gr->SetMask('+', "ff00182424f800"); gr->Dens(a,"3+");}@* +or just use manual mask style (for v.2.3 and later)@* +@code{gr->Dens(a,"3@{s00ff00182424f800@}");} @end ifclear @ifset UDAV -@code{mask '+' 'ff00182424f80000':dens a '3+'} +@code{mask '+' 'ff00182424f800':dens a '3+'}@* +or just use manual mask style (for v.2.3 and later)@* +@code{dens a '3@{s00ff00182424f800@}'} @end ifset @c ------------------------------------------------------------------ @@ -147,7 +151,7 @@ However, you can redefine mask for one symbol by specifying new matrix of size 8 @cindex Font styles -Text style is specified by the string which may contain: color id characters @samp{wkrgbcymhRGBCYMHW} (see @ref{Color styles}), and font style (@samp{ribwou}) and/or alignment (@samp{LRC}) specifications. At this, font style and alignment begin after the separator @samp{:}. For example, @samp{r:iCb} sets the bold (@samp{b}) italic (@samp{i}) font text aligned at the center (@samp{C}) and with red color (@samp{r}). +Text style is specified by the string which may contain: color id characters @samp{wkrgbcymhRGBCYMHW} (see @ref{Color styles}), and font style (@samp{ribwou}) and/or alignment (@samp{LRC}) specifications. At this, font style and alignment begin after the separator @samp{:}. For example, @samp{r:iCb} sets the bold (@samp{b}) italic (@samp{i}) font text aligned at the center (@samp{C}) and with red color (@samp{r}). Starting from MathGL v.2.3, you can set not single color for whole text, but use color gradient for printed text (see @ref{Color scheme}). The font styles are: @samp{r} -- roman (or regular) font, @samp{i} -- italic style, @samp{b} -- bold style. By default roman roman font is used. The align types are: @samp{L} -- align left (default), @samp{C} -- align center, @samp{R} -- align right. Additional font effects are: @samp{w} -- wired, @samp{o} -- over-lined, @samp{u} -- underlined. @@ -194,7 +198,7 @@ MathGL have the fast variant of textual formula evaluation @end ifclear . There are a lot of functions and operators available. The operators are: @samp{+} -- addition, @samp{-} -- subtraction, @samp{*} -- multiplication, @samp{/} -- division, @samp{^} -- integer power. Also there are logical ``operators'': @samp{<} -- true if x} -- true if x>y, @samp{=} -- true if x=y, @samp{&} -- true if x and y both nonzero, @samp{|} -- true if x or y nonzero. These logical operators have lowest priority and return 1 if true or 0 if false. -The basic functions are: @samp{sqrt(x)} -- square root of @var{x}, @samp{pow(x,y)} -- power @var{x} in @var{y}, @samp{ln(x)} -- natural logarithm of @var{x}, @samp{lg(x)} -- decimal logarithm of @var{x}, @samp{log(a,x)} -- logarithm base @var{a} of @var{x}, @samp{abs(x)} -- absolute value of @var{x}, @samp{sign(x)} -- sign of @var{x}, @samp{mod(x,y)} -- x modulo y, @samp{step(x)} -- step function, @samp{int(x)} -- integer part of @var{x}, @samp{rnd} -- random number, @samp{pi} -- number +The basic functions are: @samp{sqrt(x)} -- square root of @var{x}, @samp{pow(x,y)} -- power @var{x} in @var{y}, @samp{ln(x)} -- natural logarithm of @var{x}, @samp{lg(x)} -- decimal logarithm of @var{x}, @samp{log(a,x)} -- logarithm base @var{a} of @var{x}, @samp{abs(x)} -- absolute value of @var{x}, @samp{sign(x)} -- sign of @var{x}, @samp{mod(x,y)} -- @var{x} modulo @var{y}, @samp{step(x)} -- step function, @samp{int(x)} -- integer part of @var{x}, @samp{rnd} -- random number, @samp{random(x)} -- random data of size as in @var{x}, @samp{pi} -- number @ifhtml @html π = 3.1415926… @@ -208,7 +212,7 @@ Trigonometric functions are: @samp{sin(x)}, @samp{cos(x)}, @samp{tan(x)} (or @sa @ifhtml @html -

There are a set of special functions: ‘gamma(x)’ – Gamma function Γ(x) = ∫0 tx-1 exp(-t) dt, ‘psi(x)’ – digamma function ψ(x) = Γ′(x)/Γ(x) for x≠0, ‘ai(x)’ – Airy function Ai(x), ‘bi(x)’ – Airy function Bi(x), ‘cl(x)’ – Clausen function, ‘li2(x)’ (or ‘dilog(x)’) – dilogarithm Li2(x) = -ℜ∫0xds log(1-s)/s, ‘sinc(x)’ – compute sinc(x) = sin(πx)/(πx) for any value of x, ‘zeta(x)’ – Riemann zeta function ζ(s) = ∑k=1k-s for arbitrary s≠1, ‘eta(x)’ – eta function η(s) = (1 - 21-s)ζ(s) for arbitrary s, ‘lp(l,x)’ – Legendre polynomial Pl(x), (|x|≤1, l≥0), ‘w0(x)’ – principal branch of the Lambert W function, ‘w1(x)’ – principal branch of the Lambert W function. Function W(x) is defined to be solution of the equation: W exp(W) = x.

+

There are a set of special functions: ‘gamma(x)’ – Gamma function Γ(x) = ∫0 tx-1 exp(-t) dt, ‘gamma_inc(x,y)’ – incomplete Gamma function Γ(x,y) = ∫y tx-1 exp(-t) dt, ‘psi(x)’ – digamma function ψ(x) = Γ′(x)/Γ(x) for x≠0, ‘ai(x)’ – Airy function Ai(x), ‘bi(x)’ – Airy function Bi(x), ‘cl(x)’ – Clausen function, ‘li2(x)’ (or ‘dilog(x)’) – dilogarithm Li2(x) = -ℜ∫0xds log(1-s)/s, ‘sinc(x)’ – compute sinc(x) = sin(πx)/(πx) for any value of x, ‘zeta(x)’ – Riemann zeta function ζ(s) = ∑k=1k-s for arbitrary s≠1, ‘eta(x)’ – eta function η(s) = (1 - 21-s)ζ(s) for arbitrary s, ‘lp(l,x)’ – Legendre polynomial Pl(x), (|x|≤1, l≥0), ‘w0(x)’ – principal branch of the Lambert W function, ‘w1(x)’ – principal branch of the Lambert W function. Function W(x) is defined to be solution of the equation: W exp(W) = x.

The exponent integrals are: ‘ci(x)’ – Cosine integral Ci(x) = ∫0xdt cos(t)/t, ‘si(x)’ – Sine integral Si(x) = ∫0xdt sin(t)/t, ‘erf(x)’ – error function erf(x) = (2/√π) ∫0xdt exp(-t2) , ‘ei(x)’ – exponential integral Ei(x) = -PV(∫-xdt exp(-t)/t) (where PV denotes the principal value of the integral), ‘e1(x)’ – exponential integral E1(x) = ℜ∫1dt exp(-xt)/t, ‘e2(x)’ – exponential integral E2(x) = ℜ∫1∞dt exp(-xt)/t2, ‘ei3(x)’ – exponential integral Ei3(x) = ∫0xdt exp(-t3) for x≥0.

@@ -218,7 +222,7 @@ Trigonometric functions are: @samp{sin(x)}, @samp{cos(x)}, @samp{tan(x)} (or @sa @end html @end ifhtml @ifnothtml -There are a set of special functions: @samp{gamma(x)} -- Gamma function @math{\Gamma(x) = \int_0^\infty dt t^@{x-1@} \exp(-t)} , @samp{psi(x)} -- digamma function @math{\psi(x) = \Gamma'(x)/\Gamma(x)} for x!=0, @samp{ai(x)} -- Airy function Ai(x), @samp{bi(x)} -- Airy function Bi(x), @samp{cl(x)} -- Clausen function, @samp{li2(x)} (or @samp{dilog(x)}) -- dilogarithm @math{Li_2(x) = - \Re \int_0^x ds \log(1-s)/s}, @samp{sinc(x)} -- compute @math{sinc(x) = \sin(\pi x) / (\pi x)} for any value of x, @samp{zeta(x)} -- Riemann zeta function @math{\zeta(s) = \sum_@{k=1@}^\infty k^@{-s@}} for arbitrary s!=1, @samp{eta(x)} -- eta function @math{\eta(s) = (1-2^@{1-s@}) \zeta(s)} for arbitrary s, @samp{lp(l,x)} -- Legendre polynomial @math{P_l(x)}, (|x|<=1, l>=0), @samp{w0(x)}, @samp{w1(x)} -- principal branch of the Lambert @var{W} functions. Function W(x) is defined to be solution of the equation @math{W \exp(W) = x}. +There are a set of special functions: @samp{gamma(x)} -- Gamma function @math{\Gamma(x) = \int_0^\infty dt t^@{x-1@} exp(-t)}, @samp{gamma_inc(x,y)} -- incomplete Gamma function @math{\Gamma(x,y) = \int_y^\infty dt t^@{x-1@} exp(-t)}, @samp{psi(x)} -- digamma function @math{\psi(x) = \Gamma'(x)/\Gamma(x)} for x!=0, @samp{ai(x)} -- Airy function Ai(x), @samp{bi(x)} -- Airy function Bi(x), @samp{cl(x)} -- Clausen function, @samp{li2(x)} (or @samp{dilog(x)}) -- dilogarithm @math{Li_2(x) = - \Re \int_0^x ds \log(1-s)/s}, @samp{sinc(x)} -- compute @math{sinc(x) = \sin(\pi x) / (\pi x)} for any value of x, @samp{zeta(x)} -- Riemann zeta function @math{\zeta(s) = \sum_@{k=1@}^\infty k^@{-s@}} for arbitrary s!=1, @samp{eta(x)} -- eta function @math{\eta(s) = (1-2^@{1-s@}) \zeta(s)} for arbitrary s, @samp{lp(l,x)} -- Legendre polynomial @math{P_l(x)}, (|x|<=1, l>=0), @samp{w0(x)}, @samp{w1(x)} -- principal branch of the Lambert @var{W} functions. Function W(x) is defined to be solution of the equation @math{W \exp(W) = x}. The exponent integrals are: @samp{ci(x)} -- Cosine integral @math{Ci(x) = \int_0^x dt \cos(t)/t}, @samp{si(x)} -- Sine integral @math{Si(x) = \int_0^x dt \sin(t)/t}, @samp{erf(x)} -- error function @math{erf(x) = (2/\sqrt(\pi)) \int_0^x dt \exp(-t^2)}, @samp{ei(x)} -- exponential integral @math{Ei(x) := - PV(\int_@{-x@}^\infty dt \exp(-t)/t)} (where PV denotes the principal value of the integral), @samp{e1(x)} -- exponential integral @math{E_1(x) := Re \int_1^\infty dt \exp(-xt)/t} , @samp{e2(x)} -- exponential integral @math{E_2(x) := Re \int_1^\infty dt \exp(-xt)/t^2}, @samp{ei3(x)} -- exponential integral @math{Ei_3(x) = \int_0^x dt \exp(-t^3)} for x>=0. diff --git a/texinfo/concept_ru.texi b/texinfo/concept_ru.texi index 0e81550..01c8ed5 100644 --- a/texinfo/concept_ru.texi +++ b/texinfo/concept_ru.texi @@ -38,11 +38,11 @@ @section Оси координат @nav{} -Представление системы координат в MathGL состоит из двух частей. Вначале координаты нормируются в интервал @var{Min}x@var{Max} (@pxref{Axis settings}). Если флаг @code{SetCut()} установлен, то точки вне интервала отбрасываются, в противном случае, они проецируются на ограничивающий параллелепипед (см. @ref{Cutting}). Кроме того, отбрасываются точки внутри границ, определенных переменными @var{CutMin}x@var{CutMax} и точки, для которых значение функции @code{CutOff}() не равно нулю. После этого формулы перехода в криволинейную систему координат @code{SetFunc()}применяются к каждой точке. Наконец, точка данных отображается с помощью одной из графических функций. +Представление системы координат в MathGL состоит из двух частей. Вначале координаты нормируются в диапазон изменения осей координат (@pxref{Axis settings}). Если флаг @code{SetCut()} установлен, то точки вне интервала отбрасываются, в противном случае, они проецируются на ограничивающий параллелепипед (см. @ref{Cutting}). Кроме того, отбрасываются точки внутри границ, определенных переменными @var{CutMin}x@var{CutMax} и точки, для которых значение функции @code{CutOff}() не равно нулю. После этого формулы перехода в криволинейную систему координат @code{SetFunc()}применяются к каждой точке. Наконец, точка данных отображается с помощью одной из графических функций. Диапазон изменения @emph{x, y, z}-координат задается функциями @code{SetRange()} или @code{SetRanges()}. Точка пересечения осей координат задается функцией @code{SetOrigin()}. При этом можно использовать NAN значения для автоматического выбора положения оси. -Кроме привычных осей @emph{x, y, z} есть еще одна ось -- цветовая шкала -- ось @emph{c}. Она используется при окрашивании поверхностей и задает границы изменения функции при окрашивании. Ее границы автоматически устанавливаются равными Min.z и Max.z при вызове @code{SetRanges()}. Возможно и ручное изменение границ цветового интервала посредством вызова @code{SetRange('c', ...)}. Используйте @code{Colorbar()} для отображения цветовой шкалы. +Кроме привычных осей @emph{x, y, z} есть еще одна ось -- цветовая шкала -- ось @emph{c}. Она используется при окрашивании поверхностей и задает границы изменения функции при окрашивании. Ее границы автоматически устанавливаются равными диапазону z-оси при вызове @code{SetRanges()}. Возможно и ручное изменение границ цветового интервала посредством вызова @code{SetRange('c', ...)}. Используйте @code{Colorbar()} для отображения цветовой шкалы. Вид меток по осям определяется функцией @code{SetTicks()} (@pxref{Ticks}). Функция @var{SetTuneTicks} включает/выключает выделение общего множителя (большого или малого факторов в диапазоне) для меток осей координат. Наконец, если стандартный вид меток не устраивает пользователя, то их шаблон можно задать явно (можно использовать и ТеХ символы), воспользовавшись функцией @code{SetTickTempl()}. Кроме того, в качестве меток можно вывести произвольный текст использовав функцию @code{SetTicksVal()}. @@ -89,18 +89,18 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. @html По умолчанию палитры содержит следующие цвета: темно серыйH’, синийb’, зеленыйg’, красныйr’, голубойc’, пурпурныйm’, yellowy’, серыйh’, сине-зеленыйl’, небесно-синийn’, оранжевыйq’, желто-зеленыйe’, сине-фиолетовыйu’, фиолетовыйp’. -

Тип пунктира: пробел – нет линии (для рисования только маркеров), ‘-’ – сплошная линия (■■■■■■■■■■■■■■■■), ‘|’ – длинный пунктир (■■■■■■■■□□□□□□□□), ‘;’ – пунктир (■■■■□□□□■■■■□□□□), ‘=’ – короткий пунктир (■■□□■■□□■■□□■■□□), ‘:’ – точки (■□□□■□□□■□□□■□□□), ‘j’ – пунктир с точками (■■■■■■■□□□□■□□□□), ‘i’ – мелкий пунктир с точками (■■■□□■□□■■■□□■□□).

+

Тип пунктира: пробел – нет линии (для рисования только маркеров), ‘-’ – сплошная линия (■■■■■■■■■■■■■■■■), ‘|’ – длинный пунктир (■■■■■■■■□□□□□□□□), ‘;’ – пунктир (■■■■□□□□■■■■□□□□), ‘=’ – короткий пунктир (■■□□■■□□■■□□■■□□), ‘:’ – точки (■□□□■□□□■□□□■□□□), ‘j’ – пунктир с точками (■■■■■■■□□□□■□□□□), ‘i’ – мелкий пунктир с точками (■■■□□■□□■■■□□■□□), ‘{dNNNN}’ – заданный вручную стиль (для v.2.3 и поздних, например ‘{df090}’ для (■■■■□□□□■□□■□□□□)).

@end html @end ifhtml @ifnothtml По умолчанию палитра содержит следующие цвета: темно серый @samp{H}, синий @samp{b}, зеленый @samp{g}, красный @samp{r}, голубой @samp{c}, пурпурный @samp{m}, yellow @samp{y}, серый @samp{h}, сине-зеленый @samp{l}, небесно-синий @samp{n}, оранжевый @samp{q}, желто-зеленый @samp{e}, сине-фиолетовый @samp{u}, фиолетовый @samp{p}. -Тип пунктира: пробел -- нет линии (для рисования только маркеров), @samp{-} -- сплошная линия (################), @samp{|} -- длинный пунктир (########________), @samp{;} -- пунктир (####____####____), @samp{=} -- короткий пунктир (##__##__##__##__), @samp{:} -- точки (#___#___#___#___), @samp{j} -- пунктир с точками (#######____#____), @samp{i} -- мелкий пунктир с точками (###__#__###__#__). +Тип пунктира: пробел -- нет линии (для рисования только маркеров), @samp{-} -- сплошная линия (################), @samp{|} -- длинный пунктир (########________), @samp{;} -- пунктир (####____####____), @samp{=} -- короткий пунктир (##__##__##__##__), @samp{:} -- точки (#___#___#___#___), @samp{j} -- пунктир с точками (#######____#____), @samp{i} -- мелкий пунктир с точками (###__#__###__#__), @samp{@{dNNNN@}} -- заданный вручную стиль (для v.2.3 и поздних, например @samp{@{df090@}} для (####____#__#____)). @end ifnothtml Типы маркеров: @samp{o} -- окружность, @samp{+} -- крест, @samp{x} -- косой крест, @samp{s} -- квадрат, @samp{d} - ромб, @samp{.} -- точка, @samp{^} -- треугольник вверх, @samp{v} -- треугольник вниз, @samp{<} -- треугольник влево, @samp{>} -- треугольник вправо, @samp{#*} -- знак Y, @samp{#+} -- крест в квадрате, @samp{#x} -- косой крест в квадрате, @samp{#.} -- точка в окружности. Если в строке присутствует символ @samp{#}, то используются символы с заполнением. -На конце и в начале линии можно выводить специальный символ (стрелку), если в строке указать один из символов: @samp{A} -- стрелка наружу, @samp{V} -- стрелка внутрь, @samp{I} -- поперечная черта, @samp{K} -- стрелка с чертой, @samp{T} -- треугольник, @samp{S} -- квадрат, @samp{D} -- ромб, @samp{O} -- круг, @samp{_} -- нет стрелки (по умолчанию). При этом действует следующее правило: первый символ определяет стрелку на конце линии, второй символ -- стрелку в начале линии. Например, @samp{r-A} -- красная сплошная линия со стрелкой на конце, @samp{b|AI} -- синий пунктир со стрелкой на конце и чертой вначале, @samp{_O} -- линия с текущим стилем и кружком вначале. Эти стили действуют и при построении графиков (например, @ref{1D plotting}). +На конце и в начале линии можно выводить специальный символ (стрелку), если в строке указать один из символов: @samp{A} -- стрелка наружу, @samp{V} -- стрелка внутрь, @samp{I} -- поперечная черта, @samp{K} -- стрелка с чертой, @samp{T} -- треугольник, @samp{S} -- квадрат, @samp{D} -- ромб, @samp{O} -- круг, @samp{X} -- косой крест, @samp{_} -- нет стрелки (по умолчанию). При этом действует следующее правило: первый символ определяет стрелку на конце линии, второй символ -- стрелку в начале линии. Например, @samp{r-A} -- красная сплошная линия со стрелкой на конце, @samp{b|AI} -- синий пунктир со стрелкой на конце и чертой вначале, @samp{_O} -- линия с текущим стилем и кружком вначале. Эти стили действуют и при построении графиков (например, @ref{1D plotting}). @pfig{style, Color and line styles.} @@ -114,7 +114,7 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. Цветовая схема используется для определения цвета поверхностей, линий уровня и пр. Цветовая схема задается строкой @emph{s}, которая содержит символы цвета (@pxref{Line styles}) или символы @samp{#:|}. Символ @samp{#} переключает рисование поверхности на сетчатое (для трехмерных поверхностей) или включает рисование сетки на поверхности. Символ @samp{|} отключает интерполяцию цвета в цветовой схеме. Это может быть полезно для ``резких'' цветов, например, при рисовании матриц. Если в строке встречается символ @samp{:}, то он принудительно заканчивает разбор строки для стиля поверхности. После этого символа могут идти описание стиля текста или оси вращения кривой/линий уровня. Цветовая схема может содержать до 32 значений цвета. -При определении цвета по @emph{амплитуде} (наиболее часто используется) окончательный цвет определяется путем линейной интерполяции массива цветов. Массив цветов формируется из цветов, указанных в строке спецификации. Аргумент -- амплитуда, нормированная между @var{Cmin} -- @var{Cmax} (см. @ref{Axis settings}). Например, строка из 4 символов @samp{bcyr} соответствует изменению цвета от синего (минимальное значение) через голубой и желтый (промежуточные значения) к красному (максимальное значение). Строка @samp{kw} соответствует изменению цвета от черного (минимальное значение) к белому (максимальное значение). Строка из одного символа (например, @samp{g}) соответствует однотонному цвету (в данному случае зеленому). +При определении цвета по @emph{амплитуде} (наиболее часто используется) окончательный цвет определяется путем линейной интерполяции массива цветов. Массив цветов формируется из цветов, указанных в строке спецификации. Аргумент -- амплитуда, нормированная на диапазон изменения цвета (см. @ref{Axis settings}). Например, строка из 4 символов @samp{bcyr} соответствует изменению цвета от синего (минимальное значение) через голубой и желтый (промежуточные значения) к красному (максимальное значение). Строка @samp{kw} соответствует изменению цвета от черного (минимальное значение) к белому (максимальное значение). Строка из одного символа (например, @samp{g}) соответствует однотонному цвету (в данному случае зеленому). Есть несколько полезных цветовых схем. Строка @samp{kw} дает обычную серую (черно-белую) схему, когда большие значения светлее. Строка @samp{wk} представляет обратную серую схему, когда большие значения темнее. Строки @samp{kRryw}, @samp{kGgw}, @samp{kBbcw} представляют собой хорошо известные схемы @emph{hot}, @emph{summer} и @emph{winter}. Строки @samp{BbwrR} и @samp{bBkRr} позволяют рисовать двухцветные фигуры на белом или черном фоне, когда отрицательные значения показаны синим цветом, а положительные -- красным. Строка @samp{BbcyrR} дает цветовую схему, близкую к хорошо известной схеме @emph{jet}. @@ -122,7 +122,7 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. @pfig{schemes, Most popular color schemes.} -При определении цвета по @emph{положению точки в пространстве} (используется в @ref{map}) окончательный цвет определяется по формуле c=x*c[1] + y*c[2]. Здесь c[1], c[2] -- первые три цвета в цветовом массиве; x, y -- координаты точки, нормированные на @var{Min}x@var{Max}. +При определении цвета по @emph{положению точки в пространстве} (используется в @ref{map}) окончательный цвет определяется по формуле c=x*c[1] + y*c[2]. Здесь c[1], c[2] -- первые три цвета в цветовом массиве; x, y -- координаты точки, нормированные в диапазон изменения осей координат. @c Такой тип определения цвета полезен, например, при построении поверхностей уровня, когда цвет дает представление о положении точки в пространстве. @@ -132,10 +132,14 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. Однако, вы можете задать собственную маску (как матрицу 8*8) для любого из этих символов, используя второй аргумент команды @ref{mask}. Например, маска на правом нижнем подрисунке получается кодом@* @ifclear UDAV -@code{gr->SetMask('+', "ff00182424f80000"); gr->Dens(a,"3+");} +@code{gr->SetMask('+', "ff00182424f80000"); gr->Dens(a,"3+");}@* +или использовать явное задание маски (для v.2.3 и более поздних)@* +@code{gr->Dens(a,"3@{s00ff00182424f800@}");} @end ifclear @ifset UDAV -@code{mask '+' 'ff00182424f80000':dens a '3+'} +@code{mask '+' 'ff00182424f80000':dens a '3+'}@* +или использовать явное задание маски (для v.2.3 и более поздних)@* +@code{dens a '3@{s00ff00182424f800@}'} @end ifset @c ------------------------------------------------------------------ @@ -146,7 +150,7 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. @cindex Стиль текста -Стиль текста задается строкой, которая может содержать цвет текста @samp{wkrgbcymhRGBCYMHW} (см. @ref{Color styles}), а также тип шрифта (@samp{ribwou}) и/или выравнивания (@samp{LRC}) после символа @samp{:}. Например, @samp{r:iCb} соответствует жирному (@samp{b}) курсиву (@samp{i}) с выравниванием по центру (@samp{C} красного цвета (@samp{r}). +Стиль текста задается строкой, которая может содержать цвет текста @samp{wkrgbcymhRGBCYMHW} (см. @ref{Color styles}), а также тип шрифта (@samp{ribwou}) и/или выравнивания (@samp{LRC}) после символа @samp{:}. Например, @samp{r:iCb} соответствует жирному (@samp{b}) курсиву (@samp{i}) с выравниванием по центру (@samp{C} красного цвета (@samp{r}). Начиная с MathGL версии 2.3, вы можете использовать не только один цвет для всего текста, но и задать цветовой градиент для выводимой строки (см. @ref{Color scheme}). Начертания шрифта: @samp{r} -- прямой шрифт, @samp{i} -- курсив, @samp{b} -- жирный. По умолчанию используется прямой шрифт. Типы выравнивания текста: @samp{L} -- по левому краю (по умолчанию), @samp{C} -- по центру, @samp{R} -- по правому краю. Дополнительные эффекты шрифта: @samp{w} -- контурный, @samp{o} -- надчеркнутый, @samp{u} -- подчеркнутый. @@ -192,7 +196,7 @@ MathGL имеет быстрый парсер текстовых формул @end ifclear , понимающий большое число функций и операций. Базовые операции: @samp{+} -- сложение, @samp{-} -- вычитание, @samp{*} -- умножение, @samp{/} -- деление, @samp{^} -- возведение в целосичленную степень. Также есть логические операции: @samp{<} -- истина если if x} -- истина если x>y, @samp{=} -- истина если x=y, @samp{&} -- истина если x и y оба не равны нулю, @samp{|} -- истина если x или y не нуль. Логические операции имеют наинизший приоритет и возвращают 1 если истина или 0 если ложно. -Базовые функции: @samp{sqrt(x)} -- квадратный корень из @var{x}, @samp{pow(x,y)} -- @var{x} в степени @var{y}, @samp{ln(x)} -- натуральный логарифм @var{x}, @samp{lg(x)} -- десятичный логарифм @var{x}, @samp{log(a,x)} -- логарифм по основанию @var{a} от @var{x}, @samp{abs(x)} -- модуль @var{x}, @samp{sign(x)} -- знак @var{x}, @samp{mod(x,y)} -- остаток от деления x на y, @samp{step(x)} -- ступенчатая функция, @samp{int(x)} -- целая часть @var{x}, @samp{rnd} -- случайное число, @samp{pi} -- число +Базовые функции: @samp{sqrt(x)} -- квадратный корень из @var{x}, @samp{pow(x,y)} -- @var{x} в степени @var{y}, @samp{ln(x)} -- натуральный логарифм @var{x}, @samp{lg(x)} -- десятичный логарифм @var{x}, @samp{log(a,x)} -- логарифм по основанию @var{a} от @var{x}, @samp{abs(x)} -- модуль @var{x}, @samp{sign(x)} -- знак @var{x}, @samp{mod(x,y)} -- остаток от деления @var{x} на @var{y}, @samp{step(x)} -- ступенчатая функция, @samp{int(x)} -- целая часть @var{x}, @samp{rnd} -- случайное число, @samp{random(x)} -- матрица случайный чисел размером как @var{x}, @samp{pi} -- число @ifhtml @html π = 3.1415926… @@ -206,7 +210,7 @@ MathGL имеет быстрый парсер текстовых формул @ifhtml @html -

Специальные функции: ‘gamma(x)’ – гамма функция Γ(x) = ∫0 tx-1 exp(-t) dt, ‘psi(x)’ – дигамма функция ψ(x) = Γ′(x)/Γ(x) для x≠0, ‘ai(x)’ – Эйри функция Ai(x), ‘bi(x)’ – Эйри функция Bi(x), ‘cl(x)’ – функция Клаузена, ‘li2(x)’ (или ‘dilog(x)’) – дилогарифм Li2(x) = -ℜ∫0xds log(1-s)/s, ‘sinc(x)’ – функция sinc(x) = sin(πx)/(πx) для любых x, ‘zeta(x)’ – зета функция Римана ζ(s) = ∑k=1k-s для s≠1, ‘eta(x)’ – эта функция η(s) = (1 - 21-s)ζ(s) для произвольного s, ‘lp(l,x)’ – полином Лежандра Pl(x), (|x|≤1, l≥0), ‘w0(x)’, ‘w1(x)’ – функции Ламберта W. Функции W(x) определены как решение уравнения: W exp(W) = x.

+

Специальные функции: ‘gamma(x)’ – гамма функция Γ(x) = ∫0 tx-1 exp(-t) dt, ‘gamma_inc(x,y)’ – неполная гамма функция Γ(x,y) = ∫y tx-1 exp(-t) dt, ‘psi(x)’ – дигамма функция ψ(x) = Γ′(x)/Γ(x) для x≠0, ‘ai(x)’ – Эйри функция Ai(x), ‘bi(x)’ – Эйри функция Bi(x), ‘cl(x)’ – функция Клаузена, ‘li2(x)’ (или ‘dilog(x)’) – дилогарифм Li2(x) = -ℜ∫0xds log(1-s)/s, ‘sinc(x)’ – функция sinc(x) = sin(πx)/(πx) для любых x, ‘zeta(x)’ – зета функция Римана ζ(s) = ∑k=1k-s для s≠1, ‘eta(x)’ – эта функция η(s) = (1 - 21-s)ζ(s) для произвольного s, ‘lp(l,x)’ – полином Лежандра Pl(x), (|x|≤1, l≥0), ‘w0(x)’, ‘w1(x)’ – функции Ламберта W. Функции W(x) определены как решение уравнения: W exp(W) = x.

Экспоненциальные интегралы: ‘ci(x)’ – cos-интеграл Ci(x) = ∫0xdt cos(t)/t, ‘si(x)’ – sin-интеграл Si(x) = ∫0xdt sin(t)/t, ‘erf(x)’ – функция ошибки erf(x) = (2/√π) ∫0xdt exp(-t2) , ‘ei(x)’ – интеграл Ei(x) = -PV(∫-xdt exp(-t)/t) (где PV обозначает главное значение), ‘e1(x)’ – интеграл E1(x) = ℜ∫1dt exp(-xt)/t, ‘e2(x)’ – интеграл E2(x) = ℜ∫1∞dt exp(-xt)/t2, ‘ei3(x)’ – интеграл Ei3(x) = ∫0xdt exp(-t3) для x≥0.

@@ -216,7 +220,7 @@ MathGL имеет быстрый парсер текстовых формул @end html @end ifhtml @ifnothtml -Специальные функции: @samp{gamma(x)} -- гамма функция @math{\Gamma(x) = \int_0^\infty dt t^@{x-1@} \exp(-t)} , @samp{psi(x)} -- дигамма функция @math{\psi(x) = \Gamma'(x)/\Gamma(x)} для x!=0, @samp{ai(x)} -- Эйри функция Ai(x), @samp{bi(x)} -- Эйри функция Bi(x), @samp{cl(x)} -- функция Клаузена, @samp{li2(x)} (или @samp{dilog(x)}) -- дилогарифм @math{Li_2(x) = - \Re \int_0^x ds \log(1-s)/s}, @samp{sinc(x)} -- функция @math{sinc(x) = \sin(\pi x) / (\pi x)} для любых x, @samp{zeta(x)} -- зета функция Римана @math{\zeta(s) = \sum_@{k=1@}^\infty k^@{-s@}} для s!=1, @samp{eta(x)} -- эта функция @math{\eta(s) = (1-2^@{1-s@}) \zeta(s)} для произвольного s, @samp{lp(l,x)} -- полином Лежандра @math{P_l(x)}, (|x|<=1, l>=0), @samp{w0(x)}, @samp{w1(x)} -- функции Ламберта @var{W}. Функции W(x) определены как решение уравнения @math{W \exp(W) = x}. +Специальные функции: @samp{gamma(x)} -- гамма функция @math{\Gamma(x) = \int_0^\infty dt t^@{x-1@} \exp(-t)}, @samp{gamma_inc(x,y)} -- неполная гамма функция @math{\Gamma(x,y) = \int_y^\infty dt t^@{x-1@} exp(-t)}, @samp{psi(x)} -- дигамма функция @math{\psi(x) = \Gamma'(x)/\Gamma(x)} для x!=0, @samp{ai(x)} -- Эйри функция Ai(x), @samp{bi(x)} -- Эйри функция Bi(x), @samp{cl(x)} -- функция Клаузена, @samp{li2(x)} (или @samp{dilog(x)}) -- дилогарифм @math{Li_2(x) = - \Re \int_0^x ds \log(1-s)/s}, @samp{sinc(x)} -- функция @math{sinc(x) = \sin(\pi x) / (\pi x)} для любых x, @samp{zeta(x)} -- зета функция Римана @math{\zeta(s) = \sum_@{k=1@}^\infty k^@{-s@}} для s!=1, @samp{eta(x)} -- эта функция @math{\eta(s) = (1-2^@{1-s@}) \zeta(s)} для произвольного s, @samp{lp(l,x)} -- полином Лежандра @math{P_l(x)}, (|x|<=1, l>=0), @samp{w0(x)}, @samp{w1(x)} -- функции Ламберта @var{W}. Функции W(x) определены как решение уравнения @math{W \exp(W) = x}. Экспоненциальные интегралы: @samp{ci(x)} -- cos-интеграл @math{Ci(x) = \int_0^x dt \cos(t)/t}, @samp{si(x)} -- sin-интеграл @math{Si(x) = \int_0^x dt \sin(t)/t}, @samp{erf(x)} -- функция ошибки @math{erf(x) = (2/\sqrt(\pi)) \int_0^x dt \exp(-t^2)}, @samp{ei(x)} -- интеграл @math{Ei(x) := - PV(\int_@{-x@}^\infty dt \exp(-t)/t)} (где PV обозначает главное значение), @samp{e1(x)} -- интеграл @math{E_1(x) := Re \int_1^\infty dt \exp(-xt)/t} , @samp{e2(x)} -- интеграл @math{E_2(x) := Re \int_1^\infty dt \exp(-xt)/t^2}, @samp{ei3(x)} -- интеграл @math{Ei_3(x) = \int_0^x dt \exp(-t^3)} для x>=0. diff --git a/texinfo/core_en.texi b/texinfo/core_en.texi index 80a6e74..5b3ded0 100644 --- a/texinfo/core_en.texi +++ b/texinfo/core_en.texi @@ -11,12 +11,22 @@ This chapter contains a lot of plotting commands for 1D, 2D and 3D data. It also The core of MathGL is @strong{mglGraph} class defined in @code{#include }. It contains a lot of plotting functions for 1D, 2D and 3D data. It also encapsulates parameters for axes drawing. Moreover an arbitrary coordinate transformation can be used for each axis. All plotting functions use data encapsulated in mglData class (see @ref{Data processing}) that allows to check sizes of used arrays easily. Also it have many functions for data handling: modify it by formulas, find momentums and distribution (histogram), apply operator (differentiate, integrate, transpose, Fourier and so on), change data sizes (interpolate, squeeze, crop and so on). Additional information about colors, fonts, formula parsing can be found in @ref{General concepts} and @ref{Other classes}. @end ifclear +Some of MathGL features will appear only in novel versions. To test used MathGL version you can use following function. +@anchor{version} +@deftypefn {MGL command} {} version 'ver' +@ifclear UDAV +@deftypefnx {C function} @code{int} mgl_check_version (@code{const char *}ver) +@end ifclear +Return nonzero if MathGL version is appropriate for required by @var{ver}, i.e. if major version is the same and minor version is greater or equal to one in @var{ver}. +@end deftypefn + @menu * Constructor:: * Graphics setup:: * Axis settings:: * Subplots and rotation:: * Export picture:: +* Background:: * Primitives:: * Text printing:: * Axis and Colorbar:: @@ -87,6 +97,7 @@ Restore initial values for all of parameters. * Palette and colors:: * Masks:: * Error handling:: +* Stop drawing:: @end menu @c ================================================================== @@ -270,7 +281,7 @@ Sets size of arrows for @ref{1D plotting}, lines and curves (see @ref{Primitives @deftypefnx {Method on @code{mglGraph}} @code{void} SetMeshNum (@code{int} val) @deftypefnx {C function} @code{void} mgl_set_meshnum (@code{HMGL} gr, @code{int} num) @end ifclear -Sets approximate number of lines in @ref{mesh}, @ref{fall}, @ref{grid} and also the number of hachures in @ref{vect}, @ref{dew} and the number of cells in @ref{cloud}. By default (=0) it draws all lines/hachures/cells. +Sets approximate number of lines in @ref{mesh}, @ref{fall}, @ref{grid2} and also the number of hachures in @ref{vect}, @ref{dew} and the number of cells in @ref{cloud}. By default (=0) it draws all lines/hachures/cells. @end deftypefn @anchor{facenum} @@ -293,7 +304,8 @@ Sets default name @var{id} as filename for saving (in FLTK window for example). @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{const char *} GetPlotId () -@deftypefnx {C function} @code{const char *} mgl_get_plotid (@code{HMGL} gr) +@deftypefnx {C function only} @code{const char *} mgl_get_plotid (@code{HMGL} gr) +@deftypefnx {Fortran subroutine} @code{} mgl_get_plotid (@code{long} gr, @code{char *}out, @code{int} len) Gets default name @var{id} as filename for saving (in FLTK window for example). @end deftypefn @end ifclear @@ -483,15 +495,18 @@ Sets the default rotation angle (in degrees) for masks. Note, you can use symbol @c ================================================================== @external{} -@node Error handling, , Masks, Graphics setup +@node Error handling, Stop drawing, Masks, Graphics setup @subsection Error handling @nav{} +@ifset UDAV +All warnings will be displayed automatically in special tool-window or in console. +@end ifset @ifclear UDAV @cindex Message @cindex SetWarn @cindex GetWarn -Normally user should set it to zero by @code{SetWarn(0);} before plotting and check if @code{GetWarn()} or @code{Message()} return non zero after plotting. Only last warning will be saved. All warnings/errors produced by MathGL is not critical -- the plot just will not be drawn. +Normally user should set it to zero by @code{SetWarn(0);} before plotting and check if @code{GetWarn()} or @code{Message()} return non zero after plotting. Only last warning will be saved. All warnings/errors produced by MathGL is not critical -- the plot just will not be drawn. By default, all warnings are printed in stderr. You can disable it by using @code{mgl_suppress_warn(true);}. @deftypefn {Method on @code{mglGraph}} @code{void} SetWarn (@code{int} code, @code{const char *}info=@code{""}) @deftypefnx {C function} @code{void} mgl_set_warn (@code{HMGL} gr, @code{int} code, @code{const char *}info) @@ -499,7 +514,8 @@ Set warning code. Normally you should call this function only for clearing the w @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{const char *}Message () -@deftypefnx {C function} @code{const char *}mgl_get_mess (@code{HMGL} gr) +@deftypefnx {C function only} @code{const char *}mgl_get_mess (@code{HMGL} gr) +@deftypefnx {Fortran subroutine} @code{} mgl_get_mess (@code{long} gr, @code{char *}out, @code{int} len) Return messages about matters why some plot are not drawn. If returned string is empty then there are no messages. @end deftypefn @@ -551,6 +567,42 @@ Too long line in MGL script Unbalanced ' in MGL script @end table @end deftypefn + +@deftypefn {C function} @code{void} mgl_suppress_warn (@code{int} state) +Disable printing warnings to @code{stderr} if @var{state} is nonzero. +@end deftypefn + +@end ifclear + + +@c ================================================================== +@external{} +@node Stop drawing, , Error handling, Graphics setup +@subsection Stop drawing +@nav{} +@ifset UDAV +You can use @ref{stop} command or press corresponding toolbutton to stop drawing and script execution. +@end ifset +@ifclear UDAV +@cindex Stop +@cindex NeedStop +@cindex SetEventFunc + +@deftypefn {Method on @code{mglGraph}} @code{void} Stop (@code{bool} stop=@code{true}) +@deftypefnx {C function only} @code{void} mgl_ask_stop (@code{HMGL} gr, @code{int} stop) +Ask to stop drawing if @var{stop} is non-zero, otherwise reset stop flag. +@end deftypefn + +@deftypefn {Method on @code{mglGraph}} @code{bool} NeedStop () +@deftypefnx {C function only} @code{void} mgl_need_stop (@code{HMGL} gr) +Return @code{true} if drawing should be terminated. Also it process all events in GUI. User should call this function from time to time inside a long calculation to allow processing events for GUI. +@end deftypefn + +@deftypefn {Method on @code{mglGraph}} @code{bool} SetEventFunc (@code{void (*}func@code{)(void *)}, @code{void *}par=@code{NULL}) +@deftypefnx {C function only} @code{void} mgl_set_event_func (@code{HMGL} gr, @code{void (*}func@code{)(void *)}, @code{void *}par) +Set callback function which will be called to process events of GUI library. +@end deftypefn + @end ifclear @c ================================================================== @@ -686,7 +738,7 @@ Sets transformation formulas for curvilinear coordinate. Each string should cont @deftypefnx {Method on @code{mglGraph}} @code{void} SetCoor (@code{int} how) @deftypefnx {C function} @code{void} mgl_set_coor (@code{HMGL} gr, @code{int} how) @end ifclear -Sets one of the predefined transformation formulas for curvilinear coordinate. Paramater @var{how} define the coordinates: @code{mglCartesian=0} -- Cartesian coordinates (no transformation); @code{mglPolar=1} -- Polar coordinates @math{x_n=x*cos(y),y_n=x*sin(y), z_n=z}; @code{mglSpherical=2} -- Sperical coordinates @math{x_n=x*sin(y)*cos(z), y_n=x*sin(y)*sin(z), z_n=x*cos(y)}; @code{mglParabolic=3} -- Parabolic coordinates @math{x_n=x*y, y_n=(x*x-y*y)/2, z_n=z}; @code{mglParaboloidal=4} -- Paraboloidal coordinates @math{x_n=(x*x-y*y)*cos(z)/2, y_n=(x*x-y*y)*sin(z)/2, z_n=x*y}; @code{mglOblate=5} -- Oblate coordinates @math{x_n=cosh(x)*cos(y)*cos(z), y_n=cosh(x)*cos(y)*sin(z), z_n=sinh(x)*sin(y)}; @code{mglProlate=6} -- Prolate coordinates @math{x_n=sinh(x)*sin(y)*cos(z), y_n=sinh(x)*sin(y)*sin(z), z_n=cosh(x)*cos(y)}; @code{mglElliptic=7} -- Elliptic coordinates @math{x_n=cosh(x)*cos(y), y_n=sinh(x)*sin(y), z_n=z}; @code{mglToroidal=8} -- Toroidal coordinates @math{x_n=sinh(x)*cos(z)/(cosh(x)-cos(y)), y_n=sinh(x)*sin(z)/(cosh(x)-cos(y)), z_n=sin(y)/(cosh(x)-cos(y))}; @code{mglBispherical=9} -- Bispherical coordinates @math{x_n=sin(y)*cos(z)/(cosh(x)-cos(y)), y_n=sin(y)*sin(z)/(cosh(x)-cos(y)), z_n=sinh(x)/(cosh(x)-cos(y))}; @code{mglBipolar=10} -- Bipolar coordinates @math{x_n=sinh(x)/(cosh(x)-cos(y)), y_n=sin(y)/(cosh(x)-cos(y)), z_n=z}; @code{mglLogLog=11} -- log-log coordinates @math{x_n=lg(x), y_n=lg(y), z_n=lg(z)}; @code{mglLogX=12} -- log-x coordinates @math{x_n=lg(x), y_n=y, z_n=z}; @code{mglLogY=13} -- log-y coordinates @math{x_n=x, y_n=lg(y), z_n=z}. +Sets one of the predefined transformation formulas for curvilinear coordinate. Parameter @var{how} define the coordinates: @code{mglCartesian=0} -- Cartesian coordinates (no transformation); @code{mglPolar=1} -- Polar coordinates @math{x_n=x*cos(y),y_n=x*sin(y), z_n=z}; @code{mglSpherical=2} -- Sperical coordinates @math{x_n=x*sin(y)*cos(z), y_n=x*sin(y)*sin(z), z_n=x*cos(y)}; @code{mglParabolic=3} -- Parabolic coordinates @math{x_n=x*y, y_n=(x*x-y*y)/2, z_n=z}; @code{mglParaboloidal=4} -- Paraboloidal coordinates @math{x_n=(x*x-y*y)*cos(z)/2, y_n=(x*x-y*y)*sin(z)/2, z_n=x*y}; @code{mglOblate=5} -- Oblate coordinates @math{x_n=cosh(x)*cos(y)*cos(z), y_n=cosh(x)*cos(y)*sin(z), z_n=sinh(x)*sin(y)}; @code{mglProlate=6} -- Prolate coordinates @math{x_n=sinh(x)*sin(y)*cos(z), y_n=sinh(x)*sin(y)*sin(z), z_n=cosh(x)*cos(y)}; @code{mglElliptic=7} -- Elliptic coordinates @math{x_n=cosh(x)*cos(y), y_n=sinh(x)*sin(y), z_n=z}; @code{mglToroidal=8} -- Toroidal coordinates @math{x_n=sinh(x)*cos(z)/(cosh(x)-cos(y)), y_n=sinh(x)*sin(z)/(cosh(x)-cos(y)), z_n=sin(y)/(cosh(x)-cos(y))}; @code{mglBispherical=9} -- Bispherical coordinates @math{x_n=sin(y)*cos(z)/(cosh(x)-cos(y)), y_n=sin(y)*sin(z)/(cosh(x)-cos(y)), z_n=sinh(x)/(cosh(x)-cos(y))}; @code{mglBipolar=10} -- Bipolar coordinates @math{x_n=sinh(x)/(cosh(x)-cos(y)), y_n=sin(y)/(cosh(x)-cos(y)), z_n=z}; @code{mglLogLog=11} -- log-log coordinates @math{x_n=lg(x), y_n=lg(y), z_n=lg(z)}; @code{mglLogX=12} -- log-x coordinates @math{x_n=lg(x), y_n=y, z_n=z}; @code{mglLogY=13} -- log-y coordinates @math{x_n=x, y_n=lg(y), z_n=z}. @end deftypefn @anchor{ternary} @@ -729,6 +781,7 @@ Use @code{Ternary(0)} for returning to usual axis. @sref{Ternary axis} @sref{Axi @cindex SetTickRotate @cindex SetTickSkip @cindex SetOriginTick +@cindex AddTick @end ifclear @anchor{adjust} @@ -749,15 +802,21 @@ Set the ticks step, number of sub-ticks and initial ticks position to be the mos @deftypefnx {MGL command} {} ztick @code{val [sub=0 org=nan]} @deftypefnx {MGL command} {} ctick @code{val [sub=0 org=nan]} @ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d=@code{0}, @code{int} ns=@code{0}, @code{mreal} org=@code{NAN}) +@deftypefnx {Method on @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d=@code{0}, @code{int} ns=@code{0}, @code{mreal} org=@code{NAN}, @code{const char *}fact=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d, @code{int} ns, @code{mreal} org, @code{const wchar_t *}fact) @deftypefnx {C function} @code{void} mgl_set_ticks (@code{HMGL} gr, @code{char} dir, @code{mreal} d, @code{int} ns, @code{mreal} org) +@deftypefnx {C function} @code{void} mgl_set_ticks_fact (@code{HMGL} gr, @code{char} dir, @code{mreal} d, @code{int} ns, @code{mreal} org, @code{const char *}fact) +@deftypefnx {C function} @code{void} mgl_set_ticks_factw (@code{HMGL} gr, @code{char} dir, @code{mreal} d, @code{int} ns, @code{mreal} org, @code{const wchar_t *}fact) @end ifclear -Set the ticks step @var{d}, number of sub-ticks @var{ns} (used for positive @var{d}) and initial ticks position @var{org} for the axis along direction @var{dir} (use 'c' for colorbar ticks). Variable @var{d} set step for axis ticks (if positive) or it's number on the axis range (if negative). Zero value set automatic ticks. If @var{org} value is NAN then axis origin is used. +Set the ticks step @var{d}, number of sub-ticks @var{ns} (used for positive @var{d}) and initial ticks position @var{org} for the axis along direction @var{dir} (use 'c' for colorbar ticks). Variable @var{d} set step for axis ticks (if positive) or it's number on the axis range (if negative). Zero value set automatic ticks. If @var{org} value is NAN then axis origin is used. Parameter @var{fact} set text which will be printed after tick label (like "\pi" for @var{d}=M_PI). @end deftypefn @deftypefn {MGL command} {} xtick @code{val1} 'lbl1' [@code{val2} 'lbl2' ...] @deftypefnx {MGL command} {} ytick @code{val1} 'lbl1' [@code{val2} 'lbl2' ...] @deftypefnx {MGL command} {} ztick @code{val1} 'lbl1' [@code{val2} 'lbl2' ...] +@deftypefnx {MGL command} {} xtick vdat 'lbls' [@code{add=off}] +@deftypefnx {MGL command} {} ytick vdat 'lbls' [@code{add=off}] +@deftypefnx {MGL command} {} ztick vdat 'lbls' [@code{add=off}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetTicksVal (@code{char} dir, @code{const char *}lbl, @code{bool} add=@code{false}) @deftypefnx {Method on @code{mglGraph}} @code{void} SetTicksVal (@code{char} dir, @code{const wchar_t *}lbl, @code{bool} add=@code{false}) @@ -768,9 +827,18 @@ Set the ticks step @var{d}, number of sub-ticks @var{ns} (used for positive @var @deftypefnx {C function} @code{void} mgl_set_ticks_val (@code{HMGL} gr, @code{char} dir, @code{HCDT} val, @code{const char *}lbl, @code{bool} add) @deftypefnx {C function} @code{void} mgl_set_ticks_valw (@code{HMGL} gr, @code{char} dir, @code{HCDT} val, @code{const wchar_t *}lbl, @code{bool} add) @end ifclear -Set the manual positions @var{val} and its labels @var{lbl} for ticks along axis @var{dir}. If array @var{val} is absent then values equidistantly distributed in interval [@var{Min}.x, @var{Max}.x] are used. Labels are separated by @samp{\n} symbol. Use @code{SetTicks()} to restore automatic ticks. +Set the manual positions @var{val} and its labels @var{lbl} for ticks along axis @var{dir}. If array @var{val} is absent then values equidistantly distributed in x-axis range are used. Labels are separated by @samp{\n} symbol. Use @code{SetTicks()} to restore automatic ticks. @end deftypefn +@ifclear UDAV +@deftypefn {Method on @code{mglGraph}} @code{void} AddTick (@code{char} dir, @code{double} val, @code{const char *}lbl) +@deftypefnx {Method on @code{mglGraph}} @code{void} AddTick (@code{char} dir, @code{double} val, @code{const wchar_t *}lbl) +@deftypefnx {C function} @code{void} mgl_add_tick (@code{HMGL} gr, @code{char} dir, @code{double} val, @code{const char *}lbl) +@deftypefnx {C function} @code{void} mgl_set_tickw (@code{HMGL} gr, @code{char} dir, @code{double} val, @code{const wchar_t *}lbl) +The same as previous but add single tick label @var{lbl} at position @var{val} to the lest of existed ones. +@end deftypefn +@end ifclear + @deftypefn {MGL command} {} xtick 'templ' @deftypefnx {MGL command} {} ytick 'templ' @deftypefnx {MGL command} {} ztick 'templ' @@ -900,9 +968,9 @@ Puts further plotting in a @var{m}-th cell of @var{nx}*@var{ny} grid of the whol @item @samp{U} or @samp{_} -- at bottom side, @item -@samp{#} -- reserve none space (use whole region for axis range). +@samp{#} -- reserve none space (use whole region for axis range) -- axis and tick labels will be invisible by default. @end itemize -From the aesthetical point of view it is not recommended to use this function with different matrices in the same frame. The position of the cell can be shifted from its default position by relative size @var{dx}, @var{dy}. +From the aesthetical point of view it is not recommended to use this function with different matrices in the same frame. The position of the cell can be shifted from its default position by relative size @var{dx}, @var{dy}. Note, colorbar can be invisible (be out of image borders) if you set empty style @samp{}. @end deftypefn @anchor{multiplot} @@ -971,7 +1039,7 @@ Puts further plotting in @var{ind}-th cell of stick with @var{num} cells. At thi @deftypefnx {C function} @code{void} mgl_title (@code{HMGL} gr, @code{const char *}txt, @code{const char *}stl, @code{mreal} size) @deftypefnx {C function} @code{void} mgl_titlew (@code{HMGL} gr, @code{const wchar_t *}txt, @code{const char *}stl, @code{mreal} size) @end ifclear -Add text @var{title} for current subplot/inplot. Paramater @var{stl} can contain: +Add text @var{title} for current subplot/inplot. Parameter @var{stl} can contain: @itemize @bullet @item font style (see, @ref{Font styles}); @@ -1057,7 +1125,7 @@ The function changes the scale of graphics that correspond to zoom in/out of the @c ################################################################## @external{} -@node Export picture, Primitives, Subplots and rotation, MathGL core +@node Export picture, Background, Subplots and rotation, MathGL core @section Export picture @nav{} @cindex SetSize @@ -1090,7 +1158,7 @@ Gets quality of the plot: @code{MGL_DRAW_WIRE=0} -- no face drawing (fastest), @ @deftypefn {Method on @code{mglGraph}} @code{void} StartGroup (const char *name) @deftypefnx {C function} @code{void} mgl_start_group (@code{HMGL} gr, @code{const char *}name) -Starts group definition. Groups contain objects and other groups, they are used to select a part of a model to zoom to or to make invizible or to make semitransparent and so on. +Starts group definition. Groups contain objects and other groups, they are used to select a part of a model to zoom to or to make invisible or to make semitransparent and so on. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} EndGroup () @@ -1171,7 +1239,7 @@ Exports current frame to TGA file. Parameter @var{fname} specifies the file name @deftypefn {Method on @code{mglGraph}} @code{void} WriteEPS (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_eps (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) -Exports current frame to EPS file using vector representation. So it is not recommended for the export of large data plot. It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file. By default there is no description added. If file name is terminated by @samp{z} (for example, @samp{fname.eps.gz}) then file will be compressed in gzip format. +Exports current frame to EPS file using vector representation. So it is not recommended for the export of large data plot. It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file. By default there is no description added. If file name is terminated by @samp{z} (for example, @samp{fname.eps.gz}) then file will be compressed in gzip format. Note, that EPS format don't support color interpolation, and the resulting plot will look as you use @ref{quality}=1 for plotting. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteBPS (@code{const char *}fname, @code{const char *}descr=@code{""}) @@ -1181,7 +1249,7 @@ Exports current frame to EPS file using bitmap representation. Parameter @var{fn @deftypefn {Method on @code{mglGraph}} @code{void} WriteSVG (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_svg (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) -Exports current frame to SVG (Scalable Vector Graphics) file using vector representation. In difference of EPS format, SVG format support transparency that allows to correctly draw semitransparent plot (like @ref{surfa}, @ref{surf3a} or @ref{cloud}). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). If file name is terminated by @samp{z} (for example, @samp{fname.svgz}) then file will be compressed in gzip format. +Exports current frame to SVG (Scalable Vector Graphics) file using vector representation. In difference of EPS format, SVG format support transparency that allows to correctly draw semitransparent plot (like @ref{surfa}, @ref{surf3a} or @ref{cloud}). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). If file name is terminated by @samp{z} (for example, @samp{fname.svgz}) then file will be compressed in gzip format. Note, that SVG format don't support color interpolation, and the resulting plot will look as you use @ref{quality}=1 for plotting. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteTEX (@code{const char *}fname, @code{const char *}descr=@code{""}) @@ -1309,6 +1377,11 @@ Deletes drawing data for frame @var{i} and shift all later frame indexes. Functi Reset frames counter (start it from zero). @end deftypefn +@deftypefn {Method on @code{mglGraph}} @code{void} ClearFrame (@code{int} i) +@deftypefnx {C function} @code{void} mgl_clear_frame (@code{HMGL} gr, @code{int} i) +Clear list of primitives for current drawing. +@end deftypefn + @deftypefn {Method on @code{mglGraph}} @code{void} StartGIF (@code{const char *}fname, @code{int} ms=@code{100}) @deftypefnx {C function} @code{void} mgl_start_gif (@code{HMGL} gr, @code{const char *}fname, @code{int} ms) Start writing frames into animated GIF file @var{fname}. Parameter @var{ms} set the delay between frames in milliseconds. You @strong{should not} change the picture size during writing the cinema. Use @code{CloseGIF()} to finalize writing. Note, that this function is disabled in OpenGL mode. @@ -1438,11 +1511,56 @@ Receive graphical information from node @var{id} using MPI. The width and height @c ################################################################## @external{} -@node Primitives, Text printing, Export picture, MathGL core +@node Background, Primitives, Export picture, MathGL core +@section Background +@nav{} +@cindex LoadBackground +@cindex Clf +@cindex Rasterize + +These functions change background image. + +@anchor{clf} +@deftypefn {MGL command} {} clf ['col'] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Clf () +@deftypefnx {Method on @code{mglGraph}} @code{void} Clf (@code{const char *} col) +@deftypefnx {Method on @code{mglGraph}} @code{void} Clf (@code{char} col) +@deftypefnx {Method on @code{mglGraph}} @code{void} Clf (@code{mreal} r, @code{mreal} g, @code{mreal} b) +@deftypefnx {C function} @code{void} mgl_clf (@code{HMGL} gr) +@deftypefnx {C function} @code{void} mgl_clf_str (@code{HMGL} gr, @code{const char *} col) +@deftypefnx {C function} @code{void} mgl_clf_chr (@code{HMGL} gr, @code{char} col) +@deftypefnx {C function} @code{void} mgl_clf_rgb (@code{HMGL} gr, @code{mreal} r, @code{mreal} g, @code{mreal} b) +@end ifclear +Clear the picture and fill background by specified color. +@end deftypefn + +@anchor{rasterize} +@deftypefn {MGL command} {} rasterize +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Rasterize () +@deftypefnx {C function} @code{void} mgl_rasterize (@code{HMGL} gr) +@end ifclear +Force drawing the plot and use it as background. After it, function clear the list of primitives, like @ref{clf}. This function is useful if you want save part of plot as bitmap one (for example, large surfaces, isosurfaces or vector fields) and keep some parts as vector one (like annotation, curves, axis and so on). +@end deftypefn + +@anchor{background} +@deftypefn {MGL command} {} background 'fname' [@code{alpha=1}] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} LoadBackground (@code{const char *} fname, @code{double} alpha=@code{1}) +@deftypefnx {C function} @code{void} mgl_load_background (@code{HMGL} gr, @code{const char *} fname, @code{double} alpha) +@end ifclear +Load PNG or JPEG file @var{fname} as background for the plot. Parameter @var{alpha} manually set transparency of the background. +@end deftypefn + + + +@c ################################################################## +@external{} +@node Primitives, Text printing, Background, MathGL core @section Primitives @nav{} @cindex Ball -@cindex Clf @cindex Line @cindex Curve @cindex Glyph @@ -1461,19 +1579,6 @@ Receive graphical information from node @var{id} using MPI. The width and height These functions draw some simple objects like line, point, sphere, drop, cone and so on. @sref{Using primitives} -@anchor{clf} -@deftypefn {MGL command} {} clf ['col'] -@ifclear UDAV -@deftypefnx {Method on @code{mglGraph}} @code{void} Clf () -@deftypefnx {Method on @code{mglGraph}} @code{void} Clf (@code{char} col) -@deftypefnx {Method on @code{mglGraph}} @code{void} Clf (@code{mreal} r, @code{mreal} g, @code{mreal} b) -@deftypefnx {C function} @code{void} mgl_clf (@code{HMGL} gr) -@deftypefnx {C function} @code{void} mgl_clf_chr (@code{HMGL} gr, @code{char} col) -@deftypefnx {C function} @code{void} mgl_clf_rgb (@code{HMGL} gr, @code{mreal} r, @code{mreal} g, @code{mreal} b) -@end ifclear -Clear the picture and fill it by specified color. -@end deftypefn - @anchor{ball} @deftypefn {MGL command} {} ball @code{x y} ['col'='r.'] @deftypefnx {MGL command} {} ball @code{x y z} ['col'='r.'] @@ -1640,6 +1745,37 @@ colors for filling and boundary (second one if style @samp{@@} is used, black co @end itemize @end deftypefn +@anchor{arc} +@deftypefn {MGL command} {} arc @code{x0 y0 x1 y1 a} ['col'='r'] +@deftypefnx {MGL command} {} arc @code{x0 y0 z0 x1 y1 a} ['col'='r'] +@deftypefnx {MGL command} {} arc @code{x0 y0 z0 xa ya za x1 y1 z1 a} ['col'='r'] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Arc (@code{mglPoint} p0, @code{mglPoint} p1, @code{mreal} a, @code{const char *}col=@code{"r"}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Arc (@code{mglPoint} p0, @code{mglPoint} pa, @code{mglPoint} p1, @code{mreal} a, @code{const char *}col=@code{"r"}) +@deftypefnx {C function} @code{void} mgl_arc (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} x1, @code{mreal} y1, @code{mreal} a, @code{const char *}col) +@deftypefnx {C function} @code{void} mgl_arc_ext (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} xa, @code{mreal} ya, @code{mreal} za, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} a, @code{const char *}col) +@end ifclear +Draw the arc around axis @var{pa} (default is z-axis @var{pa}=@{0,0,1@}) with center at @var{p0} and starting from point @var{p1}. Parameter @var{a} set the angle of arc in degree. Parameter @var{col} may contain color of the arc and arrow style for arc edges. +@end deftypefn + +@anchor{polygon} +@deftypefn {MGL command} {} polygon @code{x0 y0 x1 y1 num} ['col'='r'] +@deftypefnx {MGL command} {} polygon @code{x0 y0 z0 x1 y1 z1 num} ['col'='r'] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Polygon (@code{mglPoint} p0, @code{mglPoint} p1, @code{int} num, @code{const char *}col=@code{"r"}) +@deftypefnx {C function} @code{void} mgl_polygon (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{int} num, @code{const char *}col) +@end ifclear +Draw the polygon with @var{num} edges starting from @var{p1}. The center of polygon is located in @var{p0}. Parameter @var{col} may contain +@itemize @bullet +@item +colors for filling and boundary (second one if style @samp{@@} is used, black color is used by default); +@item +@samp{#} for wire figure (boundary only); +@item +@samp{@@} for filling and boundary. +@end itemize +@end deftypefn + @c ################################################################## @external{} @node Text printing, Axis and Colorbar, Primitives, MathGL core @@ -1655,7 +1791,7 @@ colors for filling and boundary (second one if style @samp{@@} is used, black co These functions draw the text. There are functions for drawing text in arbitrary place, in arbitrary direction and along arbitrary curve. MathGL can use arbitrary font-faces and parse many TeX commands (for more details see @ref{Font styles}). All these functions have 2 variant: for printing 8-bit text (@code{char *}) and for printing Unicode text (@code{wchar_t *}). In first case the conversion into the current locale is used. So sometimes you need to specify it by @code{setlocale()} function. The @var{size} argument control the size of text: if positive it give the value, if negative it give the value relative to @code{SetFontSize()}. The font type (STIX, arial, courier, times and so on) can be selected by function LoadFont(). @xref{Font settings}. -The font parameters are described by string. This string may set the text color @samp{wkrgbcymhRGBCYMHW} (see @ref{Color styles}). Also, after delimiter symbol @samp{:}, it can contain characters of font type (@samp{rbiwou}) and/or align (@samp{LRC}) specification. The font types are: @samp{r} -- roman (or regular) font, @samp{i} -- italic style, @samp{b} -- bold style, @samp{w} -- wired style, @samp{o} -- over-lined text, @samp{u} -- underlined text. By default roman font is used. The align types are: @samp{L} -- align left (default), @samp{C} -- align center, @samp{R} -- align right. For example, string @samp{b:iC} correspond to italic font style for centered text which printed by blue color. +The font parameters are described by string. This string may set the text color @samp{wkrgbcymhRGBCYMHW} (see @ref{Color styles}). Starting from MathGL v.2.3, you can set color gradient for text (see @ref{Color scheme}). Also, after delimiter symbol @samp{:}, it can contain characters of font type (@samp{rbiwou}) and/or align (@samp{LRCT}) specification. The font types are: @samp{r} -- roman (or regular) font, @samp{i} -- italic style, @samp{b} -- bold style, @samp{w} -- wired style, @samp{o} -- over-lined text, @samp{u} -- underlined text. By default roman font is used. The align types are: @samp{L} -- align left (default), @samp{C} -- align center, @samp{R} -- align right. Style @samp{T} will position text under the specified point (like align top). For example, string @samp{b:iC} correspond to italic font style for centered text which printed by blue color. If string contains symbols @samp{aA} then text is printed at absolute position @{@var{x}, @var{y}@} (supposed to be in range [0,1]) of picture (for @samp{A}) or subplot/inplot (for @samp{a}). If string contains symbol @samp{@@} then box around text is drawn. @@ -1683,7 +1819,7 @@ The function plots the string @var{text} at position @var{p} with fonts specifyi @deftypefnx {C function} @code{void} mgl_puts_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const char *}text, @code{const char *}fnt, @code{mreal} size) @deftypefnx {C function} @code{void} mgl_putsw_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const wchar_t *}text, @code{const char *}fnt, @code{mreal} size) @end ifclear -The function plots the string @var{text} at position @var{p} along direction @var{d} with specified @var{size}. Parameter @var{fnt} set text style and text position: above (@samp{T}) or under (@samp{t}) the line. +The function plots the string @var{text} at position @var{p} along direction @var{d} with specified @var{size}. Parameter @var{fnt} set text style and text position: under (@samp{T}) or above (@samp{t}) the line. @end deftypefn @anchor{fgets} @@ -1709,7 +1845,7 @@ Draws unrotated @var{n}-th line of file @var{fname} at position @{@var{x},@var{y @deftypefnx {C function} @code{void} mgl_text_xyz (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}text, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textw_xyz (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const wchar_t *}text, @code{const char *}fnt, @code{const char *}opt) @end ifclear -The function draws @var{text} along the curve between points @{@var{x}[i], @var{y}[i], @var{z}[i]@} by font style @var{fnt}. The string @var{fnt} may contain symbols @samp{t} for printing the text under the curve (default), or @samp{T} for printing the text above the curve. The sizes of 1st dimension must be equal for all arrays @code{x.nx=y.nx=z.nx}. If array @var{x} is not specified then its an automatic array is used with values equidistantly distributed in interval [@var{Min}.x, @var{Max}.x] (see @ref{Ranges (bounding box)}). If array @var{z} is not specified then @var{z}[i] = @var{Min}.z is used. String @var{opt} contain command options (see @ref{Command options}). +The function draws @var{text} along the curve between points @{@var{x}[i], @var{y}[i], @var{z}[i]@} by font style @var{fnt}. The string @var{fnt} may contain symbols @samp{t} for printing the text under the curve (default), or @samp{T} for printing the text under the curve. The sizes of 1st dimension must be equal for all arrays @code{x.nx=y.nx=z.nx}. If array @var{x} is not specified then its an automatic array is used with values equidistantly distributed in x-axis range (see @ref{Ranges (bounding box)}). If array @var{z} is not specified then @var{z}[i] equal to minimal z-axis value is used. String @var{opt} contain command options (see @ref{Command options}). @end deftypefn @c ################################################################## @@ -1733,20 +1869,20 @@ These functions draw the ``things for measuring'', like axis with ticks, colorba @end ifclear Draws axes with ticks (see @ref{Axis settings}). Parameter @var{dir} may contain: @itemize @bullet -@item -@samp{xyz} for drawing axis in corresponding direction; -@item -@samp{XYZ} for drawing axis in corresponding direction but with inverted positions of labels; -@item -@samp{~} or @samp{_} for disabling tick labels; -@item -@samp{U} for disabling rotation of tick labels; -@item -@samp{^} for inverting default axis origin; -@item -@samp{AKDTVISO} for drawing arrow at the end of axis; -@item -@samp{a} for forced adjusting of axis ticks. +@item @samp{xyz} for drawing axis in corresponding direction; +@item @samp{XYZ} for drawing axis in corresponding direction but with inverted positions of labels; +@item @samp{~} or @samp{_} for disabling tick labels; +@item @samp{U} for disabling rotation of tick labels; +@item @samp{^} for inverting default axis origin; +@item @samp{!} for disabling ticks tuning (see @ref{tuneticks}); +@item @samp{AKDTVISO} for drawing arrow at the end of axis; +@item @samp{a} for forced adjusting of axis ticks; +@item @samp{f} for printing ticks labels in fixed format; +@item @samp{E} for using @samp{E} instead of @samp{e} in ticks labels; +@item @samp{F} for printing ticks labels in LaTeX format; +@item @samp{+} for printing @samp{+} for positive ticks; +@item @samp{-} for printing usual @samp{-} in ticks labels; +@item @samp{0123456789} for precision at printing ticks labels. @end itemize Styles of ticks and axis can be overrided by using @var{stl} string. @sref{Axis and ticks} @end deftypefn @@ -1761,14 +1897,17 @@ Draws colorbar. Parameter @var{sch} may contain: @itemize @bullet @item color scheme (see @ref{Color scheme}); -@item -@samp{<>^_} for positioning at left, at right, at top or at bottom correspondingly; -@item -@samp{I} for positioning near bounding (by default, is positioned at edges of subplot); -@item -@samp{A} for using absolute coordinates; -@item -@samp{~} for disabling tick labels. +@item @samp{<>^_} for positioning at left, at right, at top or at bottom correspondingly; +@item @samp{I} for positioning near bounding (by default, is positioned at edges of subplot); +@item @samp{A} for using absolute coordinates; +@item @samp{~} for disabling tick labels. +@item @samp{!} for disabling ticks tuning (see @ref{tuneticks}); +@item @samp{f} for printing ticks labels in fixed format; +@item @samp{E} for using @samp{E} instead of @samp{e} in ticks labels; +@item @samp{F} for printing ticks labels in LaTeX format; +@item @samp{+} for printing @samp{+} for positive ticks; +@item @samp{-} for printing usual @samp{-} in ticks labels; +@item @samp{0123456789} for precision at printing ticks labels. @end itemize @sref{Colorbars} @end deftypefn @@ -1803,7 +1942,7 @@ The same as previous but with sharp colors @var{sch} (current palette if @code{s @deftypefnx {Method on @code{mglGraph}} @code{void} Grid (@code{const char *}dir=@code{"xyz"}, @code{const char *}pen=@code{"B"}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_axis_grid (@code{HMGL} gr, @code{const char *}dir, @code{const char *}pen, @code{const char *}opt) @end ifclear -Draws grid lines perpendicular to direction determined by string parameter @var{dir}. The step of grid lines is the same as tick step for @ref{axis}. The style of lines is determined by @var{pen} parameter (default value is dark blue solid line @samp{B-}). +Draws grid lines perpendicular to direction determined by string parameter @var{dir}. If @var{dir} contain @samp{!} then grid lines will be drawn at coordinates of subticks also. The step of grid lines is the same as tick step for @ref{axis}. The style of lines is determined by @var{pen} parameter (default value is dark blue solid line @samp{B-}). @end deftypefn @anchor{box} @@ -1931,7 +2070,7 @@ Set the number of marks in the legend. By default 1 mark is used. @cindex Label @cindex Cones -These functions perform plotting of 1D data. 1D means that data depended from only 1 parameter like parametric curve @{x[i],y[i],z[i]@}, i=1...n. By default (if absent) values of @var{x}[i] are equidistantly distributed in axis range, and @var{z}[i]=@var{Min}.z. The plots are drawn for each row if one of the data is the matrix. By any case the sizes of 1st dimension @strong{must be equal} for all arrays @code{x.nx=y.nx=z.nx}. +These functions perform plotting of 1D data. 1D means that data depended from only 1 parameter like parametric curve @{x[i],y[i],z[i]@}, i=1...n. By default (if absent) values of @var{x}[i] are equidistantly distributed in axis range, and @var{z}[i] equal to minimal z-axis value. The plots are drawn for each row if one of the data is the matrix. By any case the sizes of 1st dimension @strong{must be equal} for all arrays @code{x.nx=y.nx=z.nx}. String @var{pen} specifies the color and style of line and marks (see @ref{Line styles}). By default (@code{pen=""}) solid line with color from palette is used (see @ref{Palette and colors}). Symbol @samp{!} set to use new color from palette for each point (not for each curve, as default). String @var{opt} contain command options (see @ref{Command options}). @sref{1D samples} @@ -2033,7 +2172,7 @@ These functions draw continuous lines between points and fills it to axis plane. @deftypefnx {C function} @code{void} mgl_region_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_region_3d (@code{HMGL} gr, @code{HCDT} x1, @code{HCDT} y1, @code{HCDT} z1, @code{HCDT} x2, @code{HCDT} y2, @code{HCDT} z2, @code{const char *}pen, @code{const char *}opt) @end ifclear -These functions fill area between 2 curves. Dimensions of arrays @var{y1} and @var{y2} must be equal. Also you can use gradient filling if number of specified colors is equal to 2*number of curves. If @var{pen} contain symbol @samp{i} then only area with y1} for aligning boxes left, right or centering them at its x-coordinates. @end itemize @@ -2235,7 +2374,17 @@ These functions draw string @var{txt} as marks with size proportional to @var{r} @deftypefnx {C function} @code{void} mgl_label_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_labelw_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @end ifclear -These functions draw string @var{txt} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If string @var{txt} contain @samp{%x}, @samp{%y}, @samp{%z} or @samp{%n} then it will be replaced by the value of x-,y-,z-coordinate of the point or its index. See also @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{Label sample} +These functions draw string @var{txt} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If string @var{txt} contain @samp{%x}, @samp{%y}, @samp{%z} or @samp{%n} then it will be replaced by the value of x-,y-,z-coordinate of the point or its index. String @var{fnt} may contain: +@itemize +@item @ref{Font styles}; +@item @samp{f} for fixed format of printed numbers; +@item @samp{E} for using @samp{E} instead of @samp{e}; +@item @samp{F} for printing in LaTeX format; +@item @samp{+} for printing @samp{+} for positive numbers; +@item @samp{-} for printing usual @samp{-}; +@item @samp{0123456789} for precision at printing numbers. +@end itemize +See also @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{Label sample} @end deftypefn @anchor{table} @@ -2249,7 +2398,20 @@ These functions draw string @var{txt} at points @{@var{x}[i], @var{y}[i], @var{z @deftypefnx {C function} @code{void} mgl_table (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tablew (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @end ifclear -These functions draw table with values of @var{val} and captions from string @var{txt} (separated by newline symbol @samp{\n}) at points @{@var{x}, @var{y}@} (default at @{0,0@}) related to current subplot. If string @var{fnt} contain @samp{#} then cell border will be drawn. If string @var{fnt} contain @samp{|} then table width is limited by subplot width (equivalent option @samp{value 1}). If string @var{fnt} contain @samp{=} then widths of all cells are the same. Option @code{value} set the width of the table (default is 1). See also @ref{plot}, @ref{label}. @sref{Table sample} +These functions draw table with values of @var{val} and captions from string @var{txt} (separated by newline symbol @samp{\n}) at points @{@var{x}, @var{y}@} (default at @{0,0@}) related to current subplot. String @var{fnt} may contain: +@itemize +@item @ref{Font styles}; +@item @samp{#} for drawing cell borders; +@item @samp{|} for limiting table widh by subplot one (equal to option @samp{value 1}); +@item @samp{=} for equal width of all cells; +@item @samp{f} for fixed format of printed numbers; +@item @samp{E} for using @samp{E} instead of @samp{e}; +@item @samp{F} for printing in LaTeX format; +@item @samp{+} for printing @samp{+} for positive numbers; +@item @samp{-} for printing usual @samp{-}; +@item @samp{0123456789} for precision at printing numbers. +@end itemize +Option @code{value} set the width of the table (default is 1). See also @ref{plot}, @ref{label}. @sref{Table sample} @end deftypefn @anchor{tube} @@ -2387,7 +2549,7 @@ The function draws horizontal tiles for surface specified parametrically @{@var{ @deftypefnx {C function} @code{void} mgl_dens (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws density plot for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} = @var{Min}.z. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample} +The function draws density plot for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} equal to minimal z-axis value. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample} @end deftypefn @anchor{cont} @@ -2399,7 +2561,7 @@ The function draws density plot for surface specified parametrically @{@var{x}[i @deftypefnx {C function} @code{void} mgl_cont__val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k] or at @var{z} = @var{Min}.z if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels @var{v}[k] will be drawn below (or above) the contours. See also @ref{dens}, @ref{contf}, @ref{contd}, @ref{axial}, @code{cont[xyz]}. @sref{Cont sample} +The function draws contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k], or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels @var{v}[k] will be drawn below (or above) the contours. See also @ref{dens}, @ref{contf}, @ref{contd}, @ref{axial}, @code{cont[xyz]}. @sref{Cont sample} @end deftypefn @deftypefn {MGL command} {} cont zdat ['sch'=''] @@ -2422,7 +2584,7 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefnx {C function} @code{void} mgl_contf_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws solid (or filled) contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k] or at @var{z} = @var{Min}.z if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v} (must be @code{v.nx>2}). See also @ref{dens}, @ref{cont}, @ref{contd}, @code{contf[xyz]}. @sref{ContF sample} +The function draws solid (or filled) contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k], or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v} (must be @code{v.nx>2}). See also @ref{dens}, @ref{cont}, @ref{contd}, @code{contf[xyz]}. @sref{ContF sample} @end deftypefn @deftypefn {MGL command} {} contf zdat ['sch'=''] @@ -2445,7 +2607,7 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefnx {C function} @code{void} mgl_contd_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contd_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws solid (or filled) contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k] (or at @var{z} = @var{Min}.z if @var{sch} contain symbol @samp{_}) with manual colors. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v} (must be @code{v.nx>2}). String @var{sch} sets the contour colors: the color of k-th contour is determined by character @code{sch[k%strlen(sch)]}. See also @ref{dens}, @ref{cont}, @ref{contf}. @sref{ContD sample} +The function draws solid (or filled) contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k] (or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}) with manual colors. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v} (must be @code{v.nx>2}). String @var{sch} sets the contour colors: the color of k-th contour is determined by character @code{sch[k%strlen(sch)]}. See also @ref{dens}, @ref{cont}, @ref{contf}. @sref{ContD sample} @end deftypefn @deftypefn {MGL command} {} contd zdat ['sch'=''] @@ -2468,7 +2630,7 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefnx {C function} @code{void} mgl_contv_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contv_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws vertical cylinder (tube) at contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k] or at @var{z} = @var{Min}.z if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. See also @ref{cont}, @ref{contf}. @sref{ContV sample} +The function draws vertical cylinder (tube) at contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k], or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. See also @ref{cont}, @ref{contf}. @sref{ContV sample} @end deftypefn @deftypefn {MGL command} {} contv zdat ['sch'=''] @@ -2514,7 +2676,7 @@ The same as previous with vector @var{v} of @var{num}-th elements equidistantly @deftypefnx {C function} @code{void} mgl_grid (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_grid_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws grid lines for density plot of surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} = @var{Min}.z. See also @ref{dens}, @ref{cont}, @ref{contf}, @ref{meshnum}. +The function draws grid lines for density plot of surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} equal to minimal z-axis value. See also @ref{dens}, @ref{cont}, @ref{contf}, @ref{grid3}, @ref{meshnum}. @end deftypefn @@ -2769,7 +2931,7 @@ The function draws mapping plot for matrices @{@var{ax}, @var{ay} @} which param @deftypefnx {C function} @code{void} mgl_stfa (@code{HMGL} gr, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_stfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @end ifclear -Draws spectrogram of complex array @var{re}+i*@var{im} for Fourier size of @var{dn} points at plane @var{z}=@var{Min}.z. For example in 1D case, result is density plot of data @math{res[i,j]=|\sum_d^dn exp(I*j*d)*(re[i*dn+d]+I*im[i*dn+d])|/dn} with size @{int(nx/dn), dn, ny@}. At this array @var{re}, @var{im} parametrically depend on coordinates @var{x}, @var{y}. The size of @var{re} and @var{im} must be the same. The minor dimensions of arrays @var{x}, @var{y}, @var{re} should be equal. Arrays @var{x}, @var{y} can be vectors (not matrix as @var{re}). @sref{STFA sample} +Draws spectrogram of complex array @var{re}+i*@var{im} for Fourier size of @var{dn} points at plane @var{z} equal to minimal z-axis value. For example in 1D case, result is density plot of data @math{res[i,j]=|\sum_d^dn exp(I*j*d)*(re[i*dn+d]+I*im[i*dn+d])|/dn} with size @{int(nx/dn), dn, ny@}. At this array @var{re}, @var{im} parametrically depend on coordinates @var{x}, @var{y}. The size of @var{re} and @var{im} must be the same. The minor dimensions of arrays @var{x}, @var{y}, @var{re} should be equal. Arrays @var{x}, @var{y} can be vectors (not matrix as @var{re}). @sref{STFA sample} @end deftypefn @@ -2808,7 +2970,7 @@ The function draws vectors @{@var{ax}, @var{ay}, @var{az}@} along a curve @{@var @deftypefnx {C function} @code{void} mgl_vect_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_vect_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws plane vector field plot for the field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z}=@var{Min}.z. The length and color of arrows are proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of arrows depend on @ref{meshnum}. The appearance of the hachures (arrows) can be changed by symbols: +The function draws plane vector field plot for the field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. The length and color of arrows are proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of arrows depend on @ref{meshnum}. The appearance of the hachures (arrows) can be changed by symbols: @itemize @bullet @item @samp{f} for drawing arrows with fixed lengths, @@ -2865,7 +3027,7 @@ See also @ref{vect}, @ref{flow}, @ref{dew}. @sref{Vect3 sample} @deftypefnx {C function} @code{void} mgl_dew (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dew_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws dew-drops for plane vector field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z}=@var{Min}.z. Note that this is very expensive plot in memory usage and creation time! The color of drops is proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of drops depend on @ref{meshnum}. See also @ref{vect}. @sref{Dew sample} +The function draws dew-drops for plane vector field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Note that this is very expensive plot in memory usage and creation time! The color of drops is proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of drops depend on @ref{meshnum}. See also @ref{vect}. @sref{Dew sample} @end deftypefn @anchor{flow} @@ -2877,7 +3039,7 @@ The function draws dew-drops for plane vector field @{@var{ax}, @var{ay}@} depen @deftypefnx {C function} @code{void} mgl_flow_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flow_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws flow threads for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} = @var{Min}.z. Number of threads is proportional to @code{value} option (default is 5). String @var{sch} may contain: +The function draws flow threads for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Number of threads is proportional to @code{value} option (default is 5). String @var{sch} may contain: @itemize @bullet @item color scheme -- up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); @@ -2948,7 +3110,7 @@ The function draws gradient lines for scalar field @var{phi}[i,j] (or @var{phi}[ @deftypefnx {C function} @code{void} mgl_pipe_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_pipe_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @end ifclear -The function draws flow pipes for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} = @var{Min}.z. Number of pipes is proportional to @code{value} option (default is 5). If @samp{#} symbol is specified then pipes start only from edges of axis range. The color of lines is proportional to @math{\sqrt@{ax^2+ay^2@}}. Warm color corresponds to normal flow (like attractor). Cold one corresponds to inverse flow (like source). Parameter @var{r0} set the base pipe radius. If @var{r0}<0 or symbol @samp{i} is specified then pipe radius is inverse proportional to amplitude. The vector field is plotted for each z slice of @var{ax}, @var{ay}. See also @ref{flow}, @ref{vect}. @sref{Pipe sample} +The function draws flow pipes for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Number of pipes is proportional to @code{value} option (default is 5). If @samp{#} symbol is specified then pipes start only from edges of axis range. The color of lines is proportional to @math{\sqrt@{ax^2+ay^2@}}. Warm color corresponds to normal flow (like attractor). Cold one corresponds to inverse flow (like source). Parameter @var{r0} set the base pipe radius. If @var{r0}<0 or symbol @samp{i} is specified then pipe radius is inverse proportional to amplitude. The vector field is plotted for each z slice of @var{ax}, @var{ay}. See also @ref{flow}, @ref{vect}. @sref{Pipe sample} @end deftypefn @deftypefn {MGL command} {} pipe udat vdat wdat ['sch'='' @code{r0=0.05}] @@ -3054,7 +3216,7 @@ The same as previous with manual contour levels. @deftypefnx {Method on @code{mglGraph}} @code{void} FPlot (@code{const char *}eqY, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_fplot (@code{HMGL} gr, @code{const char *}eqY, @code{const char *}pen, @code{const char *}opt) @end ifclear -Draws command function @samp{y(x)} at plane @var{z}=@var{Min}.z where @samp{x} variable is changed in @code{xrange}. You do not need to create the data arrays to plot it. Option @code{value} set initial number of points. See also @ref{plot}. +Draws command function @samp{y(x)} at plane @var{z} equal to minimal z-axis value, where @samp{x} variable is changed in @code{xrange}. You do not need to create the data arrays to plot it. Option @code{value} set initial number of points. See also @ref{plot}. @end deftypefn @deftypefn {MGL command} {} fplot 'x(t)' 'y(t)' 'z(t)' ['pen'=''] @@ -3111,7 +3273,7 @@ The function draws the surface of triangles. Triangle vertexes are set by indexe @deftypefnx {C function} @code{void} mgl_tricont_xyzcv (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tricont_xyzv (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws contour lines for surface of triangles at @var{z}=@var{v}[k] (or at @var{z} = @var{Min}.z if @var{sch} contain symbol @samp{_}). Triangle vertexes are set by indexes @var{id} of data points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If @var{v} is absent then arrays of option @code{value} elements equidistantly distributed in color range is used. String @var{sch} sets the color scheme. Array @var{c} (if specified) is used for contour coloring. First dimensions of @var{id} must be 3 or greater. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. Parameter @var{c} set the colors of triangles (if @var{id}.ny=@var{c}.nx) or colors of vertexes (if @var{x}.nx=@var{c}.nx). See also @ref{triplot}, @ref{cont}, @ref{triangulation}. +The function draws contour lines for surface of triangles at @var{z}=@var{v}[k] (or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}). Triangle vertexes are set by indexes @var{id} of data points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If @var{v} is absent then arrays of option @code{value} elements equidistantly distributed in color range is used. String @var{sch} sets the color scheme. Array @var{c} (if specified) is used for contour coloring. First dimensions of @var{id} must be 3 or greater. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. Parameter @var{c} set the colors of triangles (if @var{id}.ny=@var{c}.nx) or colors of vertexes (if @var{x}.nx=@var{c}.nx). See also @ref{triplot}, @ref{cont}, @ref{triangulation}. @end deftypefn @anchor{quadplot} @@ -3220,7 +3382,7 @@ Fit data along x-, y- and z-directions for array specified parametrically @var{a @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_fit_2 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) -Fit data along all directions for 2d or 3d arrays @var{a} with @var{s}=1 and @var{x}, @var{y}, @var{z} equidistantly distributed in interval [@var{Min}, @var{Max}]. +Fit data along all directions for 2d or 3d arrays @var{a} with @var{s}=1 and @var{x}, @var{y}, @var{z} equidistantly distributed in axis range. @end deftypefn @end ifclear @@ -3235,7 +3397,8 @@ Print last fitted formula with found coefficients (as numbers) at position @var{ @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{const char *}GetFit () -@deftypefnx {C function} @code{const char *} mgl_get_fit (@code{HMGL} gr) +@deftypefnx {C function only} @code{const char *} mgl_get_fit (@code{HMGL} gr) +@deftypefnx {Fortran subroutine} @code{} mgl_get_fit (@code{long} gr, @code{char *}out, @code{int} len) Get last fitted formula with found coefficients (as numbers). @end deftypefn @end ifclear diff --git a/texinfo/core_ru.texi b/texinfo/core_ru.texi index 6405d92..cb5adc0 100644 --- a/texinfo/core_ru.texi +++ b/texinfo/core_ru.texi @@ -11,12 +11,22 @@ Основным классом MathGL является класс @strong{mglGraph}, определённый в @code{#include }. Он включает в себя множество функций для построения графиков от 1D, 2D и 3D массивов. Он также содержит функции вывода текста и построения осей координат. Есть возможность построения в произвольной системе координат, которая задается строковыми формулами. Все графические функции используют класс mglData (см. @ref{Data processing}) для хранения массивов данных. Это позволяет легко контролировать размеры, работу с памятью и производить обработку данных. Дополнительная информация о цветах, шрифтах, вычисления формул может быть найдена в @ref{General concepts} и @ref{Other classes}. @end ifclear +Некоторые возможности MathGL доступны только в новых версиях библиотеки. Для проверки текущей версии MathGL можно использовать следующую функцию. +@anchor{version} +@deftypefn {MGL command} {} version 'ver' +@ifclear UDAV +@deftypefnx {C function} @code{int} mgl_check_version (@code{const char *}ver) +@end ifclear +Возвращает ненулевое значение если версия MathGL подходит для требуемой в @var{ver}, т.е. если номер основной версии совпадает и "подверсия" больше или равна указанной в @var{ver}. +@end deftypefn + @menu * Constructor:: * Graphics setup:: * Axis settings:: * Subplots and rotation:: * Export picture:: +* Background:: * Primitives:: * Text printing:: * Axis and Colorbar:: @@ -87,6 +97,7 @@ MGL не требует создания данного типа объекто * Palette and colors:: * Masks:: * Error handling:: +* Stop drawing:: @end menu @c ================================================================== @@ -261,7 +272,7 @@ MGL не требует создания данного типа объекто @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetMeshNum (@code{int} val) @deftypefnx {Функция С} @code{void} mgl_set_meshnum (@code{HMGL} gr, @code{int} num) @end ifclear -Задает ориентировочное число линий в @ref{mesh}, @ref{fall}, @ref{grid} и число стрелок (штрихов) в @ref{vect}, @ref{dew} и число ячеек в @ref{cloud}. По умолчанию (=0) рисуются все линии, стрелки, ячейки. +Задает ориентировочное число линий в @ref{mesh}, @ref{fall} и число стрелок (штрихов) в @ref{vect}, @ref{dew} и число ячеек в @ref{cloud}. По умолчанию (=0) рисуются все линии, стрелки, ячейки. @end deftypefn @anchor{facenum} @@ -285,6 +296,7 @@ MGL не требует создания данного типа объекто @ifclear UDAV @deftypefn {Метод класса @code{mglGraph}} @code{const char *} GetPlotId () @deftypefnx {Функция С} @code{const char *} mgl_get_plotid (@code{HMGL} gr) +@deftypefnx {Fortran процедура} @code{} mgl_get_plotid (@code{long} gr, @code{char *}out, @code{int} len) Возвращает имя графика для сохранения в файл (например, в окне FLTK). @end deftypefn @end ifclear @@ -467,15 +479,18 @@ MGL не требует создания данного типа объекто @c ================================================================== @external{} -@node Error handling, , Masks, Graphics setup +@node Error handling, Stop drawing , Masks, Graphics setup @subsection Обработка ошибок @nav{} +@ifset UDAV +Все сообщения будут выведены автоматически в специальном окне или в консоли. +@end ifset @ifclear UDAV @cindex Message @cindex SetWarn @cindex GetWarn -Обычно вы должны сбросить признак ошибки с помощью @code{SetWarn(0);} перед построением и проверить @code{GetWarnCode()} или @code{Message()} на наличие ошибок после построения. Только последнее предупреждение сохраняется. Замечу, что все предупреждения/ошибки в MathGL не являются критичными -- в худшем из вариантов соответствующий график просто не будет построен. +Обычно вы должны сбросить признак ошибки с помощью @code{SetWarn(0);} перед построением и проверить @code{GetWarnCode()} или @code{Message()} на наличие ошибок после построения. Только последнее предупреждение сохраняется. Замечу, что все предупреждения/ошибки в MathGL не являются критичными -- в худшем из вариантов соответствующий график просто не будет построен. По умолчанию, все предупреждения выводятся в @code{stderr}. Этот вывод можно выключить вызовом @code{mgl_suppress_warn(true);}. @deftypefn {Метод класса @code{mglGraph}} @code{void} SetWarn (@code{int} code, @code{const char *}info=@code{""}) @deftypefnx {Функция С} @code{void} mgl_set_warn (@code{HMGL} gr, @code{int} code, @code{const char *}info) @@ -484,6 +499,7 @@ MGL не требует создания данного типа объекто @deftypefn {Метод класса @code{mglGraph}} @code{const char *}Message () @deftypefnx {Функция С} @code{const char *}mgl_get_mess (@code{HMGL} gr) +@deftypefnx {Fortran процедура} @code{} mgl_get_mess (@code{long} gr, @code{char *}out, @code{int} len) Возвращает текст предупреждений о причине отсутствия графика. Если возвращаемая строка пустая, то сообщений нет. @end deftypefn @@ -535,6 +551,42 @@ Setsize: размер(ы) равны нулю или отрицательны Одиночная ' в скрипте MGL @end table @end deftypefn + +@deftypefn {Функция С} @code{void} mgl_suppress_warn (@code{int} state) +Выключает вывод предупреждений в @code{stderr} если @var{state} не ноль. +@end deftypefn + + +@end ifclear + +@c ================================================================== +@external{} +@node Stop drawing, , Error handling, Graphics setup +@subsection Остановка рисования +@nav{} +@ifset UDAV +Вы можете использовать команду @ref{stop} или соответствующую кнопку панели инструментов для остановки рисования и выполнения скрипта. +@end ifset +@ifclear UDAV +@cindex Stop +@cindex NeedStop +@cindex SetEventFunc + +@deftypefn {Метод класса @code{mglGraph}} @code{void} Stop (@code{bool} stop=@code{true}) +@deftypefnx {C function only} @code{void} mgl_ask_stop (@code{HMGL} gr, @code{int} stop) +Просит остановить рисование если @var{stop} не ноль, иначе сбрасывает флаг остановки. +@end deftypefn + +@deftypefn {Метод класса @code{mglGraph}} @code{bool} NeedStop () +@deftypefnx {C function only} @code{void} mgl_need_stop (@code{HMGL} gr) +Возвращает @code{true} если рисование должно быть остановлено. Также запускает обработку всех отложенных событий в GUI. Пользователь должен вызывать эту функцию время от времени внутри долгих вычислений для плавности отклика GUI. +@end deftypefn + +@deftypefn {Метод класса @code{mglGraph}} @code{bool} SetEventFunc (@code{void (*}func@code{)(void *)}, @code{void *}par=@code{NULL}) +@deftypefnx {C function only} @code{void} mgl_set_event_func (@code{HMGL} gr, @code{void (*}func@code{)(void *)}, @code{void *}par) +Задает функцию, которая будет вызвана для обработки событий в GUI библиотеке. +@end deftypefn + @end ifclear @@ -712,6 +764,7 @@ Ternary -- специальный тип графика для 3 зависим @cindex SetTickRotate @cindex SetTickSkip @cindex SetOriginTick +@cindex AddTick @end ifclear @anchor{adjust} @@ -732,15 +785,21 @@ Ternary -- специальный тип графика для 3 зависим @deftypefnx {Команда MGL} {} ztick @code{val [sub=0 org=nan]} @deftypefnx {Команда MGL} {} ctick @code{val [sub=0 org=nan]} @ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d=@code{0}, @code{int} ns=@code{0}, @code{mreal} org=@code{NAN}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d=@code{0}, @code{int} ns=@code{0}, @code{mreal} org=@code{NAN}, @code{const char *}fact=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTicks (@code{char} dir, @code{mreal} d=@code{0}, @code{int} ns=@code{0}, @code{mreal} org=@code{NAN}, @code{const wchar_t *}fact) @deftypefnx {Функция С} @code{void} mgl_set_ticks (@code{HMGL} gr, @code{char} dir, @code{mreal} d, @code{int} ns, @code{mreal} org) +@deftypefnx {Функция С} @code{void} mgl_set_ticks_fact (@code{HMGL} gr, @code{char} dir, @code{mreal} d, @code{int} ns, @code{mreal} org, @code{const char *}fact) +@deftypefnx {Функция С} @code{void} mgl_set_ticks_factw (@code{HMGL} gr, @code{char} dir, @code{mreal} d, @code{int} ns, @code{mreal} org, @code{const wchar_t *} fact) @end ifclear -Задает шаг меток осей @var{d}, число подметок @var{ns} и начальное положение меток @var{org} для оси вдоль направления @var{dir} (используйте 'c' для меток colorbar). Переменная @var{d} задает шаг меток (если положительна) или их число на оси (если отрицательна). Нулевое значение задает автоматическую расстановку меток. Если @var{org}=@code{NAN}, то используется значение из переменной @var{Org}. +Задает шаг меток осей @var{d}, число подметок @var{ns} и начальное положение меток @var{org} для оси вдоль направления @var{dir} (используйте 'c' для меток colorbar). Переменная @var{d} задает шаг меток (если положительна) или их число на оси (если отрицательна). Нулевое значение задает автоматическую расстановку меток. Если @var{org}=@code{NAN}, то используется значение из переменной @var{Org}. Параметр @var{fact} задает текст, которые будет напечатан после метки оси (например, "\pi" для @var{d}=M_PI). @end deftypefn @deftypefn {Команда MGL} {} xtick @code{val1} 'lbl1' [@code{val2} 'lbl2' ...] @deftypefnx {Команда MGL} {} ytick @code{val1} 'lbl1' [@code{val2} 'lbl2' ...] @deftypefnx {Команда MGL} {} ztick @code{val1} 'lbl1' [@code{val2} 'lbl2' ...] +@deftypefnx {Команда MGL} {} xtick vdat 'lbls' [@code{add=off}] +@deftypefnx {Команда MGL} {} ytick vdat 'lbls' [@code{add=off}] +@deftypefnx {Команда MGL} {} ztick vdat 'lbls' [@code{add=off}] @ifclear UDAV @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTicksVal (@code{char} dir, @code{const char *}lbl, @code{bool} add=@code{false}) @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTicksVal (@code{char} dir, @code{const wchar_t *}lbl, @code{bool} add=@code{false}) @@ -751,9 +810,18 @@ Ternary -- специальный тип графика для 3 зависим @deftypefnx {Функция С} @code{void} mgl_set_ticks_val (@code{HMGL} gr, @code{char} dir, @code{HCDT} val, @code{const char *}lbl, @code{bool} add) @deftypefnx {Функция С} @code{void} mgl_set_ticks_valw (@code{HMGL} gr, @code{char} dir, @code{HCDT} val, @code{const wchar_t *}lbl, @code{bool} add) @end ifclear -Задает явное положение @var{val} и подписи @var{lbl} для меток вдоль оси @var{dir}. Если массив @var{val} не указан, то используются значения равно распределённые в интервале [@var{Min}.x, @var{Max}.x]. Метки разделяются символом @samp{\n}. Используйте @code{SetTicks()} для восстановления автоматических меток. +Задает явное положение @var{val} и подписи @var{lbl} для меток вдоль оси @var{dir}. Если массив @var{val} не указан, то используются значения равно распределённые в диапазоне осей координат. Метки разделяются символом @samp{\n}. Используйте @code{SetTicks()} для восстановления автоматических меток. @end deftypefn +@ifclear UDAV +@deftypefn {Метод класса @code{mglGraph}} @code{void} AddTick (@code{char} dir, @code{double} val, @code{const char *}lbl) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} AddTick (@code{char} dir, @code{double} val, @code{const wchar_t *}lbl) +@deftypefnx {Функция С} @code{void} mgl_add_tick (@code{HMGL} gr, @code{char} dir, @code{double} val, @code{const char *}lbl) +@deftypefnx {Функция С} @code{void} mgl_set_tickw (@code{HMGL} gr, @code{char} dir, @code{double} val, @code{const wchar_t *}lbl) +Аналогично предыдущему, но добавляет одну метку оси к списку существующих меток. +@end deftypefn +@end ifclear + @deftypefn {Команда MGL} {} xtick 'templ' @deftypefnx {Команда MGL} {} ytick 'templ' @deftypefnx {Команда MGL} {} ztick 'templ' @@ -871,7 +939,7 @@ Ternary -- специальный тип графика для 3 зависим @deftypefnx {Функция С} @code{void} mgl_subplot (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl) @deftypefnx {Функция С} @code{void} mgl_subplot_d (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl, @code{mreal} dx, @code{mreal} dy) @end ifclear -Помещает последующий вывод в @var{m}-ую ячейку сетки размером @var{nx}*@var{ny} от всего рисунка. Функция сбрасывает матрицу трансформации (повороты и сжатие графика) и должна вызываться первой для создания "подграфика". С эстетической точки зрения не рекомендуется вызывать эту функцию с различными (или не кратными) размерами сетки. Место для осей/colorbar резервируется только если строка @var{stl} содержит: @samp{L} или @samp{<} -- с левого края, @samp{R} или @samp{>} -- с правого края, @samp{A} или @samp{^} -- с верхнего края, @samp{U} или @samp{_} -- с нижнего края. Если строка @var{stl} содержит @samp{#}, то оси координат будут занимать все доступное пространство (место резервироваться не будет). Ячейка может быть дополнительно сдвинута относительно своего обычного положения на относительный размер @var{dx}, @var{dy}. +Помещает последующий вывод в @var{m}-ую ячейку сетки размером @var{nx}*@var{ny} от всего рисунка. Функция сбрасывает матрицу трансформации (повороты и сжатие графика) и должна вызываться первой для создания "подграфика". С эстетической точки зрения не рекомендуется вызывать эту функцию с различными (или не кратными) размерами сетки. Место для осей/colorbar резервируется только если строка @var{stl} содержит: @samp{L} или @samp{<} -- с левого края, @samp{R} или @samp{>} -- с правого края, @samp{A} или @samp{^} -- с верхнего края, @samp{U} или @samp{_} -- с нижнего края. Если строка @var{stl} содержит @samp{#}, то оси координат будут занимать все доступное пространство (место резервироваться не будет). Ячейка может быть дополнительно сдвинута относительно своего обычного положения на относительный размер @var{dx}, @var{dy}. Отмечу, что colorbar может находиться за пределами рисунка если выбран пустой стиль @samp{}. @end deftypefn @anchor{multiplot} @@ -1010,7 +1078,7 @@ Ternary -- специальный тип графика для 3 зависим @c ################################################################## @external{} -@node Export picture, Primitives, Subplots and rotation, MathGL core +@node Export picture, Background, Subplots and rotation, MathGL core @section Экспорт рисунка @nav{} @cindex SetSize @@ -1124,7 +1192,7 @@ Ternary -- специальный тип графика для 3 зависим @deftypefn {Метод класса @code{mglGraph}} @code{void} WriteEPS (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {Функция С} @code{void} mgl_write_eps (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) -Экспортирует текущий кадр в EPS файл, используя векторное представление графика. Вследствие чего не рекомендуется сохранять большие графики (поверхности, а особенно поверхности уровня) из-за большого размера файла. Хотя никаких внутренних ограничений на размер выходного файла нет. Для них лучше использовать растровый формат (например, PNG или JPEG). Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. Если имя файла оканчивается на @samp{z} (например, @samp{fname.eps.gz}), то файл автоматически архивируется в формате gzip. +Экспортирует текущий кадр в EPS файл, используя векторное представление графика. Вследствие чего не рекомендуется сохранять большие графики (поверхности, а особенно поверхности уровня) из-за большого размера файла. Хотя никаких внутренних ограничений на размер выходного файла нет. Для них лучше использовать растровый формат (например, PNG или JPEG). Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. Если имя файла оканчивается на @samp{z} (например, @samp{fname.eps.gz}), то файл автоматически архивируется в формате gzip. Отмечу, что формат EPS не поддерживает интерполяцию цвета, и картинка будет выглядеть как при использовании @ref{quality}=1. @end deftypefn @deftypefn {Метод класса @code{mglGraph}} @code{void} WriteBPS (@code{const char *}fname, @code{const char *}descr=@code{""}) @@ -1134,7 +1202,7 @@ Ternary -- специальный тип графика для 3 зависим @deftypefn {Метод класса @code{mglGraph}} @code{void} WriteSVG (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {Функция С} @code{void} mgl_write_svg (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) -Экспортирует текущий кадр в SVG файл, используя векторное представление графика. Вследствие чего не рекомендуется сохранять большие графики (поверхности, а особенно поверхности уровня) из-за большого размера файла. Хотя никаких внутренних ограничений на размер выходного файла нет. Для них лучше использовать растровый формат (например, PNG или JPEG). Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. Если имя файла оканчивается на @samp{z} (например, @samp{fname.svgz}), то файл автоматически архивируется в формате gzip. +Экспортирует текущий кадр в SVG файл, используя векторное представление графика. Вследствие чего не рекомендуется сохранять большие графики (поверхности, а особенно поверхности уровня) из-за большого размера файла. Хотя никаких внутренних ограничений на размер выходного файла нет. Для них лучше использовать растровый формат (например, PNG или JPEG). Параметры функции следующие: @var{fname} -- имя файла, @var{descr} -- описание файла. Если имя файла оканчивается на @samp{z} (например, @samp{fname.svgz}), то файл автоматически архивируется в формате gzip. Отмечу, что формат SVG не поддерживает интерполяцию цвета, и картинка будет выглядеть как при использовании @ref{quality}=1. @end deftypefn @deftypefn {Метод класса @code{mglGraph}} @code{void} WriteTEX (@code{const char *}fname, @code{const char *}descr=@code{""}) @@ -1264,6 +1332,11 @@ Ternary -- специальный тип графика для 3 зависим Сбрасывает счетчик кадров в 0. @end deftypefn +@deftypefn {Метод класса @code{mglGraph}} @code{void} ClearFrame (@code{int} i) +@deftypefnx {Функция С} @code{void} mgl_clear_frame (@code{HMGL} gr, @code{int} i) +Очищает текущий список объектов. +@end deftypefn + @deftypefn {Метод класса @code{mglGraph}} @code{void} StartGIF (@code{const char *}fname, @code{int} ms=@code{100}) @deftypefnx {Функция С} @code{void} mgl_start_gif (@code{HMGL} gr, @code{const char *}fname, @code{int} ms) Начинает запись кадров в анимированный GIF файл @var{fname}. Параметр @var{ms} задает задержку между кадрами в миллисекундах. Вы @strong{не должны} менять размер рисунка во время создания кино. Используйте CloseGIF() для завершения записи. Эта функция не работает в режиме OpenGL. @@ -1390,13 +1463,57 @@ gr.GetBGRN(bits, len(bits)); @end ifclear +@c ################################################################## +@external{} +@node Background, Primitives, Export picture, MathGL core +@section Фоновое изображение +@nav{} +@cindex LoadBackground +@cindex Clf +@cindex Rasterize + +These functions change background image. + +@anchor{clf} +@deftypefn {Команда MGL} {} clf ['col'] +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Clf () +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Clf (@code{const char *} col) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Clf (@code{char} col) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Clf (@code{mreal} r, @code{mreal} g, @code{mreal} b) +@deftypefnx {Функция С} @code{void} mgl_clf (@code{HMGL} gr) +@deftypefnx {Функция С} @code{void} mgl_clf_str (@code{HMGL} gr, @code{const char *} col) +@deftypefnx {Функция С} @code{void} mgl_clf_chr (@code{HMGL} gr, @code{char} col) +@deftypefnx {Функция С} @code{void} mgl_clf_rgb (@code{HMGL} gr, @code{mreal} r, @code{mreal} g, @code{mreal} b) +@end ifclear +Очищает рисунок и заполняет фон заданным цветом. +@end deftypefn + +@anchor{rasterize} +@deftypefn {Команда MGL} {} rasterize +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Rasterize () +@deftypefnx {Функция С} @code{void} mgl_rasterize (@code{HMGL} gr) +@end ifclear +Завершает рисование графика и помещает результат в качестве фона. После этого, очищает список примитивов (как @ref{clf}). Функция полезна для сохранения части графика (например, поверхностей или векторных полей) в растровом виде, а другой части (кривых, осей и пр.) в векторном. +@end deftypefn + +@anchor{background} +@deftypefn {Команда MGL} {} background 'fname' [@code{alpha=1}] +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} LoadBackground (@code{const char *} fname, @code{double} alpha=@code{1}) +@deftypefnx {Функция С} @code{void} mgl_load_background (@code{HMGL} gr, @code{const char *} fname, @code{double} alpha) +@end ifclear +Загружает PNG или JPEG файл @var{fname} в качестве фона для графика. Параметр @var{alpha} задает прозрачность фона вручную. +@end deftypefn + + @c ################################################################## @external{} @node Primitives, Text printing, Export picture, MathGL core @section Рисование примитивов @nav{} @cindex Ball -@cindex Clf @cindex Line @cindex Curve @cindex Glyph @@ -1415,19 +1532,6 @@ gr.GetBGRN(bits, len(bits)); Эти функции рисуют рисуют простые объекты типа линий, точек, сфер, капель, конусов, и т.д. -@anchor{clf} -@deftypefn {Команда MGL} {} clf ['col'] -@ifclear UDAV -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Clf () -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Clf (@code{char} col) -@deftypefnx {Метод класса @code{mglGraph}} @code{void} Clf (@code{mreal} r, @code{mreal} g, @code{mreal} b) -@deftypefnx {Функция С} @code{void} mgl_clf (@code{HMGL} gr) -@deftypefnx {Функция С} @code{void} mgl_clf_chr (@code{HMGL} gr, @code{char} col) -@deftypefnx {Функция С} @code{void} mgl_clf_rgb (@code{HMGL} gr, @code{mreal} r, @code{mreal} g, @code{mreal} b) -@end ifclear -Очищает рисунок и заполняет его заданным цветом. -@end deftypefn - @anchor{ball} @deftypefn {Команда MGL} {} ball @code{x y} ['col'='r.'] @deftypefnx {Команда MGL} {} ball @code{x y z} ['col'='r.'] @@ -1571,6 +1675,30 @@ gr.GetBGRN(bits, len(bits)); Рисует ромб ширины @var{r} с вершинами в точках @var{p1}, @var{p2} цветом @var{stl}. Если @var{col} содержит: @samp{#} то рисуется только граница, @samp{@@} то рисуется граница (вторым цветом из @var{col} или черными). Если @var{col} содержит 3 цвета, то используется градиентная заливка. @end deftypefn +@anchor{arc} +@deftypefn {MGL command} {} arc @code{x0 y0 x1 y1 a} ['col'='r'] +@deftypefnx {MGL command} {} arc @code{x0 y0 z0 x1 y1 a} ['col'='r'] +@deftypefnx {MGL command} {} arc @code{x0 y0 z0 xa ya za x1 y1 z1 a} ['col'='r'] +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Arc (@code{mglPoint} p0, @code{mglPoint} p1, @code{mreal} a, @code{const char *}col=@code{"r"}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Arc (@code{mglPoint} p0, @code{mglPoint} pa, @code{mglPoint} p1, @code{mreal} a, @code{const char *}col=@code{"r"}) +@deftypefnx {C function} @code{void} mgl_arc (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} x1, @code{mreal} y1, @code{mreal} a, @code{const char *}col) +@deftypefnx {C function} @code{void} mgl_arc_ext (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} xa, @code{mreal} ya, @code{mreal} za, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} a, @code{const char *}col) +@end ifclear +Рисует дугу вокруг оси @var{pa} (по умолчанию вокруг оси z @var{pa}=@{0,0,1@}) с центром в @var{p0}, начиная с точки @var{p1}. Параметр @var{a} задает угол дуги в градусах. Строка @var{col} задает цвет дуги и тип стрелок на краях. +@end deftypefn + +@anchor{polygon} +@deftypefn {MGL command} {} polygon @code{x0 y0 x1 y1 num} ['col'='r'] +@deftypefnx {MGL command} {} polygon @code{x0 y0 z0 x1 y1 z1 num} ['col'='r'] +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Polygon (@code{mglPoint} p0, @code{mglPoint} p1, @code{int} num, @code{const char *}col=@code{"r"}) +@deftypefnx {C function} @code{void} mgl_polygon (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{int} num, @code{const char *}col) +@end ifclear +Рисует правильный @var{num}-угольник с центром в @var{p0} с первой вершиной в @var{p1} цветом @var{col}. Если @var{col} содержит: @samp{#} то рисуется только граница, @samp{@@} то рисуется граница (вторым цветом из @var{col} или черными). +@c Если @var{col} содержит 3 цвета, то используется градиентная заливка. +@end deftypefn + @c ################################################################## @external{} @node Text printing, Axis and Colorbar, Primitives, MathGL core @@ -1585,7 +1713,7 @@ gr.GetBGRN(bits, len(bits)); Функции для вывода текста позволяют вывести строку текста в произвольном месте рисунка, в произвольном направлении и вдоль произвольной кривой. MathGL позволяет использовать произвольное начертание шрифта и многие ТеХ-ие команды (детальнее см. @ref{Font styles}). Все функции вывода текста имеют варианты для 8-bit строк (@code{char *}) и для Unicode строк (@code{wchar_t *}). В первом случае используется конверсия из текущей локали, т.е. иногда вам требуется явно указать локаль с помощью функции @code{setlocale()}. Аргумент @var{size} определяет размер текста: размер шрифта если положителен или относительный размер (=-@var{size}*@code{SetFontSize()}) если отрицателен. Начертание шрифта (STIX, arial, courier, times и др.) можно изменить с помощью функции LoadFont(). @xref{Font settings}. -Параметры шрифта задаются строкой, которая может содержать символы цвета @samp{wkrgbcymhRGBCYMHW} (см. @ref{Color styles}). Также после символа @samp{:} можно указать символы стиля (@samp{rbiwou}) и/или выравнивания (@samp{LRC}). Стили шрифта: @samp{r} -- прямой, @samp{i} -- курсив, @samp{b} -- жирный, @samp{w} -- контурный, @samp{o} -- надчеркнутый, @samp{u} -- подчеркнутый. По умолчанию используется прямой шрифт. Типы выравнивания: @samp{L} -- по левому краю (по умолчанию), @samp{C} -- по центру, @samp{R} -- по правому краю. Например, строка @samp{b:iC} соответствует курсиву синего цвета с выравниванием по центру. +Параметры шрифта задаются строкой, которая может содержать символы цвета @samp{wkrgbcymhRGBCYMHW} (см. @ref{Color styles}). Также после символа @samp{:} можно указать символы стиля (@samp{rbiwou}) и/или выравнивания (@samp{LRCT}). Стили шрифта: @samp{r} -- прямой, @samp{i} -- курсив, @samp{b} -- жирный, @samp{w} -- контурный, @samp{o} -- надчеркнутый, @samp{u} -- подчеркнутый. По умолчанию используется прямой шрифт. Типы выравнивания: @samp{L} -- по левому краю (по умолчанию), @samp{C} -- по центру, @samp{R} -- по правому краю. Стиль @samp{T} выведет текст под указанной точкой (как "выравнивание по верху"). Например, строка @samp{b:iC} соответствует курсиву синего цвета с выравниванием по центру. Начиная с MathGL версии 2.3, вы можете задать цветовой градиент для выводимой строки (см. @ref{Color scheme}). Если строка содержит символы @samp{aA}, то текст выводится в абсолютных координатах (полагаются в диапазоне [0,1]). При этом используются координаты относительно рисунка (если указано @samp{A}) или относительно последнего subplot/inplot (если указано @samp{a}). Если строка содержит символ @samp{@@}, то вокруг текста рисуется прямоугольник. @@ -1613,7 +1741,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_puts_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const char *}text, @code{const char *}fnt, @code{mreal} size) @deftypefnx {Функция С} @code{void} mgl_putsw_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const wchar_t *}text, @code{const char *}fnt, @code{mreal} size) @end ifclear -Выводит строку @var{text} от точки @var{p} вдоль направления @var{d}. Параметр @var{fnt} задает стиль текста и указывает выводить текст над линией (@samp{T}) или под ней (@samp{t}). +Выводит строку @var{text} от точки @var{p} вдоль направления @var{d}. Параметр @var{fnt} задает стиль текста и указывает выводить текст под линией (@samp{T}) или над ней (@samp{t}). @end deftypefn @anchor{fgets} @@ -1639,7 +1767,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_text_xyz (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}text, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_textw_xyz (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const wchar_t *}text, @code{const char *}fnt, @code{const char *}opt) @end ifclear -Выводит строку @var{text} вдоль кривой @{@var{x}[i], @var{y}[i], @var{z}[i]@} шрифтом @var{fnt}. Строка @var{fnt} может содержать символы: @samp{t} для вывода текста под кривой (по умолчанию), или @samp{T} для вывода текста над кривой. Размеры по 1-ой размерности должны быть одинаковы для всех массивов @code{x.nx=y.nx=z.nx}. Если массив @var{x} не указан, то используется "автоматический" массив со значениями в диапазоне [@var{Min}.x, @var{Max}.x] (см. @ref{Ranges (bounding box)}). Если массив @var{z} не указан, то используется @var{z}[i] = @var{Min}.z. Строка @var{opt} содержит опции команды (см. @ref{Command options}). +Выводит строку @var{text} вдоль кривой @{@var{x}[i], @var{y}[i], @var{z}[i]@} шрифтом @var{fnt}. Строка @var{fnt} может содержать символы: @samp{t} для вывода текста под кривой (по умолчанию), или @samp{T} для вывода текста под кривой. Размеры по 1-ой размерности должны быть одинаковы для всех массивов @code{x.nx=y.nx=z.nx}. Если массив @var{x} не указан, то используется "автоматический" массив со значениями в диапазоне осей координат (см. @ref{Ranges (bounding box)}). Если массив @var{z} не указан, то используется минимальное значение оси z. Строка @var{opt} содержит опции команды (см. @ref{Command options}). @end deftypefn @c ################################################################## @@ -1661,7 +1789,24 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Метод класса @code{mglGraph}} @code{void} Axis (@code{const char *}dir=@code{"xyz"}, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_axis (@code{HMGL} gr, @code{const char *}dir, @code{const char *}stl, @code{const char *}opt) @end ifclear -Рисует оси координат и метки на них (см. @ref{Axis settings}) в направлениях @samp{xyz}, указанных строкой @var{dir}. Заглавные буквы @samp{XYZ} приведут к расположению меток с другой стороны от оси. Если строка содержит символ @samp{~} или @samp{_}, то подписи меток отображаться не будут. Если строка содержит символ @samp{^}, то инвертируется положение осей по умолчанию. Если строка содержит символ @samp{AKDTVISO}, то будет нарисована соответствующая стрелка на конце оси. Стиль меток и оси(ей) задается строкой @var{stl}. @sref{Axis and ticks} +Рисует оси координат и метки на них (см. @ref{Axis settings}) в направлениях @samp{xyz}, указанных строкой @var{dir}. Строка @var{dir} может содержать: +@itemize +@item @samp{xyz} для рисования соответствующих осей; +@item @samp{XYZ} для рисования соответствующих осей с метками с другой стороны; +@item @samp{~} или @samp{_} для осей без подписей; +@item @samp{U} для невращаемых подписей; +@item @samp{^} для инвертирования положения по умолчанию; +@item @samp{!} для отключения улучшения вида меток (см. @ref{tuneticks}); +@item @samp{AKDTVISO} для вывода стрелки на конце оси; +@item @samp{a} для принудительной автоматической расстановки меток; +@item @samp{f} для вывода чисел в фиксированном формате; +@item @samp{E} для вывода @samp{E} вместо @samp{e}; +@item @samp{F} для вывода в формате LaTeX; +@item @samp{+} для вывода @samp{+} для положительных чисел; +@item @samp{-} для вывода обычного @samp{-}; +@item @samp{0123456789} для задания точности при выводе чисел. +@end itemize +Стиль меток и оси(ей) задается строкой @var{stl}. @sref{Axis and ticks} @end deftypefn @anchor{colorbar} @@ -1670,7 +1815,22 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Метод класса @code{mglGraph}} @code{void} Colorbar (@code{const char *}sch=@code{""}) @deftypefnx {Функция С} @code{void} mgl_colorbar (@code{HMGL} gr, @code{const char *}sch) @end ifclear -Рисует полосу соответствия цвета и числовых значений (colorbar) для цветовой схемы @var{sch} (используется текущая для @code{sch=""}) с краю от графика. Если строка @var{sch} содержит @samp{<>^_}, то положение выбирается: @samp{>} -- справа, @samp{<} -- слева, @samp{^} -- сверху, @samp{_} -- снизу. Если строка содержит @samp{A}, то используются абсолютные координаты (относительно рисунка). Если строка содержит @samp{~}, то подписи меток не рисуются. @sref{Colorbars} +Рисует полосу соответствия цвета и числовых значений (colorbar) для цветовой схемы @var{sch} (используется текущая для @code{sch=""}) с краю от графика. Строка @var{sch} также может содержать: +@itemize +@item @samp{<>^_} для расположения слева, справа, сверху или снизу соответственно; +@item @samp{I} для расположения около осей (по умолчанию, на краях subplot); +@item @samp{A} для использования абсолютных координат (относительно рисунка); +@item @samp{~} для colorbar без подписей; +@item @samp{!} для отключения улучшения вида меток (см. @ref{tuneticks}); +@item @samp{a} для принудительной автоматической расстановки меток; +@item @samp{f} для вывода чисел в фиксированном формате; +@item @samp{E} для вывода @samp{E} вместо @samp{e}; +@item @samp{F} для вывода в формате LaTeX; +@item @samp{+} для вывода @samp{+} для положительных чисел; +@item @samp{-} для вывода обычного @samp{-}; +@item @samp{0123456789} для задания точности при выводе чисел. +@end itemize +@sref{Colorbars} @end deftypefn @deftypefn {Команда MGL} {} colorbar vdat ['sch'=''] @@ -1703,7 +1863,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Метод класса @code{mglGraph}} @code{void} Grid (@code{const char *}dir=@code{"xyz"}, @code{const char *}pen=@code{"B"}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_axis_grid (@code{HMGL} gr, @code{const char *}dir, @code{const char *}pen, @code{const char *}opt) @end ifclear -Рисует линии сетки в направлениях перпендикулярным @var{dir}. Шаг сетки такой же как у меток осей координат. Стиль линий задается параметром @var{pen} (по умолчанию -- сплошная темно синяя линия @samp{B-}). +Рисует линии сетки в направлениях перпендикулярным @var{dir}. Если @var{dir} содержит @samp{!}, то линии рисуются также и для координат под-меток. Шаг сетки такой же как у меток осей координат. Стиль линий задается параметром @var{pen} (по умолчанию -- сплошная темно синяя линия @samp{B-}). @end deftypefn @anchor{box} @@ -1818,7 +1978,7 @@ gr.GetBGRN(bits, len(bits)); @cindex Label @cindex Cones -Эти функции строят графики для одномерных (1D) массивов. Одномерными считаются массивы, зависящие только от одного параметра (индекса) подобно кривой в параметрической форме @{x(i),y(i),z(i)@}, i=1...n. По умолчанию (если отсутствуют) значения @var{x}[i] равно распределены в диапазоне оси х, и @var{z}[i]=@var{Min}.z. Графики рисуются для каждой строки массива данных если он двумерный. Размер по 1-ой координате @strong{должен быть одинаков} для всех массивов @code{x.nx=y.nx=z.nx}. +Эти функции строят графики для одномерных (1D) массивов. Одномерными считаются массивы, зависящие только от одного параметра (индекса) подобно кривой в параметрической форме @{x(i),y(i),z(i)@}, i=1...n. По умолчанию (если отсутствуют) значения @var{x}[i] равно распределены в диапазоне оси х, и @var{z}[i] равно минимальному значению оси z. Графики рисуются для каждой строки массива данных если он двумерный. Размер по 1-ой координате @strong{должен быть одинаков} для всех массивов @code{x.nx=y.nx=z.nx}. Строка @var{pen} задает цвет и стиль линии и маркеров (см. @ref{Line styles}). По умолчанию (@code{pen=""}) рисуется сплошная линия с текущим цветом из палитры (см. @ref{Palette and colors}). Символ @samp{!} в строке задает использование нового цвета из палитры для каждой точки данных (не для всей кривой, как по умолчанию). Строка @var{opt} задает опции графика (см. @ref{Command options}). @sref{1D samples} @@ -1920,7 +2080,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_region_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_region_3d (@code{HMGL} gr, @code{HCDT} x1, @code{HCDT} y1, @code{HCDT} z1, @code{HCDT} x2, @code{HCDT} y2, @code{HCDT} z2, @code{const char *}pen, @code{const char *}opt) @end ifclear -Функции закрашивают область между 2 кривыми. Градиентная заливка используется если число цветов равно удвоенному число кривых. Если @var{pen} содержит @samp{i}, то закрашивается только область y1} для выравнивания конусов влево, вправо или по центру относительно их координат. @end itemize @@ -2013,7 +2173,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_boxplot (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_boxplot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @end ifclear -Функции рисуют boxplot (называемый также как box-and-whisker diagram или как "ящик с усами") в точках @var{x}[i] на плоскости @var{z} = @var{zVal} (по умолчанию @var{z}=@var{Min.z}). Это график, компактно изображающий распределение вероятностей @var{a}[i,j] (минимум, нижний квартиль (Q1), медиана (Q2), верхний квартиль (Q3) и максимум) вдоль второго (j-го) направления. Если @var{pen} содержит @samp{<}, @samp{^} или @samp{>}, то полоски будут выровнены влево, вправо или центрированы относительно их координат. См. также @ref{plot}, @ref{error}, @ref{bars}, @ref{barwidth}. @sref{BoxPlot sample} +Функции рисуют boxplot (называемый также как box-and-whisker diagram или как "ящик с усами") в точках @var{x}[i] на плоскости @var{z} = @var{zVal} (по умолчанию @var{z} равно минимальному значению оси z). Это график, компактно изображающий распределение вероятностей @var{a}[i,j] (минимум, нижний квартиль (Q1), медиана (Q2), верхний квартиль (Q3) и максимум) вдоль второго (j-го) направления. Если @var{pen} содержит @samp{<}, @samp{^} или @samp{>}, то полоски будут выровнены влево, вправо или центрированы относительно их координат. См. также @ref{plot}, @ref{error}, @ref{bars}, @ref{barwidth}. @sref{BoxPlot sample} @end deftypefn @anchor{candle} @@ -2060,7 +2220,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_error_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_error_exy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ex, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @end ifclear -Функции рисуют размер ошибки @{@var{ex}[i], @var{ey}[i]@} в точках @{@var{x}[i], @var{y}[i]@} на плоскости @var{z} = @var{zVal} (по умолчанию @var{z}=@var{Min.z}). Такой график полезен для отображения ошибки эксперимента, вычислений и пр. Если @var{pen} содержит @samp{@@}, то будут использованы большие полупрозрачные маркеры. См. также @ref{plot}, @ref{mark}. @sref{Error sample} +Функции рисуют размер ошибки @{@var{ex}[i], @var{ey}[i]@} в точках @{@var{x}[i], @var{y}[i]@} на плоскости @var{z} = @var{zVal} (по умолчанию @var{z} равно минимальному значению оси z). Такой график полезен для отображения ошибки эксперимента, вычислений и пр. Если @var{pen} содержит @samp{@@}, то будут использованы большие полупрозрачные маркеры. См. также @ref{plot}, @ref{mark}. @sref{Error sample} @end deftypefn @anchor{mark} @@ -2122,7 +2282,17 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_label_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_labelw_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @end ifclear -Функции выводят текстовую строку @var{txt} в точках @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Если строка @var{txt} содержит @samp{%x}, @samp{%y}, @samp{%z} или @samp{%n}, то они будут заменены на значения соответствующих координат или на номер точки. См. также @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{Label sample} +Функции выводят текстовую строку @var{txt} в точках @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Если строка @var{txt} содержит @samp{%x}, @samp{%y}, @samp{%z} или @samp{%n}, то они будут заменены на значения соответствующих координат или на номер точки. Строка @var{fnt} может содержать: +@itemize +@item @ref{Font styles}; +@item @samp{f} для вывода чисел в фиксированном формате; +@item @samp{E} для вывода @samp{E} вместо @samp{e}; +@item @samp{F} для вывода в формате LaTeX; +@item @samp{+} для вывода @samp{+} для положительных чисел; +@item @samp{-} для вывода обычного @samp{-}; +@item @samp{0123456789} для задания точности при выводе чисел. +@end itemize +См. также @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{Label sample} @end deftypefn @anchor{table} @@ -2136,7 +2306,20 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_table (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tablew (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @end ifclear -Рисует таблицу значений массива @var{val} с заголовками @var{txt} (разделенными символом новой строки @samp{\n}) в точке @{@var{x}, @var{y}@} (по умолчанию @{0,0@}) относительно текущего subplot. Если строка @var{fnt} содержит @samp{#}, то рисуются границы ячеек. Если строка @var{fnt} содержит @samp{=}, то ширина всех ячеек одинакова. Если строка @var{fnt} содержит @samp{|}, то ширина таблицы ограничена шириной subplot (эквивалентно опции @samp{value 1}). Опция @code{value} задает ширину таблицы (по умолчанию 1). См. также @ref{label}. @sref{Table sample} +Рисует таблицу значений массива @var{val} с заголовками @var{txt} (разделенными символом новой строки @samp{\n}) в точке @{@var{x}, @var{y}@} (по умолчанию @{0,0@}) относительно текущего subplot. Строка @var{fnt} может содержать: +@itemize +@item @ref{Font styles}; +@item @samp{#} для рисования границ ячеек; +@item @samp{=} для одинаковой ширины всех ячеек; +@item @samp{|} для ограничения ширины таблицы шириной subplot (эквивалентно опции @samp{value 1}); +@item @samp{f} для вывода чисел в фиксированном формате; +@item @samp{E} для вывода @samp{E} вместо @samp{e}; +@item @samp{F} для вывода в формате LaTeX; +@item @samp{+} для вывода @samp{+} для положительных чисел; +@item @samp{-} для вывода обычного @samp{-}; +@item @samp{0123456789} для задания точности при выводе чисел. +@end itemize +Опция @code{value} задает ширину таблицы (по умолчанию 1). См. также @ref{label}. @sref{Table sample} @end deftypefn @anchor{tube} @@ -2277,7 +2460,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_dens (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_dens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует график плотности для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z} = @var{Min}.z. Если @var{sch} содержит @samp{#}, то рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample} +Рисует график плотности для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z} равном минимальному значению оси z. Если @var{sch} содержит @samp{#}, то рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{Dens sample} @end deftypefn @anchor{cont} @@ -2289,7 +2472,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_cont__val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_cont_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует линии уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z} = @var{Min}.z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Если @var{sch} содержит @samp{t} или @samp{T}, то значения @var{v}[k] будут выведены вдоль контуров над (или под) кривой. См. также @ref{dens}, @ref{contf}, @ref{contd}, @ref{axial}, @code{cont[xyz]}. @sref{Cont sample} +Рисует линии уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z} равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Если @var{sch} содержит @samp{t} или @samp{T}, то значения @var{v}[k] будут выведены вдоль контуров над (или под) кривой. См. также @ref{dens}, @ref{contf}, @ref{contd}, @ref{axial}, @code{cont[xyz]}. @sref{Cont sample} @end deftypefn @deftypefn {Команда MGL} {} cont zdat ['sch'=''] @@ -2312,7 +2495,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_contf_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contf_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует закрашенные линии (контуры) уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z} = @var{Min}.z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. См. также @ref{dens}, @ref{cont}, @ref{contd}, @code{contf[xyz]}. @sref{ContF sample} +Рисует закрашенные линии (контуры) уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z} равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. См. также @ref{dens}, @ref{cont}, @ref{contd}, @code{contf[xyz]}. @sref{ContF sample} @end deftypefn @deftypefn {Команда MGL} {} contf zdat ['sch'=''] @@ -2335,7 +2518,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_contd_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contd_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует закрашенные линии (контуры) уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z} = @var{Min}.z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Строка @var{sch} задает цвета контуров: цвет k-го контура определяется как k-ый цвет строки. См. также @ref{dens}, @ref{cont}, @ref{contf}. @sref{ContD sample} +Рисует закрашенные линии (контуры) уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z=v}[k] или при @var{z} равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. Строка @var{sch} задает цвета контуров: цвет k-го контура определяется как k-ый цвет строки. См. также @ref{dens}, @ref{cont}, @ref{contf}. @sref{ContD sample} @end deftypefn @deftypefn {Команда MGL} {} contd zdat ['sch'=''] @@ -2358,7 +2541,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_contv_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_contv_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует вертикальные цилиндры от линий уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z}=@var{v}[k] или при @var{z} = @var{Min}.z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. См. также @ref{cont}, @ref{contf}. @sref{ContV sample} +Рисует вертикальные цилиндры от линий уровня для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z}=@var{v}[k] или при @var{z} равном минимальному значению оси z если @var{sch} содержит @samp{_}. Линии уровня рисуются для @var{z}[i,j]=@var{v}[k]. См. также @ref{cont}, @ref{contf}. @sref{ContV sample} @end deftypefn @deftypefn {Команда MGL} {} contv zdat ['sch'=''] @@ -2404,7 +2587,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_grid (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_grid_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует плоскую сету для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z} = @var{Min}.z. См. также @ref{dens}, @ref{cont}, @ref{contf}, @ref{meshnum}. +Рисует плоскую сету для параметрически заданной поверхности @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} при @var{z} равном минимальному значению оси z. См. также @ref{dens}, @ref{cont}, @ref{contf}, @ref{grid3}, @ref{meshnum}. @end deftypefn @@ -2661,7 +2844,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_stfa (@code{HMGL} gr, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_stfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует спектрограмму комплексного массива @var{re}+i*@var{im} для Фурье размером @var{dn} точек в плоскости @var{z}=@var{Min}.z. Параметр @var{dn} -- любое чётное число. Например в 1D случае, результатом будет график плотности от массива @math{res[i,j]=|\sum_d^dn exp(I*j*d)*(re[i*dn+d]+I*im[i*dn+d])|/dn} размером @{int(nx/dn), dn, ny@}. Массивы @var{re}, @var{im} параметрически зависят от координат @var{x}, @var{y}. Все размеры массивов @var{re} и @var{im} должны быть одинаковы. Младшие размерности массивов @var{x}, @var{y}, @var{re} должны быть одинаковы. Массивы @var{x} и @var{y} могут быть векторами (не матрицами как @var{re}). @sref{STFA sample} +Рисует спектрограмму комплексного массива @var{re}+i*@var{im} для Фурье размером @var{dn} точек в плоскости @var{z} равно минимальному значению оси z. Параметр @var{dn} -- любое чётное число. Например в 1D случае, результатом будет график плотности от массива @math{res[i,j]=|\sum_d^dn exp(I*j*d)*(re[i*dn+d]+I*im[i*dn+d])|/dn} размером @{int(nx/dn), dn, ny@}. Массивы @var{re}, @var{im} параметрически зависят от координат @var{x}, @var{y}. Все размеры массивов @var{re} и @var{im} должны быть одинаковы. Младшие размерности массивов @var{x}, @var{y}, @var{re} должны быть одинаковы. Массивы @var{x} и @var{y} могут быть векторами (не матрицами как @var{re}). @sref{STFA sample} @end deftypefn @@ -2700,7 +2883,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_vect_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_vect_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует векторное поле @{@var{ax}, @var{ay}@} параметрически зависящее от координат @var{x}, @var{y} на плоскости при @var{z}=@var{Min}.z. Длина и цвет векторов пропорциональна @math{\sqrt@{ax^2+ay^2@}}. Число рисуемых векторов зависит от @ref{meshnum}. Вид стрелок/штрихов может быть изменён символами: +Рисует векторное поле @{@var{ax}, @var{ay}@} параметрически зависящее от координат @var{x}, @var{y} на плоскости при @var{z} равном минимальному значению оси z. Длина и цвет векторов пропорциональна @math{\sqrt@{ax^2+ay^2@}}. Число рисуемых векторов зависит от @ref{meshnum}. Вид стрелок/штрихов может быть изменён символами: @itemize @bullet @item @samp{f} для стрелок одинаковой длины, @@ -2757,7 +2940,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_dew (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_dew_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует капли для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} при @var{z}=@var{Min}.z. Замечу, что график требует много памяти и процессорного времени для своего создания! Цвет капель пропорционален @math{\sqrt@{ax^2+ay^2@}}. Число капель определяется @ref{meshnum}. См. также @ref{vect}. @sref{Dew sample} +Рисует капли для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} при @var{z} равном минимальному значению оси z. Замечу, что график требует много памяти и процессорного времени для своего создания! Цвет капель пропорционален @math{\sqrt@{ax^2+ay^2@}}. Число капель определяется @ref{meshnum}. См. также @ref{vect}. @sref{Dew sample} @end deftypefn @anchor{flow} @@ -2769,7 +2952,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_flow_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_flow_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует нити тока для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} на плоскости при @var{z} = @var{Min}.z. Число нитей пропорционально значению опции @code{value} (по умолчанию 5). Цвет нитей пропорционален @math{\sqrt@{ax^2+ay^2@}}. Строка @var{sch} может содержать +Рисует нити тока для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} на плоскости при @var{z} равном минимальному значению оси z. Число нитей пропорционально значению опции @code{value} (по умолчанию 5). Цвет нитей пропорционален @math{\sqrt@{ax^2+ay^2@}}. Строка @var{sch} может содержать @itemize @bullet @item цветовую схему -- тёплые цвета соответствуют нормальному току (типа стока), холодные цвета соответствуют обратному току (типа источника); @@ -2840,7 +3023,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_pipe_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_pipe_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @end ifclear -Рисует трубки тока для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} на плоскости при @var{z} = @var{Min}.z. Число трубок пропорционально значению опции @code{value}. Цвет и радиус трубок пропорционален @math{\sqrt@{ax^2+ay^2@}}. Тёплые цвета соответствуют нормальному току (типа стока). Холодные цвета соответствуют обратному току (типа источника). Параметр @var{r0} задает радиус трубок. При @var{r0}<0 радиус трубок обратно пропорционален их амплитуде. См. также @ref{flow}, @ref{vect}. @sref{Pipe sample} +Рисует трубки тока для векторного поля @{@var{ax}, @var{ay}@}, параметрически зависящего от координат @var{x}, @var{y} на плоскости при @var{z} равном минимальному значению оси z. Число трубок пропорционально значению опции @code{value}. Цвет и радиус трубок пропорционален @math{\sqrt@{ax^2+ay^2@}}. Тёплые цвета соответствуют нормальному току (типа стока). Холодные цвета соответствуют обратному току (типа источника). Параметр @var{r0} задает радиус трубок. При @var{r0}<0 радиус трубок обратно пропорционален их амплитуде. См. также @ref{flow}, @ref{vect}. @sref{Pipe sample} @end deftypefn @deftypefn {Команда MGL} {} pipe udat vdat wdat ['sch'='' @code{r0=0.05}] @@ -2946,7 +3129,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Метод класса @code{mglGraph}} @code{void} FPlot (@code{const char *}eqY, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Функция С} @code{void} mgl_fplot (@code{HMGL} gr, @code{const char *}eqY, @code{const char *}pen, @code{const char *}opt) @end ifclear -Рисует функцию @samp{eqY(x)} в плоскости @var{z}=@var{Min}.z с координатой @samp{x} в диапазоне [@var{Min}.x, @var{Max}.x]. Опция @code{value} задает начальное число точек. См. также @ref{plot}. +Рисует функцию @samp{eqY(x)} в плоскости @var{z} равно минимальному значению оси z с координатой @samp{x} в диапазоне осей координат. Опция @code{value} задает начальное число точек. См. также @ref{plot}. @end deftypefn @deftypefn {Команда MGL} {} fplot 'x(t)' 'y(t)' 'z(t)' ['pen'=''] @@ -3003,7 +3186,7 @@ gr.GetBGRN(bits, len(bits)); @deftypefnx {Функция С} @code{void} mgl_tricont_xyzcv (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {Функция С} @code{void} mgl_tricont_xyzv (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear -Рисует линии уровня поверхности из треугольников при @var{z}=@var{v}[k] (или при @var{z} = @var{Min}.z если @var{sch} содержит @samp{_}). Вершины треугольников задаются индексами @var{id} в массиве точек @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Если аргуент @var{v} не задан, то используется массив из @var{num} элементов равно распределенных в диапазоне изменения цвета. Здесь @var{num} равен значению параметра @code{value} в опциях @var{opt} (по умолчанию 7). Строка @var{sch} задает цветовую схему. Размер по 1-му индексу массива @var{id} должен быть 3 или больше. Массивы @var{x}, @var{y}, @var{z} должны иметь одинаковые размеры. Массив @var{c} задает цвет треугольников (если @var{id}.ny=@var{c}.nx) или цвет вершин (если @var{x}.nx=@var{c}.nx). См. также @ref{triplot}, @ref{cont}, @ref{triangulation}. +Рисует линии уровня поверхности из треугольников при @var{z}=@var{v}[k] (или при @var{z} равном минимальному значению оси z если @var{sch} содержит @samp{_}). Вершины треугольников задаются индексами @var{id} в массиве точек @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Если аргуент @var{v} не задан, то используется массив из @var{num} элементов равно распределенных в диапазоне изменения цвета. Здесь @var{num} равен значению параметра @code{value} в опциях @var{opt} (по умолчанию 7). Строка @var{sch} задает цветовую схему. Размер по 1-му индексу массива @var{id} должен быть 3 или больше. Массивы @var{x}, @var{y}, @var{z} должны иметь одинаковые размеры. Массив @var{c} задает цвет треугольников (если @var{id}.ny=@var{c}.nx) или цвет вершин (если @var{x}.nx=@var{c}.nx). См. также @ref{triplot}, @ref{cont}, @ref{triangulation}. @end deftypefn @anchor{quadplot} @@ -3058,7 +3241,7 @@ gr.GetBGRN(bits, len(bits)); Эти функции подбирают параметры функции для наилучшей аппроксимации данных, т.е. минимизируют сумму @math{\sum_i (f(x_i, y_i, z_i) - a_i)^2/s_i^2}. При этом аппроксимирующая функция @samp{f} может зависеть от одного аргумента @samp{x} (1D случай), от двух аргументов @samp{x,y} (2D случай) или от трех аргументов @samp{x,y,z} (3D случай). Функция @samp{f} также может зависеть от параметров. Список параметров задается строкой @var{var} (например, @samp{abcd}). Обычно пользователь должен предоставить начальные значения параметров в переменной @var{ini}. Однако, при его отсутствии используются нулевые значения. Параметр @var{print}=@code{true} включает вывод найденной формулы в @var{Message} (см. @ref{Error handling}). -Функции Fit() и FitS() не рисуют полученные массивы. Они заполняют массив @var{fit} по формуле @samp{f} с найденными коэффициентами и возвращают @math{\chi^2} ошибку аппроксимации. При этом, координаты @samp{x,y,z} равно распределены в интервале @var{Min}--@var{Max}. Число точек в @var{fit} определяется опцией @code{value} (по умолчанию @var{mglFitPnts}=100). Функции используют библиотеку GSL. @sref{Nonlinear fitting hints} +Функции Fit() и FitS() не рисуют полученные массивы. Они заполняют массив @var{fit} по формуле @samp{f} с найденными коэффициентами и возвращают @math{\chi^2} ошибку аппроксимации. При этом, координаты @samp{x,y,z} равно распределены в диапазоне осей координат. Число точек в @var{fit} определяется опцией @code{value} (по умолчанию @var{mglFitPnts}=100). Функции используют библиотеку GSL. @sref{Nonlinear fitting hints} @anchor{fits} @deftypefn {Команда MGL} {} fits res adat sdat 'func' 'var' [ini=0] @@ -3128,6 +3311,7 @@ gr.GetBGRN(bits, len(bits)); @ifclear UDAV @deftypefn {Метод класса @code{mglGraph}} @code{const char *}GetFit () @deftypefnx {Функция С} @code{const char *} mgl_get_fit (@code{HMGL} gr) +@deftypefnx {Fortran процедура} @code{} mgl_get_fit (@code{long} gr, @code{char *}out, @code{int} len) Возвращает последнюю подобранную формулу с найденными коэффициентами. @end deftypefn @end ifclear diff --git a/texinfo/data_en.texi b/texinfo/data_en.texi index 0a4db63..8847537 100644 --- a/texinfo/data_en.texi +++ b/texinfo/data_en.texi @@ -23,7 +23,7 @@ This chapter describe classes @code{mglData} and @code{mglDataC} for working wit * Operators:: * Global functions:: * Evaluate expression:: -* MGL variables:: +* Special data classes:: @end menu @c ------------------------------------------------------------------ @@ -62,6 +62,20 @@ Names of column (or slice if nz>1) -- one character per column. Flag to use external data, i.e. don't delete it. @end deftypecv +@deftypecv {Variable} mglDataA @code{std::wstring} s +Name of data. It is used in parsing of MGL scripts. +@end deftypecv +@deftypecv {Variable} mglDataA @code{bool} temp +Flag of temporary variable, which should be deleted. +@end deftypecv +@deftypecv {Variable} mglDataA @code{void (*)(void *)} func +Pointer to callback function which will be called at destroying. +@end deftypecv +@deftypecv {Variable} mglDataA @code{void *} o +Pointer to object for callback function. +@end deftypecv + + @deftypefn {Method on @code{mglData}} @code{mreal} GetVal (@code{long} i) @deftypefnx {Method on @code{mglDataC}} @code{mreal} GetVal (@code{long} i) @deftypefnx {Method on @code{mglData}} @code{void} SetVal (@code{mreal} val, @code{long} i) @@ -69,12 +83,9 @@ Flag to use external data, i.e. don't delete it. Gets or sets the value in by "flat" index @var{i} without border checking. Index @var{i} should be in range [0, nx*ny*nz-1]. @end deftypefn -@deftypefn {Method on @code{mglData}} @code{long} GetNx () -@deftypefnx {Method on @code{mglDataC}} @code{long} GetNx () -@deftypefnx {Method on @code{mglData}} @code{long} GetNy () -@deftypefnx {Method on @code{mglDataC}} @code{long} GetNy () -@deftypefnx {Method on @code{mglData}} @code{long} GetNz () -@deftypefnx {Method on @code{mglDataC}} @code{long} GetNz () +@deftypefn {Method on @code{mglDataA}} @code{long} GetNx () +@deftypefnx {Method on @code{mglDataA}} @code{long} GetNy () +@deftypefnx {Method on @code{mglDataA}} @code{long} GetNz () @deftypefnx {C function} @code{long} mgl_data_get_nx (@code{HCDT} dat) @deftypefnx {C function} @code{long} mgl_data_get_ny (@code{HCDT} dat) @deftypefnx {C function} @code{long} mgl_data_get_nz (@code{HCDT} dat) @@ -93,6 +104,16 @@ Gets or sets the value in specified cell of the data with border checking. @deftypefnx {C function} @code{const dual *} mgl_datac_data (@code{HCDT} dat) Returns pointer to internal data array. @end deftypefn + +@deftypefn {C function only} @code{void} mgl_data_set_func (@code{mglDataA *}dat, @code{void (*}func@code{)(void *)}, @code{void *}par) +Set pointer to callback function which will be called at destroying. +@end deftypefn + +@deftypefn {C function} @code{void} mgl_data_set_name (@code{mglDataA *}dat, @code{const char *}name) +@deftypefnx {C function} @code{void} mgl_data_set_name_w (@code{mglDataA *}dat, @code{const wchar_t *}name) +Set name of data, which used in parsing of MGL scripts. +@end deftypefn + @end ifclear @c ------------------------------------------------------------------ @@ -531,6 +552,15 @@ Copies value(s) from array @var{v} to the range of original array. Negative inde Fills by interpolated values of array @var{v} at the point @{@var{x}, @var{y}, @var{z}@}=@{@code{X[i], Y[j], Z[k]}@} (or @{@var{x}, @var{y}, @var{z}@}=@{@code{X[i,j,k], Y[i,j,k], Z[i,j,k]}@} if @var{x}, @var{y}, @var{z} are not 1d arrays), where @code{X,Y,Z} are equidistantly distributed in range [@var{x1},@var{x2}]*[@var{y1},@var{y2}]*[@var{z1},@var{z2}] and have the same sizes as this array. If parameter @var{sl} is 0 or positive then changes will be applied only for slice @var{sl}. @end deftypefn +@anchor{gspline} +@deftypefn {MGL command} {} gspline dat xdat vdat [sl=-1] +@ifclear UDAV +@deftypefnx {Method on @code{mglData}} @code{void} RefillGS (@code{const mglDataA &}x, @code{const mglDataA &}v, @code{mreal} x1, @code{mreal} x2, @code{long} sl=@code{-1}) +@deftypefnx {C function} @code{void} mgl_data_refill_gs (@code{HMDT} a, @code{HCDT} x, @code{HCDT} v, @code{mreal} x1, @code{mreal} x2, @code{long} sl) +@end ifclear +Fills by global cubic spline values of array @var{v} at the point @var{x}=@code{X[i]}, where @code{X} are equidistantly distributed in range [@var{x1},@var{x2}] and have the same sizes as this array. If parameter @var{sl} is 0 or positive then changes will be applied only for slice @var{sl}. +@end deftypefn + @anchor{idset} @deftypefn {MGL command} {} idset dat 'ids' @ifclear UDAV @@ -614,8 +644,7 @@ Join data arrays from several text files which filenames satisfied the template @anchor{save} @deftypefn {MGL command} {} save dat 'fname' @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} @deftypefnx {C function} @code{void} mgl_data_save (@code{HCDT} dat, @code{const char *}fname, @code{int} ns) @deftypefnx {C function} @code{void} mgl_datac_save (@code{HCDT} dat, @code{const char *}fname, @code{int} ns) @end ifclear @@ -636,8 +665,7 @@ Reads data array named @var{dname} from HDF5 or HDF4 file. This function does no @anchor{savehdf} @deftypefn {MGL command} {} savehdf dat 'fname' 'dname' @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} @deftypefnx {C function} @code{void} mgl_data_save_hdf (@code{HCDT} dat, @code{const char *}fname, @code{const char *}dname, @code{int} rewrite) @deftypefnx {C function} @code{void} mgl_datac_save_hdf (@code{HCDT} dat, @code{const char *}fname, @code{const char *}dname, @code{int} rewrite) @end ifclear @@ -647,8 +675,7 @@ Saves data array named @var{dname} to HDF5 file. This function does nothing if H @anchor{datas} @deftypefn {MGL command} {} datas 'fname' @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{int} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} -@deftypefnx {Method on @code{mglDataC}} @code{int} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} +@deftypefnx {Method on @code{mglDataA}} @code{int} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} @deftypefnx {C function} @code{int} mgl_datas_hdf (@code{const char *}fname, @code{char *}buf, @code{long} size) @end ifclear Put data names from HDF5 file @var{fname} into @var{buf} as '\t' separated fields. In MGL version the list of data names will be printed as message. This function does nothing if HDF5 was disabled during library compilation. @@ -666,7 +693,7 @@ Reads data from bitmap file (now support only PNG format). The RGB values of bit @anchor{export} @deftypefn {MGL command} {} export dat 'fname' 'sch' [@code{v1=0 v2=0}] @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{void} Export (@code{const char *}fname, @code{const char *}scheme, @code{mreal} v1=@code{0}, mreal v2=@code{0}, @code{int} ns=@code{-1}) const +@deftypefnx {Method on @code{mglDataA}} @code{void} Export (@code{const char *}fname, @code{const char *}scheme, @code{mreal} v1=@code{0}, mreal v2=@code{0}, @code{int} ns=@code{-1}) const @deftypefnx {C function} @code{void} mgl_data_export (@code{HMDT} dat, @code{const char *}fname, @code{const char *}scheme, @code{mreal} v1, mreal v2, @code{int} ns) const @end ifclear Saves data matrix (or @code{ns}-th slice for 3d data) to bitmap file (now support only PNG format). The data values are transformed from range [@var{v1}, @var{v2}] to RGB pixels of bitmap using color scheme @var{scheme} (@pxref{Color scheme}). If @var{v1}>=@var{v2} then the values of @var{v1}, @var{v2} are automatically determined as minimal and maximal value of the data array. @@ -707,9 +734,14 @@ Extracts sub-array data from the original data array keeping fixed positive inde @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @code{const} @deftypefnx {Method on @code{mglDataC}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @code{const} +@deftypefnx {Method on @code{mglData}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} SubData (@code{const mglDataA &}xx, @code{const mglDataA &}yy) @code{const} +@deftypefnx {Method on @code{mglData}} @code{mglData} SubData (@code{const mglDataA &}xx) @code{const} +@deftypefnx {Method on @code{mglDataC}} @code{mglData} SubData (@code{const mglDataA &}xx) @code{const} @deftypefnx {C function} @code{HMDT} mgl_data_subdata_ext (@code{HCDT} dat, @code{HCDT} xx, @code{HCDT} yy, @code{HCDT} zz) +@deftypefnx {C function} @code{HADT} mgl_datac_subdata_ext (@code{HCDT} dat, @code{HCDT} xx, @code{HCDT} yy, @code{HCDT} zz) @end ifclear -Extracts sub-array data from the original data array for indexes specified by arrays @var{xx}, @var{yy}, @var{zz} (indirect access). This function work like previous one for 1D arguments or numbers, and resulting array dimensions are equal dimensions of 1D arrays for corresponding direction. For 2D and 3D arrays in arguments, the resulting array have the same dimensions as input arrays. The dimensions of all argument must be the same (or to be scalar 1*1*1) if they are 2D or 3D arrays. In MGL version this command usually is used as inline one @code{dat(xx,yy,zz)}. Function return NULL or create empty data if data cannot be created for given arguments. +Extracts sub-array data from the original data array for indexes specified by arrays @var{xx}, @var{yy}, @var{zz} (indirect access). This function work like previous one for 1D arguments or numbers, and resulting array dimensions are equal dimensions of 1D arrays for corresponding direction. For 2D and 3D arrays in arguments, the resulting array have the same dimensions as input arrays. The dimensions of all argument must be the same (or to be scalar 1*1*1) if they are 2D or 3D arrays. In MGL version this command usually is used as inline one @code{dat(xx,yy,zz)}. Function return NULL or create empty data if data cannot be created for given arguments. In C function some of @var{xx}, @var{yy}, @var{zz} can be NULL. @end deftypefn @anchor{column} @@ -1087,7 +1119,7 @@ Normalizes data slice-by-slice along direction @var{dir} the data in slices to r @section Interpolation @nav{} -MGL scripts can use linear interpolation by @ref{subdata} command, or spline interpolation by @ref{evaluate} command. Also you can use @ref{resize} for obtaining a data array with new sizes. +MGL scripts can use spline interpolation by @ref{evaluate} or @ref{refill} commands. Also you can use @ref{resize} for obtaining a data array with new sizes. @ifclear UDAV @@ -1156,11 +1188,10 @@ There are a set of functions for obtaining data properties in MGL language. Howe @anchor{info} @deftypefn {MGL command} {} info dat @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{const char *} PrintInfo () @code{const} -@deftypefnx {Method on @code{mglData}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{const char *} PrintInfo () @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} -@deftypefnx {C function} @code{const char *} mgl_data_info (@code{HCDT} dat) +@deftypefnx {Method on @code{mglDataA}} @code{const char *} PrintInfo () @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} +@deftypefnx {C function only} @code{const char *} mgl_data_info (@code{HCDT} dat) +@deftypefnx {Fortran subroutine} @code{} mgl_data_info (@code{long} dat, @code{char *}out, @code{int} len) @end ifclear Gets or prints to file @var{fp} or as message (in MGL) information about the data (sizes, maximum/minimum, momentums and so on). @end deftypefn @@ -1181,12 +1212,9 @@ Prints value of number @var{val} as message. @deftypefnx {MGL suffix} {(dat)} .ny @deftypefnx {MGL suffix} {(dat)} .nz @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{long} GetNx () -@deftypefnx {Method on @code{mglData}} @code{long} GetNy () -@deftypefnx {Method on @code{mglData}} @code{long} GetNz () -@deftypefnx {Method on @code{mglDataC}} @code{long} GetNx () -@deftypefnx {Method on @code{mglDataC}} @code{long} GetNy () -@deftypefnx {Method on @code{mglDataC}} @code{long} GetNz () +@deftypefnx {Method on @code{mglDataA}} @code{long} GetNx () +@deftypefnx {Method on @code{mglDataA}} @code{long} GetNy () +@deftypefnx {Method on @code{mglDataA}} @code{long} GetNz () @deftypefnx {C function} @code{long} mgl_data_get_nx (@code{HCDT} dat) @deftypefnx {C function} @code{long} mgl_data_get_ny (@code{HCDT} dat) @deftypefnx {C function} @code{long} mgl_data_get_nz (@code{HCDT} dat) @@ -1200,8 +1228,7 @@ Gets the x-, y-, z-size of the data. @anchor{.max} @deftypefn {MGL suffix} {(dat)} .max @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{mreal} Maximal () @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{mreal} Maximal () @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{mreal} Maximal () @code{const} @deftypefnx {C function} @code{mreal} mgl_data_max (@code{HCDT} dat) @end ifclear Gets maximal value of the data. @@ -1211,26 +1238,22 @@ Gets maximal value of the data. @anchor{.min} @deftypefn {MGL suffix} {(dat)} .min @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{mreal} Minimal () @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{mreal} Minimal () @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{mreal} Minimal () @code{const} @deftypefnx {C function} @code{mreal} mgl_data_min (@code{HMDT} dat) @code{const} @end ifclear Gets minimal value of the data. @end deftypefn @ifclear UDAV -@deftypefn {Method on @code{mglData}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefn {Method on @code{mglDataA}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_min_int (@code{HCDT} dat, @code{int} *i, @code{int} *j, @code{int} *k) Gets position of minimum to variables @var{i}, @var{j}, @var{k} and returns the minimal value. @end deftypefn -@deftypefn {Method on @code{mglData}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefn {Method on @code{mglDataA}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_max_int (@code{HCDT} dat, @code{int} *i, @code{int} *j, @code{int} *k) Gets position of maximum to variables @var{i}, @var{j}, @var{k} and returns the maximal value. @end deftypefn -@deftypefn {Method on @code{mglData}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} +@deftypefn {Method on @code{mglDataA}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_min_real (@code{HCDT} dat, @code{mreal} *x, @code{mreal} *y, @code{mreal} *z) Gets approximated (interpolated) position of minimum to variables @var{x}, @var{y}, @var{z} and returns the minimal value. @end deftypefn @@ -1241,8 +1264,7 @@ Gets approximated (interpolated) position of minimum to variables @var{x}, @var{ @deftypefnx {MGL suffix} {(dat)} .my @deftypefnx {MGL suffix} {(dat)} .mz @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} -@deftypefnx {Method on @code{mglDataC}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_max_real (@code{HCDT} dat, @code{mreal} *x, @code{mreal} *y, @code{mreal} *z) @end ifclear Gets approximated (interpolated) position of maximum to variables @var{x}, @var{y}, @var{z} and returns the maximal value. @@ -1272,8 +1294,8 @@ Gets approximated (interpolated) position of maximum to variables @var{x}, @var{ @deftypefnx {MGL suffix} {(dat)} .kz @deftypefnx {MGL suffix} {(dat)} .ka @ifclear UDAV -@deftypefnx {Method on @code{mglData}} @code{mreal} Momentum (@code{char} dir, @code{mreal} &a, @code{mreal} &w) @code{const} -@deftypefnx {Method on @code{mglData}} @code{mreal} Momentum (@code{char} dir, @code{mreal} &m, @code{mreal} &w, @code{mreal} &s, @code{mreal} &k) @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{mreal} Momentum (@code{char} dir, @code{mreal} &a, @code{mreal} &w) @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{mreal} Momentum (@code{char} dir, @code{mreal} &m, @code{mreal} &w, @code{mreal} &s, @code{mreal} &k) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_momentum_val (@code{HCDT} dat, @code{char} dir, @code{mreal} *a, @code{mreal} *w, @code{mreal} *s, @code{mreal} *k) @end ifclear Gets zero-momentum (energy, @math{I=\sum dat_i}) and write first momentum (median, @math{a = \sum \xi_i dat_i/I}), second momentum (width, @math{w^2 = \sum (\xi_i-a)^2 dat_i/I}), third momentum (skewness, @math{s = \sum (\xi_i-a)^3 dat_i/ I w^3}) and fourth momentum (kurtosis, @math{k = \sum (\xi_i-a)^4 dat_i / 3 I w^4}) to variables. Here @math{\xi} is corresponding coordinate if @var{dir} is @samp{'x'}, @samp{'y'} or @samp{'z'}. Otherwise median is @math{a = \sum dat_i/N}, width is @math{w^2 = \sum (dat_i-a)^2/N} and so on. @@ -1283,7 +1305,7 @@ Gets zero-momentum (energy, @math{I=\sum dat_i}) and write first momentum (media @deftypefn {MGL suffix} {(dat)} .fst @ifclear UDAV @cindex Find -@deftypefnx {Method on @code{mglData}} @code{mreal} Find (@code{const char *}cond, @code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{mreal} Find (@code{const char *}cond, @code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_first (@code{HCDT} dat, @code{const char *}cond, @code{int} *i, @code{int} *j, @code{int} *k) @end ifclear Find position (after specified in @var{i}, @var{j}, @var{k}) of first nonzero value of formula @var{cond}. Function return the data value at found position. @@ -1293,19 +1315,19 @@ Find position (after specified in @var{i}, @var{j}, @var{k}) of first nonzero va @deftypefn {MGL suffix} {(dat)} .lst @ifclear UDAV @cindex Last -@deftypefnx {Method on @code{mglData}} @code{mreal} Last (@code{const char *}cond, @code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefnx {Method on @code{mglDataA}} @code{mreal} Last (@code{const char *}cond, @code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_last (@code{HCDT} dat, @code{const char *}cond, @code{int} *i, @code{int} *j, @code{int} *k) @end ifclear Find position (before specified in @var{i}, @var{j}, @var{k}) of last nonzero value of formula @var{cond}. Function return the data value at found position. @end deftypefn @ifclear UDAV -@deftypefn {Method on @code{mglData}} @code{int} Find (@code{const char *}cond, @code{char} dir, @code{int} i=@code{0}, @code{int} j=@code{0}, @code{int} k=@code{0}) @code{const} +@deftypefn {Method on @code{mglDataA}} @code{int} Find (@code{const char *}cond, @code{char} dir, @code{int} i=@code{0}, @code{int} j=@code{0}, @code{int} k=@code{0}) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_find (@code{HCDT} dat, @code{const char *}cond, @code{int} i, @code{int} j, @code{int} k) Return position of first in direction @var{dir} nonzero value of formula @var{cond}. The search is started from point @{i,j,k@}. @end deftypefn @cindex FindAny -@deftypefn {Method on @code{mglData}} @code{bool} FindAny (@code{const char *}cond) @code{const} +@deftypefn {Method on @code{mglDataA}} @code{bool} FindAny (@code{const char *}cond) @code{const} @deftypefnx {C function} @code{mreal} mgl_data_find_any (@code{HCDT} dat, @code{const char *}cond) Determines if any nonzero value of formula in the data array. @end deftypefn @@ -1460,9 +1482,11 @@ Short time Fourier transformation for real and imaginary parts. Output is ampli @deftypefn {MGL command} {} pde @sc{res} 'ham' ini_re ini_im [@code{dz=0.1 k0=100}] @ifclear UDAV @deftypefnx {Global function} @code{mglData} mglPDE (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""}) +@deftypefnx {Global function} @code{mglDataC} mglPDEc (@code{HMGL} gr, @code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_pde_solve (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt) +@deftypefnx {C function} @code{HADT} mgl_pde_solve_c (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt) @end ifclear -Solves equation du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators. Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{Min}, @var{Max} set the bounding box for the solution. Note, that really this ranges are increased by factor 3/2 for purpose of reducing reflection from boundaries. Parameter @var{dz} set the step along evolutionary coordinate z. At this moment, simplified form of function @var{ham} is supported -- all ``mixed'' terms (like @samp{x*p}->x*d/dx) are excluded. For example, in 2D case this function is effectively @math{ham = f(p,z) + g(x,z,u)}. However commutable combinations (like @samp{x*q}->x*d/dy) are allowed. Here variable @samp{u} is used for field amplitude |u|. This allow one solve nonlinear problems -- for example, for nonlinear Shrodinger equation you may set @code{ham="p^2 + q^2 - u^2"}. You may specify imaginary part for wave absorption, like @code{ham = "p^2 + i*x*(x>0)"}, but only if dependence on variable @samp{i} is linear (i.e. @math{ham = hre+i*him}). @sref{PDE solving hints} +Solves equation du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators. Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{Min}, @var{Max} set the bounding box for the solution. Note, that really this ranges are increased by factor 3/2 for purpose of reducing reflection from boundaries. Parameter @var{dz} set the step along evolutionary coordinate z. At this moment, simplified form of function @var{ham} is supported -- all ``mixed'' terms (like @samp{x*p}->x*d/dx) are excluded. For example, in 2D case this function is effectively @math{ham = f(p,z) + g(x,z,u)}. However commutable combinations (like @samp{x*q}->x*d/dy) are allowed. Here variable @samp{u} is used for field amplitude |u|. This allow one solve nonlinear problems -- for example, for nonlinear Shrodinger equation you may set @code{ham="p^2 + q^2 - u^2"}. You may specify imaginary part for wave absorption, like @code{ham = "p^2 + i*x*(x>0)"}, but only if dependence on variable @samp{i} is linear (i.e. @math{ham = hre+i*him}). See also @ref{qo2d}, @ref{qo3d}. @sref{PDE solving hints} @end deftypefn @anchor{ray} @@ -1474,16 +1498,49 @@ Solves equation du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], where p=-i/k0*d/dx, q= Solves GO ray equation like dr/dt = d @var{ham}/dp, dp/dt = -d @var{ham}/dr. This is Hamiltonian equations for particle trajectory in 3D case. Here @var{ham} is Hamiltonian which may depend on coordinates @samp{x}, @samp{y}, @samp{z}, momentums @samp{p}=px, @samp{q}=py, @samp{v}=pz and time @samp{t}: @math{ham = H(x,y,z,p,q,v,t)}. The starting point (at @code{t=0}) is defined by variables @var{r0}, @var{p0}. Parameters @var{dt} and @var{tmax} specify the integration step and maximal time for ray tracing. Result is array of @{x,y,z,p,q,v,t@} with dimensions @{7 * int(@var{tmax}/@var{dt}+1) @}. @end deftypefn +@anchor{ode} +@deftypefn {MGL command} {} ode @sc{res} 'df' 'var' ini [@code{dt=0.1 tmax=10}] +@ifclear UDAV +@deftypefnx {Global function} @code{mglData} mglODE (@code{const char *}df, @code{const char *}var, @code{const mglDataA &}ini, @code{mreal} dt=@code{0.1}, @code{mreal} tmax=@code{10}) +@deftypefnx {C function} @code{HMDT} mgl_ode_solve_str (@code{const char *}df, @code{const char *}var, @code{HCDT} ini, @code{mreal} dt, @code{mreal} tmax) +@deftypefnx {C function} @code{HMDT} mgl_ode_solve (@code{void (*}df@code{)(const mreal *x, mreal *dx, void *par)}, @code{int} n, @code{const mreal *}ini, @code{mreal} dt, @code{mreal} tmax) +@deftypefnx {C function} @code{HMDT} mgl_ode_solve_ex (@code{void (*}df@code{)(const mreal *x, mreal *dx, void *par)}, @code{int} n, @code{const mreal *}ini, @code{mreal} dt, @code{mreal} tmax, @code{void (*}bord@code{)(mreal *x, const mreal *xprev, void *par)}) +@end ifclear +Solves ODE equations dx/dt = df(x). The functions @var{df} can be specified as string of ';'-separated textual formulas (argument @var{var} set the character ids of variables x[i]) or as callback function, which fill @code{dx} array for give @code{x}'s. Parameters @var{ini}, @var{dt}, @var{tmax} set initial values, time step and maximal time of the calculation. Result is data array with dimensions @{@var{n} * int(@var{tmax}/@var{dt}+1)@}. +@end deftypefn + @anchor{qo2d} @deftypefn {MGL command} {} qo2d @sc{res} 'ham' ini_re ini_im ray [@code{r=1 k0=100} xx yy] @ifclear UDAV -@deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}, @code{mglData *}xx=@code{0}, @code{mglData *}yy=@code{0}) +@deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) @deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglDataC} mglQO2dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglDataC} mglQO2dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) @deftypefnx {C function} @code{HMDT} mgl_qo2d_solve (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy) +@deftypefnx {C function} @code{HADT} mgl_qo2d_solve_c (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy) +@deftypefnx {C function} @code{HMDT} mgl_qo2d_func (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy) +@deftypefnx {C function} @code{HADT} mgl_qo2d_func_c (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy) +@end ifclear +Solves equation du/dt = i*k0*@var{ham}(p,q,x,y,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators (see @code{mglPDE()} for details). Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{ray} set the reference ray, i.e. the ray around which the accompanied coordinate system will be maked. You may use, for example, the array created by @ref{ray} function. Note, that the reference ray @strong{must be} smooth enough to make accompanied coodrinates unambiguity. Otherwise errors in the solution may appear. If @var{xx} and @var{yy} are non-zero then Cartesian coordinates for each point will be written into them. See also @ref{pde}, @ref{qo3d}. @sref{PDE solving hints} +@end deftypefn + + +@anchor{qo3d} +@deftypefn {MGL command} {} qo3d @sc{res} 'ham' ini_re ini_im ray [@code{r=1 k0=100} xx yy zz] +@ifclear UDAV +@deftypefnx {Global function} @code{mglData} mglQO3d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglData} mglQO3d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mglData &}zz, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglDataC} mglQO3dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglDataC} mglQO3dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mglData &}zz, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {C function} @code{HMDT} mgl_qo3d_solve (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz) +@deftypefnx {C function} @code{HADT} mgl_qo3d_solve_c (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz) +@deftypefnx {C function} @code{HMDT} mgl_qo3d_func (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz) +@deftypefnx {C function} @code{HADT} mgl_qo3d_func_c (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz) @end ifclear -Solves equation du/dt = i*k0*@var{ham}(p,q,x,y,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators (see @code{mglPDE()} for details). Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{ray} set the reference ray, i.e. the ray around which the accompanied coordinate system will be maked. You may use, for example, the array created by @code{mglRay()} function. Note, that the reference ray @strong{must be} smooth enough to make accompanied coodrinates unambiguity. Otherwise errors in the solution may appear. If @var{xx} and @var{yy} are non-zero then Cartesian coordinates for each point will be written into them. See also @code{mglPDE()}. @sref{PDE solving hints} +Solves equation du/dt = i*k0*@var{ham}(p,q,v,x,y,z,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy, v=-i/k0*d/dz are pseudo-differential operators (see @code{mglPDE()} for details). Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Parameters @var{ray} set the reference ray, i.e. the ray around which the accompanied coordinate system will be maked. You may use, for example, the array created by @ref{ray} function. Note, that the reference ray @strong{must be} smooth enough to make accompanied coodrinates unambiguity. Otherwise errors in the solution may appear. If @var{xx} and @var{yy} and @var{zz} are non-zero then Cartesian coordinates for each point will be written into them. See also @ref{pde}, @ref{qo2d}. @sref{PDE solving hints} @end deftypefn + @anchor{jacobian} @deftypefn {MGL command} {} jacobian @sc{res} xdat ydat [zdat] @ifclear UDAV @@ -1507,10 +1564,27 @@ Computes the Jacobian for transformation @{i,j,k@} to @{@var{x},@var{y},@var{z}@ Computes triangulation for arbitrary placed points with coordinates @{@var{x},@var{y}@} (i.e. finds triangles which connect points). MathGL use @uref{http://www.s-hull.org/,s-hull} code for triangulation. The sizes of 1st dimension @strong{must be equal} for all arrays @code{x.nx=y.nx}. Resulting array can be used in @ref{triplot} or @ref{tricont} functions for visualization of reconstructed surface. @sref{Making regular data} @end deftypefn +@ifclear UDAV + +@deftypefn {Global function} @code{mglData} mglGSplineInit (@code{const mglDataA &}x, @code{const mglDataA &}y) +@deftypefnx {Global function} @code{mglDataC} mglGSplineCInit (@code{const mglDataA &}x, @code{const mglDataA &}y) +@deftypefnx {C function} @code{HMDT} mgl_gspline_init (@code{HCDT} x, @code{HCDT} y) +@deftypefnx {C function} @code{HADT} mgl_gsplinec_init (@code{HCDT} x, @code{HCDT} y) +Prepare coefficients for global cubic spline interpolation. +@end deftypefn + +@deftypefn {Global function} @code{mreal} mglGSpline (@code{const mglDataA &}coef, @code{mreal} dx, @code{mreal *}d1=@code{0}, @code{mreal *}d2=@code{0}) +@deftypefnx {Global function} @code{dual} mglGSplineC (@code{const mglDataA &}coef, @code{mreal} dx, @code{dual *}d1=@code{0}, @code{dual *}d2=@code{0}) +@deftypefnx {C function} @code{mreal} mgl_gspline (@code{HCDT} coef, @code{mreal} dx, @code{mreal *}d1, @code{mreal *}d2) +@deftypefnx {C function} @code{dual} mgl_gsplinec (@code{HCDT} coef, @code{mreal} dx, @code{dual *}d1, @code{dual *}d2) +Evaluate global cubic spline (and its 1st and 2nd derivatives @var{d1}, @var{d2} if they are not @code{NULL}) using prepared coefficients @var{coef} at point @var{dx}+@var{x0} (where @var{x0} is 1st element of data @var{x} provided to @code{mglGSpline*Init()} function). +@end deftypefn + +@end ifclear @c ------------------------------------------------------------------ @external{} -@node Evaluate expression, MGL variables, Global functions, Data processing +@node Evaluate expression, Special data classes, Global functions, Data processing @section Evaluate expression @nav{} @@ -1567,49 +1641,82 @@ Evaluates the formula derivation respect to @var{dir} for variables in array @va @c ------------------------------------------------------------------ @external{} -@node MGL variables, , Evaluate expression, Data processing -@section MGL variables +@node Special data classes, , Evaluate expression, Data processing +@section Special data classes @nav{} + @ifset UDAV -For information about MGL variables see @ref{MGL definition}. +MGL use these special classes automatically. @end ifset @ifclear UDAV +This section describe special data classes @code{mglDataV}, @code{mglDataF}, @code{mglDataT} and @code{mglDataR} which sometime can noticeable speed up drawing or data handling. These classes are defined in @code{#include }. Note, that all plotting and data handling routines can be done using usual @code{mglData} or @code{mglDataC} classes. Also these special classes are usable in C++ code only. -Class mglVar represent MGL variables. It is needed for parsing MGL scripts (see @ref{mglParse class}). This class is derived from @code{mglData} and is defined in @code{#include }. - -@deftypecv {Variable} mglVar @code{std::wstring} s -Name of variable. -@end deftypecv - -@deftypecv {Variable} mglVar @code{mglVar *} next -@deftypecvx {Variable} mglVar @code{mglVar *} prev -Next and previous variable in the list. -@end deftypecv +@heading Class @code{mglDataV} +represent variable with values equidistantly distributed in given range. +@deftypefn {Constructor on @code{mglDataV}} @code{} mglDataV (@code{const mglDataV &} d) +Copy constructor. +@end deftypefn +@deftypefn {Constructor on @code{mglDataV}} @code{} mglDataV (@code{long} nx=@code{1}, @code{long} ny=@code{1}, @code{long} nz=@code{1}, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{NaN}, @code{char} dir=@code{'x'}) +Create variable with "sizes" @var{nx}x@var{ny}x@var{nz} which changes from @var{v1} to @var{v2} (or is constant if @var{v2}=@code{NaN}) along @var{dir} direction. +@end deftypefn +@deftypefn {Method on @code{mglDataV}} @code{void} Create (@code{long} nx=@code{1}, @code{long} ny=@code{1}, @code{long} nz=@code{1}) +Set "sizes" @var{nx}x@var{ny}x@var{nz}. +@end deftypefn +@deftypefn {Method on @code{mglDataV}} @code{void} Fill (@code{mreal} x1, @code{mreal} x2=@code{NaN}, @code{char} dir=@code{'x'}) +Set ranges of the variable. +@end deftypefn +@deftypefn {Method on @code{mglDataV}} @code{void} Freq (@code{mreal} dp, @code{char} dir=@code{'x'}) +Set as frequency variable with increment @var{dp}. +@end deftypefn -@deftypecv {Variable} mglVar @code{bool} temp -Flag of the temporary variable. If @code{true} the this variable will be removed after script execution. -@end deftypecv +@heading Class @code{mglDataF} +represent function which values are evaluated (instead of access to data array as in @code{mglData}). +@deftypefn {Constructor on @code{mglDataF}} @code{} mglDataF (@code{const mglDataF &} d) +Copy constructor. +@end deftypefn +@deftypefn {Constructor on @code{mglDataF}} @code{} mglDataF (@code{long} nx=@code{1}, @code{long} ny=@code{1}, @code{long} nz=@code{1}) +Create variable with "sizes" @var{nx}x@var{ny}x@var{nz} with zero function. +@end deftypefn +@deftypefn {Method on @code{mglDataF}} @code{void} Create (@code{long} nx=@code{1}, @code{long} ny=@code{1}, @code{long} nz=@code{1}) +Set "sizes" @var{nx}x@var{ny}x@var{nz}. +@end deftypefn +@deftypefn {Method on @code{mglDataF}} @code{void} SetRanges (@code{mglPoint} p1, @code{mglPoint} p2) +Set ranges for internal x,y,z variables. +@end deftypefn +@deftypefn {Method on @code{mglDataF}} @code{void} SetFormula (@code{const char *}func) +Set string which will be evaluated at function calls. Note this variant is about 10 times slower than @code{SetFunc}() one. +@end deftypefn +@deftypefn {Method on @code{mglDataF}} @code{void} SetFunc (@code{mreal (*}f@code{)(mreal x,mreal y,mreal z,void *p)}, @code{void *}p=@code{NULL}) +Set pointer to function which will be used for data. +@end deftypefn -@deftypecv {Variable} mglVar @code{void} @code{void (*}func@code{)(void *)} -Callback function, which will be called at variable destroying. -@end deftypecv +@heading Class @code{mglDataT} +represent named reference to column of another data array. +@deftypefn {Constructor on @code{mglDataT}} @code{} mglDataT (@code{const mglDataT &} d) +Copy constructor. +@end deftypefn +@deftypefn {Constructor on @code{mglDataT}} @code{} mglDataT (@code{const mglDataA &} d, @code{long} col=@code{0}) +Create variable which reference @var{col}-th column of data @var{d}. +@end deftypefn +@deftypefn {Method on @code{mglDataT}} @code{void} SetInd (@code{long} col, @code{wchar_t} name) +@deftypefnx {Method on @code{mglDataT}} @code{void} SetInd (@code{long} col, @code{const wchar_t *} name) +Set reference to another column of the same data and its name. +@end deftypefn -@deftypecv {Variable} mglVar @code{void *} o -Pointer to external object for callback function. -@end deftypecv -@deftypefn {Constructor on @code{mglVar}} @code{} mglVar () -Create variable with size 1*1*1. +@heading Class @code{mglDataR} +represent named reference to row of another data array. +@deftypefn {Constructor on @code{mglDataR}} @code{} mglDataR (@code{const mglDataR &} d) +Copy constructor. @end deftypefn - -@deftypefn {Destructor on @code{mglVar}} @code{} ~mglVar () -Deletes the instance of class mglVar. +@deftypefn {Constructor on @code{mglDataR}} @code{} mglDataR (@code{const mglDataA &} d, @code{long} row=@code{0}) +Create variable which reference @var{row}-th row of data @var{d}. @end deftypefn - -@deftypefn {Method on @code{mglVar}} @code{void} MoveAfter (@code{mglVar *}var) -Move variable after @var{var} in the list. +@deftypefn {Method on @code{mglDataR}} @code{void} SetInd (@code{long} row, @code{wchar_t} name) +@deftypefnx {Method on @code{mglDataR}} @code{void} SetInd (@code{long} row, @code{const wchar_t *} name) +Set reference to another row of the same data and its name. @end deftypefn @end ifclear diff --git a/texinfo/data_ru.texi b/texinfo/data_ru.texi index a5c82ca..01afc69 100644 --- a/texinfo/data_ru.texi +++ b/texinfo/data_ru.texi @@ -23,7 +23,7 @@ * Operators:: * Global functions:: * Evaluate expression:: -* MGL variables:: +* Special data classes:: @end menu @c ------------------------------------------------------------------ @@ -62,6 +62,19 @@ MGL не поддерживает прямой доступ к элемента Флаг использования указателя на внешние данные, включает запрет на удаление массива данных. @end deftypecv +@deftypecv {Variable} mglDataA @code{std::wstring} s +Имя массива данных, использующееся при разборе MGL скриптов. +@end deftypecv +@deftypecv {Variable} mglDataA @code{bool} temp +Флаг временной переменной, которая может быть удалена в любой момент. +@end deftypecv +@deftypecv {Variable} mglDataA @code{void (*)(void *)} func +Указатель на callback функцию, которая будет вызвана при удлалении данных. +@end deftypecv +@deftypecv {Variable} mglDataA @code{void *} o +Указатель для callback функции. +@end deftypecv + @deftypefn {Метод класса @code{mglData}} @code{mreal} GetVal (@code{long} i) @deftypefnx {Метод класса @code{mglDataC}} @code{mreal} GetVal (@code{long} i) @deftypefnx {Метод класса @code{mglData}} @code{void} SetVal (@code{mreal} val, @code{long} i) @@ -69,12 +82,9 @@ MGL не поддерживает прямой доступ к элемента Присваивает или возвращает значение используя "непрерывную" индексацию без проверки выхода за границы массива. Индекс @var{i} должен быть в диапазоне [0, nx*ny*nz-1]. @end deftypefn -@deftypefn {Метод класса @code{mglData}} @code{long} GetNx () -@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNx () -@deftypefnx {Метод класса @code{mglData}} @code{long} GetNy () -@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNy () -@deftypefnx {Метод класса @code{mglData}} @code{long} GetNz () -@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNz () +@deftypefn {Метод класса @code{mglDataA}} @code{long} GetNx () +@deftypefnx {Метод класса @code{mglDataA}} @code{long} GetNy () +@deftypefnx {Метод класса @code{mglDataA}} @code{long} GetNz () @deftypefnx {Функция С} @code{long} mgl_data_get_nx (@code{HCDT} dat) @deftypefnx {Функция С} @code{long} mgl_data_get_ny (@code{HCDT} dat) @deftypefnx {Функция С} @code{long} mgl_data_get_nz (@code{HCDT} dat) @@ -92,6 +102,16 @@ MGL не поддерживает прямой доступ к элемента @deftypefn {Функция С} @code{const mreal *} mgl_data_data (@code{HCDT} dat) Возвращает указатель на внутренний массив данных. @end deftypefn + +@deftypefn {Функция С} @code{void} mgl_data_set_func (@code{mglDataA *}dat, @code{void (*}func@code{)(void *)}, @code{void *}par) +Задает указатель на callback функцию, которая будет вызвана при удлалении данных. +@end deftypefn + +@deftypefn {Функция С} @code{void} mgl_data_set_name (@code{mglDataA *}dat, @code{const char *}name) +@deftypefnx {Функция С} @code{void} mgl_data_set_name_w (@code{mglDataA *}dat, @code{const wchar_t *}name) +Задает имя массива данных, использующееся при разборе MGL скриптов. +@end deftypefn + @end ifclear @c ------------------------------------------------------------------ @@ -528,6 +548,15 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v Заполняет значениями интерполяции массива @var{v} в точках @{@var{x}, @var{y}, @var{z}@}=@{@code{X[i], Y[j], Z[k]}@} (или @{@var{x}, @var{y}, @var{z}@}=@{@code{X[i,j,k], Y[i,j,k], Z[i,j,k]}@} если @var{x}, @var{y}, @var{z} не 1d массивы), где @code{X,Y,Z} равномерно распределены в диапазоне [@var{x1},@var{x2}]*[@var{y1},@var{y2}]*[@var{z1},@var{z2}] и имеют такой же размер как и заполняемый массив. Если параметр @var{sl} равен 0 или положительный, то изменятся будет только @var{sl}-ый срез. @end deftypefn +@anchor{gspline} +@deftypefn {MGL command} {} gspline dat xdat vdat [sl=-1] +@ifclear UDAV +@deftypefnx {Method on @code{mglData}} @code{void} RefillGS (@code{const mglDataA &}x, @code{const mglDataA &}v, @code{mreal} x1, @code{mreal} x2, @code{long} sl=@code{-1}) +@deftypefnx {C function} @code{void} mgl_data_refill_gs (@code{HMDT} a, @code{HCDT} x, @code{HCDT} v, @code{mreal} x1, @code{mreal} x2, @code{long} sl) +@end ifclear +Заполняет значениями глобального кубического сплайна для массива @var{v} в точках @var{x}=@code{X[i]}, где @code{X} равномерно распределен в диапазоне [@var{x1},@var{x2}] и имеет такой же размер как и заполняемый массив. Если параметр @var{sl} равен 0 или положительный, то изменятся будет только @var{sl}-ый срез. +@end deftypefn + @anchor{idset} @deftypefn {Команда MGL} {} idset dat 'ids' @ifclear UDAV @@ -611,8 +640,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @anchor{save} @deftypefn {Команда MGL} {} save dat 'fname' @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{void} Save (@code{const char *}fname, @code{int} ns=@code{-1}) @code{const} @deftypefnx {Функция С} @code{void} mgl_data_save (@code{HCDT} dat, @code{const char *}fname, @code{int} ns) @deftypefnx {Функция С} @code{void} mgl_datac_save (@code{HCDT} dat, @code{const char *}fname, @code{int} ns) @end ifclear @@ -633,8 +661,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @anchor{savehdf} @deftypefn {Команда MGL} {} savehdf dat 'fname' 'dname' @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{void} SaveHDF (@code{const char *}fname, @code{const char *}dname, @code{bool} rewrite=@code{false}) @code{const} @deftypefnx {Функция С} @code{void} mgl_data_save_hdf (@code{HCDT} dat, @code{const char *}fname, @code{const char *}dname, @code{int} rewrite) @deftypefnx {Функция С} @code{void} mgl_datac_save_hdf (@code{HCDT} dat, @code{const char *}fname, @code{const char *}dname, @code{int} rewrite) @end ifclear @@ -644,8 +671,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @anchor{datas} @deftypefn {Команда MGL} {} datas 'fname' @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{void} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} -@deftypefnx {Метод класса @code{mglDataC}} @code{int} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} +@deftypefnx {Метод класса @code{mglDataA}} @code{int} DatasHDF (@code{const char *}fname, @code{char *}buf, @code{long} size) @code{static} @deftypefnx {Функция С} @code{void} mgl_datas_hdf (@code{const char *}fname, @code{char *}buf, @code{long} size) @end ifclear Помещает имена массивов данных в HDF5 файле @var{fname} в строку @var{buf} разделёнными символом табуляции '\t'. В версии MGL имена массивов будут выведены как сообщение. Функция ничего не делает если библиотека была собрана без поддержки HDF5. @@ -663,7 +689,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @anchor{export} @deftypefn {Команда MGL} {} export dat 'fname' 'sch' [@code{v1=0 v2=0}] @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{void} Export (@code{const char *}fname, @code{const char *}scheme, @code{mreal} v1=@code{0}, mreal v2=@code{0}, @code{int} ns=@code{-1}) const +@deftypefnx {Метод класса @code{mglDataA}} @code{void} Export (@code{const char *}fname, @code{const char *}scheme, @code{mreal} v1=@code{0}, mreal v2=@code{0}, @code{int} ns=@code{-1}) const @deftypefnx {Функция С} @code{void} mgl_data_export (@code{HMDT} dat, @code{const char *}fname, @code{const char *}scheme, @code{mreal} v1, mreal v2, @code{int} ns) const @end ifclear Сохраняет данные в растровый файл. Числовые значения, нормированные в диапазон [@var{v1}, @var{v2}], преобразуются в RGB значения пикселов, используя цветовую схему @var{sch} (@pxref{Color scheme}). Если @var{v1}>=@var{v2}, то значения @var{v1}, @var{v2} определяются автоматически как минимальное и максимальное значение данных. @@ -1083,7 +1109,7 @@ These functions change the data in some direction like differentiations, integra @section Интерполяция @nav{} -Скрипты MGL могут использовать линейную интерполяцию с помощью команды @ref{subdata}, или кубические сплайны при использовании команды @ref{evaluate}. Также можно использовать @ref{resize} для массива с новыми размерами. +Скрипты MGL могут использовать интерполяцию кубическими сплайнами с помощью команд @ref{evaluate} или @ref{refill}. Также можно использовать @ref{resize} для массива с новыми размерами. @ifclear UDAV @@ -1153,11 +1179,10 @@ These functions change the data in some direction like differentiations, integra @anchor{info} @deftypefn {Команда MGL} {} info dat @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{const char *} PrintInfo () @code{const} -@deftypefnx {Метод класса @code{mglData}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{const char *} PrintInfo () @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{const char *} PrintInfo () @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{void} PrintInfo (@code{FILE *}fp) @code{const} @deftypefnx {Функция С} @code{const char *} mgl_data_info (@code{HCDT} dat) +@deftypefnx {Fortran процедура} @code{} mgl_data_info (@code{long} dat, @code{char *}out, @code{int} len) @end ifclear Возвращает строку с информацией о данных (размеры, моменты и пр.) или пишет её в файл. В MGL скрипте печатает её как сообщение. @end deftypefn @@ -1178,12 +1203,9 @@ These functions change the data in some direction like differentiations, integra @deftypefnx {MGL suffix} {(dat)} .ny @deftypefnx {MGL suffix} {(dat)} .nz @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{long} GetNx () -@deftypefnx {Метод класса @code{mglData}} @code{long} GetNy () -@deftypefnx {Метод класса @code{mglData}} @code{long} GetNz () -@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNx () -@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNy () -@deftypefnx {Метод класса @code{mglDataC}} @code{long} GetNz () +@deftypefnx {Метод класса @code{mglDataA}} @code{long} GetNx () +@deftypefnx {Метод класса @code{mglDataA}} @code{long} GetNy () +@deftypefnx {Метод класса @code{mglDataA}} @code{long} GetNz () @deftypefnx {Функция С} @code{long} mgl_data_get_nx (@code{HCDT} dat) @deftypefnx {Функция С} @code{long} mgl_data_get_ny (@code{HCDT} dat) @deftypefnx {Функция С} @code{long} mgl_data_get_nz (@code{HCDT} dat) @@ -1197,8 +1219,7 @@ These functions change the data in some direction like differentiations, integra @anchor{.max} @deftypefn {MGL suffix} {(dat)} .max @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{mreal} Maximal () @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Maximal () @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{mreal} Maximal () @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_max (@code{HCDT} dat) @end ifclear Возвращает максимальное значение массива данных. @@ -1208,26 +1229,22 @@ These functions change the data in some direction like differentiations, integra @anchor{.min} @deftypefn {MGL suffix} {(dat)} .min @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{mreal} Minimal () @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Minimal () @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{mreal} Minimal () @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_min (@code{HMDT} dat) @code{const} @end ifclear Возвращает минимальное значение массива данных. @end deftypefn @ifclear UDAV -@deftypefn {Метод класса @code{mglData}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefn {Метод класса @code{mglDataA}} @code{mreal} Minimal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_min_int (@code{HCDT} dat, @code{int} *i, @code{int} *j, @code{int} *k) Возвращает максимальное значение массива данных и сохраняет его положение в переменные @var{i}, @var{j}, @var{k}. @end deftypefn -@deftypefn {Метод класса @code{mglData}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefn {Метод класса @code{mglDataA}} @code{mreal} Maximal (@code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_max_int (@code{HCDT} dat, @code{int} *i, @code{int} *j, @code{int} *k) Возвращает минимальное значение массива данных и сохраняет его положение в переменные @var{i}, @var{j}, @var{k}. @end deftypefn -@deftypefn {Метод класса @code{mglData}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} +@deftypefn {Метод класса @code{mglDataA}} @code{mreal} Minimal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_min_real (@code{HCDT} dat, @code{mreal} *x, @code{mreal} *y, @code{mreal} *z) Возвращает максимальное значение массива данных и его приближенное (интерполированное) положение в переменные @var{x}, @var{y}, @var{z}. @end deftypefn @@ -1238,8 +1255,7 @@ These functions change the data in some direction like differentiations, integra @deftypefnx {MGL suffix} {(dat)} .my @deftypefnx {MGL suffix} {(dat)} .mz @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} -@deftypefnx {Метод класса @code{mglDataC}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{mreal} Maximal (@code{mreal} &x, @code{mreal} &y, @code{mreal} &z) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_max_real (@code{HCDT} dat, @code{mreal} *x, @code{mreal} *y, @code{mreal} *z) @end ifclear Возвращает минимальное значение массива данных и его приближенное (интерполированное) положение в переменные @var{x}, @var{y}, @var{z}. @@ -1269,8 +1285,8 @@ These functions change the data in some direction like differentiations, integra @deftypefnx {MGL suffix} {(dat)} .kz @deftypefnx {MGL suffix} {(dat)} .ka @ifclear UDAV -@deftypefnx {Метод класса @code{mglData}} @code{mreal} Momentum (@code{char} dir, @code{mreal} &a, @code{mreal} &w) @code{const} -@deftypefnx {Метод класса @code{mglData}} @code{mreal} Momentum (@code{char} dir, @code{mreal} &m, @code{mreal} &w, @code{mreal} &s, @code{mreal} &k) @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{mreal} Momentum (@code{char} dir, @code{mreal} &a, @code{mreal} &w) @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{mreal} Momentum (@code{char} dir, @code{mreal} &m, @code{mreal} &w, @code{mreal} &s, @code{mreal} &k) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_momentum_val (@code{HCDT} dat, @code{char} dir, @code{mreal} *a, @code{mreal} *w, @code{mreal} *s, @code{mreal} *k) @end ifclear Возвращает нулевой момент (энергию, @math{I=\sum a_i}) и записывает первый (среднее, @math{m = \sum \xi_i a_i/I}), второй (ширину, @math{w^2 = \sum (\xi_i-m)^2 a_i/I}), третий (асимметрия, @math{s = \sum (\xi_i-m)^3 a_i/ I w^3}) и четвёртый моменты (эксцесс, @math{k = \sum (\xi_i-m)^4 a_i / 3 I w^4})). Здесь @math{\xi} -- соответствующая координата если @var{dir} равно @samp{'x'}, @samp{'y'}, @samp{'z'}. В противном случае среднее, ширина, асимметрия, эксцесс равны @math{m = \sum a_i/N}, @math{w^2 = \sum (a_i-m)^2/N} и т.д. @@ -1280,7 +1296,7 @@ These functions change the data in some direction like differentiations, integra @deftypefn {MGL suffix} {(dat)} .fst @ifclear UDAV @cindex Find -@deftypefnx {Метод класса @code{mglData}} @code{mreal} Find (@code{const char *}cond, @code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{mreal} Find (@code{const char *}cond, @code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_first (@code{HCDT} dat, @code{const char *}cond, @code{int} *i, @code{int} *j, @code{int} *k) @end ifclear Находит положение (после заданного в @var{i}, @var{j}, @var{k}) первого не нулевого значения формулы @var{cond}. Функция возвращает найденное значение и записывает его положение в @var{i}, @var{j}, @var{k}. @@ -1290,19 +1306,19 @@ These functions change the data in some direction like differentiations, integra @deftypefn {MGL suffix} {(dat)} .lst @ifclear UDAV @cindex Last -@deftypefnx {Метод класса @code{mglData}} @code{mreal} Last (@code{const char *}cond, @code{int} &i, @code{int} &j, @code{int} &k) @code{const} +@deftypefnx {Метод класса @code{mglDataA}} @code{mreal} Last (@code{const char *}cond, @code{int} &i, @code{int} &j, @code{int} &k) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_last (@code{HCDT} dat, @code{const char *}cond, @code{int} *i, @code{int} *j, @code{int} *k) @end ifclear Находит положение (перед заданного в @var{i}, @var{j}, @var{k}) последнего не нулевого значения формулы @var{cond}. Функция возвращает найденное значение и записывает его положение в @var{i}, @var{j}, @var{k}. @end deftypefn @ifclear UDAV -@deftypefn {Метод класса @code{mglData}} @code{int} Find (@code{const char *}cond, @code{char} dir, @code{int} i=@code{0}, @code{int} j=@code{0}, @code{int} k=@code{0}) @code{const} +@deftypefn {Метод класса @code{mglDataA}} @code{int} Find (@code{const char *}cond, @code{char} dir, @code{int} i=@code{0}, @code{int} j=@code{0}, @code{int} k=@code{0}) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_find (@code{HCDT} dat, @code{const char *}cond, @code{int} i, @code{int} j, @code{int} k) Возвращает положение первого в направлении @var{dir} не нулевого значения формулы @var{cond}. Поиск начинается с точки @{i,j,k@}. @end deftypefn @cindex FindAny -@deftypefn {Метод класса @code{mglData}} @code{bool} FindAny (@code{const char *}cond) @code{const} +@deftypefn {Метод класса @code{mglDataA}} @code{bool} FindAny (@code{const char *}cond) @code{const} @deftypefnx {Функция С} @code{mreal} mgl_data_find_any (@code{HCDT} dat, @code{const char *}cond) Определяет есть ли хоть одно значение массива, удовлетворяющее условию @var{cond}. @end deftypefn @@ -1471,14 +1487,45 @@ These functions change the data in some direction like differentiations, integra Решает систему геометрооптических уравнений d@emph{r}/dt = d @var{ham}/d@emph{p}, d@emph{p}/dt = -d @var{ham}/d@emph{r}. Это гамильтоновы уравнения для траектории частицы в 3D случае. Гамильтониан @var{ham} может зависеть от координат @samp{x}, @samp{y}, @samp{z}, импульсов @samp{p}=px, @samp{q}=py, @samp{v}=pz и времени @samp{t}: @math{ham = H(x,y,z,p,q,v,t)}. Начальная точка (при @code{t=0}) задается переменными @{@var{x0}, @var{y0}, @var{z0}, @var{p0}, @var{q0}, @var{v0}@}. Параметры @var{dt} и @var{tmax} задают шаг и максимальное время интегрирования. Результат -- массив @{x,y,z,p,q,v,t@} с размером @{7 * int(@var{tmax}/@var{dt}+1) @}. @end deftypefn +@anchor{ode} +@deftypefn {MGL command} {} ode @sc{res} 'df' 'var' ini [@code{dt=0.1 tmax=10}] +@ifclear UDAV +@deftypefnx {Global function} @code{mglData} mglODE (@code{const char *}df, @code{const char *}var, @code{const mglDataA &}ini, @code{mreal} dt=@code{0.1}, @code{mreal} tmax=@code{10}) +@deftypefnx {C function} @code{HMDT} mgl_ode_solve_str (@code{const char *}df, @code{const char *}var, @code{HCDT} ini, @code{mreal} dt, @code{mreal} tmax) +@deftypefnx {C function} @code{HMDT} mgl_ode_solve (@code{void (*}df@code{)(const mreal *x, mreal *dx, void *par)}, @code{int} n, @code{const mreal *}ini, @code{mreal} dt, @code{mreal} tmax) +@deftypefnx {C function} @code{HMDT} mgl_ode_solve_ex (@code{void (*}df@code{)(const mreal *x, mreal *dx, void *par)}, @code{int} n, @code{const mreal *}ini, @code{mreal} dt, @code{mreal} tmax, @code{void (*}bord@code{)(mreal *x, const mreal *xprev, void *par)}) +@end ifclear +Решает систему обыкновенных дифференциальных уравнений dx/dt = df(x). Функции @var{df} могут быть заданны строкой с разделенными ';' формулами (аргумент @var{var} задает символы для переменных x[i]) или указателем на функцию, которая заполняет @code{dx} по заданным значениям @code{x}. Параметры @var{ini}, @var{dt}, @var{tmax} задают начальные значения, шаг и максимальное время интегрирования. Результат -- массив с размером @{@var{n} * int(@var{tmax}/@var{dt}+1)@}. +@end deftypefn + @anchor{qo2d} @deftypefn {Команда MGL} {} qo2d @sc{res} 'ham' ini_re ini_im ray [@code{r=1 k0=100} xx yy] @ifclear UDAV @deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}, @code{mglData *}xx=@code{0}, @code{mglData *}yy=@code{0}) @deftypefnx {Global function} @code{mglData} mglQO2d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglDataC} mglQO2dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglDataC} mglQO2dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) @deftypefnx {Функция С} @code{HMDT} mgl_qo2d_solve (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy) +@deftypefnx {Функция С} @code{HADT} mgl_qo2d_solve_c (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy) +@deftypefnx {Функция С} @code{HMDT} mgl_qo2d_func (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy) +@deftypefnx {Функция С} @code{HADT} mgl_qo2d_func_c (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy) @end ifclear -Решает уравнение в частных производных du/dt = i*k0*@var{ham}(p,q,x,y,|u|)[u] в сопровождающей системе координат, где p=-i/k0*d/dx, q=-i/k0*d/dy -- псевдо-дифференциальные операторы. Параметры @var{ini_re}, @var{ini_im} задают начальное распределение поля. Параметр @var{ray} задает опорный луч для сопровождающей системы координат. Можно использовать луч найденный с помощью @code{mglRay()}. Опорный луч должен быть достаточно гладкий, чтобы система координат была однозначной и для исключения ошибок интегрирования. Если массивы @var{xx} и @var{yy} указаны, то в них записываются декартовы координаты для каждой точки найденного решения. См. также @code{mglPDE()}. @sref{PDE solving hints} +Решает уравнение в частных производных du/dt = i*k0*@var{ham}(p,q,x,y,|u|)[u] в сопровождающей системе координат, где p=-i/k0*d/dx, q=-i/k0*d/dy -- псевдо-дифференциальные операторы. Параметры @var{ini_re}, @var{ini_im} задают начальное распределение поля. Параметр @var{ray} задает опорный луч для сопровождающей системы координат. Можно использовать луч найденный с помощью @ref{ray}. Опорный луч должен быть достаточно гладкий, чтобы система координат была однозначной и для исключения ошибок интегрирования. Если массивы @var{xx} и @var{yy} указаны, то в них записываются декартовы координаты для каждой точки найденного решения. См. также @ref{pde}, @ref{qo3d}. @sref{PDE solving hints} +@end deftypefn + +@anchor{qo3d} +@deftypefn {Команда MGL} {} qo3d @sc{res} 'ham' ini_re ini_im ray [@code{r=1 k0=100} xx yy zz] +@ifclear UDAV +@deftypefnx {Global function} @code{mglData} mglQO3d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglData} mglQO3d (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mglData &}zz, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglDataC} mglQO3dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Global function} @code{mglDataC} mglQO3dc (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{const mglDataA &}ray, @code{mglData &}xx, @code{mglData &}yy, @code{mglData &}zz, @code{mreal} r=@code{1}, @code{mreal} k0=@code{100}) +@deftypefnx {Функция С} @code{HMDT} mgl_qo3d_solve (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz) +@deftypefnx {Функция С} @code{HADT} mgl_qo3d_solve_c (@code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz) +@deftypefnx {Функция С} @code{HMDT} mgl_qo3d_func (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz) +@deftypefnx {Функция С} @code{HADT} mgl_qo3d_func_c (@code{dual (*}ham@code{)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par)}, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{HCDT} ray, @code{mreal} r, @code{mreal} k0, @code{HMDT} xx, @code{HMDT} yy, @code{HMDT} zz) +@end ifclear +Решает уравнение в частных производных du/dt = i*k0*@var{ham}(p,q,v,x,y,z,|u|)[u] в сопровождающей системе координат, где p=-i/k0*d/dx, q=-i/k0*d/dy, v=-i/k0*d/dz -- псевдо-дифференциальные операторы. Параметры @var{ini_re}, @var{ini_im} задают начальное распределение поля. Параметр @var{ray} задает опорный луч для сопровождающей системы координат. Можно использовать луч найденный с помощью @ref{ray}. Опорный луч должен быть достаточно гладкий, чтобы система координат была однозначной и для исключения ошибок интегрирования. Если массивы @var{xx}, @var{yy} и @var{zz} указаны, то в них записываются декартовы координаты для каждой точки найденного решения. См. также @ref{pde}, @ref{qo2d}. @end deftypefn @anchor{jacobian} @@ -1505,9 +1552,27 @@ These functions change the data in some direction like differentiations, integra @end deftypefn +@ifclear UDAV + +@deftypefn {Global function} @code{mglData} mglGSplineInit (@code{const mglDataA &}x, @code{const mglDataA &}y) +@deftypefnx {Global function} @code{mglDataC} mglGSplineCInit (@code{const mglDataA &}x, @code{const mglDataA &}y) +@deftypefnx {Функция С} @code{HMDT} mgl_gspline_init (@code{HCDT} x, @code{HCDT} y) +@deftypefnx {Функция С} @code{HADT} mgl_gsplinec_init (@code{HCDT} x, @code{HCDT} y) +Подготавливает коэффициенты для глобального кубического сплайна. +@end deftypefn + +@deftypefn {Global function} @code{mreal} mglGSpline (@code{const mglDataA &}coef, @code{mreal} dx, @code{mreal *}d1=@code{0}, @code{mreal *}d2=@code{0}) +@deftypefnx {Global function} @code{dual} mglGSplineC (@code{const mglDataA &}coef, @code{mreal} dx, @code{dual *}d1=@code{0}, @code{dual *}d2=@code{0}) +@deftypefnx {Функция С} @code{mreal} mgl_gspline (@code{HCDT} coef, @code{mreal} dx, @code{mreal *}d1, @code{mreal *}d2) +@deftypefnx {Функция С} @code{dual} mgl_gsplinec (@code{HCDT} coef, @code{mreal} dx, @code{dual *}d1, @code{dual *}d2) +Вычисляет глобальный кубический сплайн (а также 1ую и 2ую производные @var{d1}, @var{d2} если они не @code{NULL}), используя коэффициенты @var{coef} в точке @var{dx}+@var{x0} (здесь @var{x0} -- 1ый элемент массива @var{x} в функции @code{mglGSpline*Init()}). +@end deftypefn + +@end ifclear + @c ------------------------------------------------------------------ @external{} -@node Evaluate expression, MGL variables, Global functions, Data processing +@node Evaluate expression, Special data classes, Global functions, Data processing @section Вычисление выражений @nav{} @@ -1561,49 +1626,81 @@ These functions change the data in some direction like differentiations, integra @c ------------------------------------------------------------------ @external{} -@node MGL variables, , Evaluate expression, Data processing -@section Переменные MGL +@node Special data classes, , Evaluate expression, Data processing +@section Special data classes @nav{} @ifset UDAV -Для информации о переменных MGL см. @ref{MGL definition}. +MGL использует специальные классы автоматически. @end ifset @ifclear UDAV +Раздел описывает специальные классы данных @code{mglDataV}, @code{mglDataF}, @code{mglDataT} и @code{mglDataR}, которые могут заметно ускорить рисование и обработку данных. Классы определены в @code{#include }. Отмечу, что все функции рисования и обработки данных можно выполнить используя только основные классы @code{mglData} и/или @code{mglDataC}. Также специальные классы доступны только в коде на С++. -Класс mglVar содержит переменную/массив скрипта MGL и используется при разборе MGL скриптов (см. @ref{mglParse class}). Это класс наследник @code{mglData} и определен в @code{#include }. - -@deftypecv {Variable} mglVar @code{std::wstring} s -Имя переменной в скрипте. -@end deftypecv - -@deftypecv {Variable} mglVar @code{mglVar *} next -@deftypecvx {Variable} mglVar @code{mglVar *} prev -Следующая и предыдущая переменная в списке. -@end deftypecv +@heading Класс @code{mglDataV} +представляет переменную со значениями равнораспределенными в заданном интервале. +@deftypefn {Конструктор @code{mglDataV}} @code{} mglDataV (@code{const mglDataV &} d) +Конструктор копирования. +@end deftypefn +@deftypefn {Конструктор @code{mglDataV}} @code{} mglDataV (@code{long} nx=@code{1}, @code{long} ny=@code{1}, @code{long} nz=@code{1}, @code{mreal} v1=@code{0}, @code{mreal} v2=@code{NaN}, @code{char} dir=@code{'x'}) +Создает переменную "размером" @var{nx}x@var{ny}x@var{nz}, изменяющуюся от @var{v1} до @var{v2} (или постоянную при @var{v2}=@code{NaN}) вдоль направления @var{dir}. +@end deftypefn +@deftypefn {Метод класса @code{mglDataV}} @code{void} Create (@code{long} nx=@code{1}, @code{long} ny=@code{1}, @code{long} nz=@code{1}) +Задает "размеры" переменной @var{nx}x@var{ny}x@var{nz}. +@end deftypefn +@deftypefn {Метод класса @code{mglDataV}} @code{void} Fill (@code{mreal} x1, @code{mreal} x2=@code{NaN}, @code{char} dir=@code{'x'}) +Задает диапазон изменения переменной. +@end deftypefn +@deftypefn {Метод класса @code{mglDataV}} @code{void} Freq (@code{mreal} dp, @code{char} dir=@code{'x'}) +Задает переменную для частоты с шагом @var{dp}. +@end deftypefn -@deftypecv {Variable} mglVar @code{bool} temp -Флаг временной переменной. Если @code{true}, то переменная будет удалена после выполнения скрипта. -@end deftypecv +@heading Класс @code{mglDataF} +представляет функцию, которая будет вызываться вместо обращения к элементам массива (как в классе @code{mglData}). +@deftypefn {Конструктор @code{mglDataF}} @code{} mglDataF (@code{const mglDataF &} d) +Конструктор копирования. +@end deftypefn +@deftypefn {Конструктор @code{mglDataF}} @code{} mglDataF (@code{long} nx=@code{1}, @code{long} ny=@code{1}, @code{long} nz=@code{1}) +Создает данные "размером" @var{nx}x@var{ny}x@var{nz} с нулевой функцией. +@end deftypefn +@deftypefn {Метод класса @code{mglDataF}} @code{void} Create (@code{long} nx=@code{1}, @code{long} ny=@code{1}, @code{long} nz=@code{1}) +Задает "размеры" данных @var{nx}x@var{ny}x@var{nz}. +@end deftypefn +@deftypefn {Метод класса @code{mglDataF}} @code{void} SetRanges (@code{mglPoint} p1, @code{mglPoint} p2) +Задает диапазоны изменения внутренних переменных x,y,z. +@end deftypefn +@deftypefn {Метод класса @code{mglDataF}} @code{void} SetFormula (@code{const char *}func) +Задает строку, которая будет разобрана в функцию. Это вариант более чем 10 раз медленнее в сравнении с @code{SetFunc}(). +@end deftypefn +@deftypefn {Метод класса @code{mglDataF}} @code{void} SetFunc (@code{mreal (*}f@code{)(mreal x,mreal y,mreal z,void *p)}, @code{void *}p=@code{NULL}) +Задает указатель на функцию, которая будет использована вместо доступа к элементам массива. +@end deftypefn -@deftypecv {Variable} mglVar @code{void (*}func@code{)(void *)} -Callback функция, вызываемая при удалении переменной. -@end deftypecv +@heading Класс @code{mglDataT} +представляет именнованную ссылку на столбец в другом массиве данных. +@deftypefn {Конструктор @code{mglDataT}} @code{} mglDataT (@code{const mglDataT &} d) +Конструктор копирования. +@end deftypefn +@deftypefn {Конструктор @code{mglDataT}} @code{} mglDataT (@code{const mglDataA &} d, @code{long} col=@code{0}) +Создает ссылку на @var{col}-ый столбец данных @var{d}. +@end deftypefn +@deftypefn {Метод класса @code{mglDataT}} @code{void} SetInd (@code{long} col, @code{wchar_t} name) +@deftypefnx {Метод класса @code{mglDataT}} @code{void} SetInd (@code{long} col, @code{const wchar_t *} name) +Задает ссылку на другой столбец того же массива данных. +@end deftypefn -@deftypecv {Variable} mglVar @code{void *} o -Указатель на внешний объект, передаваемый callback функции. -@end deftypecv -@deftypefn {Constructor on @code{mglVar}} @code{} mglVar () -Создает переменную с размерами 1*1*1. +@heading Класс @code{mglDataR} +представляет именнованную ссылку на строку в другом массиве данных. +@deftypefn {Конструктор @code{mglDataR}} @code{} mglDataR (@code{const mglDataR &} d) +Конструктор копирования. @end deftypefn - -@deftypefn {Destructor on @code{mglVar}} @code{} ~mglVar () -Удаляет переменную mglVar. +@deftypefn {Конструктор @code{mglDataR}} @code{} mglDataR (@code{const mglDataA &} d, @code{long} row=@code{0}) +Создает ссылку на @var{row}-ую строку данных @var{d}. @end deftypefn - -@deftypefn {Метод класса @code{mglVar}} @code{void} MoveAfter (@code{mglVar *}var) -Перемещает переменную после @var{var} в списке переменных. +@deftypefn {Метод класса @code{mglDataR}} @code{void} SetInd (@code{long} row, @code{wchar_t} name) +@deftypefnx {Метод класса @code{mglDataR}} @code{void} SetInd (@code{long} row, @code{const wchar_t *} name) +Задает ссылку на другой столбец того же массива данных. @end deftypefn @end ifclear diff --git a/texinfo/doc_en.texi b/texinfo/doc_en.texi index 3dcd007..1e46da6 100644 --- a/texinfo/doc_en.texi +++ b/texinfo/doc_en.texi @@ -72,44 +72,45 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c MathGL -
- - +@comment
+@comment +@comment + @end html @end macro @macro external {} @html -
- - -
- - -
+@comment
+@comment +@comment +@comment
+@comment +@comment +@comment