From: Dimitrios Eftaxiopoulos Date: Sat, 18 Jul 2015 14:33:41 +0000 (+0300) Subject: Imported Upstream version 2.3.3 X-Git-Tag: archive/raspbian/2.5-2+rpi1^2~26^2~9 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b5a917861ca65c6b83b35380084e8647bc224eaf;p=mathgl.git Imported Upstream version 2.3.3 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index b369da1..2aae334 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,8 @@ 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_VERSION_MAJOR 2) +set(MathGL_VERSION_MINOR 3.3) set(MathGL_SOVERSION 7.4.0) @@ -60,6 +60,7 @@ ENDMACRO(MGL_DEPENDENT_OPTION) include(CMakeDependentOption) set(MGL_LIB_INSTALL_DIR "lib" CACHE STRING "Set library install directory") +string(TIMESTAMP MGL_NIGHT "%d.%m.%y") option(enable-double "Enable double precision in MathGL library" ON) option(enable-mpi "Enable mpi") @@ -133,9 +134,8 @@ if(NOT WIN32) set(MGL_MAN_PATH "${CMAKE_INSTALL_PREFIX}/share/man") set(MGL_INFO_PATH "${CMAKE_INSTALL_PREFIX}/share/info") set(MGL_FONT_PATH "${MGL_DATA_PATH}/fonts") - install(DIRECTORY fonts/ DESTINATION ${MGL_FONT_PATH} - PATTERN ".svn" EXCLUDE - PATTERN "*.vfm") +else(NOT WIN32) + set(MGL_FONT_PATH "${CMAKE_INSTALL_PREFIX}/fonts") endif(NOT WIN32) include(CheckFunctionExists) @@ -164,7 +164,11 @@ if(HAVE_MEMRCHR) ADD_DEFINITIONS(-DHAVE_MEMRCHR) endif(HAVE_MEMRCHR) +include(CheckTypeSize) +check_type_size("long" SIZEOF_LONG) + include(CheckCXXSourceCompiles) +unset(MGL_HAVE_C99_COMPLEX) CHECK_CXX_SOURCE_COMPILES( "#include #include @@ -175,12 +179,16 @@ 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) + +unset(MGL_HAVE_NAN_INF) 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) + +unset(MGL_HAVE_ATTRIBUTE) CHECK_CXX_SOURCE_COMPILES( "int __attribute__((pure)) test1() {return 0;} int __attribute__((const)) test2(int x) {return x*x;} @@ -188,6 +196,8 @@ 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) + +unset(MGL_HAVE_TYPEOF) 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) @@ -195,7 +205,7 @@ if(NOT MGL_HAVE_TYPEOF) set(MGL_HAVE_TYPEOF 0) endif(NOT MGL_HAVE_TYPEOF) -#unset(MGL_HAVE_C99_COMPLEX) +unset(MGL_HAVE_RVAL) CHECK_CXX_SOURCE_COMPILES( "struct test { test() {} test(test&& a){} }; int main() { test t; return 0; }" MGL_HAVE_RVAL) @@ -505,6 +515,7 @@ if(NOT enable-lgpl) endif(enable-python OR enable-lua OR enable-octave) if(NOT MSVC AND NOT BORLAND) add_subdirectory( utils ) + add_subdirectory( fonts ) endif(NOT MSVC AND NOT BORLAND) # add_subdirectory( mgllab ) endif(NOT enable-lgpl) @@ -521,3 +532,9 @@ endif(NOT MSVC AND NOT BORLAND) if(enable-mgltex) add_subdirectory( mgltex ) endif(enable-mgltex) + +if(WIN32) + install(FILES ${CMAKE_SOURCE_DIR}/FindMathGL2.cmake DESTINATION ${CMAKE_INSTALL_PREFIX} RENAME mathgl2-config.cmake) +else(WIN32) + install(FILES ${CMAKE_SOURCE_DIR}/FindMathGL2.cmake DESTINATION ${MGL_LIB_INSTALL_DIR}/cmake/mathgl2/ RENAME mathgl2-config.cmake) +endif(WIN32) diff --git a/ChangeLog.txt b/ChangeLog.txt index 716ad27..3add637 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,9 +1,44 @@ +2.3.3 Released 01 June 2015 + +* Add SurfCA() and Surf3CA() plots +* Add wavelet transforms +* Add AttachLight() for attaching light settings to inplots +* Add manual rotation angle for axis ticks (by "value" option) +* Add mglDataS class which is similar to std::vector one. +* Add missing mglDataC functions + +* Add style '%' for color scheme along 2 coordinates (as in Map()) +* If tick template start with '&' then long integer is passed instead of double. +* Add style 'V' for drawing text centered vertically. +* Add style "dN" in Smooth() for averaging over (2*N+1)-th points. +* Add TeX symbols "\quote", "--" and Cyrillic ones. + +* Add complex numbers in MGL -- any expression started with '!' will have complex value(s) +* Add 'rkstep' command for Runge-Kutta step in MGL script +* Add functions 'min()', 'max()' to MGL parser and formula evaluation. +* MGL command 'join' now can join arbitrary number of data arrays. +* Command 'stop' is not required to be placed before 'func' +* Add warning about writing to temporary arrays in MGL scripts +* Names 'rnd','nan','inf' are reserved in MGL scripts now. + +* Add annotation for plot styles and options into header files. +* Greatly improve the speed of formula parsing for MGL scripts +* Update JS interface +* Add binary font files for speeding up initialization and font loading +* Exclude "pure" attribute for function due to compatibility reasons +* Add mgl_set_size_scl() for additional scaling width and height of the image +* Add options -S, -q for mglconv +* Rearrange toolbuttons in UDAV. +* Bugfix for Flow() and Pipe() functions +* Other minor improvements, bugfixes and compatibility changes + 2.3.2 Released 2 February 2015 * Update mgltex (thanks to Diego Sejas Viscarra) * Add reading files with complex numbers by 'read' command. * Parallelize reading textual data files. * Add 'i','j','k' variables for data filling. +* Add 2-color style for candle and ohlc plot. * Add saving images in QMathGL even if corresponding format support is disabled. * Add cmake option MGL_DEF_FONT to change default font name or use built-in one (if MGL_DEF_FONT is empty). * Compatibility changes and bugfixes. diff --git a/FindMathGL2.cmake b/FindMathGL2.cmake index 43b8640..ec5ba2d 100644 --- a/FindMathGL2.cmake +++ b/FindMathGL2.cmake @@ -16,10 +16,14 @@ # # 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 +# find_package(MathGL2 REQUIRED) - v.2.* (no interfaces), required +# find_package(MathGL2 2.1 REQUIRED Qt) - v.2.1 + Qt interface, required +# find_package(MathGL2 2.1 REQUIRED) - v.2.1 (no interfaces), required +# find_package(MathGL2 2.0 COMPONENTS Qt WX) - v.2.0 + Qt and WX interfaces, optional +# find_package(MathGL2 2.1) - v.2.1 (no interfaces), optional +# +# Note, some cmake builds require to write "COMPONENTS" always, like +# find_package(MathGL2 REQUIRED COMPONENTS Qt) - v.2.* + Qt interface, required # # Typical usage could be something like this: # find_package(MathGL 2.1 GLUT REQUIRED) @@ -69,11 +73,39 @@ IF(MATHGL2_INCLUDE_DIR) 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") + SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error") ENDIF() ELSE() - MESSAGE(FATAL_ERROR "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found") + SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found") ENDIF() + IF(_ERR_MESSAGE) + UNSET(_ERR_MESSAGE) + SET(_CONFIG_FILE_PATH "${MATHGL2_INCLUDE_DIR}/mgl2/config.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() + SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error") + ENDIF() + ELSE() + SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found") + ENDIF() + ENDIF(_ERR_MESSAGE) + + if(_ERR_MESSAGE) + MESSAGE(FATAL_ERROR ${_ERR_MESSAGE}) + endif(_ERR_MESSAGE) ENDIF() INCLUDE(FindPackageHandleStandardArgs) @@ -84,10 +116,10 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(MathGL2 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) - + # TODO find qt.h for qt4 and qt5 !!! FIND_PATH(MATHGL2_${_COMPONENT}_INCLUDE_DIR NAMES mgl2/${_component}.h PATHS ${MATHGL2_INCLUDE_DIR} NO_DEFAULT_PATH) @@ -98,7 +130,7 @@ FOREACH(_Component ${MathGL2_FIND_COMPONENTS}) 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}) diff --git a/cmake-qt4.txt b/cmake-qt4.txt index 462e1f8..a5d389e 100644 --- a/cmake-qt4.txt +++ b/cmake-qt4.txt @@ -1,8 +1,8 @@ set(MGL_HAVE_QT4 1) if(enable-json-sample) -FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtNetwork QtWebKit) +FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtNetwork QtWebKit QtOpenGL) else(enable-json-sample) -FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui) +FIND_PACKAGE(Qt4 4.8 REQUIRED QtCore QtGui QtOpenGL) endif(enable-json-sample) if(NOT QT4_FOUND) message(SEND_ERROR "Couldn't find Qt4 library.") diff --git a/cmake-qt5.txt b/cmake-qt5.txt index 49caf21..c4b5bbf 100644 --- a/cmake-qt5.txt +++ b/cmake-qt5.txt @@ -3,6 +3,10 @@ find_package(Qt5Core REQUIRED) find_package(Qt5Widgets REQUIRED) find_package(Qt5Gui REQUIRED) find_package(Qt5PrintSupport REQUIRED) +find_package(Qt5OpenGL REQUIRED) +if(NOT Qt5OpenGL_FOUND) + message(SEND_ERROR "Couldn't find Qt5 OpenGL library.") +endif(NOT Qt5OpenGL_FOUND) if(NOT Qt5Core_FOUND) message(SEND_ERROR "Couldn't find Qt5 Core library.") endif(NOT Qt5Core_FOUND) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 74ac689..517162d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -27,10 +27,21 @@ if(enable-qt) if(enable-qt5) include(../cmake-qt5.txt) target_link_libraries(mgl_qt_example mgl-qt5) + qt5_wrap_cpp(qgl_moc_src qgl_example.h ) else(enable-qt5) include(../cmake-qt4.txt) target_link_libraries(mgl_qt_example mgl-qt4) + qt4_wrap_cpp(qgl_moc_src qgl_example.h ) endif(enable-qt5) + add_executable(mgl_qgl_example wnd_samples.cpp qgl_example.cpp ${qgl_moc_src} ${MGL_MOC_EX_FILES}) + if(enable-qt5) + target_link_libraries(mgl_qgl_example mgl) + qt5_use_modules(mgl_qgl_example Core Widgets Gui OpenGL) + else(enable-qt5) + target_link_libraries(mgl_qgl_example mgl) + target_link_libraries(mgl_qgl_example ${QT_LIBRARIES}) + endif(enable-qt5) + endif(enable-qt) if(MGL_HAVE_LTDL) diff --git a/examples/fltk_example.cpp b/examples/fltk_example.cpp index 646373a..e4a8013 100644 --- a/examples/fltk_example.cpp +++ b/examples/fltk_example.cpp @@ -41,7 +41,7 @@ void *calc(void *) for(int i=0;i<10;i++) // do calculation { long_calculations(); // which can be very long - pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1); + pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1); if(gr) { gr->Clf(); // make new drawing @@ -70,7 +70,7 @@ int main(int argc,char **argv) for(int i=0;i<10;i++) // do calculation { long_calculations();// which can be very long - pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1); + pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1); gr.Clf(); // make new drawing gr.Line(mglPoint(),pnt,"Ar2"); char str[10] = "i=0"; str[3] = '0'+i; diff --git a/examples/full_test.cpp b/examples/full_test.cpp index 4f2a465..d34f80a 100644 --- a/examples/full_test.cpp +++ b/examples/full_test.cpp @@ -25,6 +25,7 @@ #endif #include "mgl2/mgl.h" +#include "mgl2/font.h" #include "mgl2/eval.h" //----------------------------------------------------------------------------- void mgl_create_cpp_font(HMGL gr, const wchar_t *how); @@ -64,6 +65,12 @@ void mgls_prepare3v(mglData *ex, mglData *ey, mglData *ez); void save(mglGraph *gr,const char *name,const char *suf); void test(mglGraph *gr) { + gr->Line(mglPoint(-1,-1),mglPoint(1,1)); + gr->Axis(); + gr->WriteEPS("1.eps"); + gr->WriteTEX("1.tex"); + gr->WriteSVG("1.svg"); + return; mglParse par; par.Execute(gr,"load '/home/balakin/mathgl-code/mathgl-2x/build/examples/libmgl_module.so':baxis\n"); // par.Execute(gr,"subplot 1 1 0:#rotate 40 60\nperspective 1.22:box:axis\n"); @@ -103,6 +110,7 @@ static struct option longopts[] = { "font", no_argument, &dotest, 2 }, { "time", no_argument, &dotest, 3 }, { "fexport",no_argument, &dotest, 4 }, + { "textbl", no_argument, &dotest, 5 }, { "thread", required_argument, NULL, 't' }, { "verbose",no_argument, &verbose, 1 }, { "width", required_argument, NULL, 'w' }, @@ -370,6 +378,15 @@ void smgl_fexport(mglGraph *gr) // test file export gr->ImportMGLD("fexport.mgld"); } //----------------------------------------------------------------------------- +extern mglTeXsymb mgl_tex_symb[]; +extern long mgl_tex_num; +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; + return wcscmp(aa->tex, bb->tex); +} +//----------------------------------------------------------------------------- int main(int argc,char **argv) { mgl_suppress_warn(true); @@ -431,8 +448,6 @@ int main(int argc,char **argv) { 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}; @@ -468,6 +483,20 @@ int main(int argc,char **argv) } fprintf(fp,"\n@end multitable\n"); fclose(fp); } + else if(dotest==4) + { smgl_fexport(gr); delete gr; return 0; } + else if(dotest==5) + { + size_t i=0; while(mgl_tex_symb[i].tex[0]) i++; + if(mgl_tex_num!=i) printf("real=%lu, set=%ld\n",i,mgl_tex_num); + for(size_t i=0;mgl_tex_symb[i].tex[0];i++) + { + mglTeXsymb tst, *rts; tst.tex = mgl_tex_symb[i].tex; + rts = (mglTeXsymb *) bsearch(&tst, mgl_tex_symb, mgl_tex_num, sizeof(mglTeXsymb), mgl_tex_symb_cmp); + if(!rts) printf("Bad '%ls' at %lu\n",mgl_tex_symb[i].tex,i); + } + delete gr; return 0; + } if(type==15 || type==16) big=3; // save mini version for json @@ -485,7 +514,7 @@ int main(int argc,char **argv) setlocale(LC_CTYPE, ""); char *buf = new char[strlen(s->mgl)+strlen(mmgl_dat_prepare)+1]; strcpy(buf,s->mgl); strcat(buf,mmgl_dat_prepare); - printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl); + if(type!=7) printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl); par.Execute(gr,buf); delete []buf; const char *mess = gr->Message(); if(*mess) printf("Warnings: %s\n-------\n",mess); @@ -512,7 +541,7 @@ int main(int argc,char **argv) setlocale(LC_CTYPE, ""); char *buf = new char[strlen(s->mgl)+strlen(mmgl_dat_prepare)+1]; strcpy(buf,s->mgl); strcat(buf,mmgl_dat_prepare); - printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl); + if(type!=7) printf("\n-------\n%s\n-------\n",verbose?buf:s->mgl); par.Execute(gr,buf); delete []buf; const char *mess = gr->Message(); if(*mess) printf("Warnings: %s\n-------\n",mess); diff --git a/examples/glut_example.cpp b/examples/glut_example.cpp index 077c480..1ae89b6 100644 --- a/examples/glut_example.cpp +++ b/examples/glut_example.cpp @@ -41,7 +41,7 @@ void *calc(void *) for(int i=0;i<10;i++) // do calculation { sleep(1); // which can be very long - pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1); + pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1); printf("i=%d, gr=%p\n",i,gr); fflush(stdout); if(gr) { diff --git a/examples/qgl_example.cpp b/examples/qgl_example.cpp new file mode 100644 index 0000000..c606a3a --- /dev/null +++ b/examples/qgl_example.cpp @@ -0,0 +1,61 @@ +/*************************************************************************** + * qt_example.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 General Public License as published by * + * the Free Software Foundation; either version 2 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 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 "qgl_example.h" +#include +//----------------------------------------------------------------------------- +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} +//----------------------------------------------------------------------------- +MainWindow::MainWindow(QWidget *parent) : QGLWidget(parent) { gr=0; } +//----------------------------------------------------------------------------- +MainWindow::~MainWindow() { if(gr) delete gr; } +//----------------------------------------------------------------------------- +void MainWindow::initializeGL() +{ + if(gr) delete gr; + gr = new mglGraph(1); +} +//----------------------------------------------------------------------------- +void MainWindow::paintGL() +{ + gr->Clf(); + gr->Rotate(40,5); + gr->Light(true); + gr->AddLight(0,mglPoint(0,0,10),mglPoint(0,0,-1)); + gr->Axis(); + gr->Box(); + gr->FPlot("sin(pi*x)","i2"); + gr->FPlot("cos(pi*x)","|"); + gr->FSurf("cos(2*pi*(x^2+y^2))"); + gr->Finish(); + swapBuffers(); +} +//----------------------------------------------------------------------------- +void MainWindow::resizeGL(int w, int h) +{ + QGLWidget::resizeGL(w, h); + glViewport (0, 0, w, h); +} +//----------------------------------------------------------------------------- diff --git a/examples/qgl_example.h b/examples/qgl_example.h new file mode 100644 index 0000000..1d3ca0f --- /dev/null +++ b/examples/qgl_example.h @@ -0,0 +1,22 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +//#include +#include +#include +#include + +class MainWindow : public QGLWidget +{ + Q_OBJECT +protected: + mglGraph *gr; + void resizeGL(int nWidth, int nHeight); // Метод вызываемый после каждого изменения размера окна + void paintGL(); // Метод для вывода изображения на экран +void initializeGL(); // Метод для инициализирования opengl +public: + MainWindow(QWidget *parent = 0); + ~MainWindow(); +}; + +#endif // MAINWINDOW_H diff --git a/examples/qt_example.cpp b/examples/qt_example.cpp index 58a7f9c..5fd80e9 100644 --- a/examples/qt_example.cpp +++ b/examples/qt_example.cpp @@ -41,7 +41,7 @@ void *calc(void *) for(int i=0;i<10;i++) // do calculation { long_calculations(); // which can be very long - pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1); + pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1); if(gr) { gr->Clf(); // make new drawing @@ -75,7 +75,7 @@ void Foo::Calc() for(int i=0;i<30;i++) // do calculation { long_calculations(); // which can be very long - pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1); + pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1); Gr->Update(); // update window } } diff --git a/examples/samples.cpp b/examples/samples.cpp index c3a939b..f023900 100644 --- a/examples/samples.cpp +++ b/examples/samples.cpp @@ -557,18 +557,19 @@ void smgl_alpha(mglGraph *gr) // alpha and lighting gr->Box(); gr->Light(false); gr->Surf(a); } //----------------------------------------------------------------------------- -const char *mmgl_schemes="call 'sch' 0 'kw'\ncall 'sch' 1 'wk'\ncall 'sch' 2 'kHCcw'\ncall 'sch' 3 'kBbcw'\n" +const char *mmgl_schemes="new x 100 100 'x':new y 100 100 'y'\n" +"call 'sch' 0 'kw'\ncall 'sch' 1 '%gbrw'\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 '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" +"stop\nfunc 'sch' 2\nsubplot 2 10 $1 '<>_^' 0.2 0:surfa x y $2\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); + mglData a(256,2), b(256,2); a.Fill(-1,1); b.Fill(-1,1,'y'); 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,1,NULL,0.2); gr->SurfA(a,b,"%gbrw"); gr->Puts(0.57, 0.92, "%gbrw", "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"); @@ -928,8 +929,11 @@ void smgl_tens(mglGraph *gr) 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'"; +"subplot 2 2 2 '':title '\"i\" style':box:region y1 y2 'ir':plot y1 'k2':plot y2 'k2'\n" +"subplot 2 2 3 '^_':title '3d variant':rotate 40 60:box\n" +"new x1 100 'sin(pi*x)':new y1 100 'cos(pi*x)':new z 100 'x'\n" +"new x2 100 'sin(pi*x+pi/3)':new y2 100 'cos(pi*x+pi/3)'\n" +"plot x1 y1 z 'r2':plot x2 y2 z 'b2'\nregion x1 y1 z x2 y2 z 'cmy!'"; void smgl_region(mglGraph *gr) { mglData y; mgls_prepare1d(&y); @@ -938,8 +942,13 @@ void smgl_region(mglGraph *gr) gr->Box(); gr->Region(y1,y2); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); if(big==3) return; gr->SubPlot(2,2,1,""); gr->Title("2 colors"); gr->Box(); gr->Region(y1,y2,"yr"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); - gr->SubPlot(2,2,2,""); gr->Title("'!' style"); gr->Box(); gr->Region(y1,y2,"!"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); - gr->SubPlot(2,2,3,""); gr->Title("'i' style"); gr->Box(); gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); + gr->SubPlot(2,2,2,""); gr->Title("'i' style"); gr->Box(); gr->Region(y1,y2,"ir"); gr->Plot(y1,"k2"); gr->Plot(y2,"k2"); + gr->SubPlot(2,2,3,"^_"); gr->Title("3d variant"); gr->Rotate(40,60); gr->Box(); + gr->Fill(y1,"cos(pi*x)"); gr->Fill(y2,"cos(pi*x+pi/3)"); + mglData x1(y1.nx), x2(y1.nx), z(y1.nx); + gr->Fill(x1,"sin(pi*x)"); gr->Fill(x2,"sin(pi*x+pi/3)"); gr->Fill(z,"x"); + gr->Plot(x1,y1,z,"r2"); gr->Plot(x2,y2,z,"b2"); + gr->Region(x1,y1,z,x2,y2,z,"cmy!"); } //----------------------------------------------------------------------------- const char *mmgl_stem="call 'prepare1d'\norigin 0 0 0:subplot 2 2 0 '':title 'Stem plot (default)':box:stem y\n" @@ -1585,35 +1594,30 @@ void smgl_several_light(mglGraph *gr) // several light sources gr->Box(); gr->Surf(a,"h"); } //----------------------------------------------------------------------------- -const char *mmgl_light="light on:quality 6\ncall 'prepare2d'\n" +const char *mmgl_light="light on:attachlight on\ncall 'prepare2d'\n" "subplot 2 2 0:title 'Default':rotate 50 60:box:surf a\nline -1 -0.7 1.7 -1 -0.7 0.7 'BA'\n\n" -"light 0 1 0 1 -2 -1 -1\nsubplot 2 2 1:title 'Local':rotate 50 60:box:surf a\n" -"line 1 0 1 -1 -1 0 'BAO'\n\n" -"diffuse 0\nsubplot 2 2 2:title 'no diffuse':rotate 50 60:box:surf a\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'"; +"subplot 2 2 1:title 'Local':rotate 50 60\nlight 0 1 0 1 -2 -1 -1\nline 1 0 1 -1 -1 0 'BAO':box:surf a\n\n" +"subplot 2 2 2:title 'no diffuse':rotate 50 60\ndiffuse 0\nline 1 0 1 -1 -1 0 'BAO':box:surf a\n\n" +"subplot 2 2 3:title 'diffusive only':rotate 50 60\ndiffuse 0.5:light 0 1 0 1 -2 -1 -1 'w' 0\n" +"line 1 0 1 -1 -1 0 'BAO':box:surf a"; void smgl_light(mglGraph *gr) // local light sources { mglData a; mgls_prepare2d(&a); + gr->Light(true); gr->AttachLight(true); if(big==3) - { gr->Light(true); gr->Rotate(50,60); gr->Box(); gr->Surf(a); return; } - int qual = gr->GetQuality(); - gr->Light(true); gr->SetQuality(6); - gr->SubPlot(2,2,0); gr->Title("Default"); gr->Rotate(50,60); gr->Box(); gr->Surf(a); - gr->Line(mglPoint(-1,-0.7,1.7),mglPoint(-1,-0.7,0.7),"BA"); + { gr->Rotate(50,60); gr->Box(); gr->Surf(a); return; } + gr->SubPlot(2,2,0); gr->Title("Default"); gr->Rotate(50,60); + gr->Line(mglPoint(-1,-0.7,1.7),mglPoint(-1,-0.7,0.7),"BA"); gr->Box(); gr->Surf(a); + gr->SubPlot(2,2,1); gr->Title("Local"); gr->Rotate(50,60); gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1)); - gr->SubPlot(2,2,1); gr->Title("Local"); gr->Rotate(50,60); gr->Box(); gr->Surf(a); - gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO"); + gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO"); gr->Box(); gr->Surf(a); + gr->SubPlot(2,2,2); gr->Title("no diffuse"); gr->Rotate(50,60); gr->SetDiffuse(0); - gr->SubPlot(2,2,2); gr->Title("no diffuse"); gr->Rotate(50,60); gr->Box(); gr->Surf(a); - gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO"); + gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO"); gr->Box(); gr->Surf(a); + gr->SubPlot(2,2,3); gr->Title("diffusive only"); gr->Rotate(50,60); gr->SetDiffuse(0.5); gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1),'w',0); - gr->SubPlot(2,2,3); gr->Title("diffusive only"); gr->Rotate(50,60); gr->Box(); gr->Surf(a); - gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO"); - gr->SetQuality(qual); + gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO"); gr->Box(); gr->Surf(a); } //----------------------------------------------------------------------------- const char *mmgl_surf3="call 'prepare3d'\nlight on:alpha on\n" @@ -1651,6 +1655,15 @@ void smgl_surf3c(mglGraph *gr) gr->Box(); gr->Surf3C(c,d); } //----------------------------------------------------------------------------- +const char *mmgl_surf3ca="call 'prepare3d'\ntitle 'Surf3CA plot':rotate 50 60:light on:alpha on:box:surf3ca c d c"; +void smgl_surf3ca(mglGraph *gr) +{ + mglData c,d; mgls_prepare3d(&c,&d); + if(big!=3) gr->Title("Surf3CA plot"); + gr->Rotate(50,60); gr->Light(true); gr->Alpha(true); + gr->Box(); gr->Surf3CA(c,d,c); +} +//----------------------------------------------------------------------------- const char *mmgl_cut="call 'prepare2d'\ncall 'prepare3d'\nsubplot 2 2 0:title 'Cut on (default)':rotate 50 60:light on:box:surf a; zrange -1 0.5\n" "subplot 2 2 1:title 'Cut off':rotate 50 60:box:surf a; zrange -1 0.5; cut off\n" "subplot 2 2 2:title 'Cut in box':rotate 50 60:box:alpha on\ncut 0 -1 -1 1 0 1.1:surf3 c\ncut 0 0 0 0 0 0\t# restore back\n" @@ -1728,8 +1741,8 @@ void smgl_parser(mglGraph *gr) // example of MGL parsing double a[100]; // let a_i = sin(4*pi*x), x=0...1 for(int i=0;i<100;i++)a[i]=sin(4*M_PI*i/99); mglParse *parser = new mglParse; - mglData *d = parser->AddVar("dat"); - d->Set(a,100); // set data to variable + mglData *d = dynamic_cast(parser->AddVar("dat")); + if(d) d->Set(a,100); // set data to variable parser->Execute(gr, "plot dat; xrange 0 1\nbox\naxis"); // you may break script at any line do something // and continue after that @@ -1777,6 +1790,14 @@ void smgl_surfc(mglGraph *gr) gr->Light(true); gr->Box(); gr->SurfC(a,b); } //----------------------------------------------------------------------------- +const char *mmgl_surfca="call 'prepare2d'\ntitle 'SurfCA plot':rotate 50 60:light on:alpha on:box:surfca a b a"; +void smgl_surfca(mglGraph *gr) +{ + mglData a,b; mgls_prepare2d(&a,&b); + if(big!=3) gr->Title("SurfCA plot"); gr->Rotate(50,60); + gr->Alpha(true); gr->Light(true); gr->Box(); gr->SurfCA(a,b,a); +} +//----------------------------------------------------------------------------- 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) { @@ -1820,21 +1841,21 @@ void smgl_boxs(mglGraph *gr) gr->Rotate(50,60); gr->Box(); gr->Tile(a); } //----------------------------------------------------------------------------- -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 'k. '\n" +const char *mmgl_fit="new dat 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 dat 'a+b*sin(c*x)' 'abc' ini\n" +"title 'Fitting sample':yrange -2 2:box:axis:plot dat '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'"; void smgl_fit(mglGraph *gr) // nonlinear fitting { - mglData rnd(100), in(100), res; - gr->Fill(rnd,"0.4*rnd+0.1+sin(2*pi*x)"); + mglData dat(100), in(100), res; + gr->Fill(dat,"0.4*rnd+0.1+sin(2*pi*x)"); gr->Fill(in,"0.3+sin(2*pi*x)"); double ini[3] = {1,1,3}; mglData Ini(3,ini); - res = gr->Fit(rnd, "a+b*sin(c*x)", "abc", Ini); + res = gr->Fit(dat, "a+b*sin(c*x)", "abc", Ini); if(big!=3) gr->Title("Fitting sample"); - gr->SetRange('y',-2,2); gr->Box(); gr->Plot(rnd, "k. "); + gr->SetRange('y',-2,2); gr->Box(); gr->Plot(dat, "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"); @@ -2685,8 +2706,10 @@ mglSample samp[] = { {"surf3", smgl_surf3, mmgl_surf3}, {"surf3a", smgl_surf3a, mmgl_surf3a}, {"surf3c", smgl_surf3c, mmgl_surf3c}, + {"surf3ca", smgl_surf3ca, mmgl_surf3ca}, {"surfa", smgl_surfa, mmgl_surfa}, {"surfc", smgl_surfc, mmgl_surfc}, + {"surfca", smgl_surfca, mmgl_surfca}, {"table", smgl_table, mmgl_table}, {"tape", smgl_tape, mmgl_tape}, {"tens", smgl_tens, mmgl_tens}, diff --git a/examples/wnd_samples.cpp b/examples/wnd_samples.cpp index a2a69d1..8506f40 100644 --- a/examples/wnd_samples.cpp +++ b/examples/wnd_samples.cpp @@ -406,19 +406,19 @@ int sample_d(mglGraph *gr) gr->NewFrame(); gr->Box(); gr->Axis("xy"); - gr->Puts(mglPoint(0,1.2,1),"Vector field (color ~ \\sqrt{a^2})","rC",8); + gr->Puts(mglPoint(0,1.2,1),"Vector field (color ~ \\sqrt{a^2})",":rC",8); gr->Vect(a,b,"","value 50"); gr->EndFrame(); gr->NewFrame(); gr->Box(); gr->Axis("xy"); - gr->Puts(mglPoint(0,1.2,1),"Vector field (length ~ \\sqrt{a^2})","rC",8); + gr->Puts(mglPoint(0,1.2,1),"Vector field (length ~ \\sqrt{a^2})",":rC",8); gr->Vect(a,b); gr->EndFrame(); gr->NewFrame(); gr->Box(); gr->Axis("xy"); - gr->Puts(mglPoint(0,1.2,1),"Flow chart (blue - source)","rC",8); + gr->Puts(mglPoint(0,1.2,1),"Flow chart (blue - source)",":rC",8); gr->Flow(a,b); gr->EndFrame(); diff --git a/fonts/CMakeLists.txt b/fonts/CMakeLists.txt new file mode 100644 index 0000000..b3428f8 --- /dev/null +++ b/fonts/CMakeLists.txt @@ -0,0 +1,20 @@ +configure_file(${MathGL_SOURCE_DIR}/texinfo/version.texi.in ${MathGL_BINARY_DIR}/texinfo/version.texi) + +set(MGL_FONTS STIX adventor bonum cursor heroscn heros pagella schola termes) +set(MGL_FONTS_BIN ) +set(MGL_FONTS_SRC ) + +foreach(SAMPLE ${MGL_FONTS}) + set(MGL_FONTS_BIN ${MGL_FONTS_BIN} ${MathGL_BINARY_DIR}/fonts/${SAMPLE}.vfmb) + add_custom_command(OUTPUT ${MathGL_BINARY_DIR}/fonts/${SAMPLE}.vfmb + COMMAND make_bin -p ${MathGL_SOURCE_DIR}/fonts/ -o ${MathGL_BINARY_DIR}/fonts/${SAMPLE}.vfmb ${SAMPLE} + DEPENDS ${SAMPLE}.vfm + WORKING_DIRECTORY ${MGL_OUT} ) +endforeach(SAMPLE) + +add_custom_target(fonts ALL DEPENDS ${MGL_FONTS_BIN}) + +install(DIRECTORY ${MathGL_BINARY_DIR}/fonts/ DESTINATION ${MGL_FONT_PATH} + PATTERN "*[mM]ake*" EXCLUDE + PATTERN ".svn" EXCLUDE + PATTERN "*.vfmb") diff --git a/fonts/adventor.vfm b/fonts/adventor.vfm new file mode 100644 index 0000000..22b9ea7 Binary files /dev/null and b/fonts/adventor.vfm differ diff --git a/fonts/adventor_b.vfm b/fonts/adventor_b.vfm new file mode 100644 index 0000000..c2eac39 Binary files /dev/null and b/fonts/adventor_b.vfm differ diff --git a/fonts/adventor_bi.vfm b/fonts/adventor_bi.vfm new file mode 100644 index 0000000..30ffd68 Binary files /dev/null and b/fonts/adventor_bi.vfm differ diff --git a/fonts/adventor_i.vfm b/fonts/adventor_i.vfm new file mode 100644 index 0000000..b885858 Binary files /dev/null and b/fonts/adventor_i.vfm differ diff --git a/fonts/bonum.vfm b/fonts/bonum.vfm new file mode 100644 index 0000000..c6aa626 Binary files /dev/null and b/fonts/bonum.vfm differ diff --git a/fonts/bonum_b.vfm b/fonts/bonum_b.vfm new file mode 100644 index 0000000..bc58c44 Binary files /dev/null and b/fonts/bonum_b.vfm differ diff --git a/fonts/bonum_bi.vfm b/fonts/bonum_bi.vfm new file mode 100644 index 0000000..e4197a0 Binary files /dev/null and b/fonts/bonum_bi.vfm differ diff --git a/fonts/bonum_i.vfm b/fonts/bonum_i.vfm new file mode 100644 index 0000000..12aecf0 Binary files /dev/null and b/fonts/bonum_i.vfm differ diff --git a/fonts/chorus.vfm b/fonts/chorus.vfm new file mode 100644 index 0000000..ee1b049 Binary files /dev/null and b/fonts/chorus.vfm differ diff --git a/fonts/cursor.vfm b/fonts/cursor.vfm new file mode 100644 index 0000000..e11ac80 Binary files /dev/null and b/fonts/cursor.vfm differ diff --git a/fonts/cursor_b.vfm b/fonts/cursor_b.vfm new file mode 100644 index 0000000..ab7145a Binary files /dev/null and b/fonts/cursor_b.vfm differ diff --git a/fonts/cursor_bi.vfm b/fonts/cursor_bi.vfm new file mode 100644 index 0000000..763bc0a Binary files /dev/null and b/fonts/cursor_bi.vfm differ diff --git a/fonts/cursor_i.vfm b/fonts/cursor_i.vfm new file mode 100644 index 0000000..ef4aff1 Binary files /dev/null and b/fonts/cursor_i.vfm differ diff --git a/fonts/heros.vfm b/fonts/heros.vfm new file mode 100644 index 0000000..5f40a94 Binary files /dev/null and b/fonts/heros.vfm differ diff --git a/fonts/heros_b.vfm b/fonts/heros_b.vfm new file mode 100644 index 0000000..0fab5dd Binary files /dev/null and b/fonts/heros_b.vfm differ diff --git a/fonts/heros_bi.vfm b/fonts/heros_bi.vfm new file mode 100644 index 0000000..92e5d31 Binary files /dev/null and b/fonts/heros_bi.vfm differ diff --git a/fonts/heros_i.vfm b/fonts/heros_i.vfm new file mode 100644 index 0000000..94e487b Binary files /dev/null and b/fonts/heros_i.vfm differ diff --git a/fonts/heroscn.vfm b/fonts/heroscn.vfm new file mode 100644 index 0000000..342334f Binary files /dev/null and b/fonts/heroscn.vfm differ diff --git a/fonts/heroscn_b.vfm b/fonts/heroscn_b.vfm new file mode 100644 index 0000000..06e7aa3 Binary files /dev/null and b/fonts/heroscn_b.vfm differ diff --git a/fonts/heroscn_bi.vfm b/fonts/heroscn_bi.vfm new file mode 100644 index 0000000..bcc180b Binary files /dev/null and b/fonts/heroscn_bi.vfm differ diff --git a/fonts/heroscn_i.vfm b/fonts/heroscn_i.vfm new file mode 100644 index 0000000..c20bdfd Binary files /dev/null and b/fonts/heroscn_i.vfm differ diff --git a/fonts/pagella.vfm b/fonts/pagella.vfm new file mode 100644 index 0000000..87a0061 Binary files /dev/null and b/fonts/pagella.vfm differ diff --git a/fonts/pagella_b.vfm b/fonts/pagella_b.vfm new file mode 100644 index 0000000..8da8bd1 Binary files /dev/null and b/fonts/pagella_b.vfm differ diff --git a/fonts/pagella_bi.vfm b/fonts/pagella_bi.vfm new file mode 100644 index 0000000..4f47168 Binary files /dev/null and b/fonts/pagella_bi.vfm differ diff --git a/fonts/pagella_i.vfm b/fonts/pagella_i.vfm new file mode 100644 index 0000000..bd0dc24 Binary files /dev/null and b/fonts/pagella_i.vfm differ diff --git a/fonts/schola.vfm b/fonts/schola.vfm new file mode 100644 index 0000000..ee36d40 Binary files /dev/null and b/fonts/schola.vfm differ diff --git a/fonts/schola_b.vfm b/fonts/schola_b.vfm new file mode 100644 index 0000000..84d58f7 Binary files /dev/null and b/fonts/schola_b.vfm differ diff --git a/fonts/schola_bi.vfm b/fonts/schola_bi.vfm new file mode 100644 index 0000000..5b009ce Binary files /dev/null and b/fonts/schola_bi.vfm differ diff --git a/fonts/schola_i.vfm b/fonts/schola_i.vfm new file mode 100644 index 0000000..87710b8 Binary files /dev/null and b/fonts/schola_i.vfm differ diff --git a/fonts/termes.vfm b/fonts/termes.vfm new file mode 100644 index 0000000..2e0404d Binary files /dev/null and b/fonts/termes.vfm differ diff --git a/fonts/termes_b.vfm b/fonts/termes_b.vfm new file mode 100644 index 0000000..5039e9b Binary files /dev/null and b/fonts/termes_b.vfm differ diff --git a/fonts/termes_bi.vfm b/fonts/termes_bi.vfm new file mode 100644 index 0000000..67110c6 Binary files /dev/null and b/fonts/termes_bi.vfm differ diff --git a/fonts/termes_i.vfm b/fonts/termes_i.vfm new file mode 100644 index 0000000..ec85e7e Binary files /dev/null and b/fonts/termes_i.vfm differ diff --git a/include/config.h.in b/include/config.h.in index 51d3730..483e6b6 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -1,6 +1,8 @@ #ifndef _MGL_CONFIG_H_ #define _MGL_CONFIG_H_ +#define MGL_VER2 ${MathGL_VERSION_MINOR} // minor version of MathGL 2.* (like 1.3 for v.2.1.3) + #define MGL_USE_DOUBLE ${MGL_USE_DOUBLE} #ifdef WIN32 // a man ask to use built-in font under Windows @@ -23,6 +25,7 @@ #define MGL_HAVE_C99_COMPLEX ${MGL_HAVE_C99_COMPLEX} #endif +#define MGL_SIZEOF_LONG ${SIZEOF_LONG} #define MGL_HAVE_LTDL ${MGL_HAVE_LTDL} #define MGL_HAVE_RVAL ${MGL_HAVE_RVAL} #define MGL_HAVE_ZLIB ${MGL_HAVE_ZLIB} diff --git a/include/mgl2/abstract.h b/include/mgl2/abstract.h index 86041a6..d6eb494 100644 --- a/include/mgl2/abstract.h +++ b/include/mgl2/abstract.h @@ -45,6 +45,13 @@ typedef const mglDataA* HCDT; #ifdef __cplusplus extern "C" { #endif +/// Set seed for random numbers +void MGL_EXPORT mgl_srnd(long seed); +void MGL_EXPORT mgl_srnd_(int *seed); +/// Get random number +double MGL_EXPORT mgl_rnd(); +double MGL_EXPORT mgl_rnd_(); + /// 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); diff --git a/include/mgl2/addon.h b/include/mgl2/addon.h index 5896c36..801054c 100644 --- a/include/mgl2/addon.h +++ b/include/mgl2/addon.h @@ -40,9 +40,9 @@ 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 -long MGL_EXPORT_PURE mgl_strpos(const char *str,char *fnd); +long MGL_EXPORT mgl_strpos(const char *str,char *fnd); /// Get position of symbol or return -1 if not found -long MGL_EXPORT_PURE mgl_chrpos(const char *str,char fnd); +long MGL_EXPORT 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); diff --git a/include/mgl2/base.h b/include/mgl2/base.h index 40244fc..9526e7f 100644 --- a/include/mgl2/base.h +++ b/include/mgl2/base.h @@ -120,9 +120,6 @@ struct MGL_EXPORT mglMatrix bool norot; // flag to disable pnts rotation mglMatrix() { memset(this,0,sizeof(mglMatrix)); clear(); } mglMatrix(const mglMatrix &aa) : x(aa.x),y(aa.y),z(aa.z),pf(aa.pf),norot(aa.norot) { memcpy(b,aa.b,9*sizeof(mreal)); } -#if MGL_HAVE_RVAL - mglMatrix(mglMatrix &&aa) : x(aa.x),y(aa.y),z(aa.z),pf(aa.pf),norot(aa.norot) { memcpy(b,aa.b,9*sizeof(mreal)); } -#endif void Rotate(mreal tetz,mreal tetx,mreal tety); void RotateN(mreal Tet,mreal x,mreal y,mreal z); inline void clear() { x=y=z=pf=0; memset(b,0,9*sizeof(mreal)); b[0]=b[4]=b[8]=1; norot=false; } @@ -156,14 +153,43 @@ struct MGL_EXPORT mglPrim // NOTE: use float for reducing memory size }; mglPrim(int t=0):n1(0),n2(0),n3(0),n4(0),type(t),angl(0),id(0),z(0),w(0),m(0) {} mglPrim(const mglPrim &aa) : n1(aa.n1),n2(aa.n2),n3(aa.n3),n4(aa.n4),type(aa.type),angl(aa.angl),id(aa.id),z(aa.z),w(aa.w),m(aa.m) {} -#if MGL_HAVE_RVAL - mglPrim(mglPrim &&aa) : n1(aa.n1),n2(aa.n2),n3(aa.n3),n4(aa.n4),type(aa.type),angl(aa.angl),id(aa.id),z(aa.z),w(aa.w),m(aa.m) {} -#endif const mglPrim &operator=(const mglPrim &aa) { memcpy(this, &aa, sizeof(mglPrim)); return aa; } }; bool operator<(const mglPrim &a,const mglPrim &b); bool operator>(const mglPrim &a,const mglPrim &b); //----------------------------------------------------------------------------- +/// Structure for light source +struct MGL_EXPORT mglLight +{ + 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) {} + + bool n; ///< Availability of light sources + mglPoint d; ///< Direction of light sources + mglPoint r; ///< Position of light sources (NAN for infinity) + mglPoint q; ///< Actual position of light sources (filled by LightScale() function) + mglPoint p; ///< Actual direction of light sources (filled by LightScale() function) + mreal a; ///< Aperture of light sources + mreal b; ///< Brightness of light sources + mglColor c; ///< Color of light sources +}; +//----------------------------------------------------------------------------- +/// Structure for inplot +struct MGL_EXPORT mglBlock +{ + int id; ///< object id + long n1,n2,n3,n4; ///< coordinates of corners {n1=x1,n2=x2,n3=y1,n4=y2} + + mglLight light[10]; ///< Light sources + mreal AmbBr; ///< Default ambient light brightness + mreal DifBr; ///< Default diffusive light brightness + mglMatrix B; ///< Transformation matrix + + mglBlock():id(0),n1(0),n2(0),n3(0),n4(0),AmbBr(0.5),DifBr(0.5) {} + mglBlock(const mglBlock &aa) { memcpy(this, &aa, sizeof(mglBlock)); } + const mglBlock &operator=(const mglBlock &aa) { memcpy(this, &aa, sizeof(mglBlock)); return aa; } +}; +//----------------------------------------------------------------------------- /// Structure for group of primitives struct MGL_EXPORT mglGroup { @@ -196,27 +222,31 @@ struct MGL_EXPORT mglText /// Structure for internal point representation struct MGL_EXPORT mglPnt // NOTE: use float for reducing memory size { - float xx,yy,zz; // original coordinates - float x,y,z; // coordinates - float c,t,ta; // index in color scheme - float u,v,w; // normales - float r,g,b,a; // RGBA color + union { float dat[16]; struct { + float x,y,z; // coordinates + float u,v,w; // normales + float r,g,b,a; // RGBA color + float xx,yy,zz; // original coordinates + float c,t,ta; // index in color scheme + }; }; short sub; // subplot id and rotation information (later will be in subplot) - 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; } + mglPnt(float X, 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):x(X),y(Y),z(Z),u(U),v(V),w(W),r(R),g(G),b(B),a(A),xx(X),yy(Y),zz(Z),c(0),t(0),ta(0),sub(0) {} + mglPnt():x(0),y(0),z(0),u(0),v(0),w(0),r(0),g(0),b(0),a(0),xx(0),yy(0),zz(0),c(0),t(0),ta(0),sub(0) {} + mglPnt(const mglPnt &aa) : sub(aa.sub) { memcpy(dat,aa.dat,16*sizeof(float)); } + inline const mglPnt&operator=(const mglPnt &aa) { sub=aa.sub; memcpy(dat,aa.dat,16*sizeof(float)); return aa; } }; inline mglPnt operator+(const mglPnt &a, const mglPnt &b) -{ 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); } +{ mglPnt p; for(long i=0;i<10;i++) p.dat[i] = a.dat[i]+b.dat[i]; p.sub=a.sub; return p; } +//{ 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) -{ 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); } +{ mglPnt p; for(long i=0;i<10;i++) p.dat[i] = a.dat[i]-b.dat[i]; p.sub=a.sub; return p; } +//{ 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) -{ 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); } +{ mglPnt p; for(long i=0;i<10;i++) p.dat[i] = a.dat[i]*b; p.sub=a.sub; return p; } +//{ 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) -{ 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); } +{ mglPnt p; for(long i=0;i<10;i++) p.dat[i] = a.dat[i]*b; p.sub=a.sub; return p; } +//{ 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 @@ -362,7 +392,7 @@ public: inline void SetCut(bool val) { set(val, MGL_ENABLE_CUT); } /// Set additional cutting box inline void SetCutBox(mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2) - { CutMin=mglPoint(x1,y1,z1); CutMax=mglPoint(x2,y2,z2); } + { CutMin.Set(x1,y1,z1); CutMax.Set(x2,y2,z2); } inline void SetCutBox(mglPoint v1, mglPoint v2) { CutMin=v1; CutMax=v2; } /// Reset mask to solid state inline void ResetMask() { mask = MGL_SOLID_MASK; MaskAn = DefMaskAn; } @@ -372,6 +402,9 @@ public: /// Set the using of light on/off. virtual bool Light(bool enable) { bool t=get(MGL_ENABLE_LIGHT); set(enable,MGL_ENABLE_LIGHT); return t; } + /// Set to attach light sources to inplot. + virtual bool AttachLight(bool enable) + { bool t=get(MGL_LOCAL_LIGHT); set(enable,MGL_LOCAL_LIGHT); return t; } /// Set ambient light brightness virtual void SetAmbient(mreal bright=0.5); /// Set diffusive light brightness @@ -546,7 +579,7 @@ public: void SetEventFunc(void (*func)(void *), void *par) { event_cb=func; event_par=par; } protected: - bool Stop; ///< Flag that execution should be terminated. + volatile 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 @@ -561,7 +594,7 @@ protected: 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 Sub; ///< InPlot regions std::vector Ptx; ///< Text labels for mglPrim std::vector Leg; ///< Text labels for legend std::vector Glf; ///< Glyphs data @@ -579,8 +612,8 @@ protected: mreal pPos; ///< Current position in pen mask mreal PenWidth; ///< Pen width for further line plotting (must be >0 !!!) // long numT; ///< Number of textures - mreal AmbBr; ///< Default ambient light brightness - mreal DifBr; ///< Default diffusive light brightness + mreal AmbBr; ///< Default ambient light brightness // TODO move to mglBlock + mreal DifBr; ///< Default diffusive light brightness // TODO move to mglBlock mreal persp; ///< Original value for perspective mglMatrix Bp; ///< Transformation matrix for View() and Zoom() diff --git a/include/mgl2/base_cf.h b/include/mgl2/base_cf.h index e8d37b7..786afa4 100644 --- a/include/mgl2/base_cf.h +++ b/include/mgl2/base_cf.h @@ -32,20 +32,20 @@ int MGL_EXPORT mgl_check_version_(const char *ver, int); void MGL_EXPORT mgl_suppress_warn(int on); void MGL_EXPORT mgl_suppress_warn_(int *on); /// Get last warning code -int MGL_EXPORT_PURE mgl_get_warn(HMGL gr); -int MGL_EXPORT_PURE mgl_get_warn_(uintptr_t *gr); +int MGL_EXPORT mgl_get_warn(HMGL gr); +int MGL_EXPORT 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); /// Get text of warning message(s) -MGL_EXPORT_PURE const char *mgl_get_mess(HMGL gr); +MGL_EXPORT 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_PURE const char *mgl_get_plotid(HMGL gr); +MGL_EXPORT const char *mgl_get_plotid(HMGL gr); int MGL_EXPORT mgl_get_plotid_(uintptr_t *gr, char *out, int len); /// Ask to stop drawing @@ -58,9 +58,14 @@ int MGL_EXPORT mgl_need_stop_(uintptr_t *gr); void MGL_EXPORT mgl_set_event_func(HMGL gr, void (*func)(void *), void *par); /// Get plot quality -int MGL_EXPORT_PURE mgl_get_quality(HMGL gr); -int MGL_EXPORT_PURE mgl_get_quality_(uintptr_t *gr); +int MGL_EXPORT mgl_get_quality(HMGL gr); +int MGL_EXPORT mgl_get_quality_(uintptr_t *gr); /// Set plot quality +/** qual=0 -- no face drawing (fastest), + * qual=1 -- no color interpolation (fast), + * qual=2 -- high quality (normal), + * qual|4 -- direct bitmap drawing (low memory usage); + * qual|8 for dots drawing instead of primitives (extremely fast). */ void MGL_EXPORT mgl_set_quality(HMGL gr, int qual); void MGL_EXPORT mgl_set_quality_(uintptr_t *gr, int *qual); /// Set drawing region for Quality&4 @@ -68,10 +73,10 @@ 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); /// 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); +int MGL_EXPORT mgl_is_frames(HMGL gr); /// Get bit-value flag of HMGL state (for advanced users only) -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); +int MGL_EXPORT mgl_get_flag(HMGL gr, uint32_t flag); +int MGL_EXPORT 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); @@ -115,7 +120,7 @@ void MGL_EXPORT mgl_set_mask_angle_(uintptr_t *gr, int *angle); /// Set default value of alpha-channel void MGL_EXPORT mgl_set_alpha_default(HMGL gr, double alpha); void MGL_EXPORT mgl_set_alpha_default_(uintptr_t *gr, mreal *alpha); -/// Set relative width of rectangles in Bars, Barh, BoxPlot +/// Set relative width of rectangles in Bars, Barh, BoxPlot, Candle, OHLC (default is 0.7) void MGL_EXPORT mgl_set_bar_width(HMGL gr, double width); void MGL_EXPORT mgl_set_bar_width_(uintptr_t *gr, mreal *width); /// Set number of mesh lines (use 0 to draw all of them) @@ -170,13 +175,16 @@ void MGL_EXPORT mgl_zoom_axis_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, m /// Set axis origin void MGL_EXPORT mgl_set_origin(HMGL gr, double x0, double y0, double z0); void MGL_EXPORT mgl_set_origin_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0); -/// Set the transformation formulas for coordinate +/// Set the transformation formulas for coordinate. Use "" or NULL for built-in ones void MGL_EXPORT mgl_set_func(HMGL gr, const char *EqX,const char *EqY,const char *EqZ,const char *EqA); void MGL_EXPORT mgl_set_func_(uintptr_t *gr, const char *EqX, const char *EqY, const char *EqZ, const char *EqA, int, int, int, int); /// Set one of predefined transformation rule void MGL_EXPORT mgl_set_coor(HMGL gr, int how); void MGL_EXPORT mgl_set_coor_(uintptr_t *gr, int *how); /// Set to draw Ternary axis (triangle like axis, grid and so on) +/** val=1 for Ternary axis (a+b+c=1, z=z), + * val=2 for Quaternary axis (a+b+c+d=1), + * val|4 for projections. */ void MGL_EXPORT mgl_set_ternary(HMGL gr, int kind); void MGL_EXPORT mgl_set_ternary_(uintptr_t *gr, int *kind); diff --git a/include/mgl2/canvas.h b/include/mgl2/canvas.h index 20d3060..efcee95 100644 --- a/include/mgl2/canvas.h +++ b/include/mgl2/canvas.h @@ -61,26 +61,8 @@ struct MGL_EXPORT mglAxis mreal angl; ///< Manual for ticks rotation (if not NAN) }; //----------------------------------------------------------------------------- -/// Structure for light source -struct MGL_EXPORT mglLight -{ - 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) - mglPoint q; ///< Actual position of light sources (filled by LightScale() function) - mglPoint p; ///< Actual direction of light sources (filled by LightScale() function) - mreal a; ///< Aperture of light sources - mreal b; ///< Brightness of light sources - mglColor c; ///< Color of light sources -}; -//----------------------------------------------------------------------------- class mglCanvas; -/// Structure for light source +/// Structure for drawing region struct MGL_EXPORT mglDrawReg { mglDrawReg() {} @@ -106,14 +88,15 @@ struct MGL_EXPORT mglDrawReg struct MGL_EXPORT mglDrawDat { mglDrawDat() {} - mglDrawDat(const mglDrawDat &aa) : Pnt(aa.Pnt),Prm(aa.Prm),Ptx(aa.Ptx),Glf(aa.Glf),Txt(aa.Txt) {} + mglDrawDat(const mglDrawDat &aa) : Pnt(aa.Pnt),Prm(aa.Prm),Sub(aa.Sub),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) {} + mglDrawDat(mglDrawDat &&aa) : Pnt(aa.Pnt),Prm(aa.Prm),Sub(aa.Sub),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; } + { Pnt=aa.Pnt; Prm=aa.Prm; Ptx=aa.Ptx; Glf=aa.Glf; Txt=aa.Txt; Sub=aa.Sub; return aa; } mglStack Pnt; ///< Internal points mglStack Prm; ///< Primitives (lines, triangles and so on) -- need for export + std::vector Sub; ///< InPlot regions std::vector Ptx; ///< Text labels for mglPrim std::vector Glf; ///< Glyphs data mglStack Txt; ///< Pointer to textures @@ -215,7 +198,8 @@ using mglBase::Light; /// Set object/subplot id inline void SetObjId(long id) { ObjId = id; } /// Get object id - inline int GetObjId(long xs,long ys) const { return OI[xs+Width*ys]; } + inline int GetObjId(long xs,long ys) const + { register long i=xs+Width*ys; return (i>=0 && i^_’ for positioning at left, at right, at top or at bottom correspondingly; + * ‘I’ for positioning near bounding (by default, at edges of subplot); + * ‘A’ for using absolute coordinates; + * ‘~’ for disabling tick labels. + * ‘!’ for disabling ticks tuning; + * ‘f’ for printing ticks labels in fixed format; + * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; + * ‘F’ for printing ticks labels in LaTeX format; + * ‘+’ for printing ‘+’ for positive ticks; + * ‘-’ for printing usual ‘-’ in ticks labels; + * ‘0123456789’ for precision at printing ticks labels.*/ void MGL_EXPORT mgl_colorbar(HMGL gr, const char *sch); void MGL_EXPORT mgl_colorbar_(uintptr_t *gr, const char *sch,int); /// Draw colorbar at manual position +/** Parameter \a sch may contain: + * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; + * ‘I’ for positioning near bounding (by default, at edges of subplot); + * ‘A’ for using absolute coordinates; + * ‘~’ for disabling tick labels. + * ‘!’ for disabling ticks tuning; + * ‘f’ for printing ticks labels in fixed format; + * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; + * ‘F’ for printing ticks labels in LaTeX format; + * ‘+’ for printing ‘+’ for positive ticks; + * ‘-’ for printing usual ‘-’ in ticks labels; + * ‘0123456789’ for precision at printing ticks labels.*/ void MGL_EXPORT mgl_colorbar_ext(HMGL gr, const char *sch, double x, double y, double w, double h); void MGL_EXPORT mgl_colorbar_ext_(uintptr_t *gr, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, int); /// Draw colorbar with manual colors at edge of axis +/** Parameter \a sch may contain: + * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; + * ‘I’ for positioning near bounding (by default, at edges of subplot); + * ‘A’ for using absolute coordinates; + * ‘~’ for disabling tick labels. + * ‘!’ for disabling ticks tuning; + * ‘f’ for printing ticks labels in fixed format; + * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; + * ‘F’ for printing ticks labels in LaTeX format; + * ‘+’ for printing ‘+’ for positive ticks; + * ‘-’ for printing usual ‘-’ in ticks labels; + * ‘0123456789’ for precision at printing ticks labels.*/ void MGL_EXPORT mgl_colorbar_val(HMGL gr, HCDT dat, const char *sch); void MGL_EXPORT mgl_colorbar_val_(uintptr_t *gr, uintptr_t *dat, const char *sch,int); /// Draw colorbar with manual colors at manual position +/** Parameter \a sch may contain: + * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; + * ‘I’ for positioning near bounding (by default, at edges of subplot); + * ‘A’ for using absolute coordinates; + * ‘~’ for disabling tick labels. + * ‘!’ for disabling ticks tuning; + * ‘f’ for printing ticks labels in fixed format; + * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; + * ‘F’ for printing ticks labels in LaTeX format; + * ‘+’ for printing ‘+’ for positive ticks; + * ‘-’ for printing usual ‘-’ in ticks labels; + * ‘0123456789’ for precision at printing ticks labels.*/ void MGL_EXPORT mgl_colorbar_val_ext(HMGL gr, HCDT dat, const char *sch,double x, double y, double w, double h); void MGL_EXPORT mgl_colorbar_val_ext_(uintptr_t *gr, uintptr_t *dat, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, int); @@ -132,9 +203,26 @@ void MGL_EXPORT mgl_add_legendw(HMGL gr, const wchar_t *text,const char *style); void MGL_EXPORT mgl_clear_legend(HMGL gr); void MGL_EXPORT mgl_clear_legend_(uintptr_t *gr); /// Draw legend of accumulated strings at position {x,y} +/** Parameter fnt may contain: + * font style for legend text; + * colors for background (first one), border (second one) and text (last one); + * ‘A’ for positioning in absolute coordinates; + * ‘^’ for positioning outside of specified point; + * ‘-’ for arranging entries horizontally; + * ‘#’ for drawing box around legend. + * Option value set the space between line samples and text (default is 0.1).*/ void MGL_EXPORT mgl_legend_pos(HMGL gr, double x, double y, const char *font, const char *opt); void MGL_EXPORT mgl_legend_pos_(uintptr_t *gr, mreal *x, mreal *y, const char *font, const char *opt,int,int); /// Draw legend of accumulated strings +/** Parameter fnt may contain: + * font style for legend text; + * colors for background (first one), border (second one) and text (last one); + * ‘A’ for positioning in absolute coordinates; + * ‘^’ for positioning outside of specified point; + * ‘-’ for arranging entries horizontally; + * ‘#’ for drawing box around legend. + * Option value set the space between line samples and text (default is 0.1). + * Parameter \a where sets position: 0 at bottom-left, 1 at bottom-right, 2 at top-left, 3 at top-right (default).*/ void MGL_EXPORT mgl_legend(HMGL gr, int where, const char *font, const char *opt); void MGL_EXPORT mgl_legend_(uintptr_t *gr, int *where, const char *font, const char *opt,int,int); /// Set number of marks in legend sample @@ -223,20 +311,23 @@ void MGL_EXPORT mgl_write_json_z_(uintptr_t *gr, const char *fname,const char *d MGL_EXPORT const char *mgl_get_json(HMGL gr); /// Get RGB values of current bitmap +/** Position of element {i,j} is [3*i + 3*Width*j]. */ MGL_EXPORT const unsigned char *mgl_get_rgb(HMGL gr); MGL_EXPORT const unsigned char *mgl_get_rgb_(uintptr_t *gr); /// Get RGBA values of current bitmap +/** Position of element {i,j} is [4*i + 4*Width*j]. */ 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 +/// Get RGBA values of background image +/** Position of element {i,j} is [4*i + 4*Width*j]. */ 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_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); +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); /// 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); @@ -253,8 +344,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_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); +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); /// Create new frame. int MGL_EXPORT mgl_new_frame(HMGL gr); @@ -299,6 +390,9 @@ void MGL_EXPORT mgl_set_light_(uintptr_t *gr, int *enable); /// Switch on/off the specified light source. void MGL_EXPORT mgl_set_light_n(HMGL gr, int n, int enable); void MGL_EXPORT mgl_set_light_n_(uintptr_t *gr, int *n, int *enable); +/// Set to attach light settings to inplot. +void MGL_EXPORT mgl_set_attach_light(HMGL gr, int enable); +void MGL_EXPORT mgl_set_attach_light_(uintptr_t *gr, int *enable); /// Add white light source at infinity. void MGL_EXPORT mgl_add_light(HMGL gr, int n, double x, double y, double z); @@ -336,19 +430,37 @@ void MGL_EXPORT mgl_clf_str_(uintptr_t *gr, const char *col, int); 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. +/// Put further plotting in m-th cell of nx*ny grid of the image. +/** String \a style may contain: + * '<' for reserving space at left + * '>' for reserving space at right + * '^' for reserving space at top + * '_' for reserving space at bottom + * '#' for using whole region. */ void MGL_EXPORT mgl_subplot(HMGL gr, int nx,int ny,int m,const char *style); void MGL_EXPORT mgl_subplot_(uintptr_t *gr, int *nx,int *ny,int *m, const char *s,int); -/// Put further plotting in some region of whole frame and shift it by distance {dx,dy}. +/// Put further plotting in m-th cell of nx*ny grid of the image and shift it by distance {dx,dy}. +/** String \a style may contain: + * '<' for reserving space at left + * '>' for reserving space at right + * '^' for reserving space at top + * '_' for reserving space at bottom + * '#' for using whole region. */ void MGL_EXPORT mgl_subplot_d(HMGL gr, int nx,int ny,int m,const char *style, double dx, double dy); void MGL_EXPORT mgl_subplot_d_(uintptr_t *gr, int *nx,int *ny,int *m, mreal *dx, mreal *dy); -/// Like MGL_EXPORT mgl_subplot() but "join" several cells +/// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image. +/** String \a style may contain: + * '<' for reserving space at left + * '>' for reserving space at right + * '^' for reserving space at top + * '_' for reserving space at bottom + * '#' for using whole region. */ void MGL_EXPORT mgl_multiplot(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style); void MGL_EXPORT mgl_multiplot_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy, const char *s,int); -/// Put further plotting in a region of whole frame. +/// Put further plotting in a region [x1,x2]*[y1,y2] of the image (x1,x2,y1,y2 in range [0, 1]). void MGL_EXPORT mgl_inplot(HMGL gr, double x1,double x2,double y1,double y2); void MGL_EXPORT mgl_inplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2); -/// Put further plotting in a region of current subplot/inplot. +/// Put further plotting in a region [x1,x2]*[y1,y2] of the subplot (x1,x2,y1,y2 in range [0, 1]). void MGL_EXPORT mgl_relplot(HMGL gr, double x1,double x2,double y1,double y2); void MGL_EXPORT mgl_relplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2); /// Put further plotting in column cell of previous subplot/inplot. @@ -361,6 +473,7 @@ void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d) void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int ind, double tet, double phi); void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi); /// Add title for current subplot/inplot. +/** Style '#' draw box around the title. */ void MGL_EXPORT mgl_title(HMGL gr, const char *title, const char *stl, double size); void MGL_EXPORT mgl_title_(uintptr_t *gr, const char *title, const char *stl, mreal *size, int,int); void MGL_EXPORT mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, double size); @@ -403,8 +516,8 @@ void MGL_EXPORT mgl_wnd_set_func(HMGL gr, int (*draw)(HMGL gr, void *p), 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_PURE mgl_wnd_get_delay(HMGL gr); -double MGL_EXPORT_PURE mgl_wnd_get_delay_(uintptr_t *gr); +double MGL_EXPORT mgl_wnd_get_delay(HMGL gr); +double MGL_EXPORT 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); @@ -461,21 +574,21 @@ void MGL_EXPORT mgl_parser_add_paramw(HMPR p, int id, const wchar_t *str); /// Find variable with given name or add a new one /// NOTE !!! You must not delete obtained data arrays !!! -HMDT MGL_EXPORT mgl_parser_add_var(HMPR p, const char *name); +MGL_EXPORT mglDataA *mgl_parser_add_var(HMPR p, const char *name); 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); +MGL_EXPORT mglDataA *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 !!! -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); +MGL_EXPORT mglDataA *mgl_parser_find_var(HMPR p, const char *name); +uintptr_t MGL_EXPORT mgl_parser_find_var_(uintptr_t* p, const char *name, int); +MGL_EXPORT 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); +MGL_EXPORT mglDataA *mgl_parser_get_var(HMPR p, unsigned long id); +uintptr_t MGL_EXPORT 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); +long MGL_EXPORT mgl_parser_num_var(HMPR p); +long MGL_EXPORT mgl_parser_num_var_(uintptr_t* p); /// Delete variable with name void MGL_EXPORT mgl_parser_del_var(HMPR p, const char *name); @@ -489,6 +602,11 @@ void MGL_EXPORT mgl_parser_del_all_(uintptr_t *p); void MGL_EXPORT mgl_parser_load(HMPR pr, const char *dll_name); void MGL_EXPORT mgl_parser_load_(uintptr_t *pr, const char *dll_name,int); +/// Apply one step for equation d vars[i]/dt = eqs[i] using Runge-Kutta method +void MGL_EXPORT mgl_rk_step(HMPR pr, const char *eqs, const char *vars, mreal dt); +void MGL_EXPORT mgl_rk_step_w(HMPR pr, const wchar_t *eqs, const wchar_t *vars, mreal dt); +void MGL_EXPORT mgl_rk_step_(uintptr_t *p, const char *eqs, const char *vars, double *dt, int,int); + /// Parse and draw single line of the MGL script int MGL_EXPORT mgl_parse_line(HMGL gr, HMPR p, const char *str, int pos); int MGL_EXPORT mgl_parse_line_(uintptr_t* gr, uintptr_t* p, const char *str, int *pos, int); @@ -520,21 +638,25 @@ 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_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); +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); /// Return description of MGL command -MGL_EXPORT_PURE const char *mgl_parser_cmd_desc(HMPR pr, const char *name); +MGL_EXPORT const char *mgl_parser_cmd_desc(HMPR pr, const char *name); /// Return string of command format (command name and its argument[s]) -MGL_EXPORT_PURE const char *mgl_parser_cmd_frmt(HMPR pr, const char *name); +MGL_EXPORT const char *mgl_parser_cmd_frmt(HMPR pr, const char *name); /// Get name of command with nmber n -MGL_EXPORT_PURE const char *mgl_parser_cmd_name(HMPR pr, long id); +MGL_EXPORT const char *mgl_parser_cmd_name(HMPR pr, long id); /// Get number of defined commands -long MGL_EXPORT_PURE mgl_parser_cmd_num(HMPR pr); +long MGL_EXPORT mgl_parser_cmd_num(HMPR pr); /// Return result of formula evaluation HMDT MGL_EXPORT mgl_parser_calc(HMPR pr, const char *formula); uintptr_t MGL_EXPORT mgl_parser_calc_(uintptr_t *pr, const char *formula,int); HMDT MGL_EXPORT mgl_parser_calcw(HMPR pr, const wchar_t *formula); +/// Return result of formula evaluation as complex data +HADT MGL_EXPORT mgl_parser_calc_complex(HMPR pr, const char *formula); +uintptr_t MGL_EXPORT mgl_parser_calc_complex_(uintptr_t *pr, const char *formula,int); +HADT MGL_EXPORT mgl_parser_calc_complexw(HMPR pr, const wchar_t *formula); #ifdef __cplusplus } diff --git a/include/mgl2/cont.h b/include/mgl2/cont.h index 7028840..a0367df 100644 --- a/include/mgl2/cont.h +++ b/include/mgl2/cont.h @@ -43,112 +43,187 @@ void MGL_EXPORT mgl_contf_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCD //void MGL_EXPORT mgl_contv_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl); //void MGL_EXPORT mgl_axial_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl); -/// Draw manual contour lines for 2d data specified parametrically +/// Draw contour lines at manual levels for 2d data specified parametrically +/** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_cont_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw manual contour lines for 2d data +/// Draw contour lines at manual levels for 2d data +/** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_cont_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour lines for 2d data specified parametrically +/** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_cont_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour lines for 2d data +/** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont(HMGL gr, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_cont_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw manual solid contours for 2d data specified parametrically +/// Draw solid contours at manual levels for 2d data specified parametrically +/** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contf_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contf_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw manual solid contours for 2d data +/// Draw solid contours at manual levels for 2d data +/** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contf_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contf_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours for 2d data specified parametrically +/** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contf_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours for 2d data +/** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf(HMGL gr, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contf_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw manual solid contours for 2d data specified parametrically with manual colors +/// Draw solid contours at manual levels for 2d data specified parametrically with specified colors +/** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contd_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw manual solid contours for 2d data with manual colors +/// Draw solid contours at manual levels for 2d data with specified colors +/** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contd_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contd_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw solid contours for 2d data specified parametrically with manual colors +/// Draw solid contours for 2d data specified parametrically with specified colors +/** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contd_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contd_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw solid contours for 2d data with manual colors +/// Draw solid contours for 2d data with specified colors +/** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contd(HMGL gr, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contd_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw manual contour tubes for 2d data specified parametrically +/// Draw contour tubes between manual levels for 2d data specified parametrically +/** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contv_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw manual contour tubes for 2d data +/// Draw contour tubes between manual levels for 2d data +/** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contv_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contv_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour tubes for 2d data specified parametrically +/** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contv_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contv_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour tubes for 2d data +/** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contv(HMGL gr, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contv_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw manual axial-symmetric isosurfaces for 2d data specified parametrically +/// Draw axial-symmetric isosurfaces at manual levels for 2d data specified parametrically +/** String \a sch may contain: + * ‘#’ for wired plot; + * ‘.’ for plot by dots; + * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */ void MGL_EXPORT mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_axial_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); -/// Draw manual axial-symmetric isosurfaces for 2d data +/// Draw axial-symmetric isosurfaces at manual levels for 2d data +/** String \a sch may contain: + * ‘#’ for wired plot; + * ‘.’ for plot by dots; + * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */ void MGL_EXPORT mgl_axial_val(HMGL gr, HCDT v, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_axial_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw axial-symmetric isosurfaces for 2d data specified parametrically +/** String \a sch may contain: + * ‘#’ for wired plot; + * ‘.’ for plot by dots; + * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). + * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_axial_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_axial_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw axial-symmetric isosurfaces for 2d data +/** String \a sch may contain: + * ‘#’ for wired plot; + * ‘.’ for plot by dots; + * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). + * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_axial(HMGL gr, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_axial_(uintptr_t *gr, uintptr_t *a, const char *sch, const char *opt,int,int); -/// Draw surface of curve {r,z} rotatation around axis +/// Draw surface of curve {r,z} rotation around axis +/** Style ‘#’ produce wire plot. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_torus(HMGL gr, HCDT r, HCDT z, const char *col, const char *opt); void MGL_EXPORT mgl_torus_(uintptr_t *gr, uintptr_t *r, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw grid lines for density plot at slice for 3d data specified parametrically +/** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ void MGL_EXPORT mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_grid3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw grid lines for density plot at slice for 3d data +/** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ void MGL_EXPORT mgl_grid3(HMGL gr, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_grid3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw density plot at slice for 3d data specified parametrically +/** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ void MGL_EXPORT mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw density plot at slice for 3d data +/** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ void MGL_EXPORT mgl_dens3(HMGL gr, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -/// Draw manual contour lines at slice for 3d data specified parametrically +/// Draw contour lines at manual levels along slice for 3d data specified parametrically +/** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_cont3_xyz_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -/// Draw manual contour lines at slice for 3d data +/// Draw contour lines at manual levels along slice for 3d data +/** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_cont3_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -/// Draw contour lines at slice for 3d data specified parametrically +/// Draw contour lines along slice for 3d data specified parametrically +/** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_cont3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -/// Draw contour lines at slice for 3d data +/// Draw contour lines along slice for 3d data +/** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_cont3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -/// Draw manual solid contours at slice for 3d data specified parametrically +/// Draw solid contours at manual levels along slice for 3d data specified parametrically +/** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */ void MGL_EXPORT mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_contf3_xyz_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -/// Draw manual solid contours at slice for 3d data +/// Draw solid contours at manual levels along slice for 3d data +/** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */ void MGL_EXPORT mgl_contf3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_contf3_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -/// Draw solid contours at slice for 3d data specified parametrically +/// Draw solid contours along slice for 3d data specified parametrically +/** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_contf3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); -/// Draw solid contours at slice for 3d data +/// Draw solid contours along slice for 3d data +/** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_contf3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); diff --git a/include/mgl2/data.h b/include/mgl2/data.h index 424bbcf..6ca9f62 100644 --- a/include/mgl2/data.h +++ b/include/mgl2/data.h @@ -69,6 +69,16 @@ using mglDataA::Momentum; /// Delete the array virtual ~mglData() { if(!link && a) delete []a; } + /// Move all data from variable d, and delete this variable. + inline void Move(mglData *d) // NOTE: Variable d will be deleted!!! + { if(d && d->GetNN()>1) + { bool l=link; mreal *b=a; + nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=b; + temp=d->temp; func=d->func; o=d->o; s=d->s; + id=d->id; link=d->link; d->link=l; delete d; } + else if(d) { *this = d->a[0]; delete d; } + } + 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) @@ -318,6 +328,12 @@ using mglDataA::Momentum; inline void Sew(const char *dirs="xyz", mreal da=2*mglPi) { mgl_data_sew(this,dirs,da); } /// Smooth the data on specified direction or directions + /** String \a dir may contain: + * ‘x’, ‘y’, ‘z’ for 1st, 2nd or 3d dimension; + * ‘dN’ for linear averaging over N points; + * ‘3’ for linear averaging over 3 points; + * ‘5’ for linear averaging over 5 points. + * By default quadratic averaging over 5 points is used. */ inline void Smooth(const char *dirs="xyz",mreal delta=0) { mgl_data_smooth(this,dirs,delta); } /// Normalize the data to range [v1,v2] @@ -336,6 +352,14 @@ using mglDataA::Momentum; /// Fill data by 'x'/'k' samples for Hankel ('h') or Fourier ('f') transform inline void FillSample(const char *how) { mgl_data_fill_sample(this,how); } + /// Apply wavelet transform + /** Parameter \a dir may contain: + * ‘x‘,‘y‘,‘z‘ for directions, + * ‘d‘ for daubechies, ‘D‘ for centered daubechies, + * ‘h‘ for haar, ‘H‘ for centered haar, + * ‘b‘ for bspline, ‘B‘ for centered bspline, + * ‘i‘ for applying inverse transform. */ + inline void Wavelet(const char *how, int k) { mgl_data_wavelet(this, how, k); } /// Return an approximated x-value (root) when dat(x) = val inline mreal Solve(mreal val, bool use_spline=true, long i0=0) const @@ -458,9 +482,9 @@ inline bool operator<(const mglDataA &b, const mglDataA &d) inline bool operator>(const mglDataA &b, const mglDataA &d) { return b.Minimal()>d.Minimal(); } //----------------------------------------------------------------------------- -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); +mreal MGL_EXPORT mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z); +mreal MGL_EXPORT 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 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 @@ -697,7 +721,7 @@ class MGL_EXPORT mglDataF : public mglDataA 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(); } + { ex=0; v2.Set(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 @@ -871,5 +895,34 @@ public: { return 0; } }; //----------------------------------------------------------------------------- +/// Class for replacement of std::vector +class MGL_EXPORT mglDataS : public mglDataA +{ +public: + std::vector dat; + + mglDataS(const mglDataS &st) : dat(st.dat) {} + mglDataS(const std::vector &d) : dat(d) {} + mglDataS(size_t s=1) { dat.resize(s); } + ~mglDataS() {} + inline void reserve(size_t num) { dat.reserve(num); } + inline void clear() { dat.clear(); } + inline double operator[](size_t i) { return dat[i]; } + inline void push_back(double t) { dat.push_back(t); } + inline size_t size() const { return dat.size(); } + const mglDataS &operator=(const mglDataS &st) { dat = st.dat; return st; } + const std::vector &operator=(const std::vector &st) { dat = st; return st; } + + mreal v(long i,long j=0,long k=0) const { return dat[i]; } + mreal vthr(long i) const { return dat[i]; }; + long GetNx() const { return dat.size(); } + long GetNy() const { return 1; } + long GetNz() const { return 1; } + mreal dvx(long i,long j=0,long k=0) const + { return i>0? (iGetNN()>1) + { bool l=link; dual *b=a; + nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=b; + temp=d->temp; func=d->func; o=d->o; s=d->s; + id=d->id; link=d->link; d->link=l; delete d; } + else if(d) { *this = d->a[0]; delete d; } + } + 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) @@ -175,6 +186,27 @@ using mglDataA::Momentum; /// Equidistantly fill the data to range [x1,x2] in direction dir inline void Fill(dual x1,dual x2=mglNaN,char dir='x') { mgl_datac_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_datac_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_datac_refill_x(this,&xdat,&vdat,x1,x2,sl); } + inline void Refill(const mglDataA &xdat, const mglDataA &vdat, mglPoint p1, mglPoint p2,long sl=-1) + { mgl_datac_refill_x(this,&xdat,&vdat,p1.x,p2.x,sl); } + inline void Refill(const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, mglPoint p1, mglPoint p2,long sl=-1) + { mgl_datac_refill_xy(this,&xdat,&ydat,&vdat,p1.x,p2.x,p1.y,p2.y,sl); } + inline void Refill(const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, mglPoint p1, mglPoint p2) + { mgl_datac_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(HMGL gr, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="") + { mgl_datac_refill_gr(gr,this,&xdat,0,0,&vdat,sl,opt); } + inline void Refill(HMGL gr, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="") + { mgl_datac_refill_gr(gr,this,&xdat,&ydat,0,&vdat,sl,opt); } + inline void Refill(HMGL gr, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="") + { mgl_datac_refill_gr(gr,this,&xdat,&ydat,&zdat,&vdat,-1,opt); } + /// Put value to data element(s) inline void Put(dual val, long i=-1, long j=-1, long k=-1) @@ -299,6 +331,12 @@ using mglDataA::Momentum; /// Mirror the data in given direction (useful for fourier spectrums) inline void Mirror(const char *dir) { mgl_datac_mirror(this,dir); } /// Smooth the data on specified direction or directions + /** String \a dir may contain: + * ‘x’, ‘y’, ‘z’ for 1st, 2nd or 3d dimension; + * ‘dN’ for linear averaging over N points; + * ‘3’ for linear averaging over 3 points; + * ‘5’ for linear averaging over 5 points. + * By default quadratic averaging over 5 points is used. */ inline void Smooth(const char *dirs="xyz",mreal delta=0) { mgl_datac_smooth(this,dirs,delta); } @@ -326,14 +364,14 @@ using mglDataA::Momentum; { dual val,dx,dy,dz; val = mgl_datac_linear_ext(this,x,y,z, &dx, &dy, &dz); - dif = mglPoint(dx.real(),dy.real(),dz.real()); return val; + dif.Set(dx.real(),dy.real(),dz.real()); return val; } /// Interpolate by line the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1] inline dual Linear1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const { dual val,dx,dy,dz; val = mgl_datac_linear_ext(this,x,y,z, &dx, &dy, &dz); - dif = mglPoint(dx.real(),dy.real(),dz.real()); + dif.Set(dx.real(),dy.real(),dz.real()); dif.x/=nx>1?nx-1:1; dif.y/=ny>1?ny-1:1; dif.z/=nz>1?nz-1:1; return val; } @@ -352,9 +390,29 @@ using mglDataA::Momentum; inline const mglDataC &operator=(const mglDataC &d) { if(this!=&d) Set(&d); return d; } inline dual operator=(dual val) - { for(long i=0;i _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;}) +#define mgl_int(a) ({typeof (a) _a = (a); long(_a+(_a>=0 ? 0.5:-0.5));}) #else #define mgl_min(a,b) (((a)>(b)) ? (b) : (a)) #define mgl_max(a,b) (((a)>(b)) ? (a) : (b)) @@ -175,6 +177,7 @@ typedef float mreal; #define mgl_isfin(a) ((a)-(a)==mreal(0.)) #define mgl_isbad(a) ((a)-(a)!=mreal(0.)) #define mgl_sign(a) ((a)<0 ? -1:1) +#define mgl_int(a) (long(a+((a)>=0 ? 0.5:-0.5))) #endif //----------------------------------------------------------------------------- enum{ // types of predefined curvelinear coordinate systems @@ -224,6 +227,7 @@ enum{ // Codes for warnings/messages mglScrCmd, // Wrong command in MGL script mglScrLong, // Too long line in MGL script mglScrStr, // Unbalanced ' in MGL script + mglScrTemp, // Change temporary data in MGL script mglWarnEnd // Maximal number of warnings (must be last) }; //----------------------------------------------------------------------------- @@ -253,7 +257,7 @@ extern uint64_t mgl_mask_val[16]; #define MGL_SHOW_POS 0x001000 ///< Switch to show or not mouse click position #define MGL_CLF_ON_UPD 0x002000 ///< Clear plot before Update() #define MGL_NOSUBTICKS 0x004000 ///< Disable subticks drawing (for bounding box) -//#define MGL_DIFFUSIVE 0x008000 ///< Use diffusive light instead of specular +#define MGL_LOCAL_LIGHT 0x008000 ///< Keep light sources for each inplot #define MGL_VECT_FRAME 0x010000 ///< Use DrwDat to remember all data of frames #define MGL_REDUCEACC 0x020000 ///< Reduce accuracy of points (to reduc size of output files) #define MGL_PREFERVC 0x040000 ///< Prefer vertex color instead of texture if output format supports @@ -264,15 +268,13 @@ extern uint64_t mgl_mask_val[16]; #include #if MGL_USE_DOUBLE typedef double _Complex mdual; -#ifndef _Complex_I -#define _Complex_I (double _Complex){0, 1} -#endif #else typedef float _Complex mdual; -#ifndef _Complex_I -#define _Complex_I (float _Complex){0, 1} #endif +#ifndef _Complex_I +#define _Complex_I 1.0i #endif +const mdual mgl_I=_Complex_I; #define mgl_abs(x) cabs(x) #endif #ifdef __cplusplus @@ -284,7 +286,7 @@ typedef std::complex dual; typedef std::complex ddual; #if !MGL_HAVE_C99_COMPLEX #define mdual dual -#define _Complex_I dual(0,1) +#define mgl_I dual(0,1) #define mgl_abs(x) abs(x) #endif //----------------------------------------------------------------------------- @@ -297,15 +299,15 @@ typedef double _Complex ddual; /// Find length of wchar_t string (bypass standard wcslen bug) double MGL_EXPORT_CONST mgl_hypot(double x, double y); /// Find length of wchar_t string (bypass standard wcslen bug) -size_t MGL_EXPORT_PURE mgl_wcslen(const wchar_t *str); +size_t MGL_EXPORT 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_PURE mgl_have_color(const char *stl); +long MGL_EXPORT mgl_have_color(const char *stl); /// Find symbol in string excluding {} and return its position or NULL -MGL_EXPORT_PURE const char *mglchr(const char *str, char ch); +MGL_EXPORT const char *mglchr(const char *str, char ch); /// Find any symbol from chr in string excluding {} and return its position or NULL -MGL_EXPORT_PURE const char *mglchrs(const char *str, const char *chr); +MGL_EXPORT 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); @@ -325,7 +327,7 @@ void MGL_EXPORT mgl_clear_fft(); void MGL_EXPORT mgl_set_global_warn(const char *text); void MGL_EXPORT mgl_set_global_warn_(const char *text,int); /// Get text of global warning message(s) -MGL_EXPORT_PURE const char *mgl_get_global_warn(); +MGL_EXPORT const char *mgl_get_global_warn(); int MGL_EXPORT mgl_get_global_warn_(char *out, int len); #ifdef __cplusplus } diff --git a/include/mgl2/fit.h b/include/mgl2/fit.h index 8dda570..82e3144 100644 --- a/include/mgl2/fit.h +++ b/include/mgl2/fit.h @@ -27,44 +27,61 @@ extern "C" { //----------------------------------------------------------------------------- extern int mglFitPnts; ///< Number of output points in fitting extern char mglFitRes[1024]; ///< Last fitted formula +/// Fit data along x-direction for each data row. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_1(HMGL gr, HCDT y, const char *eq, const char *vars, HMDT ini, const char *opt); +uintptr_t MGL_EXPORT mgl_fit_1_(uintptr_t* gr, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); +/// Fit data along x-, y-directions for each data slice. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_2(HMGL gr, HCDT z, const char *eq, const char *vars, HMDT ini, const char *opt); +uintptr_t MGL_EXPORT mgl_fit_2_(uintptr_t* gr, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); +/// Fit data along along all directions. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_3(HMGL gr, HCDT a, const char *eq, const char *vars, HMDT ini, const char *opt); +uintptr_t MGL_EXPORT mgl_fit_3_(uintptr_t* gr, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); +/// Fit data along x-direction for each data row. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_xy(HMGL gr, HCDT x, HCDT y, const char *eq, const char *vars, HMDT ini, const char *opt); +uintptr_t MGL_EXPORT mgl_fit_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); +/// Fit data along x-, y-directions for each data slice. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *eq, const char *vars, HMDT ini, const char *opt); +uintptr_t MGL_EXPORT mgl_fit_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); +/// Fit data along along all directions. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_xyza(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *eq, const char *vars, HMDT ini, const char *opt); +uintptr_t MGL_EXPORT mgl_fit_xyza_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); + /// Fit data with dispersion s along x-direction for each data row. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_ys(HMGL gr, HCDT y, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt); +uintptr_t MGL_EXPORT mgl_fit_ys_(uintptr_t* gr, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT x, HCDT y, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt); +uintptr_t MGL_EXPORT mgl_fit_xys_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); + /// Fit data with dispersion s along x-, y-directions for each data slice. Return array with values for found formula. 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); +uintptr_t MGL_EXPORT mgl_fit_xyzs_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); 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); +uintptr_t MGL_EXPORT mgl_fit_xyzas_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -MGL_EXPORT_CONST const char *mgl_get_fit(HMGL gr); +/// Get last fitted formula +MGL_EXPORT const char *mgl_get_fit(HMGL gr); int MGL_EXPORT mgl_get_fit_(uintptr_t *gr, char *out, int len); +/// Make histogram (distribution) of data. This function do not plot data. +/** Option "value" sets the size of output array (default is mglFitPnts=100). */ 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); -HMDT MGL_EXPORT mgl_hist_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *opt); - -void MGL_EXPORT mgl_puts_fit(HMGL gr, double x, double y, double z, const char *prefix, const char *font, double size); -mreal MGL_EXPORT mgl_get_fit_chi(); -//----------------------------------------------------------------------------- -uintptr_t MGL_EXPORT mgl_fit_1_(uintptr_t* gr, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -uintptr_t MGL_EXPORT mgl_fit_2_(uintptr_t* gr, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -uintptr_t MGL_EXPORT mgl_fit_3_(uintptr_t* gr, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -uintptr_t MGL_EXPORT mgl_fit_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -uintptr_t MGL_EXPORT mgl_fit_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -uintptr_t MGL_EXPORT mgl_fit_xyza_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -uintptr_t MGL_EXPORT mgl_fit_ys_(uintptr_t* gr, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -uintptr_t MGL_EXPORT mgl_fit_xys_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -uintptr_t MGL_EXPORT mgl_fit_xyzs_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); -uintptr_t MGL_EXPORT mgl_fit_xyzas_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); - uintptr_t MGL_EXPORT mgl_hist_x_(uintptr_t* gr, uintptr_t* x, uintptr_t* a, const char *opt,int); +/// Make histogram (distribution) of data. This function do not plot data. +/** Option "value" sets the size of output array (default is mglFitPnts=100). */ +HMDT MGL_EXPORT mgl_hist_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *opt); uintptr_t MGL_EXPORT mgl_hist_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* a, const char *opt,int); +/// Make histogram (distribution) of data. This function do not plot data. +/** Option "value" sets the size of output array (default is mglFitPnts=100). */ +HMDT MGL_EXPORT mgl_hist_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *opt); uintptr_t MGL_EXPORT mgl_hist_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *opt,int); +/// Print fitted last formula (with coefficients) +void MGL_EXPORT mgl_puts_fit(HMGL gr, double x, double y, double z, const char *prefix, const char *font, double size); void MGL_EXPORT mgl_puts_fit_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, const char *prefix, const char *font, mreal *size, int l, int n); +/// Get chi for last fitted formula +mreal MGL_EXPORT mgl_get_fit_chi(); mreal MGL_EXPORT mgl_get_fit_chi_(); +/// Get covariance matrix for last fitted formula +HCDT MGL_EXPORT mgl_get_fit_covar(); +uintptr_t MGL_EXPORT mgl_get_fit_covar_(); //----------------------------------------------------------------------------- #ifdef __cplusplus } diff --git a/include/mgl2/font.h b/include/mgl2/font.h index dcb23b5..678681e 100644 --- a/include/mgl2/font.h +++ b/include/mgl2/font.h @@ -55,7 +55,7 @@ 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 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); +long MGL_EXPORT mgl_internal_code(unsigned s, const std::vector &glyphs); class mglBase; //----------------------------------------------------------------------------- /// Class for font typeface and text plotting procedures @@ -69,6 +69,10 @@ public: /// Load font data to memory. Normally used by constructor. bool Load(const char *base, const char *path=0); + /// Load binary font data to memory. Normally used by constructor. + bool LoadBin(const char *base, const char *path=0); + /// Save binary font data + size_t SaveBin(const char *fname); /// Free memory void Clear(); /// Copy data from other font diff --git a/include/mgl2/mgl.h b/include/mgl2/mgl.h index a27d5a5..286a3bb 100644 --- a/include/mgl2/mgl.h +++ b/include/mgl2/mgl.h @@ -80,6 +80,8 @@ public: inline void Light(int n,bool enable) { mgl_set_light_n(gr, n, enable); } /// Use diffusive light (only for local light sources) -- OBSOLETE inline void SetDifLight(bool dif) { mgl_set_light_dif(gr, dif); } + /// Set to attach light settings to inplot. + inline void AttachLight(bool enable) { mgl_set_attach_light(gr, enable); } /// Add a light source. inline void AddLight(int n, mglPoint p, char col='w', double bright=0.5, double ap=0) { mgl_add_light_ext(gr, n, p.x, p.y, p.z, col, bright, ap); } @@ -92,7 +94,7 @@ public: /// Set the fog distance or switch it off (if d=0). inline void Fog(double d, double dz=0.25) { mgl_set_fog(gr, d, dz); } - /// Set relative width of rectangles in Bars, Barh, BoxPlot + /// Set relative width of rectangles in Bars, Barh, BoxPlot, Candle, OHLC (default is 0.7) inline void SetBarWidth(double width) { mgl_set_bar_width(gr, width); } /// Set default size of marks (locally you can use "size" option) inline void SetMarkSize(double size) { mgl_set_mark_size(gr, size); } @@ -174,15 +176,15 @@ public: /// Set range in direction dir as minimal and maximal values of data a inline void SetRange(char dir, const mglDataA &dat, bool add=false) { mgl_set_range_dat(gr, dir, &dat, add); } - /// Set values of axis range as minimal and maximal values of datas + /// Set values of axis range as minimal and maximal values of corresponding data inline void SetRanges(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz, const mglDataA &cc) { mgl_set_range_dat(gr,'x',&xx,0); mgl_set_range_dat(gr,'y',&yy,0); mgl_set_range_dat(gr,'z',&zz,0); mgl_set_range_dat(gr,'c',&cc,0); } - /// Set values of axis range as minimal and maximal values of datas + /// Set values of axis range as minimal and maximal values of corresponding data inline void SetRanges(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) { mgl_set_range_dat(gr,'x',&xx,0); mgl_set_range_dat(gr,'y',&yy,0); mgl_set_range_dat(gr,'z',&zz,0); mgl_set_range_dat(gr,'c',&zz,0); } - /// Set values of axis range as minimal and maximal values of datas + /// Set values of axis range as minimal and maximal values of corresponding data inline void SetRanges(const mglDataA &xx, const mglDataA &yy) { mgl_set_range_dat(gr,'x',&xx,0); mgl_set_range_dat(gr,'y',&yy,0); } /// Set values of axis ranges @@ -203,12 +205,15 @@ public: inline void SetOrigin(double x0, double y0, double z0=mglNaN) { mgl_set_origin(gr, x0, y0, z0); } - /// Set the transformation formulas for coordinate + /// Set the transformation formulas for coordinate. Use "" or NULL for built-in ones inline void SetFunc(const char *EqX, const char *EqY, const char *EqZ=NULL, const char *EqA=NULL) { mgl_set_func(gr, EqX, EqY, EqZ, EqA); } /// Set one of predefined transformation rule inline void SetCoor(int how) { mgl_set_coor(gr, how); } /// Set to draw Ternary axis (triangle like axis, grid and so on) + /** val=1 for Ternary axis (a+b+c=1, z=z), + * val=2 for Quaternary axis (a+b+c+d=1), + * val|4 for projections. */ inline void Ternary(int val) { mgl_set_ternary(gr, val); } /// Set to use or not tick labels rotation @@ -253,7 +258,7 @@ public: { mgl_set_tick_templ(gr,dir,t); } inline void SetTickTempl(char dir, const wchar_t *t) { mgl_set_tick_templw(gr,dir,t); } - /// Tune ticks + /// Tune ticks (tune|1 for common multiplier, tune|2 for common component) inline void SetTuneTicks(int tune, double fact_pos=1.15) { mgl_tune_ticks(gr, tune, fact_pos); } /// Set additional shift of tick labels @@ -266,13 +271,25 @@ public: inline void SetOriginTick(bool enable=true) { mgl_set_flag(gr,!enable, MGL_NO_ORIGIN); } - /// Put further plotting in some region of whole frame. + /// Put further plotting in m-th cell of nx*ny grid of the image. + /** String \a style may contain: + * '<' for reserving space at left + * '>' for reserving space at right + * '^' for reserving space at top + * '_' for reserving space at bottom + * '#' for using whole region. */ inline void SubPlot(int nx,int ny,int m,const char *style="<>_^", double dx=0, double dy=0) { mgl_subplot_d(gr, nx, ny, m, style, dx, dy); } - /// Like SubPlot() but "join" several cells + /// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image. + /** String \a style may contain: + * '<' for reserving space at left + * '>' for reserving space at right + * '^' for reserving space at top + * '_' for reserving space at bottom + * '#' for using whole region. */ inline void MultiPlot(int nx,int ny,int m, int dx, int dy, const char *style="<>_^") { mgl_multiplot(gr, nx, ny, m, dx, dy, style); } - /// Put further plotting in a region of whole frame. + /// Put further plotting in a region [x1,x2]*[y1,y2] of the image or subplot (x1,x2,y1,y2 in range [0, 1]). inline void InPlot(double x1,double x2,double y1,double y2, bool rel=true) { if(rel) mgl_relplot(gr, x1, x2, y1, y2); else mgl_inplot(gr, x1, x2, y1, y2); } @@ -295,8 +312,11 @@ public: inline void Pop() { mgl_mat_pop(gr); } /// Add title for current subplot/inplot + /** Style '#' draw box around the title. */ inline void Title(const char *title,const char *stl="",double size=-2) { mgl_title(gr,title,stl,size); } + /// Add title for current subplot/inplot + /** Style '#' draw box around the title. */ inline void Title(const wchar_t *title,const char *stl="",double size=-2) { mgl_titlew(gr,title,stl,size); } /// Set aspect ratio for further plotting. @@ -323,7 +343,14 @@ public: /// Set size of frame in pixels. Normally this function is called internally. inline void SetSize(int width, int height) { mgl_set_size(gr, width, height); } + /// Scaling for all further set size calls. + static inline void SetSizeScl(double scl) { mgl_set_size_scl(scl); } /// Set plot quality + /** qual=0 -- no face drawing (fastest), + * qual=1 -- no color interpolation (fast), + * qual=2 -- high quality (normal), + * qual|4 -- direct bitmap drawing (low memory usage); + * qual|8 for dots drawing instead of primitives (extremely fast). */ inline void SetQuality(int qual=MGL_DRAW_NORM) { mgl_set_quality(gr, qual); } /// Get plot quality inline int GetQuality() { return mgl_get_quality(gr); } @@ -433,20 +460,26 @@ public: { mgl_import_mgld(gr, fname, add); } /// Copy RGB values into array which is allocated by user + /** Position of element {i,j} is [3*i + 3*Width*j]. */ 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; } + /// Get RGB values of current bitmap + /** Position of element {i,j} is [3*i + 3*Width*j]. */ inline const unsigned char *GetRGB() { return mgl_get_rgb(gr); } /// Copy RGBA values into array which is allocated by user + /** Position of element {i,j} is [4*i + 4*Width*j]. */ 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; } + /// Get RGBA values of current bitmap + /** Position of element {i,j} is [4*i + 4*Width*j]. */ inline const unsigned char *GetRGBA() { return mgl_get_rgba(gr); } /// Copy BGRN values into array which is allocated by user inline bool GetBGRN(unsigned char *imgdata, int imglen) @@ -463,12 +496,15 @@ public: return imglen>=4*w*h; } /// Copy RGBA values of background image into array which is allocated by user + /** Position of element {i,j} is [4*i + 4*Width*j]. */ 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; } + /// Get RGBA values of background image + /** Position of element {i,j} is [4*i + 4*Width*j]. */ inline const unsigned char *GetBackground() { return mgl_get_background(gr); } /// Get width of the image inline int GetWidth() { return mgl_get_width(gr); } @@ -500,10 +536,13 @@ public: /// Combine plots from 2 canvases. Result will be saved into this inline void Combine(const mglGraph *g) { mgl_combine_gr(gr,g->gr); } - /// Clear up the frame + /// Clear up the frame and fill background by specified color inline void Clf(double r, double g, double b) { mgl_clf_rgb(gr, r, g, b); } + /// Clear up the frame and fill background by specified color with manual transparency inline void Clf(const char *col) { mgl_clf_str(gr, col); } + /// Clear up the frame and fill background by specified color inline void Clf(char col) { mgl_clf_chr(gr, col); } + /// Clear up the frame inline void Clf() { mgl_clf(gr); } /// Clear unused points and primitives. Useful only in combination with SetFaceNum(). inline void ClearUnused() { mgl_clear_unused(gr); } @@ -521,6 +560,7 @@ public: inline void Mark(mglPoint p, const char *mark) { mgl_mark(gr, p.x, p.y, p.z, mark); } /// Draws the line between points by specified pen + /** Large \a n (for example, n=100) should be used for geodesic line in curved coordinates */ inline void Line(mglPoint p1, mglPoint p2, const char *pen="B",int n=2) { mgl_line(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, pen, n); } /// Draws the spline curve between points by specified pen @@ -543,24 +583,42 @@ public: inline void FaceZ(mglPoint p, double wx, double wy, const char *stl="w", double dx=0, double dy=0) { mgl_facez(gr, p.x, p.y, p.z, wx, wy, stl, dx, dy); } /// Draws the drop at point p in direction d with color col and radius r + /** Parameter \a shift set the degree of drop oblongness: ‘0’ is sphere, ‘1’ is maximally oblongness drop. Parameter \a ap set relative width of the drop (this is analogue of “ellipticity” for the sphere).*/ inline void Drop(mglPoint p, mglPoint d, double r, const char *col="r", double shift=1, double ap=1) { mgl_drop(gr, p.x, p.y, p.z, d.x, d.y, d.z, r, col, shift, ap); } /// Draws the sphere at point p with color col and radius r inline void Sphere(mglPoint p, double r, const char *col="r") { mgl_sphere(gr, p.x, p.y, p.z, r, col); } /// Draws the cone between points p1,p2 with radius r1,r2 and with style stl + /** Parameter \a stl can contain: + * ‘@’ for drawing edges; + * ‘#’ for wired cones; + * ‘t’ for drawing tubes/cylinder instead of cones/prisms; + * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones.*/ inline void Cone(mglPoint p1, mglPoint p2, double r1, double r2=-1, const char *stl="r@") { mgl_cone(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z,r1,r2,stl); } /// Draws the ellipse between points p1,p2 with color stl and width r + /** Parameter \a stl can contain: + * ‘#’ for wired figure (boundary only); + * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ inline void Ellipse(mglPoint p1, mglPoint p2, double r, const char *stl="r") { mgl_ellipse(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, r,stl); } /// Draws the circle at point p with color stl and radius r + /** Parameter \a stl can contain: + * ‘#’ for wired figure (boundary only); + * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ inline void Circle(mglPoint p, double r, const char *stl="r") { mgl_ellipse(gr, p.x, p.y, p.z, p.x, p.y, p.z, r,stl); } /// Draws the rhomb between points p1,p2 with color stl and width r + /** Parameter \a stl can contain: + * ‘#’ for wired figure (boundary only); + * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ 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 + /** Parameter \a stl can contain: + * ‘#’ for wired figure (boundary only); + * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ 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) @@ -578,55 +636,134 @@ public: /// Print text in position p with specified font inline void Putsw(mglPoint p,const wchar_t *text,const char *font=":C",double size=-1) { mgl_putsw(gr, p.x, p.y, p.z, text, font, size); } + /// Print text in position p with specified font inline void Puts(mglPoint p,const char *text,const char *font=":C",double size=-1) { mgl_puts(gr, p.x, p.y, p.z, text, font, size); } + /// Print text in position p with specified font inline void Putsw(double x, double y,const wchar_t *text,const char *font=":AC",double size=-1) { mgl_putsw(gr, x, y, 0, text, font, size); } + /// Print text in position p with specified font inline void Puts(double x, double y,const char *text,const char *font=":AC",double size=-1) { mgl_puts(gr, x, y, 0, text, font, size); } /// Print text in position p along direction d with specified font inline void Putsw(mglPoint p, mglPoint d, const wchar_t *text, const char *font=":L", double size=-1) { mgl_putsw_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, text, font, size); } + /// Print text in position p along direction d with specified font inline void Puts(mglPoint p, mglPoint d, const char *text, const char *font=":L", double size=-1) { mgl_puts_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, text, font, size); } /// Print text along the curve inline void Text(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *text, const char *font="", const char *opt="") { mgl_text_xyz(gr, &x, &y, &z, text, font, opt); } + /// Print text along the curve inline void Text(const mglDataA &x, const mglDataA &y, const char *text, const char *font="", const char *opt="") { mgl_text_xy(gr, &x, &y, text, font, opt); } + /// Print text along the curve inline void Text(const mglDataA &y, const char *text, const char *font="", const char *opt="") { mgl_text_y(gr, &y, text, font, opt); } + /// Print text along the curve inline void Text(const mglDataA &x, const mglDataA &y, const mglDataA &z, const wchar_t *text, const char *font="", const char *opt="") { mgl_textw_xyz(gr, &x, &y, &z, text, font, opt); } + /// Print text along the curve inline void Text(const mglDataA &x, const mglDataA &y, const wchar_t *text, const char *font="", const char *opt="") { mgl_textw_xy(gr, &x, &y, text, font, opt); } + /// Print text along the curve inline void Text(const mglDataA &y, const wchar_t *text, const char *font="", const char *opt="") { mgl_textw_y(gr, &y, text, font, opt); } /// Draws bounding box outside the plotting volume with color c. + /** Style ‘@’ produce filled back faces. */ inline void Box(const char *col="", bool ticks=true) { mgl_box_str(gr, col, ticks); } /// Draw axises with ticks in direction(s) dir. + /** Parameter \a dir may contain: + * ‘xyzt’for drawing axis in corresponding direction; + * ‘XYZT’ for drawing axis in corresponding direction but with inverted positions of labels; + * ‘~’, ‘_’ for disabling tick labels; + * ‘U’ for disabling rotation of tick labels; + * ‘^’ for inverting default axis origin; + * ‘!’ for disabling ticks tuning; + * ‘AKDTVISO’ for drawing arrow at the end of axis; + * ‘a’ for forced adjusting of axis ticks; + * ‘f’ for printing ticks labels in fixed format; + * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; + * ‘F’ for printing ticks labels in LaTeX format; + * ‘+’ for printing ‘+’ for positive ticks; + * ‘-’ for printing usual ‘-’ in ticks labels; + * ‘0123456789’ for precision at printing ticks labels. + * Option "value" set the manual rotation angle for the ticks. */ inline void Axis(const char *dir="xyzt", const char *stl="", const char *opt="") { mgl_axis(gr, dir,stl,opt); } /// Draw grid lines perpendicular to direction(s) dir. inline void Grid(const char *dir="xyzt",const char *pen="B", const char *opt="") { mgl_axis_grid(gr, dir, pen, opt); } /// Print the label text for axis dir. + /** Option "value" set additional shifting of the label. */ inline void Label(char dir, const char *text, double pos=+1, const char *opt="") { mgl_label(gr, dir, text, pos, opt); } + /// Print the label text for axis dir. + /** Option "value" set additional shifting of the label. */ inline void Label(char dir, const wchar_t *text, double pos=+1, const char *opt="") { mgl_labelw(gr, dir, text, pos, opt); } /// Draw colorbar at edge of axis + /** Parameter \a sch may contain: + * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; + * ‘I’ for positioning near bounding (by default, at edges of subplot); + * ‘A’ for using absolute coordinates; + * ‘~’ for disabling tick labels. + * ‘!’ for disabling ticks tuning; + * ‘f’ for printing ticks labels in fixed format; + * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; + * ‘F’ for printing ticks labels in LaTeX format; + * ‘+’ for printing ‘+’ for positive ticks; + * ‘-’ for printing usual ‘-’ in ticks labels; + * ‘0123456789’ for precision at printing ticks labels.*/ inline void Colorbar(const char *sch="") { mgl_colorbar(gr, sch); } + /// Draw colorbar at manual position + /** Parameter \a sch may contain: + * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; + * ‘I’ for positioning near bounding (by default, at edges of subplot); + * ‘A’ for using absolute coordinates; + * ‘~’ for disabling tick labels. + * ‘!’ for disabling ticks tuning; + * ‘f’ for printing ticks labels in fixed format; + * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; + * ‘F’ for printing ticks labels in LaTeX format; + * ‘+’ for printing ‘+’ for positive ticks; + * ‘-’ for printing usual ‘-’ in ticks labels; + * ‘0123456789’ for precision at printing ticks labels.*/ inline void Colorbar(const char *sch,double x,double y,double w=1,double h=1) { mgl_colorbar_ext(gr, sch, x,y,w,h); } /// Draw colorbar with manual colors at edge of axis + /** Parameter \a sch may contain: + * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; + * ‘I’ for positioning near bounding (by default, at edges of subplot); + * ‘A’ for using absolute coordinates; + * ‘~’ for disabling tick labels. + * ‘!’ for disabling ticks tuning; + * ‘f’ for printing ticks labels in fixed format; + * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; + * ‘F’ for printing ticks labels in LaTeX format; + * ‘+’ for printing ‘+’ for positive ticks; + * ‘-’ for printing usual ‘-’ in ticks labels; + * ‘0123456789’ for precision at printing ticks labels.*/ inline void Colorbar(const mglDataA &val, const char *sch="") { mgl_colorbar_val(gr, &val, sch); } + /// Draw colorbar with manual colors at manual position + /** Parameter \a sch may contain: + * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; + * ‘I’ for positioning near bounding (by default, at edges of subplot); + * ‘A’ for using absolute coordinates; + * ‘~’ for disabling tick labels. + * ‘!’ for disabling ticks tuning; + * ‘f’ for printing ticks labels in fixed format; + * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; + * ‘F’ for printing ticks labels in LaTeX format; + * ‘+’ for printing ‘+’ for positive ticks; + * ‘-’ for printing usual ‘-’ in ticks labels; + * ‘0123456789’ for precision at printing ticks labels.*/ inline void Colorbar(const mglDataA &val, const char *sch,double x,double y,double w=1,double h=1) { mgl_colorbar_val_ext(gr, &val, sch, x,y,w,h); } @@ -639,9 +776,26 @@ public: inline void ClearLegend() { mgl_clear_legend(gr); } /// Draw legend of accumulated strings at position {x,y} + /** Parameter fnt may contain: + * font style for legend text; + * colors for background (first one), border (second one) and text (last one); + * ‘A’ for positioning in absolute coordinates; + * ‘^’ for positioning outside of specified point; + * ‘-’ for arranging entries horizontally; + * ‘#’ for drawing box around legend. + * Option value set the space between line samples and text (default is 0.1).*/ inline void Legend(double x, double y, const char *font="#", const char *opt="") { mgl_legend_pos(gr, x, y, font, opt); } /// Draw legend of accumulated strings + /** Parameter fnt may contain: + * font style for legend text; + * colors for background (first one), border (second one) and text (last one); + * ‘A’ for positioning in absolute coordinates; + * ‘^’ for positioning outside of specified point; + * ‘-’ for arranging entries horizontally; + * ‘#’ for drawing box around legend. + * Option value set the space between line samples and text (default is 0.1). + * Parameter \a where sets position: 0 at bottom-left, 1 at bottom-right, 2 at top-left, 3 at top-right (default).*/ inline void Legend(int where=3, const char *font="#", const char *opt="") { mgl_legend(gr, where, font, opt); } /// Set number of marks in legend sample @@ -650,517 +804,1139 @@ public: /// Draw usual curve {x,y,z} inline void Plot(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_plot_xyz(gr, &x, &y, &z, pen, opt); } + /// Draw usual curve {x,y} inline void Plot(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_plot_xy(gr, &x, &y, pen,opt); } + /// Draw usual curve {x,y} with x in x-axis range inline void Plot(const mglDataA &y, const char *pen="", const char *opt="") { mgl_plot(gr, &y, pen,opt); } - /// Draw tape(s) which rotates as (bi-)normales of curve {x,y,z} + /// Draw tapes which rotates as (bi-)normales of curve {x,y,z} + /** The width of tape is proportional to barwidth and can be changed by option "value".*/ inline void Tape(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_tape_xyz(gr, &x, &y, &z, pen, opt); } + /// Draw tapes which rotates as (bi-)normales of curve {x,y} + /** The width of tape is proportional to barwidth and can be changed by option "value".*/ inline void Tape(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_tape_xy(gr, &x, &y, pen,opt); } + /// Draw tapes which rotates as (bi-)normales of curve {x,y} with x in x-axis range + /** The width of tape is proportional to barwidth and can be changed by option "value".*/ inline void Tape(const mglDataA &y, const char *pen="", const char *opt="") { mgl_tape(gr, &y, pen,opt); } /// Draw radar chart (plot in curved coordinates) + /** Option "value" set the additional shift of data (i.e. the data a+value is used instead of a).*/ inline void Radar(const mglDataA &a, const char *pen="", const char *opt="") { mgl_radar(gr, &a, pen, opt); } + /// Draw stairs for points in arrays {x,y,z} inline void Step(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_step_xyz(gr, &x, &y, &z, pen, opt); } + /// Draw stairs for points in arrays {x,y} inline void Step(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_step_xy(gr, &x, &y, pen, opt); } + /// Draw stairs for points in arrays {x,y} with x in x-axis range inline void Step(const mglDataA &y, const char *pen="", const char *opt="") { mgl_step(gr, &y, pen, opt); } + /// Draw curve {x,y,z} which is colored by c (like tension plot) inline void Tens(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *pen="", const char *opt="") { mgl_tens_xyz(gr, &x, &y, &z, &c, pen, opt); } + /// Draw curve {x,y} which is colored by c (like tension plot) inline void Tens(const mglDataA &x, const mglDataA &y, const mglDataA &c, const char *pen="", const char *opt="") { mgl_tens_xy(gr, &x, &y, &c, pen, opt); } + /// Draw curve {x,y} with x in x-axis range which is colored by c (like tension plot) inline void Tens(const mglDataA &y, const mglDataA &c, const char *pen="", const char *opt="") { mgl_tens(gr, &y, &c, pen, opt); } + /// Fill area between curve {x,y,z} and axis plane + /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Area(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_area_xyz(gr, &x, &y, &z, pen, opt); } + /// Fill area between curve {x,y} and axis plane + /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Area(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_area_xy(gr, &x, &y, pen, opt); } + /// Fill area between curve {x,y} with x in x-axis range and axis plane + /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Area(const mglDataA &y, const char *pen="", const char *opt="") { mgl_area(gr, &y, pen, opt); } - /// Fill area between curves y1 and y2 specified parametrically + + /// Fill area between curves {x,y1} and {x,y2} with x in x-axis range + /** Style 'i' will fill area only if y1 < y2. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Region(const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_region(gr, &y1, &y2, pen, opt); } + /// Fill area between curves {x,y1} and {x,y2} + /** Style 'i' will fill area only if y1 < y2. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Region(const mglDataA &x, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_region_xy(gr, &x, &y1, &y2, pen, opt); } /// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2} + /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Region(const mglDataA &x1, const mglDataA &y1, const mglDataA &z1, const mglDataA &x2, const mglDataA &y2, const mglDataA &z2, const char *pen="", const char *opt="") { mgl_region_3d(gr, &x1, &y1, &z1, &x2, &y2, &z2, pen, opt); } + /// Fill area (draw ribbon) between curves {x1,y1} and {x2,y2} + /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Region(const mglDataA &x1, const mglDataA &y1, const mglDataA &x2, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_region_3d(gr, &x1, &y1, NULL, &x2, &y2, NULL, pen, opt); } + /// Draw vertical lines from points {x,y,z} to axis plane inline void Stem(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_stem_xyz(gr, &x, &y, &z, pen, opt); } + /// Draw vertical lines from points {x,y} to axis plane inline void Stem(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_stem_xy(gr, &x, &y, pen, opt); } + /// Draw vertical lines from points {x,y} with x in x-axis range to axis plane inline void Stem(const mglDataA &y, const char *pen="", const char *opt="") { mgl_stem(gr, &y, pen, opt); } /// Draw vertical bars from points {x,y,z} to axis plane + /** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Bars(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_bars_xyz(gr, &x, &y, &z, pen, opt); } + /// Draw vertical bars from points {x,y} to axis plane + /** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Bars(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_bars_xy(gr, &x, &y, pen, opt); } + /// Draw vertical bars from points {x,y} with x in x-axis range to axis plane + /** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Bars(const mglDataA &y, const char *pen="", const char *opt="") { mgl_bars(gr, &y, pen, opt); } /// Draw horizontal bars from points {x,y} to axis plane + /** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Barh(const mglDataA &y, const mglDataA &v, const char *pen="", const char *opt="") { mgl_barh_yx(gr, &y, &v, pen, opt); } + /// Draw horizontal bars from points {x,y} with y in y-axis range to axis plane + /** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Barh(const mglDataA &v, const char *pen="", const char *opt="") { mgl_barh(gr, &v, pen, opt); } /// Draw chart for data a + /** Space denote transparent color. Style '#' draw black borders. */ inline void Chart(const mglDataA &a, const char *colors="", const char *opt="") { mgl_chart(gr, &a, colors,opt); } /// Draw Open-High-Low-Close (OHLC) diagram + /** Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */ inline void OHLC(const mglDataA &x, const mglDataA &open, const mglDataA &high, const mglDataA &low, const mglDataA &close, const char *pen="", const char *opt="") { mgl_ohlc_x(gr, &x, &open,&high,&low,&close,pen,opt); } + /// Draw Open-High-Low-Close (OHLC) diagram with x in x-axis range + /** Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */ inline void OHLC(const mglDataA &open, const mglDataA &high, const mglDataA &low, const mglDataA &close, const char *pen="", const char *opt="") { mgl_ohlc(gr, &open,&high,&low,&close,pen,opt); } /// Draw box-plot (special 5-value plot used in statistic) + /** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/ inline void BoxPlot(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_boxplot_xy(gr, &x, &y, pen,opt); } + /// Draw box-plot (special 5-value plot used in statistic) with x in x-axis range + /** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/ inline void BoxPlot(const mglDataA &y, const char *pen="", const char *opt="") { mgl_boxplot(gr, &y, pen,opt); } + /// Draw candle plot + /** Different colors are used for up and down values if 2 colors are specified. + * Style ‘#’ force drawing wire candle even for 2-color scheme. */ inline void Candle(const mglDataA &x, const mglDataA &v1, const mglDataA &v2, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_candle_xyv(gr, &x, &v1, &v2, &y1, &y2, pen, opt); } + /// Draw candle plot with x in x-axis range + /** Different colors are used for up and down values if 2 colors are specified. + * Style ‘#’ force drawing wire candle even for 2-color scheme. */ inline void Candle(const mglDataA &v1, const mglDataA &v2, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_candle_yv(gr, &v1, &v2, &y1, &y2, pen, opt); } inline void Candle(const mglDataA &v1, const mglDataA &v2, const char *pen="", const char *opt="") { mgl_candle_yv(gr, &v1, &v2, NULL, NULL, pen, opt); } + /// Draw candle plot with v1=v[i], v2=v[i+1] + /** Different colors are used for up and down values if 2 colors are specified. + * Style ‘#’ force drawing wire candle even for 2-color scheme. */ inline void Candle(const mglDataA &y, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_candle(gr, &y, &y1, &y2, pen, opt); } + /// Draw candle plot with v1=v[i], v2=v[i+1] + /** Different colors are used for up and down values if 2 colors are specified. + * Style ‘#’ force drawing wire candle even for 2-color scheme. */ inline void Candle(const mglDataA &y, const char *pen="", const char *opt="") { mgl_candle(gr, &y, NULL, NULL, pen, opt); } + /// Draw cones from points {x,y,z} to axis plane + /** String \a pen may contain: + * ‘@’ for drawing edges; + * ‘#’ for wired cones; + * ‘t’ for drawing tubes/cylinders instead of cones/prisms; + * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; + * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Cones(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="@", const char *opt="") { mgl_cones_xyz(gr, &x, &y, &z, pen, opt); } + /// Draw cones from points {x,z} to axis plane + /** String \a pen may contain: + * ‘@’ for drawing edges; + * ‘#’ for wired cones; + * ‘t’ for drawing tubes/cylinders instead of cones/prisms; + * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; + * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Cones(const mglDataA &x, const mglDataA &z, const char *pen="@", const char *opt="") { mgl_cones_xz(gr, &x, &z, pen, opt); } + /// Draw cones from points {x,z} with x in x-axis range to axis plane + /** String \a pen may contain: + * ‘@’ for drawing edges; + * ‘#’ for wired cones; + * ‘t’ for drawing tubes/cylinders instead of cones/prisms; + * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; + * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Cones(const mglDataA &z, const char *pen="@", const char *opt="") { mgl_cones(gr, &z, pen, opt); } - /// Draw error boxes {ex,ey} at points {x,y} + /// Draw error boxes {ey} at points {x,y} with x in x-axis range + /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ inline void Error(const mglDataA &y, const mglDataA &ey, const char *pen="", const char *opt="") { mgl_error(gr, &y, &ey, pen, opt); } + /// Draw error boxes {ey} at points {x,y} + /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ inline void Error(const mglDataA &x, const mglDataA &y, const mglDataA &ey, const char *pen="", const char *opt="") { mgl_error_xy(gr, &x, &y, &ey, pen, opt); } + /// Draw error boxes {ex,ey} at points {x,y} + /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ inline void Error(const mglDataA &x, const mglDataA &y, const mglDataA &ex, const mglDataA &ey, const char *pen="", const char *opt="") { mgl_error_exy(gr, &x, &y, &ex, &ey, pen, opt); } + /// Draw marks with size r at points {x,y,z} inline void Mark(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *pen, const char *opt="") { mgl_mark_xyz(gr, &x, &y, &z, &r, pen, opt); } + /// Draw marks with size r at points {x,y} inline void Mark(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *pen, const char *opt="") { mgl_mark_xy(gr, &x, &y, &r, pen, opt); } + /// Draw marks with size r at points {x,y} with x in x-axis range inline void Mark(const mglDataA &y, const mglDataA &r, const char *pen, const char *opt="") { mgl_mark_y(gr, &y, &r, pen, opt); } + /// Draw textual marks with size r at points {x,y,z} inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *text, const char *fnt="", const char *opt="") { mgl_textmark_xyzr(gr, &x, &y, &z, &r, text, fnt, opt); } + /// Draw textual marks with size r at points {x,y} inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *text, const char *fnt="", const char *opt="") { mgl_textmark_xyr(gr, &x, &y, &r, text, fnt, opt); } + /// Draw textual marks with size r at points {x,y} with x in x-axis range inline void TextMark(const mglDataA &y, const mglDataA &r, const char *text, const char *fnt="", const char *opt="") { mgl_textmark_yr(gr, &y, &r, text, fnt, opt); } + /// Draw textual marks at points {x,y} with x in x-axis range inline void TextMark(const mglDataA &y, const char *text, const char *fnt="", const char *opt="") { mgl_textmark(gr, &y, text, fnt, opt); } + /// Draw textual marks with size r at points {x,y,z} inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_textmarkw_xyzr(gr, &x, &y, &z, &r, text, fnt, opt); } + /// Draw textual marks with size r at points {x,y} inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &r, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_textmarkw_xyr(gr, &x, &y, &r, text, fnt, opt); } + /// Draw textual marks with size r at points {x,y} with x in x-axis range inline void TextMark(const mglDataA &y, const mglDataA &r, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_textmarkw_yr(gr, &y, &r, text, fnt, opt); } + /// Draw textual marks at points {x,y} with x in x-axis range inline void TextMark(const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_textmarkw(gr, &y, text, fnt, opt); } /// Draw labels for points coordinate(s) at points {x,y,z} + /** String \a fnt may contain: + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *text, const char *fnt="", const char *opt="") { mgl_label_xyz(gr, &x, &y, &z, text, fnt, opt); } + /// Draw labels for points coordinate(s) at points {x,y} + /** String \a fnt may contain: + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &x, const mglDataA &y, const char *text, const char *fnt="", const char *opt="") { mgl_label_xy(gr, &x, &y, text, fnt, opt); } + /// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range + /** String \a fnt may contain: + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &y, const char *text, const char *fnt="", const char *opt="") { mgl_label_y(gr, &y, text, fnt, opt); } + /// Draw labels for points coordinate(s) at points {x,y,z} + /** String \a fnt may contain: + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &x, const mglDataA &y, const mglDataA &z, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_labelw_xyz(gr, &x, &y, &z, text, fnt, opt); } + /// Draw labels for points coordinate(s) at points {x,y} + /** String \a fnt may contain: + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &x, const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_labelw_xy(gr, &x, &y, text, fnt, opt); } + /// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range + /** String \a fnt may contain: + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_labelw_y(gr, &y, text, fnt, opt); } /// Draw table for values val along given direction with row labels text + /** String \a fnt may contain: + * ‘#’ for drawing cell borders; + * ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’); + * ‘=’ for equal width of all cells; + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers. + * Option value set the width of the table (default is 1).*/ inline void Table(const mglDataA &val, const char *text, const char *fnt="#|", const char *opt="") { mgl_table(gr, 0, 0, &val, text, fnt, opt); } + /// Draw table for values val along given direction with row labels text + /** String \a fnt may contain: + * ‘#’ for drawing cell borders; + * ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’); + * ‘=’ for equal width of all cells; + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers. + * Option value set the width of the table (default is 1).*/ inline void Table(const mglDataA &val, const wchar_t *text, const char *fnt="#|", const char *opt="") { mgl_tablew(gr, 0, 0, &val, text, fnt, opt); } /// Draw table for values val along given direction with row labels text at given position + /** String \a fnt may contain: + * ‘#’ for drawing cell borders; + * ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’); + * ‘=’ for equal width of all cells; + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers. + * Option value set the width of the table (default is 1).*/ inline void Table(double x, double y, const mglDataA &val, const char *text, const char *fnt="#|", const char *opt="") { mgl_table(gr, x, y, &val, text, fnt, opt); } + /// Draw table for values val along given direction with row labels text at given position + /** String \a fnt may contain: + * ‘#’ for drawing cell borders; + * ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’); + * ‘=’ for equal width of all cells; + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers. + * Option value set the width of the table (default is 1).*/ inline void Table(double x, double y, const mglDataA &val, const wchar_t *text, const char *fnt="#|", const char *opt="") { mgl_tablew(gr, x, y, &val, text, fnt, opt); } /// Draw tube with radius r around curve {x,y,z} inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *pen="", const char *opt="") { mgl_tube_xyzr(gr, &x, &y, &z, &r, pen, opt); } + /// Draw tube with radius r around curve {x,y,z} inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &z, double r, const char *pen="", const char *opt="") { mgl_tube_xyz(gr, &x, &y, &z, r, pen, opt); } + /// Draw tube with radius r around curve {x,y} inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *pen="", const char *opt="") { mgl_tube_xyr(gr, &x, &y, &r, pen, opt); } + /// Draw tube with radius r around curve {x,y} inline void Tube(const mglDataA &x, const mglDataA &y, double r, const char *pen="", const char *opt="") { mgl_tube_xy(gr, &x, &y, r, pen, opt); } + /// Draw tube with radius r around curve {x,y} with x in x-axis range inline void Tube(const mglDataA &y, const mglDataA &r, const char *pen="", const char *opt="") { mgl_tube_r(gr, &y, &r, pen, opt); } + /// Draw tube with radius r around curve {x,y} with x in x-axis range inline void Tube(const mglDataA &y, double r, const char *pen="", const char *opt="") { mgl_tube(gr, &y, r, pen, opt); } - /// Draw surface of curve {r,z} rotatation around axis + /// Draw surface of curve {r,z} rotation around axis + /** Style ‘#’ produce wire plot. Style ‘.’ produce plot by dots.*/ inline void Torus(const mglDataA &r, const mglDataA &z, const char *pen="", const char *opt="") { mgl_torus(gr, &r, &z, pen,opt); } /// Draw mesh lines for 2d data specified parametrically inline void Mesh(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_mesh_xy(gr, &x, &y, &z, stl, opt); } + /// Draw mesh lines for 2d data inline void Mesh(const mglDataA &z, const char *stl="", const char *opt="") { mgl_mesh(gr, &z, stl, opt); } - /// Draw mesh lines for 2d data specified parametrically + + /// Draw waterfall plot for 2d data specified parametrically + /** Style 'x' draw lines in x-direction. */ inline void Fall(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_fall_xy(gr, &x, &y, &z, stl, opt); } + /// Draw waterfall plot for 2d data + /** Style 'x' draw lines in x-direction. */ inline void Fall(const mglDataA &z, const char *stl="", const char *opt="") { mgl_fall(gr, &z, stl, opt); } + /// Draw belts for 2d data specified parametrically + /** Style 'x' draw belts in x-direction. */ inline void Belt(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_belt_xy(gr, &x, &y, &z, stl, opt); } + /// Draw belts for 2d data + /** Style 'x' draw belts in x-direction. */ inline void Belt(const mglDataA &z, const char *stl="", const char *opt="") { mgl_belt(gr, &z, stl, opt); } + /// Draw surface for 2d data specified parametrically with color proportional to z + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void Surf(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_surf_xy(gr, &x, &y, &z, stl, opt); } + /// Draw surface for 2d data with color proportional to z + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void Surf(const mglDataA &z, const char *stl="", const char *opt="") { mgl_surf(gr, &z, stl, opt); } + /// Draw grid lines for density plot of 2d data specified parametrically inline void Grid(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_grid_xy(gr, &x, &y, &z, stl, opt); } + /// Draw grid lines for density plot of 2d data inline void Grid(const mglDataA &z, const char *stl="", const char *opt="") { mgl_grid(gr, &z, stl, opt); } + /// Draw vertical tiles for 2d data specified parametrically inline void Tile(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_tile_xy(gr, &x, &y, &z, stl, opt); } + /// Draw vertical tiles for 2d data inline void Tile(const mglDataA &z, const char *stl="", const char *opt="") { mgl_tile(gr, &z, stl, opt); } + /// Draw density plot for 2d data specified parametrically - inline void Dens(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") - { mgl_dens_xy(gr, &x, &y, &z, stl, opt); } - inline void Dens(const mglDataA &z, const char *stl="", const char *opt="") - { mgl_dens(gr, &z, stl, opt); } + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ + inline void Dens(const mglDataA &x, const mglDataA &y, const mglDataA &c, const char *stl="", const char *opt="") + { mgl_dens_xy(gr, &x, &y, &c, stl, opt); } + /// Draw density plot for 2d data + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ + inline void Dens(const mglDataA &c, const char *stl="", const char *opt="") + { mgl_dens(gr, &c, stl, opt); } + /// Draw vertical boxes for 2d data specified parametrically + /** Style ‘#’ draw filled boxes. */ inline void Boxs(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_boxs_xy(gr, &x, &y, &z, stl, opt); } + /// Draw vertical boxes for 2d data + /** Style ‘#’ draw filled boxes. */ inline void Boxs(const mglDataA &z, const char *stl="", const char *opt="") { mgl_boxs(gr, &z, stl, opt); } - /// Draw contour lines for 2d data specified parametrically + /// Draw contour lines at manual levels for 2d data specified parametrically + /** Style ‘_’ to draw contours at bottom of axis box. + * Style 't'/'T' draw contour labels below/above contours.*/ inline void Cont(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_cont_xy_val(gr, &v, &x, &y, &z, sch, opt); } + /// Draw contour lines for 2d data + /** Style ‘_’ to draw contours at bottom of axis box. + * Style 't'/'T' draw contour labels below/above contours.*/ inline void Cont(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_cont_val(gr, &v, &z, sch, opt); } + /// Draw contour lines at manual levels for 2d data specified parametrically + /** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ inline void Cont(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_cont_xy(gr, &x, &y, &z, sch, opt); } + /// Draw contour lines for 2d data + /** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ inline void Cont(const mglDataA &z, const char *sch="", const char *opt="") { mgl_cont(gr, &z, sch, opt); } - /// Draw solid contours for 2d data specified parametrically + + /// Draw solid contours at manual levels for 2d data specified parametrically + /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContF(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contf_xy_val(gr, &v, &x, &y, &z, sch, opt); } + /// Draw solid contours at manual levels for 2d data + /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContF(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contf_val(gr, &v, &z, sch, opt); } + /// Draw solid contours for 2d data specified parametrically + /** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ inline void ContF(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contf_xy(gr, &x, &y, &z, sch, opt); } + /// Draw solid contours for 2d data + /** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ inline void ContF(const mglDataA &z, const char *sch="", const char *opt="") { mgl_contf(gr, &z, sch, opt); } - /// Draw solid contours for 2d data specified parametrically with manual colors + + /// Draw solid contours at manual levels for 2d data specified parametrically with specified colors + /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContD(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contd_xy_val(gr, &v, &x, &y, &z, sch, opt); } + /// Draw solid contours at manual levels for 2d data with specified colors + /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContD(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contd_val(gr, &v, &z, sch, opt); } + /// Draw solid contours for 2d data specified parametrically with specified colors + /** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ inline void ContD(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contd_xy(gr, &x, &y, &z, sch, opt); } + /// Draw solid contours for 2d data with specified colors + /** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ inline void ContD(const mglDataA &z, const char *sch="", const char *opt="") { mgl_contd(gr, &z, sch, opt); } - /// Draw contour tubes for 2d data specified parametrically + + /// Draw contour tubes between manual levels for 2d data specified parametrically + /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContV(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv_xy_val(gr, &v, &x, &y, &z, sch, opt); } + /// Draw contour tubes between manual levels for 2d data + /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContV(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv_val(gr, &v, &z, sch, opt); } + /// Draw contour tubes for 2d data specified parametrically + /** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ inline void ContV(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv_xy(gr, &x, &y, &z, sch, opt); } + /// Draw contour tubes for 2d data + /** Style ‘_’ to draw contours at bottom of axis box. + * Option "value" set the number of contour levels (default is 7). */ inline void ContV(const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv(gr, &z, sch, opt); } - /// Draw axial-symmetric isosurfaces for 2d data specified parametrically + /// Draw axial-symmetric isosurfaces at manual levels for 2d data specified parametrically + /** String \a sch may contain: + * ‘#’ for wired plot; + * ‘.’ for plot by dots; + * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */ inline void Axial(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_axial_xy_val(gr, &v, &x, &y, &z, sch,opt); } + /// Draw axial-symmetric isosurfaces at manual levels for 2d data + /** String \a sch may contain: + * ‘#’ for wired plot; + * ‘.’ for plot by dots; + * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */ inline void Axial(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_axial_val(gr, &v, &z, sch, opt); } + /// Draw axial-symmetric isosurfaces for 2d data specified parametrically + /** String \a sch may contain: + * ‘#’ for wired plot; + * ‘.’ for plot by dots; + * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). + * Option "value" set the number of isosurfaces (default is 3). */ inline void Axial(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_axial_xy(gr, &x, &y, &z, sch, opt); } + /// Draw axial-symmetric isosurfaces for 2d data + /** String \a sch may contain: + * ‘#’ for wired plot; + * ‘.’ for plot by dots; + * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). + * Option "value" set the number of isosurfaces (default is 3). */ inline void Axial(const mglDataA &z, const char *sch="", const char *opt="") { mgl_axial(gr, &z, sch, opt); } /// Draw grid lines for density plot at slice for 3d data specified parametrically + /** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ inline void Grid3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_grid3_xyz(gr, &x, &y, &z, &a, stl, sVal, opt); } + /// Draw grid lines for density plot at slice for 3d data + /** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ inline void Grid3(const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_grid3(gr, &a, stl, sVal, opt); } + /// Draw density plot at slice for 3d data specified parametrically + /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ inline void Dens3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_dens3_xyz(gr, &x, &y, &z, &a, stl, sVal, opt); } + /// Draw density plot at slice for 3d data + /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ inline void Dens3(const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_dens3(gr, &a, stl, sVal, opt); } - /// Draw isosurface(s) for 3d data specified parametrically + /// Draw isosurface for 3d data specified parametrically + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/ inline void Surf3(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3_xyz_val(gr, Val, &x, &y, &z, &a, stl, opt); } + /// Draw isosurface for 3d data + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/ inline void Surf3(double Val, const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3_val(gr, Val, &a, stl, opt); } + /// Draw isosurfaces for 3d data specified parametrically + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3_xyz(gr, &x, &y, &z, &a, stl, opt); } + /// Draw isosurfaces for 3d data + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3(const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3(gr, &a, stl, opt); } - /// Draw a semi-transparent cloud for 3d data + /// Draw a semi-transparent cloud for 3d data specified parametrically + /** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */ inline void Cloud(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="") { mgl_cloud_xyz(gr, &x, &y, &z, &a, stl, opt); } + /// Draw a semi-transparent cloud for 3d data + /** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */ inline void Cloud(const mglDataA &a, const char *stl="", const char *opt="") { mgl_cloud(gr, &a, stl, opt); } - /// Draw contour lines at slice for 3d data specified parametrically + /// Draw contour lines at manual levels along slice for 3d data specified parametrically + /** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void Cont3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3_xyz_val(gr, &v, &x, &y, &z, &a, sch, sVal, opt); } + /// Draw contour lines at manual levels along slice for 3d data + /** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void Cont3(const mglDataA &v, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3_val(gr, &v, &a, sch, sVal, opt); } + /// Draw contour lines along slice for 3d data specified parametrically + /** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ inline void Cont3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3_xyz(gr, &x, &y, &z, &a, sch, sVal, opt); } + /// Draw contour lines along slice for 3d data + /** Style ‘#’ draw grid lines. + * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ inline void Cont3(const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3(gr, &a, sch, sVal, opt); } - /// Draw solid contours at slice for 3d data specified parametrically + /// Draw solid contours at manual levels along slice for 3d data specified parametrically + /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */ inline void ContF3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3_xyz_val(gr, &v, &x, &y, &z, &a, sch, sVal, opt); } + /// Draw solid contours at manual levels along slice for 3d data + /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */ inline void ContF3(const mglDataA &v, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3_val(gr, &v, &a, sch, sVal, opt); } + /// Draw solid contours along slice for 3d data specified parametrically + /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Option "value" set the number of contour levels (default is 7).*/ inline void ContF3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3_xyz(gr, &x, &y, &z, &a, sch, sVal, opt); } + /// Draw solid contours along slice for 3d data + /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. + * Option "value" set the number of contour levels (default is 7).*/ inline void ContF3(const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3(gr, &a, sch, sVal, opt); } /// Draw several isosurfaces for 3d beam in curvilinear coordinates + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots. + * Variable \a flag is bitwise: + * ‘0x1’ - draw in accompanied (not laboratory) coordinates; + * ‘0x2’ - draw projection to \rho-z plane; + * ‘0x4’ - draw normalized in each slice field.*/ inline void Beam(const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, double r, const char *stl=0, int flag=0, int num=3) { mgl_beam(gr, &tr,&g1,&g2,&a,r,stl,flag,num); } + /// Draw isosurface at value \a val for 3d beam in curvilinear coordinates + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots. + * Variable \a flag is bitwise: + * ‘0x1’ - draw in accompanied (not laboratory) coordinates; + * ‘0x2’ - draw projection to \rho-z plane; + * ‘0x4’ - draw normalized in each slice field.*/ inline void Beam(double val, const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, double r, const char *stl=NULL, int flag=0) { mgl_beam_val(gr,val,&tr,&g1,&g2,&a,r,stl,flag); } /// Draw vertical tiles with variable size r for 2d data specified parametrically inline void TileS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *stl="", const char *opt="") { mgl_tiles_xy(gr, &x, &y, &z, &r, stl, opt); } + /// Draw vertical tiles with variable size r for 2d data inline void TileS(const mglDataA &z, const mglDataA &r, const char *stl="", const char *opt="") { mgl_tiles(gr, &z, &r, stl, opt); } + /// Draw surface for 2d data specified parametrically with color proportional to c + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfC(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_surfc_xy(gr, &x, &y, &z, &c, sch,opt); } + /// Draw surface for 2d data with color proportional to c + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfC(const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_surfc(gr, &z, &c, sch,opt); } + /// Draw surface for 2d data specified parametrically with alpha proportional to c + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfA(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_surfa_xy(gr, &x, &y, &z, &c, sch,opt); } + /// Draw surface for 2d data with alpha proportional to c + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfA(const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_surfa(gr, &z, &c, sch,opt); } + /// Draw surface for 2d data specified parametrically with color proportional to c and alpha proportional to a + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ + inline void SurfCA(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const mglDataA &a, const char *sch="", const char *opt="") + { mgl_surfca_xy(gr, &x, &y, &z, &c, &a, sch,opt); } + /// Draw surface for 2d data with color proportional to c and alpha proportional to a + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ + inline void SurfCA(const mglDataA &z, const mglDataA &c, const mglDataA &a, const char *sch="", const char *opt="") + { mgl_surfca(gr, &z, &c, &a, sch,opt); } + /// Color map of matrix a to matrix b, both matrix can parametrically depend on coordinates + /** Style ‘.’ produce plot by dots. */ inline void Map(const mglDataA &x, const mglDataA &y, const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="") { mgl_map_xy(gr, &x, &y, &a, &b, sch, opt); } + /// Color map of matrix a to matrix b + /** Style ‘.’ produce plot by dots. */ inline void Map(const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="") { mgl_map(gr, &a, &b, sch, opt); } + /// Draw density plot for spectra-gramm specified parametrically + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void STFA(const mglDataA &x, const mglDataA &y, const mglDataA &re, const mglDataA &im, int dn, const char *sch="", const char *opt="") { mgl_stfa_xy(gr, &x, &y, &re, &im, dn, sch, opt); } + /// Draw density plot for spectra-gramm + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void STFA(const mglDataA &re, const mglDataA &im, int dn, const char *sch="", const char *opt="") { mgl_stfa(gr, &re, &im, dn, sch, opt); } - /// Draw isosurface(s) for 3d data specified parametrically with alpha proportional to b + /// Draw isosurface for 3d data specified parametrically with alpha proportional to b + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ inline void Surf3A(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a_xyz_val(gr, Val, &x, &y, &z, &a, &b, stl, opt); } + /// Draw isosurface for 3d data with alpha proportional to b + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ inline void Surf3A(double Val, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a_val(gr, Val, &a, &b, stl, opt); } + /// Draw isosurfaces for 3d data specified parametrically with alpha proportional to b + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3A(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a_xyz(gr, &x, &y, &z, &a, &b, stl, opt); } + /// Draw isosurfaces for 3d data with alpha proportional to b + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3A(const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a(gr, &a, &b, stl, opt); } - /// Draw isosurface(s) for 3d data specified parametrically with color proportional to b - inline void Surf3C(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") - { mgl_surf3c_xyz_val(gr, Val, &x, &y, &z, &a, &b, stl,opt); } - inline void Surf3C(double Val, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") - { mgl_surf3c_val(gr, Val, &a, &b, stl, opt); } - inline void Surf3C(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") - { mgl_surf3c_xyz(gr, &x, &y, &z, &a, &b, stl, opt); } - inline void Surf3C(const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") - { mgl_surf3c(gr, &a, &b, stl, opt); } + /// Draw isosurface for 3d data specified parametrically with color proportional to c + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ + inline void Surf3C(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="") + { mgl_surf3c_xyz_val(gr, Val, &x, &y, &z, &a, &c, stl,opt); } + /// Draw isosurface for 3d data with color proportional to c + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ + inline void Surf3C(double Val, const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="") + { mgl_surf3c_val(gr, Val, &a, &c, stl, opt); } + /// Draw isosurfaces for 3d data specified parametrically with color proportional to c + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ + inline void Surf3C(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="") + { mgl_surf3c_xyz(gr, &x, &y, &z, &a, &c, stl, opt); } + /// Draw isosurfaces for 3d data specified parametrically with color proportional to c + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ + inline void Surf3C(const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="") + { mgl_surf3c(gr, &a, &c, stl, opt); } + + /// Draw isosurface for 3d data specified parametrically with color proportional to c and alpha proportional to b + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ + inline void Surf3CA(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="") + { mgl_surf3ca_xyz_val(gr, Val, &x, &y, &z, &a, &c, &b, stl,opt); } + /// Draw isosurface for 3d data with color proportional to c and alpha proportional to b + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ + inline void Surf3CA(double Val, const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="") + { mgl_surf3ca_val(gr, Val, &a, &c, &b, stl, opt); } + /// Draw isosurfaces for 3d data specified parametrically with color proportional to c and alpha proportional to b + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ + inline void Surf3CA(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="") + { mgl_surf3ca_xyz(gr, &x, &y, &z, &a, &c, &b, stl, opt); } + /// Draw isosurfaces for 3d data with color proportional to c and alpha proportional to b + /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ + inline void Surf3CA(const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="") + { mgl_surf3ca(gr, &a, &c, &b, stl, opt); } /// Plot dew drops for vector field {ax,ay} parametrically depended on coordinate {x,y} inline void Dew(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_dew_xy(gr, &x, &y, &ax, &ay, sch, opt); } + /// Plot dew drops for vector field {ax,ay} inline void Dew(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_dew_2d(gr, &ax, &ay, sch, opt); } - /// Plot vectors at position {x,y,z} along {ax,ay,az} with length/color proportional to |a| + + /// Plot vectors at position {x,y} along {ax,ay} with length/color proportional to |a| + /** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */ inline void Traj(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_traj_xy(gr, &x, &y, &ax, &ay, sch, opt); } + /// Plot vectors at position {x,y,z} along {ax,ay,az} with length/color proportional to |a| + /** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */ inline void Traj(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_traj_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt); } - /// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a| + /// Plot vector field {ax,ay} parametrically depended on coordinate {x,y} with length/color proportional to |a| + /** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows. */ inline void Vect(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_vect_xy(gr, &x, &y, &ax, &ay, sch, opt); } + /// Plot vector field {ax,ay} with length/color proportional to |a| + /** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows. */ inline void Vect(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_vect_2d(gr, &ax, &ay, sch, opt); } + /// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a| + /** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows. */ inline void Vect(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_vect_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt); } + /// Plot vector field {ax,ay,az} with length/color proportional to |a| + /** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows. */ inline void Vect(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_vect_3d(gr, &ax, &ay, &az, sch, opt); } - /// Draw vector plot at slice for 3d data specified parametrically + /// Draw vector plot along slice for 3d data specified parametrically + /** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows, + * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */ inline void Vect3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *stl="", double sVal=-1, const char *opt="") { mgl_vect3_xyz(gr, &x, &y, &z, &ax,&ay,&az, stl, sVal, opt); } + /// Draw vector plot along slice for 3d data + /** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows, + * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */ inline void Vect3(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *stl="", double sVal=-1, const char *opt="") { mgl_vect3(gr, &ax,&ay,&az, stl, sVal, opt); } - /// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| + /// Plot flows for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ inline void Flow(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flow_xy(gr, &x, &y, &ax, &ay, sch, opt); } + /// Plot flows for vector field {ax,ay} with color proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ inline void Flow(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flow_2d(gr, &ax, &ay, sch, opt); } + /// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ inline void Flow(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_flow_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt); } + /// Plot flows for vector field {ax,ay,az} with color proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ inline void Flow(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_flow_3d(gr, &ax, &ay, &az, sch, opt); } - /// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| + /// Plot flow from point p for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads. */ inline void FlowP(mglPoint p, const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flowp_xy(gr, p.x, p.y, p.z, &x, &y, &ax, &ay, sch, opt); } + /// Plot flow from point p for vector field {ax,ay} with color proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads. */ inline void FlowP(mglPoint p, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flowp_2d(gr, p.x, p.y, p.z, &ax, &ay, sch, opt); } + /// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */ inline void FlowP(mglPoint p, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_flowp_xyz(gr, p.x, p.y, p.z, &x, &y, &z, &ax, &ay, &az, sch, opt); } + /// Plot flow from point p for vector field {ax,ay,az} with color proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */ inline void FlowP(mglPoint p, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_flowp_3d(gr, p.x, p.y, p.z, &ax, &ay, &az, sch, opt); } /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y,z} + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ inline void Grad(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &phi, const char *sch="", const char *opt="") { mgl_grad_xyz(gr,&x,&y,&z,&phi,sch,opt); } + /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y} + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ inline void Grad(const mglDataA &x, const mglDataA &y, const mglDataA &phi, const char *sch="", const char *opt="") { mgl_grad_xy(gr,&x,&y,&phi,sch,opt); } + /// Plot flows for gradient of scalar field phi + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ inline void Grad(const mglDataA &phi, const char *sch="", const char *opt="") { mgl_grad(gr,&phi,sch,opt); } - /// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a| + /// Plot flow pipes for vector field {ax,ay} parametrically depended on coordinate {x,y} with color and radius proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘i’ for pipe radius to be inverse proportional to amplitude. + * Option "value" sets the number of threads (default is 5). */ inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_xy(gr, &x, &y, &ax, &ay, sch, r0, opt); } + /// Plot flow pipes for vector field {ax,ay} with color and radius proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘i’ for pipe radius to be inverse proportional to amplitude. + * Option "value" sets the number of threads (default is 5). */ inline void Pipe(const mglDataA &ax, const mglDataA &ay, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_2d(gr, &ax, &ay, sch, r0, opt); } + /// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘i’ for pipe radius to be inverse proportional to amplitude; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, r0, opt); } + /// Plot flow pipes for vector field {ax,ay,az} with color and radius proportional to |a| + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘i’ for pipe radius to be inverse proportional to amplitude; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ inline void Pipe(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_3d(gr, &ax, &ay, &az, sch, r0, opt); } /// Draw density plot for data at x = sVal + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void DensX(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_dens_x(gr, &a, stl, sVal, opt); } /// Draw density plot for data at y = sVal + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void DensY(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_dens_y(gr, &a, stl, sVal, opt); } /// Draw density plot for data at z = sVal + /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void DensZ(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_dens_z(gr, &a, stl, sVal, opt); } + /// Draw contour lines for data at x = sVal + /** Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ inline void ContX(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_x(gr, &a, stl, sVal, opt); } + /// Draw contour lines at manual levels for data at x = sVal + /** Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void ContX(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_x_val(gr, &v, &a, stl, sVal, opt); } /// Draw contour lines for data at y = sVal + /** Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ inline void ContY(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_y(gr, &a, stl, sVal, opt); } + /// Draw contour lines at manual levels for data at y = sVal + /** Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void ContY(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_y_val(gr, &v, &a, stl, sVal, opt); } /// Draw contour lines for data at z = sVal + /** Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ inline void ContZ(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_z(gr, &a, stl, sVal, opt); } + /// Draw contour lines at manual levels for data at z = sVal + /** Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void ContZ(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_z_val(gr, &v, &a, stl, sVal, opt); } + /// Draw solid contours for data at x = sVal + /** Option "value" set the number of contour levels (default is 7). */ inline void ContFX(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_x(gr, &a, stl, sVal, opt); } + /// Draw solid contours at manual levels for data at x = sVal inline void ContFX(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_x_val(gr, &v, &a, stl, sVal, opt); } /// Draw solid contours for data at y = sVal + /** Option "value" set the number of contour levels (default is 7). */ inline void ContFY(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_y(gr, &a, stl, sVal, opt); } + /// Draw solid contours at manual levels for data at y = sVal inline void ContFY(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_y_val(gr, &v, &a, stl, sVal, opt); } /// Draw solid contours for data at z = sVal + /** Option "value" set the number of contour levels (default is 7). */ inline void ContFZ(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_z(gr, &a, stl, sVal, opt); } + /// Draw solid contours at manual levels for data at z = sVal inline void ContFZ(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_z_val(gr, &v, &a, stl, sVal, opt); } /// Draw curve for formula with x in x-axis range + /** Option "value" set initial number of points. */ inline void FPlot(const char *fy, const char *stl="", const char *opt="") { mgl_fplot(gr, fy, stl, opt); } /// Draw curve for formulas parametrically depended on t in range [0,1] + /** Option "value" set initial number of points. */ inline void FPlot(const char *fx, const char *fy, const char *fz, const char *stl, const char *opt="") { mgl_fplot_xyz(gr, fx, fy, fz, stl, opt); } /// Draw surface by formula with x,y in axis range + /** Option "value" set initial number of points. */ inline void FSurf(const char *fz, const char *stl="", const char *opt="") { mgl_fsurf(gr, fz, stl, opt); } /// Draw surface by formulas parametrically depended on u,v in range [0,1] + /** Option "value" set initial number of points. */ inline void FSurf(const char *fx, const char *fy, const char *fz, const char *stl, const char *opt="") { mgl_fsurf_xyz(gr, fx, fy, fz, stl, opt); } /// Draw triangle mesh for points in arrays {x,y,z} with specified color c. + /** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the triangle colors, else vertex colors. */ inline void TriPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_triplot_xyzc(gr, &nums, &x, &y, &z, &c, sch, opt); } + /// Draw triangle mesh for points in arrays {x,y,z} + /** Style ‘#’ produce wire plot. */ inline void TriPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_triplot_xyz(gr, &nums, &x, &y, &z, sch, opt); } + /// Draw triangle mesh for points in arrays {x,y} + /** Style ‘#’ produce wire plot. */ inline void TriPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const char *sch="", const char *opt="") { mgl_triplot_xy(gr, &nums, &x, &y, sch, opt); } - /// Draw quad mesh for points in arrays {x,y,z} with specified color c. + + /// Draw quad mesh for points in arrays {x,y,z} with specified color c + /** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_quadplot_xyzc(gr, &nums, &x, &y, &z, &c, sch, opt); } + /// Draw quad mesh for points in arrays {x,y,z} + /** Style ‘#’ produce wire plot. */ inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_quadplot_xyz(gr, &nums, &x, &y, &z, sch, opt); } + /// Draw quad mesh for points in arrays {x,y} + /** Style ‘#’ produce wire plot. */ inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const char *sch="", const char *opt="") { mgl_quadplot_xy(gr, &nums, &x, &y, sch, opt); } - /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. + /// Draw contour lines for triangle mesh for points in arrays {x,y,z} + /** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ inline void TriCont(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_tricont_xyc(gr, &nums, &x, &y, &z, sch, opt); } + /// Draw contour lines for triangle mesh for points in arrays {x,y,z} + /** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. + * Option "value" set the number of contour levels (default is 7). */ inline void TriContV(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_tricont_xycv(gr, &v, &nums, &x, &y, &z, sch, opt); } + /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. + /** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ inline void TriCont(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_tricont_xyzc(gr, &nums, &x, &y, &z, &a, sch, opt); } + /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. + /** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ 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); } + /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. + /** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ 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. + /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} + /** Option "value" set the number of contour levels (default is 7). */ 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); } + /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c + /** Option "value" set the number of contour levels (default is 7). */ 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); } + /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c + /** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ 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); } @@ -1174,58 +1950,73 @@ public: inline void Dots(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const mglDataA &a, const char *sch="", const char *opt="") { mgl_dots_ca(gr, &x, &y, &z, &c, &a, sch, opt); } /// Draw surface reconstructed for points in arrays {x,y,z}. + /** Style ‘#’ produce wired plot. */ inline void Crust(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_crust(gr, &x, &y, &z, sch, opt); } /// Fit data along x-direction for each data row. Return array with values for found formula. inline mglData Fit(const mglDataA &y, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_1(gr, &y, eq,vars,0, opt)); } + /// Fit data along x-direction for each data row starting from \a ini values. Return array with values for found formula. inline mglData Fit(const mglDataA &y, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_1(gr, &y, eq, vars, &ini, opt)); } /// Fit data along x-, y-directions for each data slice. Return array with values for found formula. inline mglData Fit2(const mglDataA &z, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_2(gr, &z, eq, vars,0, opt)); } + /// Fit data along x-, y-direction for each data slice starting from \a ini values. Return array with values for found formula. inline mglData Fit2(const mglDataA &z, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_2(gr, &z, eq, vars, &ini, opt)); } /// Fit data along along all directions. Return array with values for found formula. inline mglData Fit3(const mglDataA &a, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_3(gr, &a, eq, vars,0, opt)); } + /// Fit data along all directions starting from \a ini values. Return array with values for found formula. inline mglData Fit3(const mglDataA &a, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_3(gr, &a, eq, vars, &ini, opt)); } + /// Fit data along x-direction for each data row. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xy(gr, &x, &y, eq, vars,0, opt)); } + /// Fit data along x-direction for each data row starting from \a ini values. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xy(gr, &x, &y, eq, vars, &ini, opt)); } /// Fit data along x-, y-directions for each data slice. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xyz(gr, &x, &y, &z, eq, vars,0, opt)); } + /// Fit data along x-, y-directions for each data slice starting from \a ini values. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xyz(gr, &x, &y, &z, eq, vars, &ini, opt)); } /// Fit data along along all directions. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xyza(gr, &x, &y, &z, &a, eq, vars,0, opt)); } + /// Fit data along along all directions starting from \a ini values. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xyza(gr, &x, &y, &z, &a, eq,vars, &ini, opt)); } + /// Fit data with dispersion s along x-direction for each data row. Return array with values for found formula. inline mglData FitS(const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_ys(gr, &y, &s, eq, vars,0, opt)); } + /// Fit data with dispersion s along x-direction for each data row starting from \a ini values. Return array with values for found formula. inline mglData FitS(const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_ys(gr, &y, &s, eq, vars, &ini, opt)); } + /// Fit data with dispersion s along x-direction for each data row. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xys(gr, &x, &y, &s, eq, vars,0, opt)); } + /// Fit data with dispersion s along x-direction for each data row starting from \a ini values. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xys(gr, &x, &y, &s, eq, vars, &ini, opt)); } /// Fit data with dispersion s along x-, y-directions for each data slice. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &s, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xyzs(gr, &x, &y, &z, &s, eq, vars,0, opt)); } + /// Fit data with dispersion s along x-, y-directions for each data slice starting from \a ini values. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xyzs(gr, &x, &y, &z, &s, eq, vars, &ini, opt)); } /// Fit data with dispersion s along all directions. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &s, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xyzas(gr, &x, &y, &z, &a, &s, eq, vars,0, opt)); } + /// Fit data with dispersion s along all directions starting from \a ini values. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xyzas(gr, &x, &y, &z, &a, &s, eq, vars, &ini, opt)); } + /// Print fitted last formula (with coefficients) inline void PutsFit(mglPoint p, const char *prefix=0, const char *font="", double size=-1) { mgl_puts_fit(gr, p.x, p.y, p.z, prefix, font, size); } @@ -1235,18 +2026,25 @@ public: /// Get chi for last fitted formula static inline mreal GetFitChi() { return mgl_get_fit_chi(); } + /// Get covariance matrix for last fitted formula + static inline mglData GetFitCovar() + { return mglData(mgl_get_fit_covar()); } - /// Solve PDE with x,y,z in range [Min, Max] + /// Solve PDE with x,y,z in range axis range inline mglData PDE(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, double dz=0.1, double k0=100, const char *opt="") { return mglData(true,mgl_pde_solve(gr,ham,&ini_re,&ini_im,dz,k0, opt)); } - /// Fill data by formula with x,y,z in range [Min, Max] + /// Solve PDE with x,y,z in range axis range + inline mglDataC PDEc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, double dz=0.1, double k0=100, const char *opt="") + { return mglDataC(true,mgl_pde_solve_c(gr,ham,&ini_re,&ini_im,dz,k0, opt)); } + + /// Fill data by formula with x,y,z in range axis range inline void Fill(mglData &u, const char *eq, const char *opt="") { mgl_data_fill_eq(gr, &u, eq, 0, 0, opt); } inline void Fill(mglData &u, const char *eq, const mglDataA &v, const char *opt="") { mgl_data_fill_eq(gr, &u, eq, &v, 0, opt); } inline void Fill(mglData &u, const char *eq, const mglDataA &v, const mglDataA &w, const char *opt="") { mgl_data_fill_eq(gr, &u, eq, &v, &w, opt); } - /// Fill data by formula with x,y,z in range [Min, Max] + /// Fill data by formula with x,y,z in range axis range inline void Fill(mglDataC &u, const char *eq, const char *opt="") { mgl_datac_fill_eq(gr, &u, eq, 0, 0, opt); } inline void Fill(mglDataC &u, const char *eq, const mglDataA &v, const char *opt="") @@ -1254,23 +2052,40 @@ public: inline void Fill(mglDataC &u, const char *eq, const mglDataA &v, const mglDataA &w, const char *opt="") { mgl_datac_fill_eq(gr, &u, eq, &v, &w, opt); } - /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range + /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in axis range inline void Refill(mglData &dat, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="") { mgl_data_refill_gr(gr,&dat,&xdat,0,0,&vdat,sl,opt); } + /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat for x,y in axis range inline void Refill(mglData &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="") { mgl_data_refill_gr(gr,&dat,&xdat,&ydat,0,&vdat,sl,opt); } + /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range inline void Refill(mglData &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="") { mgl_data_refill_gr(gr,&dat,&xdat,&ydat,&zdat,&vdat,-1,opt); } - /// Set the data by triangulated surface values assuming x,y,z in range [Min, Max] + /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in axis range + inline void Refill(mglDataC &dat, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="") + { mgl_datac_refill_gr(gr,&dat,&xdat,0,0,&vdat,sl,opt); } + /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat for x,y in axis range + inline void Refill(mglDataC &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="") + { mgl_datac_refill_gr(gr,&dat,&xdat,&ydat,0,&vdat,sl,opt); } + /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range + inline void Refill(mglDataC &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="") + { mgl_datac_refill_gr(gr,&dat,&xdat,&ydat,&zdat,&vdat,-1,opt); } + + /// Set the data by triangulated surface values assuming x,y,z in range axis range inline void DataGrid(mglData &d, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *opt="") { mgl_data_grid(gr,&d,&x,&y,&z,opt); } /// Make histogram (distribution) of data. This function do not plot data. + /** Option "value" sets the size of output array (default is mglFitPnts=100). */ inline mglData Hist(const mglDataA &x, const mglDataA &a, const char *opt="") { return mglData(true, mgl_hist_x(gr, &x, &a, opt)); } + /// Make histogram (distribution) of data. This function do not plot data. + /** Option "value" sets the size of output array (default is mglFitPnts=100). */ inline mglData Hist(const mglDataA &x, const mglDataA &y, const mglDataA &a, const char *opt="") { return mglData(true, mgl_hist_xy(gr, &x, &y, &a, opt)); } + /// Make histogram (distribution) of data. This function do not plot data. + /** Option "value" sets the size of output array (default is mglFitPnts=100). */ inline mglData Hist(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *opt="") { return mglData(true, mgl_hist_xyz(gr, &x, &y, &z, &a, opt)); } @@ -1333,6 +2148,11 @@ public: /// Load new commands from external dynamic Library (must have "const mglCommand *mgl_cmd_extra" variable) inline void LoadDLL(const char *fname) { mgl_parser_load(pr, fname); } + /// Apply one step for equation d vars[i]/dt = eqs[i] using Runge-Kutta method + inline void RK_Step(const char *eqs, const char *vars, mreal dt=1) + { mgl_rk_step(pr, eqs, vars, dt); } + inline void RK_Step(const wchar_t *eqs, const wchar_t *vars, mreal dt=1) + { mgl_rk_step_w(pr, eqs, vars, dt); } /// Set value for parameter $N inline void AddParam(int id, const char *str) @@ -1356,11 +2176,17 @@ public: inline mglData Calc(const wchar_t *formula) { return mglData(true,mgl_parser_calcw(pr,formula)); } + /// Return result of formula evaluation as complex data + inline mglDataC CalcComplex(const char *formula) + { return mglDataC(true,mgl_parser_calc_complex(pr,formula)); } + inline mglDataC CalcComplex(const wchar_t *formula) + { return mglDataC(true,mgl_parser_calc_complexw(pr,formula)); } + /// Find variable with given name or add a new one /// NOTE !!! You must not delete obtained data arrays !!! - inline mglData *AddVar(const char *name) + inline mglDataA *AddVar(const char *name) { return mgl_parser_add_var(pr, name); } - inline mglData *AddVar(const wchar_t *name) + inline mglDataA *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 !!! diff --git a/include/mgl2/mgl_pas.pas b/include/mgl2/mgl_pas.pas index 85d594a..5de4b9c 100644 --- a/include/mgl2/mgl_pas.pas +++ b/include/mgl2/mgl_pas.pas @@ -132,9 +132,13 @@ procedure mgl_qt_run(); cdecl; external libmglqt; {== ../../include/mgl2/abstract.h ==} //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- +/// Set seed for random numbers +procedure mgl_srnd(seed: integer); cdecl; external libmgl; +/// Get random number +function mgl_rnd(): double; cdecl; external libmgl; /// 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; +procedure mgl_data_set_name(dat: HMDT;const name: PChar); cdecl; external libmgl; +procedure mgl_data_set_name_w(dat: HMDT;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; @@ -184,7 +188,7 @@ function mgl_data_momentum_val(const d: HMDT;dir: char;m: Pmreal;w: Pmreal;s: P //----------------------------------------------------------------------------- {== ../../include/mgl2/base_cf.h ==} //----------------------------------------------------------------------------- -/// Check if MathGL version is valid +/// Check if MathGL version is valid (return 0) or not (return 1) function mgl_check_version(const ver: PChar): integer; cdecl; external libmgl; /// Suppress printing warnings to stderr procedure mgl_suppress_warn(on: integer); cdecl; external libmgl; @@ -192,7 +196,7 @@ procedure mgl_suppress_warn(on: integer); cdecl; external libmgl; function mgl_get_warn(gr: HMGL): integer; cdecl; external libmgl; /// Set warning code ant fill message procedure mgl_set_warn(gr: HMGL;code: integer;const text: PChar); cdecl; external libmgl; -/// Set buffer for warning messages +/// Get text of warning message(s) function mgl_get_mess(gr: HMGL): PChar; cdecl; external libmgl; /// Set name of plot for saving filename procedure mgl_set_plotid(gr: HMGL;const id: PChar); cdecl; external libmgl; @@ -277,7 +281,7 @@ procedure mgl_set_func(gr: HMGL;const EqX: PChar;const EqY: PChar;const EqZ: PC /// Set one of predefined transformation rule procedure mgl_set_coor(gr: HMGL;how: integer); cdecl; external libmgl; /// Set to draw Ternary axis (triangle like axis, grid and so on) -procedure mgl_set_ternary(gr: HMGL;enable: integer); cdecl; external libmgl; +procedure mgl_set_ternary(gr: HMGL;kind: integer); cdecl; external libmgl; /// Set to use or not tick labels rotation procedure mgl_set_tick_rotate(gr: HMGL;enable: integer); cdecl; external libmgl; /// Set to use or not tick labels skipping @@ -305,10 +309,6 @@ procedure mgl_restore_font(gr: HMGL); cdecl; external libmgl; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -/// Set seed for random numbers -procedure mgl_srnd(seed: integer); cdecl; external libmgl; -/// Get random number -function mgl_rnd(): double; cdecl; external libmgl; /// Get integer power of x function mgl_ipow(x: double;n: integer): double; cdecl; external libmgl; /// Get number of seconds since 1970 for given string @@ -555,10 +555,6 @@ function mgl_expr_diff_v(ex: HMEX;dir: char;vars: Pmreal): double; cdecl; exter //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -/// Set seed for random numbers -procedure mgl_srnd(seed: integer); cdecl; external libmgl; -/// Get random number -function mgl_rnd(): double; cdecl; external libmgl; /// Get integer power of x function mgl_ipowc(x: dual;n: integer): dual; cdecl; external libmgl; /// Get exp(i*a) @@ -819,6 +815,7 @@ function mgl_hist_x(gr: HMGL;const x: HMDT;const a: HMDT;const opt: PChar): HMD function mgl_hist_xy(gr: HMGL;const x: HMDT;const y: HMDT;const a: HMDT;const opt: PChar): HMDT; cdecl; external libmgl; function mgl_hist_xyz(gr: HMGL;const x: HMDT;const y: HMDT;const z: HMDT;const a: HMDT;const opt: PChar): HMDT; cdecl; external libmgl; procedure mgl_puts_fit(gr: HMGL;x: double;y: double;z: double;const prefix: PChar;const font: PChar;size: double); cdecl; external libmgl; +function mgl_get_fit_chi(): mreal; cdecl; external libmgl; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -1102,8 +1099,8 @@ procedure mgl_ellipse(gr: HMGL;x1: double;y1: double;z1: double;x2: double;y2: procedure mgl_rhomb(gr: HMGL;x1: double;y1: double;z1: double;x2: double;y2: double;z2: double;r: double;const stl: PChar); cdecl; external libmgl; /// Draws the polygon based on points p1,p2 with color stl procedure mgl_polygon(gr: HMGL;x1: double;y1: double;z1: double;x2: double;y2: double;z2: double;n: integer;const stl: PChar); cdecl; external libmgl; -procedure mgl_arc_ext(gr: HMGL;x0: double;y0: double;z0: double;xr: double;yr: double;zr: double;x1: double;y1: double;z1: double;a: double; !!! const char* stl); cdecl; external libmgl; -procedure mgl_arc(gr: HMGL;x0: double;y0: double;x1: double;y1: double;a: double; !!! const char* stl); cdecl; external libmgl; +procedure mgl_arc_ext(gr: HMGL;x0: double;y0: double;z0: double;xr: double;yr: double;zr: double;x1: double;y1: double;z1: double;a: double;const stl: PChar); cdecl; external libmgl; +procedure mgl_arc(gr: HMGL;x0: double;y0: double;x1: double;y1: double;a: double;const stl: PChar); cdecl; external libmgl; /// Draw cones from points {x,y,z} to axis plane procedure mgl_cones_xyz(graph: HMGL;const x: HMDT;const y: HMDT;const z: HMDT;const pen: PChar;const opt: PChar); cdecl; external libmgl; /// Draw cones from points {x,z} to axis plane @@ -1141,6 +1138,9 @@ procedure mgl_labelw_y(graph: HMGL;const y: HMDT;const text: PWideChar;const fn /// Draw table for values val along given direction with row labels text at position {x,y} procedure mgl_table(gr: HMGL;x: double;y: double;const val: HMDT;const text: PChar;const fnt: PChar;const opt: PChar); cdecl; external libmgl; procedure mgl_tablew(gr: HMGL;x: double;y: double;const val: HMDT;const text: PWideChar;const fnt: PChar;const opt: PChar); cdecl; external libmgl; +/// Draws bitmap (logo) which is stretched along whole axis range +procedure mgl_logo(gr: HMGL;w: integer;h: integer;const rgba: PByte;smooth: integer;const opt: PChar); cdecl; external libmgl; +procedure mgl_logo_file(gr: HMGL;const fname: PChar;smooth: integer;const opt: PChar); cdecl; external libmgl; //----------------------------------------------------------------------------- {== ../../include/mgl2/other.h ==} //----------------------------------------------------------------------------- @@ -1374,6 +1374,8 @@ procedure mgl_set_frame(gr: HMGL;i: integer); cdecl; external libmgl; procedure mgl_show_frame(gr: HMGL;i: integer); cdecl; external libmgl; /// Delete primitives for i-th frame (work if MGL_VECT_FRAME is set on) procedure mgl_del_frame(gr: HMGL;i: integer); cdecl; external libmgl; +/// Clear list of primitives for current drawing +procedure mgl_clear_frame(gr: HMGL); cdecl; external libmgl; /// Set the transparency type (0 - usual, 1 - glass, 2 - lamp) procedure mgl_set_transp_type(gr: HMGL;kind: integer); cdecl; external libmgl; /// Set the transparency on/off. @@ -1396,6 +1398,8 @@ procedure mgl_mat_pop(gr: HMGL); cdecl; external libmgl; procedure mgl_mat_push(gr: HMGL); cdecl; external libmgl; /// Clear up the frame procedure mgl_clf(gr: HMGL); cdecl; external libmgl; +/// Clear up the frame but keep fog settings +procedure mgl_clf_nfog(gr: HMGL); cdecl; external libmgl; /// Clear up the frame and fill background by specified color procedure mgl_clf_rgb(gr: HMGL;r: double;g: double;b: double); cdecl; external libmgl; /// Clear up the frame and fill background by specified color @@ -1441,6 +1445,7 @@ procedure mgl_view(gr: HMGL;TetX: double;TetZ: double;TetY: double); cdecl; ext procedure mgl_zoom(gr: HMGL;x1: double;y1: double;x2: double;y2: double); cdecl; external libmgl; //----------------------------------------------------------------------------- /// Callback function for mouse click +/// Set callback functions for drawing and data reloading /// Set delay for animation in seconds procedure mgl_wnd_set_delay(gr: HMGL;dt: double); cdecl; external libmgl; /// Get delay for animation in seconds @@ -1496,6 +1501,8 @@ procedure mgl_parser_del_var(p: HMPR;const name: PChar); cdecl; external libmgl procedure mgl_parser_del_varw(p: HMPR;const name: PWideChar); cdecl; external libmgl; /// Delete all data variables procedure mgl_parser_del_all(p: HMPR); cdecl; external libmgl; +/// Load new commands from external dynamic Library (must have "const mglCommand *mgl_cmd_extra" variable) +procedure mgl_parser_load(pr: HMPR;const dll_name: PChar); cdecl; external libmgl; /// Parse and draw single line of the MGL script function mgl_parse_line(gr: HMGL;p: HMPR;const str: PChar;pos: integer): integer; cdecl; external libmgl; function mgl_parse_linew(gr: HMGL;p: HMPR;const str: PWideChar;pos: integer): integer; cdecl; external libmgl; @@ -1509,6 +1516,8 @@ procedure mgl_parser_restore_once(p: HMPR); cdecl; external libmgl; procedure mgl_parser_allow_setsize(p: HMPR;a: integer); cdecl; external libmgl; /// Allow reading/saving files procedure mgl_parser_allow_file_io(p: HMPR;a: integer); cdecl; external libmgl; +/// Allow loading commands from external libraries +procedure mgl_parser_allow_dll_call(p: HMPR;a: integer); cdecl; external libmgl; /// Set flag to stop script parsing procedure mgl_parser_stop(p: HMPR); cdecl; external libmgl; /// Return type of command: 0 - not found, 1 - data plot, 2 - other plot, diff --git a/include/mgl2/opengl.h b/include/mgl2/opengl.h index a859043..beae2f6 100644 --- a/include/mgl2/opengl.h +++ b/include/mgl2/opengl.h @@ -59,7 +59,6 @@ protected: unsigned char **GetRGBLines(long &w, long &h, unsigned char *&f, bool solid=true); void LightScale(const mglMatrix *M); - void set_pen(unsigned style,mreal width); void gl_clf(mglColor Back=WC); }; diff --git a/include/mgl2/other.h b/include/mgl2/other.h index 277b1ce..4d1675c 100644 --- a/include/mgl2/other.h +++ b/include/mgl2/other.h @@ -26,49 +26,74 @@ extern "C" { #endif /// Draw triangle mesh for points in arrays {x,y,z} with specified color c. +/** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the triangle colors, else vertex colors. */ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_triplot_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,int); /// Draw triangle mesh for points in arrays {x,y,z} with color proportional to z. +/** Style ‘#’ produce wire plot. */ void MGL_EXPORT mgl_triplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_triplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw triangle mesh for points in arrays {x,y} +/** Style ‘#’ produce wire plot. */ void MGL_EXPORT mgl_triplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt); void MGL_EXPORT mgl_triplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int); /// Draw quad mesh for points in arrays {x,y,z} with specified color c. +/** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_quadplot_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,int); /// Draw quad mesh for points in arrays {x,y,z} with color proportional to z. +/** Style ‘#’ produce wire plot. */ void MGL_EXPORT mgl_quadplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_quadplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw quad mesh for points in arrays {x,y}. +/** Style ‘#’ produce wire plot. */ void MGL_EXPORT mgl_quadplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt); void MGL_EXPORT mgl_quadplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int); /// Draw manual contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. +/** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_tricont_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *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,int); /// Draw manual contour lines for triangle mesh for points in arrays {x,y,z}. +/** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_tricont_xycv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_tricont_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,int); /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. +/** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_tricont_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_tricont_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, int); /// Draw contour lines for triangle mesh for points in arrays {x,y,z}. +/** Style ‘_’ to draw contours at bottom of axis box. + * Style ‘t’/‘T’ draw contour labels below/above contours. + * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_tricont_xyc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_tricont_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int, int); - /// Draw manual contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c. +/** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_tricontv_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *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,int); /// Draw manual contour tubes for triangle mesh for points in arrays {x,y,z}. +/** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_tricontv_xycv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); 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,int); /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c. +/** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_tricontv_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); 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, int); /// Draw contour tubes for triangle mesh for points in arrays {x,y,z}. +/** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_tricontv_xyc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); 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, int); @@ -83,46 +108,62 @@ void MGL_EXPORT mgl_dots_ca(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, con void MGL_EXPORT mgl_dots_ca_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw surface reconstructed for points in arrays {x,y,z}. +/** Style ‘#’ produce wired plot. */ void MGL_EXPORT mgl_crust(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_crust_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw density plot for data at x = sVal +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_dens_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw density plot for data at y = sVal +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_dens_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw density plot for data at z = sVal +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_dens_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw contour lines for data at x = sVal +/** Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw contour lines for data at y = sVal +/** Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw contour lines for data at z = sVal +/** Style ‘t’/‘T’ draw contour labels below/above contours. + * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw manual contour lines for data at x = sVal +/** Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_x_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_x_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw manual contour lines for data at y = sVal +/** Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_y_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_y_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw manual contour lines for data at z = sVal +/** Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_z_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_z_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw solid contours for data at x = sVal +/** Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_contf_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw solid contours for data at y = sVal +/** Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_contf_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw solid contours for data at z = sVal +/** Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_contf_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); diff --git a/include/mgl2/parser.h b/include/mgl2/parser.h index 3ff6fa4..f952074 100644 --- a/include/mgl2/parser.h +++ b/include/mgl2/parser.h @@ -35,7 +35,8 @@ struct mglArg std::wstring w; ///< String with parameters std::string s; ///< String with parameters mreal v; ///< Numerical value (used if type==2) - mglArg():type(-1),d(0),v(0) {} + dual c; ///< Numerical complex value (used if type==2) + mglArg():type(-1),d(0),v(0),c(0.) {} }; //----------------------------------------------------------------------------- /// Structure for MGL command @@ -58,8 +59,9 @@ extern mglCommand mgls_base_cmd[]; struct mglNum { mreal d; ///< Number itself + dual c; std::wstring s; ///< Number name - mglNum(mreal val=0):d(val) {} + mglNum(mreal val=0):d(val),c(val) {} }; //----------------------------------------------------------------------------- /// Structure for function name and position. @@ -97,7 +99,7 @@ public: bool AllowDllCall; ///< Allow calls from external dynamic libraries bool AllowSetSize; ///< Allow using setsize command bool AllowFileIO; ///< Allow reading/saving files - bool Stop; ///< Stop command was. Flag prevent further execution + volatile bool Stop; ///< Stop command was. Flag prevent further execution mglCommand *Cmd; ///< Table of MGL commands (can be changed by user). It MUST be sorted by 'name'!!! long InUse; ///< Smart pointer (number of users) const mglBase *curGr; ///< Current grapher @@ -139,8 +141,8 @@ public: mglDataA *FindVar(const char *name) MGL_FUNC_PURE; mglDataA *FindVar(const wchar_t *name) MGL_FUNC_PURE; /// Find variable or create it if absent - mglData *AddVar(const char *name); - mglData *AddVar(const wchar_t *name); + mglDataA *AddVar(const char *name); + mglDataA *AddVar(const wchar_t *name); /// Find number or return 0 if absent mglNum *FindNum(const char *name) MGL_FUNC_PURE; mglNum *FindNum(const wchar_t *name) MGL_FUNC_PURE; @@ -192,6 +194,7 @@ private: /// In skip mode bool inline ifskip() { return (if_pos>0 && !(if_stack[if_pos-1]&1)); } bool inline skip() { return (Skip || ifskip() || for_br); } + bool CheckForName(const std::wstring &s); // check if name is valid for new data }; //----------------------------------------------------------------------------- #endif diff --git a/include/mgl2/plot.h b/include/mgl2/plot.h index 2494ae2..cd7d708 100644 --- a/include/mgl2/plot.h +++ b/include/mgl2/plot.h @@ -26,13 +26,16 @@ extern "C" { #endif /// Draw curve for formula with x in x-axis range +/** Option "value" set initial number of points. */ void MGL_EXPORT mgl_fplot(HMGL gr, const char *eqY, const char *pen, const char *opt); void MGL_EXPORT mgl_fplot_(uintptr_t *gr, const char *fy, const char *stl, const char *opt, int ly, int ls, int lo); /// Draw curve for formulas parametrically depended on t in range [0,1] +/** Option "value" set initial number of points. */ void MGL_EXPORT mgl_fplot_xyz(HMGL gr, const char *eqX, const char *eqY, const char *eqZ, const char *pen, const char *opt); void MGL_EXPORT mgl_fplot_xyz_(uintptr_t *gr, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt, int lx, int ly, int lz, int ls, int lo); /// Draw radar chart (plot in curved coordinates) +/** Option "value" set the additional shift of data (i.e. the data a+value is used instead of a).*/ void MGL_EXPORT mgl_radar(HMGL graph, HCDT a, const char *pen, const char *opt); void MGL_EXPORT mgl_radar_(uintptr_t *gr, uintptr_t *a, const char *pen, const char *opt, int l,int lo); @@ -56,40 +59,53 @@ void MGL_EXPORT mgl_tens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintp void MGL_EXPORT mgl_tens(HMGL graph, HCDT y, HCDT c, const char *pen, const char *opt); void MGL_EXPORT mgl_tens_(uintptr_t *graph, uintptr_t *y, uintptr_t *c, const char *pen, const char *opt,int,int); -/// Draw tape(s) which rotates as (bi-)normales of curve {x,y,z} +/// Draw tapes which rotates as (bi-)normales of curve {x,y,z} +/** The width of tape is proportional to barwidth and can be changed by option "value".*/ void MGL_EXPORT mgl_tape_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_tape_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); -/// Draw tape(s) which rotates as (bi-)normales of curve {x,y} +/// Draw tapes which rotates as (bi-)normales of curve {x,y} +/** The width of tape is proportional to barwidth and can be changed by option "value".*/ void MGL_EXPORT mgl_tape_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_tape_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); -/// Draw tape(s) which rotates as (bi-)normales of curve {x,y} with x in x-axis range +/// Draw tapes which rotates as (bi-)normales of curve {x,y} with x in x-axis range +/** The width of tape is proportional to barwidth and can be changed by option "value".*/ void MGL_EXPORT mgl_tape(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_tape_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw box-plot (special 5-value plot used in statistic) for data specified parametrically +/** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/ void MGL_EXPORT mgl_boxplot_xy(HMGL graph, HCDT x, HCDT a, const char *pen, const char *opt); void MGL_EXPORT mgl_boxplot_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw box-plot (special 5-value plot used in statistic) +/** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/ void MGL_EXPORT mgl_boxplot(HMGL graph, HCDT a, const char *pen, const char *opt); void MGL_EXPORT mgl_boxplot_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Fill area between curve {x,y,z} and axis plane +/** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_area_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_area_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Fill area between curve {x,y} and axis plane +/** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_area_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_area_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Fill area between curve {x,y} with x in x-axis range and axis plane +/** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_area(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_area_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2} +/** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_region_3d(HMGL graph, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT y2, HCDT z2, const char *pen, const char *opt); void MGL_EXPORT mgl_region_3d_(uintptr_t *graph, uintptr_t *x1, uintptr_t *y1, uintptr_t *z1, uintptr_t *x2, uintptr_t *y2, uintptr_t *z2, const char *pen, const char *opt,int,int); /// Fill area between curves {x,y1} and {x,y2} +/** Style 'i' will fill area only if y1 < y2. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_region_xy(HMGL graph, HCDT x, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_region_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int); /// Fill area between curves {x,y1} and {x,y2} with x in x-axis range +/** Style 'i' will fill area only if y1 < y2. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_region(HMGL graph, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_region_(uintptr_t *graph, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int); @@ -114,40 +130,71 @@ void MGL_EXPORT mgl_step(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_step_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw vertical bars from points {x,y,z} to axis plane +/** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_bars_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_bars_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw vertical bars from points {x,y} to axis plane +/** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_bars_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_bars_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw vertical bars from points {x,y} with x in x-axis range to axis plane +/** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_bars(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_bars_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw horizontal bars from points {v,y} to axis plane +/** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_barh_yx(HMGL graph, HCDT y, HCDT v, const char *pen, const char *opt); void MGL_EXPORT mgl_barh_yx_(uintptr_t *graph, uintptr_t *y, uintptr_t *v, const char *pen, const char *opt,int,int); /// Draw horizontal bars from points {v,y} with y in y-axis range to axis plane +/** String \a pen may contain: + * ‘a’ for drawing boxes one above another (like summation); + * ‘f’ for waterfall chart; + * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_barh(HMGL graph, HCDT v, const char *pen, const char *opt); void MGL_EXPORT mgl_barh_(uintptr_t *graph, uintptr_t *v, const char *pen, const char *opt,int,int); /// Draw Open-High-Low-Close (OHLC) diagram +/** Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */ void MGL_EXPORT mgl_ohlc_x(HMGL graph, HCDT x, HCDT open, HCDT high, HCDT low, HCDT close, const char *pen, const char *opt); void MGL_EXPORT mgl_ohlc_x_(uintptr_t *graph, uintptr_t *x, uintptr_t *open, uintptr_t *high, uintptr_t *low, uintptr_t *close, const char *pen, const char *opt,int,int); /// Draw Open-High-Low-Close (OHLC) diagram with x in x-axis range +/** Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */ void MGL_EXPORT mgl_ohlc(HMGL graph, HCDT open, HCDT high, HCDT low, HCDT close, const char *pen, const char *opt); void MGL_EXPORT mgl_ohlc_(uintptr_t *graph, uintptr_t *open, uintptr_t *high, uintptr_t *low, uintptr_t *close, const char *pen, const char *opt,int,int); /// Draw chart for data a +/** Space denote transparent color. Style '#' draw black borders. */ void MGL_EXPORT mgl_chart(HMGL graph, HCDT a, const char *col, const char *opt); void MGL_EXPORT mgl_chart_(uintptr_t *graph, uintptr_t *a, const char *col, const char *opt,int,int); /// Draw error boxes {ex,ey} at points {x,y} +/** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ void MGL_EXPORT mgl_error_exy(HMGL graph, HCDT x, HCDT y, HCDT ex, HCDT ey, const char *pen, const char *opt); void MGL_EXPORT mgl_error_exy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ex, uintptr_t *ey, const char *pen, const char *opt,int,int); /// Draw error boxes {ey} at points {x,y} +/** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ void MGL_EXPORT mgl_error_xy(HMGL graph, HCDT x, HCDT y, HCDT ey, const char *pen, const char *opt); void MGL_EXPORT mgl_error_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int,int); /// Draw error boxes {ey} at points {x,y} with x in x-axis range +/** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ void MGL_EXPORT mgl_error(HMGL graph, HCDT y, HCDT ey, const char *pen, const char *opt); void MGL_EXPORT mgl_error_(uintptr_t *graph, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int,int); @@ -181,12 +228,18 @@ void MGL_EXPORT mgl_tube(HMGL graph, HCDT y, double r, const char *pen, const ch void MGL_EXPORT mgl_tube_(uintptr_t *graph, uintptr_t *y, mreal *r, const char *pen, const char *opt,int,int); /// Draw candle plot for data specified parametrically +/** Different colors are used for up and down values if 2 colors are specified. + * Style ‘#’ force drawing wire candle even for 2-color scheme. */ void MGL_EXPORT mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_candle_xyv_(uintptr_t *gr, uintptr_t *x, uintptr_t *v1, uintptr_t *v2, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); /// Draw candle plot +/** Different colors are used for up and down values if 2 colors are specified. + * Style ‘#’ force drawing wire candle even for 2-color scheme. */ void MGL_EXPORT mgl_candle_yv(HMGL gr, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_candle_yv_(uintptr_t *gr, uintptr_t *v1, uintptr_t *v2, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); /// Draw candle plot with v1=v[i], v2=v[i+1] +/** Different colors are used for up and down values if 2 colors are specified. + * Style ‘#’ force drawing wire candle even for 2-color scheme. */ void MGL_EXPORT mgl_candle(HMGL gr, HCDT v, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_candle_(uintptr_t *gr, uintptr_t *y, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); diff --git a/include/mgl2/prim.h b/include/mgl2/prim.h index 582d4a7..18f7e55 100644 --- a/include/mgl2/prim.h +++ b/include/mgl2/prim.h @@ -33,6 +33,7 @@ void MGL_EXPORT mgl_ball(HMGL gr, double x,double y,double z); void MGL_EXPORT mgl_ball_(uintptr_t *gr, mreal *x, mreal *y, mreal *z); /// Draws the line between 2 points by specified pen +/** Large \a n (for example, n=100) should be used for geodesic line in curvilinear coordinates */ void MGL_EXPORT mgl_line(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, const char *pen,int n); void MGL_EXPORT mgl_line_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, const char *pen,int *n,int); /// Draws the spline curve between 2 points by specified pen @@ -60,35 +61,71 @@ void MGL_EXPORT mgl_facez_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal void MGL_EXPORT mgl_sphere(HMGL gr, double x, double y, double z, double r, const char *stl); void MGL_EXPORT mgl_sphere_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal *r, const char *stl, int); /// Draws the drop at point {x,y,z} in direction {dx,dy,dz} with color stl and radius r +/** Parameter \a shift set the degree of drop oblongness: ‘0’ is sphere, ‘1’ is maximally oblongness drop. Parameter \a ap set relative width of the drop (this is analogue of “ellipticity” for the sphere).*/ void MGL_EXPORT mgl_drop(HMGL gr, double x, double y, double z, double dx, double dy, double dz, double r, const char *stl, double shift, double ap); void MGL_EXPORT mgl_drop_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, mreal *shift, mreal *ap, int); /// Draws the cone between points p1,p2 with radius r1,r2 and with style stl +/** Parameter \a stl can contain: + * ‘@’ for drawing edges; + * ‘#’ for wired cones; + * ‘t’ for drawing tubes/cylinder instead of cones/prisms; + * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones.*/ void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r1, double r2, const char *stl); void MGL_EXPORT mgl_cone_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r1, mreal *r2, const char *stl, int); /// Draws the ellipse between points p1,p2 with color stl and width r +/** Parameter \a stl can contain: + * ‘#’ for wired figure (boundary only); + * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl); void MGL_EXPORT mgl_ellipse_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, int); /// Draws the rhomb between points p1,p2 with color stl and width r +/** Parameter \a stl can contain: + * ‘#’ for wired figure (boundary only); + * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ 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 +/** Parameter \a stl can contain: + * ‘#’ for wired figure (boundary only); + * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ 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(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(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 +/** String \a pen may contain: + * ‘@’ for drawing edges; + * ‘#’ for wired cones; + * ‘t’ for drawing tubes/cylinders instead of cones/prisms; + * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; + * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_cones_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_cones_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw cones from points {x,z} to axis plane +/** String \a pen may contain: + * ‘@’ for drawing edges; + * ‘#’ for wired cones; + * ‘t’ for drawing tubes/cylinders instead of cones/prisms; + * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; + * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_cones_xz(HMGL graph, HCDT x, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_cones_xz_(uintptr_t *graph, uintptr_t *x, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw cones from points {x,z} with x in x-axis range to axis plane +/** String \a pen may contain: + * ‘@’ for drawing edges; + * ‘#’ for wired cones; + * ‘t’ for drawing tubes/cylinders instead of cones/prisms; + * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; + * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. + * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_cones(HMGL graph, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_cones_(uintptr_t *graph, uintptr_t *z, const char *pen, const char *opt,int,int); @@ -129,19 +166,51 @@ void MGL_EXPORT mgl_textmarkw(HMGL graph, HCDT y, const wchar_t *text, const cha void MGL_EXPORT mgl_textmark_(uintptr_t *graph, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int); /// Draw labels for points coordinate(s) at points {x,y,z} +/** String \a fnt may contain: + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers.*/ void MGL_EXPORT mgl_label_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_label_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *text, const char *fnt, const char *opt,int,int,int); void MGL_EXPORT mgl_labelw_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const wchar_t *text, const char *fnt, const char *opt); /// Draw labels for points coordinate(s) at points {x,y} +/** String \a fnt may contain: + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers.*/ void MGL_EXPORT mgl_label_xy(HMGL graph, HCDT x, HCDT y, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_label_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int); void MGL_EXPORT mgl_labelw_xy(HMGL graph, HCDT x, HCDT y, const wchar_t *text, const char *fnt, const char *opt); /// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range +/** String \a fnt may contain: + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers.*/ void MGL_EXPORT mgl_label_y(HMGL graph, HCDT y, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_labelw_y(HMGL graph, HCDT y, const wchar_t *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_label_y_(uintptr_t *graph, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int); /// Draw table for values val along given direction with row labels text at position {x,y} +/** String \a fnt may contain: + * ‘#’ for drawing cell borders; + * ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’); + * ‘=’ for equal width of all cells; + * ‘f’ for fixed format of printed numbers; + * ‘E’ for using ‘E’ instead of ‘e’; + * ‘F’ for printing in LaTeX format; + * ‘+’ for printing ‘+’ for positive numbers; + * ‘-’ for printing usual ‘-’; + * ‘0123456789’ for precision at printing numbers. + * Option value set the width of the table (default is 1).*/ void MGL_EXPORT mgl_table(HMGL gr, double x, double y, HCDT val, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_table_(uintptr_t *gr, mreal *x, mreal *y, uintptr_t *val, const char *text, const char *fnt, const char *opt,int,int,int); void MGL_EXPORT mgl_tablew(HMGL gr, double x, double y, HCDT val, const wchar_t *text, const char *fnt, const char *opt); diff --git a/include/mgl2/qmathgl.h b/include/mgl2/qmathgl.h index 53241df..0e6334c 100644 --- a/include/mgl2/qmathgl.h +++ b/include/mgl2/qmathgl.h @@ -97,6 +97,8 @@ public slots: void zoomIn(); ///< Zoom in graphics void zoomOut(); ///< Zoom out graphics void restore(); ///< Restore zoom and rotation to default values + void setZoomScl(double s=0.5); ///< Set factor for zooming (must be s>0) + void setShiftScl(double s=0.25); ///< Set factor for shifting (must be s!=0) // void reload(); ///< Reload data and execute script void shiftLeft(); ///< Shift graphics to left direction @@ -203,6 +205,8 @@ private slots: void afterPlot(); ///< minor tuning after plot was done private: int x0, y0, xe, ye; ///< Temporary variables for mouse + double sclZ; ///< Scale factor for zooming + double sclS; ///< Scale factor for shifting uchar *grBuf; void drawPrim(); int prevQuality; diff --git a/include/mgl2/surf.h b/include/mgl2/surf.h index b1fe54e..43f35b4 100644 --- a/include/mgl2/surf.h +++ b/include/mgl2/surf.h @@ -26,9 +26,11 @@ extern "C" { #endif /// Draw surface by formula with x,y in axis range +/** Option "value" set initial number of points. */ void MGL_EXPORT mgl_fsurf(HMGL graph, const char *fz, const char *stl, const char *opt); void MGL_EXPORT mgl_fsurf_(uintptr_t *graph, const char *fz, const char *stl, const char *opt,int,int,int); /// Draw surface by formulas parametrically depended on u,v in range [0,1] +/** Option "value" set initial number of points. */ void MGL_EXPORT mgl_fsurf_xyz(HMGL graph, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt); void MGL_EXPORT mgl_fsurf_xyz_(uintptr_t *graph, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt, int, int, int, int, int); @@ -46,38 +48,48 @@ void MGL_EXPORT mgl_mesh_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintp void MGL_EXPORT mgl_mesh(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_mesh_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw mesh lines for 2d data specified parametrically +/// Draw waterfall plot for 2d data specified parametrically +/** Style 'x' draw lines in x-direction. */ void MGL_EXPORT mgl_fall_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_fall_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); -/// Draw mesh lines for 2d data +/// Draw waterfall plot for 2d data +/** Style 'x' draw lines in x-direction. */ void MGL_EXPORT mgl_fall(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_fall_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw belts for 2d data specified parametrically +/** Style 'x' draw belts in x-direction. */ void MGL_EXPORT mgl_belt_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_belt_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw belts for 2d data +/** Style 'x' draw belts in x-direction. */ void MGL_EXPORT mgl_belt(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_belt_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw surface for 2d data specified parametrically with color proportional to z +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surf_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_surf_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw surface for 2d data with color proportional to z +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surf(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_surf_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw density plot for 2d data specified parametrically -void MGL_EXPORT mgl_dens_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); -void MGL_EXPORT mgl_dens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ +void MGL_EXPORT mgl_dens_xy(HMGL graph, HCDT x, HCDT y, HCDT c, const char *sch, const char *opt); +void MGL_EXPORT mgl_dens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw density plot for 2d data -void MGL_EXPORT mgl_dens(HMGL graph, HCDT z, const char *sch, const char *opt); -void MGL_EXPORT mgl_dens_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ +void MGL_EXPORT mgl_dens(HMGL graph, HCDT c, const char *sch, const char *opt); +void MGL_EXPORT mgl_dens_(uintptr_t *graph, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw vertical boxes for 2d data specified parametrically +/** Style ‘#’ draw filled boxes. */ void MGL_EXPORT mgl_boxs_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_boxs_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw vertical boxes for 2d data +/** Style ‘#’ draw filled boxes. */ void MGL_EXPORT mgl_boxs(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_boxs_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); @@ -96,30 +108,47 @@ void MGL_EXPORT mgl_tiles(HMGL graph, HCDT z, HCDT r, const char *sch, const cha void MGL_EXPORT mgl_tiles_(uintptr_t *graph, uintptr_t *z, uintptr_t *r, const char *sch, const char *opt,int,int); /// Draw surface for 2d data specified parametrically with color proportional to c +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfc_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_surfc_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw surface for 2d data with color proportional to c +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfc(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_surfc_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw surface for 2d data specified parametrically with alpha proportional to c +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfa_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_surfa_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw surface for 2d data with alpha proportional to c +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfa(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_surfa_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); +/// Draw surface for 2d data specified parametrically with color proportional to c and alpha proportional to a +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ +void MGL_EXPORT mgl_surfca_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt); +void MGL_EXPORT mgl_surfca_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int,int); +/// Draw surface for 2d data with color proportional to c and alpha proportional to a +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ +void MGL_EXPORT mgl_surfca(HMGL gr, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt); +void MGL_EXPORT mgl_surfca_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int,int); + /// Draw density plot for spectra-gramm specified parametrically +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_stfa_xy(HMGL graph, HCDT x, HCDT y, HCDT re, HCDT im, int dn, const char *sch, const char *opt); void MGL_EXPORT mgl_stfa_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *re, uintptr_t *im, int *dn, const char *sch, const char *opt,int, int); /// Draw density plot for spectra-gramm +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_stfa(HMGL graph, HCDT re, HCDT im, int dn, const char *sch, const char *opt); void MGL_EXPORT mgl_stfa_(uintptr_t *graph, uintptr_t *re, uintptr_t *im, int *dn, const char *sch, const char *opt,int, int); /// Color map of matrix a to matrix b, both matrix can parametrically depend on coordinates +/** Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_map_xy(HMGL graph, HCDT x, HCDT y, HCDT a, HCDT b, const char *sch, const char *opt); void MGL_EXPORT mgl_map_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int); /// Color map of matrix a to matrix b +/** Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_map(HMGL graph, HCDT a, HCDT b, const char *sch, const char *opt); void MGL_EXPORT mgl_map_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int); diff --git a/include/mgl2/type.h b/include/mgl2/type.h index 3a97b80..8450f76 100644 --- a/include/mgl2/type.h +++ b/include/mgl2/type.h @@ -41,6 +41,7 @@ struct MGL_EXPORT mglPoint #if MGL_HAVE_RVAL mglPoint(mglPoint &&d):x(d.x),y(d.y),z(d.z),c(d.c) {} #endif + inline void Set(mreal X=0,mreal Y=0,mreal Z=0,mreal C=0) {x=X;y=Y;z=Z;c=C;} 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); } diff --git a/include/mgl2/vect.h b/include/mgl2/vect.h index ce1f33f..388c0e0 100644 --- a/include/mgl2/vect.h +++ b/include/mgl2/vect.h @@ -26,78 +26,192 @@ extern "C" { #endif //----------------------------------------------------------------------------- /// Plot vectors at position {x,y} along {ax,ay} with length/color proportional to |a| +/** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */ void MGL_EXPORT mgl_traj_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_traj_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot vectors at position {x,y,z} along {ax,ay,az} with length/color proportional to |a| +/** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */ 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); void MGL_EXPORT mgl_traj_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot vector field {ax,ay} parametrically depended on coordinate {x,y} with length/color proportional to |a| +/** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows. */ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_vect_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot vector field {ax,ay} with length/color proportional to |a| +/** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows. */ void MGL_EXPORT mgl_vect_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_vect_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a| +/** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows. */ void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_vect_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot vector field {ax,ay,az} with length/color proportional to |a| +/** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows. */ void MGL_EXPORT mgl_vect_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_vect_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot flows for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads. + * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_flow_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot flows for vector field {ax,ay} with color proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads. + * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_flow_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_flow_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ 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); void MGL_EXPORT mgl_flow_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot flows for vector field {ax,ay,az} with color proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_flow_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_flow_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot flow from point p for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads. */ 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); void MGL_EXPORT mgl_flowp_xy_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int, int); /// Plot flow from point p for vector field {ax,ay} with color proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads. */ void MGL_EXPORT mgl_flowp_2d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_flowp_2d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int, int); /// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_flowp_xyz_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int, int); /// Plot flow from point p for vector field {ax,ay,az} with color proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */ 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); void MGL_EXPORT mgl_flowp_3d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot flow pipes for vector field {ax,ay} parametrically depended on coordinate {x,y} with color and radius proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘i’ for pipe radius to be inverse proportional to amplitude. + * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt); void MGL_EXPORT mgl_pipe_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, mreal *r0, const char *opt,int,int); /// Plot flow pipes for vector field {ax,ay} with color and radius proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘i’ for pipe radius to be inverse proportional to amplitude. + * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_pipe_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt); void MGL_EXPORT mgl_pipe_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, mreal *r0, const char *opt,int,int); /// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘i’ for pipe radius to be inverse proportional to amplitude; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ 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); void MGL_EXPORT mgl_pipe_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *r0, const char *opt,int,int); /// Plot flow pipes for vector field {ax,ay,az} with color and radius proportional to |a| +/** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘i’ for pipe radius to be inverse proportional to amplitude; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_pipe_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt); void MGL_EXPORT mgl_pipe_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *r0, const char *opt,int,int); /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y,z} + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_grad_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ph, const char *sch, const char *opt); void MGL_EXPORT mgl_grad_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ph, const char *sch, const char *opt,int, int); /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y} + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_grad_xy(HMGL gr, HCDT x, HCDT y, HCDT ph, const char *sch, const char *opt); void MGL_EXPORT mgl_grad_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ph, const char *sch, const char *opt,int,int); /// Plot flows for gradient of scalar field phi + /** String \a sch may contain: + * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); + * ‘#’ for starting threads from edges only; + * ‘v’ for drawing arrows on the threads; + * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. + * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_grad(HMGL gr, HCDT ph, const char *sch, const char *opt); void MGL_EXPORT mgl_grad_(uintptr_t *gr, uintptr_t *ph, const char *sch, const char *opt,int,int); -/// Draw vector plot at slice for 3d data specified parametrically +/// Draw vector plot along slice for 3d data specified parametrically +/** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows, + * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */ 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); void MGL_EXPORT mgl_vect3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int,int); -/// Draw vector plot at slice for 3d data +/// Draw vector plot along slice for 3d data +/** String \a sch may contain: + * ‘f’ for drawing arrows with fixed lengths, + * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), + * ‘.’ for drawing hachures with dots instead of arrows, + * ‘=’ for enabling color gradient along arrows, + * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */ void MGL_EXPORT mgl_vect3(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_vect3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int,int); //----------------------------------------------------------------------------- diff --git a/include/mgl2/volume.h b/include/mgl2/volume.h index 9ec34ae..d5ee4bc 100644 --- a/include/mgl2/volume.h +++ b/include/mgl2/volume.h @@ -26,55 +26,105 @@ extern "C" { #endif //----------------------------------------------------------------------------- /// Draw isosurface for 3d data specified parametrically +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surf3_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surf3_val(HMGL graph, double Val, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data specified parametrically +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3(HMGL graph, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3_(uintptr_t *graph, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data specified parametrically with alpha proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3a_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data with alpha proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3a_val(HMGL graph, double Val, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3a_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data specified parametrically with alpha proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3a_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3a_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data with alpha proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3a(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3a_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data specified parametrically with color proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3c_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data with color proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3c_val(HMGL graph, double Val, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3c_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data specified parametrically with color proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3c_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3c_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data with color proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3c(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3c_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurface for 3d data specified parametrically with color proportional to c and alpha proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ +void MGL_EXPORT mgl_surf3ca_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt); +void MGL_EXPORT mgl_surf3ca_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurface for 3d data with color proportional to c and alpha proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ +void MGL_EXPORT mgl_surf3ca_val(HMGL graph, double Val, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt); +void MGL_EXPORT mgl_surf3ca_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurfaces for 3d data specified parametrically with color proportional to c and alpha proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ +void MGL_EXPORT mgl_surf3ca_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt); +void MGL_EXPORT mgl_surf3ca_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int); +/// Draw isosurfaces for 3d data with color proportional to c and alpha proportional to b +/** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). */ +void MGL_EXPORT mgl_surf3ca(HMGL graph, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt); +void MGL_EXPORT mgl_surf3ca_(uintptr_t *graph, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int); + /// Draw a semi-transparent cloud for 3d data specified parametrically +/** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */ void MGL_EXPORT mgl_cloud_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_cloud_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw a semi-transparent cloud for 3d data +/** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */ void MGL_EXPORT mgl_cloud(HMGL graph, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_cloud_(uintptr_t *graph, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d beam in curvilinear coordinates +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots. + * Variable \a flag is bitwise: + * ‘0x1’ - draw in accompanied (not laboratory) coordinates; + * ‘0x2’ - draw projection to \rho-z plane; + * ‘0x4’ - draw normalized in each slice field.*/ void MGL_EXPORT mgl_beam_val(HMGL graph, double Val, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int norm); void MGL_EXPORT mgl_beam_val_(uintptr_t *gr, mreal *val, uintptr_t *tr, uintptr_t *g1, uintptr_t *g2, uintptr_t *a, mreal *r, const char *sch, int *norm,int l); /// Draw several isosurfaces for 3d beam in curvilinear coordinates +/** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots. + * Option "value" set the number of isosurfaces (default is 3). + * Variable \a flag is bitwise: + * ‘0x1’ - draw in accompanied (not laboratory) coordinates; + * ‘0x2’ - draw projection to \rho-z plane; + * ‘0x4’ - draw normalized in each slice field.*/ void MGL_EXPORT mgl_beam(HMGL graph, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int norm, int num); void MGL_EXPORT mgl_beam_(uintptr_t *gr, uintptr_t *tr, uintptr_t *g1, uintptr_t *g2, uintptr_t *a, mreal *r, const char *sch, int *norm, int *num,int l); //----------------------------------------------------------------------------- diff --git a/json/main.js b/json/main.js index 4e88df6..3c78b78 100644 --- a/json/main.js +++ b/json/main.js @@ -15,7 +15,8 @@ var main = function() { graph = new mathgl.Graph(canvas, backend); graph.setBackgroundFillStyle("#F0F0F0"); // initialize it by some sample MGL script - graph.init(makeSampleScript()); + graph.loadGeometry(makeSampleScript(),null); + graph.setPerspective(0.5); } @@ -29,7 +30,8 @@ var makeSampleScript = function() { 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 += "origin 0 0 0:axis :xlabel 'xxxx':ylabel 'yyyy':zlabel 'zzzz':" + mgl += "axis :xlabel 'xxxx':ylabel 'yyyy':zlabel 'zzzz':" mgl += "box:fplot 'sin(x^2)'\n"; // This is just for testing zoomaxis features mgl += "text 0 0 'aaa'"; return mgl; diff --git a/json/mathgl.Backend.js b/json/mathgl.Backend.js index 6c1ec74..69ace4e 100644 --- a/json/mathgl.Backend.js +++ b/json/mathgl.Backend.js @@ -7,7 +7,7 @@ mathgl.Backend = function() {} /** * Request for geometry data for given MGL script. - * @param mgl {String} MGL script containing all the information neede to build geometry - * @return {Object} geometry data gathered from server-side + * @param mgl {String} MGL script to build geometry + * @param callback {Function} receiver of geometry must be a function(error, result) */ -mathgl.Backend.prototype.geometry = function(mgl) { throw new Error("abstract method invoked"); } +mathgl.Backend.prototype.geometry = function(mgl, callback) { throw new Error("abstract method invoked"); } diff --git a/json/mathgl.Graph.js b/json/mathgl.Graph.js index d505b47..22c8660 100644 --- a/json/mathgl.Graph.js +++ b/json/mathgl.Graph.js @@ -26,26 +26,17 @@ mathgl.Graph = function(canvas, backend) { this.__x1 = 0; this.__y1 = 0; this.__z1 = 0; this.__x2 = 1; this.__y2 = 1; this.__z2 = 1; this.__activeTimeoutHandlers = []; + + // create view + this.__view = new mathgl.View(); + // connect method which starts rendering to view object + this.__view.setRenderLauncher(mathgl.bind(this.__renderStart, this)); + // connect pick point handler + this.__view.setPickPointHandler(mathgl.bind(this.__pickPointHandler, this)); + // attach canvas to view + this.__view.attachCanvas(this.__canvas); }; -/** - * Initialize current view by given MGL script. - * @param mgl {String} MGL script - */ -mathgl.Graph.prototype.init = function(mgl) { - // request backend for geometry object - this.__geometry = this.__backend.geometry(mgl); - this.__geometry.mgl = mgl; - // construct view according the view type recieved from backend (within geometry object) and initialize it - - this.__view = new mathgl.View(); - // connect method which starts rendering to view object - this.__view.setRenderLauncher(mathgl.bind(this.__renderStart, this)); - // connect pick point handler - this.__view.setPickPointHandler(mathgl.bind(this.__pickPointHandler, this)); - // attach canvas to view - this.__view.attachCanvas(this.__canvas); -} /** * Method uses to wrap native JS setTimeout function to make possible deactivate active callbacks in destroy method @@ -125,11 +116,8 @@ mathgl.Graph.prototype.shiftAxis = function(x, y, z) { this.__z1 += dz; this.__z2 += dz; // introduce zoomaxis coomand for server side var zoom = "zoomaxis "+this.__x1+" "+this.__y1+" "+this.__z1+" "+this.__x2+" "+this.__y2+" "+this.__z2+"\n"; - var mgl = this.__geometry.mgl; - // now ask server side for proper coordinates - this.__geometry = this.__backend.geometry(zoom+mgl); - this.__geometry.mgl = mgl; - this.__renderStart(); + + this.loadGeometry(zoom + this.__geometry.mgl); } @@ -144,18 +132,15 @@ mathgl.Graph.prototype.zoomAxis = function(factor) { this.__z1 = c-d; this.__z2 = c+d; // introduce zoomaxis coomand for server side var zoom = "zoomaxis "+this.__x1+" "+this.__y1+" "+this.__z1+" "+this.__x2+" "+this.__y2+" "+this.__z2+"\n"; - var mgl = this.__geometry.mgl; - // now ask server side for proper coordinates - this.__geometry = this.__backend.geometry(zoom+this.__geometry.mgl); - this.__geometry.mgl = mgl; - this.__renderStart(); + + this.loadGeometry(zoom + this.__geometry.mgl); } /** initiate the chains of rendering the geometry to the canvas */ mathgl.Graph.prototype.__renderStart = function() { - // do nothing if processing is already started - if (!this.__isDraftRenderingInScheduled) { + // do nothing if processing is already started or no geometry + if (!this.__isDraftRenderingInScheduled && this.__geometry) { // enqueue draft rendering step this.__isDraftRenderingInScheduled = true; this.__setTimeout(mathgl.bind(this.__renderDraft, this), 0); @@ -279,11 +264,19 @@ mathgl.Graph.prototype.__mgl_draw_good = function(obj, ctx, skip) { { var prim = obj.prim[i]; var scl = s1*this.__mgl_pf(obj, prim[9]); - if(obj.pnts[prim[1]][3]) scl = s2; + if(obj.pnts[prim[1]][3]<0) scl = s2; this.__mgl_draw_prim(obj,ctx,prim,scl); } } + +mathgl.Graph.prototype.__mgl_pf = function(obj, z) { + // return 1/obj.pf; + 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)); +} + + /** perform high-quality drawing */ mathgl.Graph.prototype.__mgl_draw_prim = function(obj, ctx, prim, scl) { var n1 = prim[1], n2 = prim[2]; @@ -328,7 +321,13 @@ mathgl.Graph.prototype.__mgl_draw_prim = function(obj, ctx, prim, scl) { var xx=obj.coor[n2][2]/100,yy=-obj.coor[n2][3]/100,zz=obj.coor[n2][4]/100; var xc = obj.b[0]*xx + obj.b[1]*yy + obj.b[2]*zz; var yc = obj.b[3]*xx + obj.b[4]*yy + obj.b[5]*zz; -// var zc = obj.b[6]*xx + obj.b[7]*yy + obj.b[8]*zz; + var zc = obj.b[6]*xx + obj.b[7]*yy + obj.b[8]*zz; + + var dv = this.__mgl_pf(obj, pp[n1][2]); + var cv = this.__fov*obj.pf/(1-this.__fov/1.37)/obj.depth; + xc += (pp[n1][0]-obj.b[9])*zc*cv;//*dv; + yc += (pp[n1][1]-obj.b[10])*zc*cv;//*dv; + if(obj.pnts[n1][3]<0) { xc=xx; yc=yy; } var ll = xc*xc+yc*yc; if(ll < 1e-10) break; @@ -356,13 +355,6 @@ 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/1.37)/obj.pf/(1-this.__fov*z/obj.depth); // TODO: check calc coordinates!!! -// return 1/(1+obj.pf*(1-z/obj.depth)); -} - - /** change coordinates according current transformations, usually called internally by draw() */ mathgl.Graph.prototype.__mgl_prepare = function(obj, skip) { // fill transformation matrix @@ -381,12 +373,13 @@ mathgl.Graph.prototype.__mgl_prepare = function(obj, skip) { } // now transform points for found transformation matrix var b = obj.b, i; + obj.pp = []; for(i=0;i=0) // TODO: check later when mglInPlot will be ready obj.pp[i] = [b[9] + b[0]*x + b[1]*y + b[2]*z, b[10] + b[3]*x + b[4]*y + b[5]*z, b[11] + b[6]*x + b[7]*y + b[8]*z]; @@ -396,7 +389,7 @@ mathgl.Graph.prototype.__mgl_prepare = function(obj, skip) { if(obj.pf || this.__fov) for(var i=0;i=0) // TODO: check later when mglInPlot will be ready { obj.pp[i][0] = d*obj.pp[i][0] + (1-d)*obj.b[9]; obj.pp[i][1] = d*obj.pp[i][1] + (1-d)*obj.b[10]; @@ -601,52 +594,112 @@ mathgl.Graph.prototype.__mgl_line_glyph = function(ctx, x,y, f,solid,b) { } +/** + * Move Left using MGL 'zoomaxis' with geometry reload + */ mathgl.Graph.prototype.moveLeft = function() { var b = this.__geometry.b; var f = 0.1/Math.sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]); this.shiftAxis(f*b[0],f*b[1],f*b[2]); } + +/** + * Move Right using MGL 'zoomaxis' with geometry reload + */ mathgl.Graph.prototype.moveRight = function() { var b = this.__geometry.b; var f = -0.1/Math.sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]); this.shiftAxis(f*b[0],f*b[1],f*b[2]); } + +/** + * Move Up using MGL 'zoomaxis' with geometry reload + */ mathgl.Graph.prototype.moveUp = function() { var b = this.__geometry.b; var f = -0.1/Math.sqrt(b[3]*b[3]+b[4]*b[4]+b[5]*b[5]); this.shiftAxis(-f*b[3],f*b[4],-f*b[5]); } + +/** + * Move Down using MGL 'zoomaxis' with geometry reload + */ mathgl.Graph.prototype.moveDown = function() { var b = this.__geometry.b; var f = 0.1/Math.sqrt(b[3]*b[3]+b[4]*b[4]+b[5]*b[5]); this.shiftAxis(-f*b[3],f*b[4],-f*b[5]); } + +/** + * Zoom In using MGL 'zoomaxis' with geometry reload + */ mathgl.Graph.prototype.zoomIn = function() { this.zoomAxis(1.1); } + +/** + * Zoom Out using MGL 'zoomaxis' with geometry reload + */ mathgl.Graph.prototype.zoomOut = function() { this.zoomAxis(1./1.1); } -mathgl.Graph.prototype.getView = function(mgl) { + +/** + * @return mathgl.View instance + */ +mathgl.Graph.prototype.getView = function() { return this.__view; } -mathgl.Graph.prototype.reloadGeometry = function() { - var mgl = this.__geometry.mgl; - this.__geometry = this.__backend.geometry(mgl); - this.__geometry.mgl = mgl; + +/** + * Build and load geometry into View + * @param mgl {String} MGL script + * @param completeCallback {Function|null} optional callback to notify completion + */ +mathgl.Graph.prototype.loadGeometry = function(mgl, completeCallback) { + this.__backend.geometry(mgl, mathgl.bind(function(error, result) { + if (!error) { + this.__geometry = result; + this.__geometry.mgl = mgl; + this.redraw(); + + if (typeof completeCallback === "function") { + completeCallback(); + } + } + }, this)); } + +/** + * Force reload geometry + * @param completeCallback {Function|null} optional callback to notify completion + */ +mathgl.Graph.prototype.reloadGeometry = function(completeCallback) { + var mgl = (this.__geometry && this.__geometry.mgl) ? this.__geometry.mgl : ""; + this.loadGeometry(mgl, completeCallback); +} + + +/** + * Force redraw view from current geometry + */ mathgl.Graph.prototype.redraw = function() { this.__renderStart(); } + +/** + * Shutdown graph instance + * Destroy view, cleanup all timers and references + */ mathgl.Graph.prototype.destroy = function() { // clear active timeouts for (var i = 0, l = this.__activeTimeoutHandlers.length; i0.3) - this.__pitch += 0.5 * (y - this.__mouseY) * Math.PI / 180; -// else -// this.__theta += 0.5 * (y - this.__mouseY) * Math.PI / 180; + this.__pitch += 0.5 * (y - this.__mouseY) * Math.PI / 180; this.__mouseX = x; this.__mouseY = y; - if(this.__pitch > 63) this.__pitch -= 20*Math.PI; - if(this.__pitch < -63) this.__pitch += 20*Math.PI; + if (this.__limitedPitchRotation) { + this.__pitch = Math.min(this.__pitch, 0.999*Math.PI/2); + this.__pitch = Math.max(this.__pitch, -0.999*Math.PI/2); + } else { + if (this.__pitch > 63) this.__pitch -= 20*Math.PI; + if (this.__pitch < -63) this.__pitch += 20*Math.PI; + } + if(this.__yaw > 63) this.__yaw -= 20*Math.PI; if(this.__yaw <-63) this.__yaw += 20*Math.PI; -// this.__pitch = Math.min(this.__pitch, Math.PI / 2); -// this.__pitch = Math.max(this.__pitch, -Math.PI / 2); // this.__yaw = Math.min(this.__yaw, Math.PI); // this.__yaw = Math.max(this.__yaw, -Math.PI); - if(this.__onCameraChanged) - this.__onCameraChanged(this.getViewpoint()); + this.__notifyCameraChanged(); this.__renderLauncherFunc(); } } mathgl.View.prototype.__onMouseDown = function(e) { - this.__mouseX = e.offsetX; - this.__mouseY = e.offsetY; + this.__mouseX = e.layerX; + this.__mouseY = e.layerY; this.__isMouseDown = true; } @@ -188,25 +200,37 @@ mathgl.View.prototype.__onMouseOut = function() { mathgl.View.prototype.__onDblClick = function(e) { - this.__pickPointHandlerFunc(e.offsetX, e.offsetY); + this.__pickPointHandlerFunc(e.layerX, e.layerY); } mathgl.View.prototype.__onMouseWheel = function(e) { this.__isMouseDown = false; - this.__distance -= 0.1 * e.wheelDelta / 120; +// this.__distance -= 0.1 * e.wheelDelta / 120; + + var wheelSensivity = 0.1; + if (e.wheelDelta !== undefined) { + // handle deprecated 'mousewheel' event (old webkit in chrome and safari) + // wheelDelta is always 120 and inverted to standard deltaY + var direction = e.wheelDelta >= 0 ? -1 : 1; + this.__distance += -1. * wheelSensivity * direction; + } else if (e.deltaY !== undefined) { + // handle standard W3C DOM Level 3 'wheel' event + var direction = e.deltaY >= 0 ? -1 : 1; + this.__distance += wheelSensivity * direction; + } + this.__distance = Math.min(this.__distance, 10.0); this.__distance = Math.max(this.__distance, 0.2); - if(this.__onCameraChanged) - this.__onCameraChanged(this.getViewpoint()); + this.__notifyCameraChanged(); this.__renderLauncherFunc(); } -mathgl.View.prototype.getViewpoint = function() { +mathgl.View.prototype.getViewpoint = function() { return { distance : this.__distance, pitch : this.__pitch, - yaw : this.__yaw, + yaw : this.__yaw }; } @@ -227,5 +251,16 @@ mathgl.View.prototype.setCameraEventHandler = function(handler) { this.__onCameraChanged = handler; } +mathgl.View.prototype.__notifyCameraChanged = function() { + if(this.__onCameraChanged) { + this.__onCameraChanged(this.getViewpoint()); + } +} - +/** + * Limit the pitch control rotation to +-90 degrees + * @param limitedPitch {Boolean} enable or disable limit + */ +mathgl.View.prototype.setLimitedPitchRotation = function(limitedPitch) { + this.__limitedPitchRotation = limitedPitch; +} diff --git a/json/mathgl.WebkitBackend.js b/json/mathgl.WebkitBackend.js index fbc91a8..6b61570 100644 --- a/json/mathgl.WebkitBackend.js +++ b/json/mathgl.WebkitBackend.js @@ -9,8 +9,12 @@ mathgl.WebkitBackend = function() {} mathgl.WebkitBackend.prototype = new mathgl.Backend(); -/** return geometry */ -mathgl.WebkitBackend.prototype.geometry = function(mgl) { +/** + * Request for geometry data for given MGL script. + * @param mgl {String} MGL script to build geometry + * @param callback {Function} receiver of geometry must be a function(error, result) + */ +mathgl.WebkitBackend.prototype.geometry = function(mgl, callback) { var geometryData = globalBackend.geometry(mgl); /* @@ -20,6 +24,9 @@ mathgl.WebkitBackend.prototype.geometry = function(mgl) { */ var obj = JSON.parse(geometryData); - obj.pp = new Array(); - return obj; + + // simulate async reply + setTimeout(function() { + callback(null, obj); + }, 0); } diff --git a/mgltex/CMakeLists.txt b/mgltex/CMakeLists.txt index 560e656..cac7b7f 100644 --- a/mgltex/CMakeLists.txt +++ b/mgltex/CMakeLists.txt @@ -20,35 +20,23 @@ if(NOT TEXMFLOCALDIR) message(SEND_ERROR "Couldn't find TEXMFLOCAL directory.") endif(NOT TEXMFLOCALDIR) -set(extramgl Axis_projection Vectorial) - -add_custom_command(OUTPUT scripts - COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/scripts - COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/sample.tex ${MathGL_BINARY_DIR}/mgltex/ - COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/mgltex.sty ${MathGL_BINARY_DIR}/mgltex/ - COMMAND ${findpdflatex} -draftmode sample.tex -) -foreach(mglscr ${extramgl}) - list(APPEND mglpng scripts/${mglscr}.png) - add_custom_command(OUTPUT scripts/${mglscr}.png - COMMAND mglconv -o ${mglscr}.png ${mglscr}.mgl - DEPENDS mglconv scripts - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/mgltex/scripts/ - ) -endforeach(mglscr) - -add_custom_command(OUTPUT scripts/sample.png - COMMAND mglconv -o scripts/sample.png scripts/sample.mgl - DEPENDS mglconv scripts -) +# set(extramgl Axis_projection Vectorial) add_custom_command(OUTPUT sample.pdf - COMMAND ${findpdflatex} sample.tex - DEPENDS mgltex.sty sample.tex ${mglpng} scripts/sample.png) + COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL + COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL/scripts + COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL/backups + COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL_BINARY_DIR}/mgltex/MGL/graphics + COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/sample.tex ${MathGL_BINARY_DIR}/mgltex/ + COMMAND ${CMAKE_COMMAND} -E copy ${MathGL_SOURCE_DIR}/mgltex/mgltex.sty ${MathGL_BINARY_DIR}/mgltex/ + COMMAND PATH=$ ${findpdflatex} --shell-escape -draftmode sample.tex + COMMAND PATH=$ ${findpdflatex} --shell-escape -draftmode sample.tex + COMMAND PATH=$ ${findpdflatex} --shell-escape sample.tex + DEPENDS mgltex.sty sample.tex ) add_custom_target(pdf ALL DEPENDS sample.pdf) get_directory_property(mglconv_clean ADDITIONAL_MAKE_CLEAN_FILES) -set(mglconv_clean ${mglconv_clean} scripts sample.sty sample.tex sample.aux sample.log) +set(mglconv_clean ${mglconv_clean} scripts mgltex.sty sample.tex sample.aux sample.log) set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mglconv_clean}") install(FILES mgltex.sty DESTINATION ${TEXMFLOCALDIR}/tex/latex/mgltex/) diff --git a/mgltex/mgltex.sty b/mgltex/mgltex.sty index a4eb204..642aa1e 100644 --- a/mgltex/mgltex.sty +++ b/mgltex/mgltex.sty @@ -1,14 +1,6 @@ %% -%% This is file `mgltex.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% mgltex.dtx (with options: `package') -%% -%% This is a generated file. -%% -%% Copyright (C) 2014 by Diego Sejas +%% Copyright (C) 2015 by Diego Sejas Viscarra +%% Copyright (C) 2015 by Alexey Balakin %% %% This program is free software: you can redistribute it and/or modify it %% under the terms of the GNU General Public License as published by the @@ -22,60 +14,87 @@ %% %% You should have received a copy of the GNU General Public License along %% with this program. If not, see . -%% -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{mgltex}[/2014/11/22 v2.0 Embed MGL scripts in LaTeX documents] +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{mgltex}[/2015/03/29 v3.0 Embed MGL scripts in LaTeX documents] \RequirePackage{keyval} \RequirePackage{graphicx} - \DeclareOption{draft}{% \PassOptionsToPackage{\CurrentOption}{graphicx}% } \DeclareOption{final}{% \PassOptionsToPackage{\CurrentOption}{graphicx}% } -\newif\if@mgltex@on@ + +\DeclareOption{epstopdf}{% + \DeclareGraphicsRule{.eps}{pdf}{.pdf}{`epstopdf #1}% +} + \DeclareOption{on}{% - \@mgltex@on@true% - \def\mgl@write#1#2{% + \def\MGL@openout#1#2{% + \immediate\openout#1="#2"% + }% + \def\MGL@write#1#2{% \immediate\write#1{#2}% - } + }% + \def\MGL@graph@not@found@text{MGL\\image\\not\\found}% + \def\MGL@graph@not@found@message{MGL image "\MGL@this@code@label" not found}% } \DeclareOption{off}{% - \@mgltex@on@false% - \def\mgl@write#1#2{}% + \def\MGL@openout#1#2{}% + \def\MGL@write#1#2{}% + \def\MGL@graph@not@found@text{\mglTeX\\is off,\\no image\\generated}% + \def\MGL@graph@not@found@message{mglTeX is off, MGL image "\MGL@this@code@label" not generated}% } -\newif\if@mgl@comments@ + +\newif\if@MGL@comments@ \DeclareOption{comments}{% - \@mgl@comments@true% + \@MGL@comments@true% } \DeclareOption{nocomments}{% - \@mgl@comments@false% + \@MGL@comments@false% } +\DeclareOption{1x}{\def\MGL@scale{1}} +\DeclareOption{2x}{\def\MGL@scale{2}} +\DeclareOption{3x}{\def\MGL@scale{3}} +\DeclareOption{4x}{\def\MGL@scale{4}} +\DeclareOption{5x}{\def\MGL@scale{5}} +\DeclareOption{6x}{\def\MGL@scale{6}} +\DeclareOption{7x}{\def\MGL@scale{7}} +\DeclareOption{8x}{\def\MGL@scale{8}} +\DeclareOption{9x}{\def\MGL@scale{9}} + \DeclareGraphicsExtensions{% .png,.eps,.jpg,.jpeg,.bps,.pdf,.epsz,.eps.gz,.bpsz,.bps.gz,.gif% } +\DeclareOption{jpg}{\def\MGL@graphics@ext{.jpg}} +\DeclareOption{jpeg}{\def\MGL@graphics@ext{.jpeg}} +\DeclareOption{pdf}{\def\MGL@graphics@ext{.pdf}} +\DeclareOption{png}{\def\MGL@graphics@ext{.png}} +\DeclareOption{eps}{\def\MGL@graphics@ext{.eps}} +\DeclareOption{epsz}{\def\MGL@graphics@ext{.eps.gz}} +\DeclareOption{bps}{\def\MGL@graphics@ext{.bps}} +\DeclareOption{bpsz}{\def\MGL@graphics@ext{.bps.gz}} +\DeclareOption{gif}{\def\MGL@graphics@ext{.gif}} +\DeclareOption{tex}{\def\MGL@graphics@ext{.tex}} -\DeclareOption{jpg}{\def\mgl@image@ext{.jpg}} -\DeclareOption{jpeg}{\def\mgl@image@ext{.jpeg}} -\DeclareOption{pdf}{\def\mgl@image@ext{.pdf}} -\DeclareOption{png}{\def\mgl@image@ext{.png}} -\DeclareOption{eps}{\def\mgl@image@ext{.eps}} -\DeclareOption{epsz}{\def\mgl@image@ext{.eps.gz}} -\DeclareOption{bps}{\def\mgl@image@ext{.bps}} -\DeclareOption{bpsz}{\def\mgl@image@ext{.bps.gz}} -\DeclareOption{gif}{\def\mgl@image@ext{.gif}} - -\DeclareOption{tex}{\def\mgl@image@ext{.tex}} \DeclareOption*{\@unknownoptionerror} -\ExecuteOptions{final,on,nocomments,eps} +\ExecuteOptions{final,on,nocomments,1x,eps} \ProcessOptions* +\define@key{MGL@keys}{dir}{\def\MGL@dir{#1}} +\define@key{MGL@keys}{scriptsdir}{\def\MGL@scripts@dir{#1}} +\define@key{MGL@keys}{graphicsdir}{\def\MGL@graphics@dir{#1}} +\define@key{MGL@keys}{backupsdir}{\def\MGL@backups@dir{#1}} +\define@key{MGL@keys}{quality}{\def\MGL@quality{#1}} +\define@key{MGL@keys}{width}{\def\MGL@width{#1}} +\define@key{MGL@keys}{height}{\def\MGL@height{#1}} + \define@key{mgl@keys}{bb}{\g@addto@macro{\graph@keys}{bb=#1,}} \define@key{mgl@keys}{bbllx}{\g@addto@macro{\graph@keys}{bbllx=#1,}} \define@key{mgl@keys}{bblly}{\g@addto@macro{\graph@keys}{bblly=#1,}} @@ -99,8 +118,7 @@ \define@key{mgl@keys}{ext}{\g@addto@macro{\graph@keys}{ext=#1,}} \define@key{mgl@keys}{read}{\g@addto@macro{\graph@keys}{read=#1,}} \define@key{mgl@keys}{command}{\g@addto@macro{\graph@keys}{command=#1,}} -\define@key{mgl@keys}{imgext}{\def\mgl@image@ext{.#1}} - +\define@key{mgl@keys}{imgext}{\def\mgl@graphics@ext{.#1}} \define@key{mglplot@keys}{bb}{\g@addto@macro{\graph@keys}{bb=#1,}} \define@key{mglplot@keys}{bbllx}{\g@addto@macro{\graph@keys}{bbllx=#1,}} @@ -125,302 +143,565 @@ \define@key{mglplot@keys}{ext}{\g@addto@macro{\graph@keys}{ext=#1,}} \define@key{mglplot@keys}{read}{\g@addto@macro{\graph@keys}{read=#1,}} \define@key{mglplot@keys}{command}{\g@addto@macro{\graph@keys}{command=#1,}} -\define@key{mglplot@keys}{imgext}{\def\mglplot@image@ext{.#1}} +\define@key{mglplot@keys}{imgext}{\def\MGL@graphics@ext{.#1}} \define@key{mglplot@keys}{setup}{\def\mglplot@setup{#1}} +\def\mglsettings#1{% + \setkeys{MGL@keys}{#1}% +} +\@onlypreamble\mglsettings + +\def\MGL@dir{} +\def\mgldir#1{% + \def\MGL@dir{#1}% +} +\@onlypreamble\mgldir + +\def\MGL@scripts@dir{} +\def\mglscriptsdir#1{% + \def\MGL@scripts@dir{#1}% +} +\@onlypreamble\mglscriptsdir + +\def\MGL@graphics@dir{} +\def\mglgraphicsdir#1{% + \def\MGL@graphics@dir{#1}% +} +\@onlypreamble\mglscriptsdir + +\def\MGL@backups@dir{} +\def\mglbackupsdir#1{% + \def\MGL@backups@dir{#1}% +} +\@onlypreamble\mglbackupsdir \def\TeX@ext{.tex} -\def\mgl@include@image#1{% - \ifx\mgl@image@ext\TeX@ext% - \IfFileExists{#1.tex}{% - \include{#1}% +\def\MGL@include@graphics{% + \ifx\MGL@graphics@ext\TeX@ext% + \IfFileExists{\MGL@this@code@label.tex}{% + \include{\MGL@dir\MGL@graphics@dir\MGL@this@code@label}% }{% - \mgl@img@not@found{#1}% + \MGL@graph@not@found% }% \else% - \def\next@action{\mgl@img@not@found{#1}}% - \@for\img@ext:=\Gin@extensions\do{% - \IfFileExists{#1\img@ext}{% - \def\next@action{% - \expandafter\includegraphics\expandafter[\graph@keys]{#1}% + \def\MGL@next@action{\MGL@graph@not@found}% + \@for\MGL@graph@ext:=\Gin@extensions\do{%b + \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graph@ext}{% + \def\MGL@next@action{% + \expandafter\includegraphics\expandafter[\graph@keys]{\MGL@dir\MGL@graphics@dir\MGL@this@code@label}% }% }{}% }% - \next@action% + \MGL@next@action% \fi% } -\def\mgl@img@not@found#1{% - \PackageWarning{mgltex}{MGL image "#1" not found}% - \framebox[10em]{% +\def\MGL@graph@not@found{% + \PackageWarning{mgltex}{\MGL@graph@not@found@message}% + \fbox{% \centering% \bfseries\Huge% - \begin{tabular}{c}MGL\\image\\not\\found\end{tabular}% + \begin{tabular}{c}\MGL@graph@not@found@text\end{tabular}% }% } -\newcounter{mgl@image@no} - -\newwrite\mgl@script -\AtBeginDocument{% - \if@mgltex@on@% - \immediate\openout\mgl@script="\mgl@dir\jobname.mgl"% - \mglsignature@write\mgl@script% +\def\MGL@openin#1#2{% + \immediate\openin#1="#2"% +} +\def\MGL@read#1#2{% + \def#2{}% + \ifeof#1\else% + \immediate\read#1 to #2% \fi% } -\AtEndDocument{% - \mgl@write\mgl@script{}% - \mgl@write\mgl@script{stop}% - \mgl@func% - \immediate\closeout\mgl@script% - \mgl@write{18}{mglconv -n "\mgl@dir\jobname.mgl"}% +\def\MGL@closein#1{% + \immediate\closein#1% +} +\def\MGL@closeout#1{% + \immediate\closeout#1% } +\def\MGL@unchanged#1{% + \global\@namedef{MGL@@@#1}{}% +} +\def\MGL@scripts@written{} +\def\MGL@funcs{} +\newwrite\MGL@script +\newread\MGL@in@stream +\newwrite\MGL@out@stream -\newcommand\mgl[1][]{% +\AtBeginDocument{% + \MGL@openout{\MGL@script}{\MGL@dir\MGL@scripts@dir\jobname.mgl}% + \MGL@write\MGL@script{\MGL@signature}% +} +\AtEndDocument{% + \MGL@write\MGL@script{stop}% + \MGL@write\MGL@script{}% + \bgroup% + \endlinechar=-1\relax% + \MGL@funcs% + \egroup% + \MGL@closeout{\MGL@script}% + \MGL@write{18}{mglconv -n -q \MGL@quality\space -S \MGL@scale\space "\MGL@dir\MGL@scripts@dir\jobname.mgl"}% +} + +%%%%% Anatomy of environments and commands %%%%% +\def\MGL@setkeys#1#2{% \def\graph@keys{}% - \setkeys{mgl@keys}{#1}% - \let\do\@makeother \dospecials% - \endlinechar`\^^M \catcode`\^^M\active% - \catcode`\ =10% - \mgl@write\mgl@script{quality \mgl@quality}% - \expandafter\mgl@write@line% + \setkeys{#1}{#2}% } -\begingroup% - \escapechar=-1 \relax% - \xdef\end@mgl{\string\\end\string\{mgl\string\}}% -\endgroup -\begingroup% +\newcounter{MGL@script@no} +\def\MGL@create@code@label{% + \stepcounter{MGL@script@no}% + \edef\MGL@this@code@label{\jobname-MGL-\arabic{MGL@script@no}}% + \xdef\MGL@scripts@written{\MGL@scripts@written\MGL@this@code@label,}% +} - \catcode`\^^M\active% - \gdef\mgl@write@line#1^^M{% - \def\next@action{% - \mgl@write\mgl@script{#1}% - \mgl@write@line% - }% - \test@end@mgl{#1}% - \next@action% +\def\MGL@test@code@label#1{% + \edef\MGL@this@code@label{#1}% + \@for\MGL@script@name:=\MGL@scripts@written\do{% + \ifx\MGL@this@code@label\MGL@script@name% + \PackageWarning{mgltex}{Overwriting MGL code labeled "\MGL@this@code@label"}% + \fi% }% -\endgroup + \xdef\MGL@scripts@written{\MGL@scripts@written\MGL@this@code@label,}% +} -\def\test@end@mgl#1{% - \edef\this@line{#1}% - \ifx\this@line\end@mgl% - \def\next@action{\end{mgl}}% +\def\MGL@codes{% + \let\do\@makeother\dospecials\relax% + \endlinechar`\^^M \catcode`\^^M\active\relax% + \catcode`\ =10\relax% +} +\def\MGL@verb@codes{% + \let\do\@makeother\dospecials\relax% + \endlinechar`\^^M\relax\catcode`\^^M\active\relax% +} + +\def\MGL@test@end@env#1{% + \edef\MGL@this@line{#1}% + \ifx\MGL@this@line\MGL@end@env@cmd% + \def\MGL@next@action{\MGL@end@env}% \fi% } -\def\endmgl{% - \stepcounter{mgl@image@no}% - \mgl@write\mgl@script{% - write '\mgl@dir\jobname-mgl-\arabic{mgl@image@no}\mgl@image@ext'% + +\def\MGL@def@end@env@cmd#1{% + \def\MGL@end@env{\end{#1}}% + \begingroup% + \escapechar=-1 \relax% + \xdef\MGL@end@env@cmd{\string\\end\string\{#1\string\}}% + \endgroup% +} + +\def\MGL@set@write@script@out{% + \def\MGL@write@code@action##1{% + \MGL@write\MGL@script{##1}% + \MGL@write\MGL@out@stream{##1}% + }% +} +\def\MGL@set@write@script{% + \def\MGL@write@code@action##1{% + \MGL@write\MGL@script{##1}% + }% +} +\def\MGL@set@write@out{% + \def\MGL@write@code@action##1{% + \MGL@write\MGL@out@stream{##1}% + }% +} +\begingroup% + \catcode`\^^M\active\relax% + \gdef\MGL@ignore@line#1^^M{% + \expandafter\MGL@write@line% }% - \mgl@write\mgl@script{reset}% - \mgl@write\mgl@script{}% - \mgl@include@image{\mgl@dir\jobname-mgl-\arabic{mgl@image@no}}% -} - -\bgroup% - \escapechar=-1\relax% - \xdef\end@mgladdon{\string\\end\string\{mgladdon\string\}}% -\egroup% -\newenvironment{mgladdon}{% - \def\test@end@mgl##1{% - \edef\this@line{##1}% - \ifx\this@line\end@mgladdon% - \def\next@action{\end{mgladdon}}% + \gdef\MGL@write@line#1^^M{% + \def\MGL@next@action{% + \MGL@write@code@action{#1}% + \MGL@write@line% + }% + \MGL@test@end@env{#1}% + \MGL@next@action% + }% + \gdef\MGL@compare@line#1^^M{% + \def\MGL@next@action{% + \def\MGL@this@line{#1^^M}% + \MGL@read\MGL@in@stream{\MGL@this@code@line}% + \ifx\MGL@this@code@line\MGL@this@line\else% + \def\MGL@future@action{}% + \fi% + \MGL@compare@line% + }% + \edef\MGL@this@line{#1}% + \ifx\MGL@this@line\MGL@end@env@cmd% + \def\MGL@next@action{\MGL@end@env}% + \MGL@read\MGL@in@stream{\MGL@this@code@line}% + \ifeof\MGL@in@stream\else% + \def\MGL@future@action{}% + \fi% \fi% + \MGL@next@action% }% - \mgl[]% -}{} +\endgroup -\def\mgl@script@written{} -\newwrite\mgl@out@stream -\newcommand\mglcode[2][]{% - \def\graph@keys{}% - \setkeys{mgl@keys}{#1}% - \test@mgl@script@written{#2}% - \xdef\mgl@script@written{\mgl@script@written#2,}% - \def\this@script{#2}% - \if@mgltex@on@% - \immediate\openout\mgl@out@stream=\mgl@dir\this@script.mgl% - \mglsignature@write\mgl@out@stream% - \fi% - \let\do\@makeother \dospecials% - \endlinechar`\^^M \catcode`\^^M\active% - \obeyspaces% - \expandafter\mglcode@write@line% +\def\MGL@set@write@verb@out{% + \def\MGL@write@verb@code@action{% + \MGL@write\MGL@out@stream{\the\MGL@line}% + }% } -\def\test@mgl@script@written#1{% - \edef\this@script{#1}% - \@for\mgl@script@name:=\mgl@script@written\do{% - \ifx\this@script\mgl@script@name% - \PackageWarning{mgltex}{Overwriting MGL script "\this@script.mgl"}% - \fi% +\def\MGL@set@write@verb@to@doc{% + \def\MGL@write@verb@code@action{% + \stepcounter{MGL@verb@line@no}% + \item\mbox{\the\MGL@line}% }% } -\newtoks\mgl@word -\newtoks\mgl@line -\def\mglcode@write@line#1{% - \let\next@action\mglcode@write@line% +\begingroup% + \catcode`\^^M\active\relax% + \gdef\MGL@ignore@verb@line#1^^M{% + \expandafter\MGL@write@verb@line% + } +\endgroup% +\newtoks\MGL@word +\newtoks\MGL@line +\def\MGL@write@verb@line#1{% + \let\MGL@next@action\MGL@write@verb@line% \expandafter\if#1\^^M% - \mgl@write\mgl@out@stream{\the\mgl@line}% - \mgl@word{}% - \mgl@line{}% + \MGL@write@verb@code@action% + \MGL@word{}% + \MGL@line{}% \else\expandafter\if#1\space% - \mgl@word{}% - \mgl@line\expandafter{\the\mgl@line#1}% + \MGL@word{}% + \MGL@line\expandafter{\the\MGL@line#1}% \else% - \mgl@word\expandafter{\the\mgl@word#1}% - \mgl@line\expandafter{\the\mgl@line#1}% - \test@end@mglcode{\the\mgl@word}% + \MGL@word\expandafter{\the\MGL@word#1}% + \MGL@line\expandafter{\the\MGL@line#1}% + \MGL@test@end@env{\the\MGL@word}% \fi\fi% - \next@action% + \MGL@next@action% } -\begingroup% - \escapechar=-1\relax% - \xdef\end@mglcode{\string\\end\string\{mglcode\string\}}% -\endgroup% -\def\test@end@mglcode#1{% - \edef\this@word{#1}% - \ifx\this@word\end@mglcode% - \def\next@action{\end{mglcode}}% +\def\MGL@rewrite@code#1{% + \MGL@read\MGL@in@stream{\MGL@this@code@line}% + \ifeof\MGL@in@stream% + \MGL@closein{\MGL@in@stream}% + \else% + \MGL@write#1{\MGL@this@code@line}% + \MGL@rewrite@code{#1}% \fi% } -\def\endmglcode{% - \immediate\closeout\mgl@out@stream% - \mgl@write{18}{% - mglconv "\mgl@dir\this@script.mgl" -s "\mgl@dir\mglcommonscript.mgl" -o "\mgl@dir\this@script\mgl@image@ext"% +\begingroup% + \catcode`\^^M\active\relax% + \gdef\MGL@compare@next@verb@line#1^^M{% + \expandafter\MGL@compare@verb@line% }% - \mgl@include@image{\mgl@dir\this@script}% -} - -\bgroup% - \escapechar=-1\relax% - \xdef\end@mglscript{\string\\end\string\{mglscript\string\}}% -\egroup% -\newenvironment{mglscript}[1]{% - \def\test@end@mglcode##1{% - \edef\this@word{##1}% - \ifx\this@word\end@mglscript% - \def\next@action{\end{mglscript}}% +\endgroup +\def\MGL@compare@verb@line#1{% + \let\MGL@next@action\MGL@compare@verb@line% + \expandafter\if#1\^^M% + \MGL@line\expandafter{\the\MGL@line#1}% + \MGL@read\MGL@in@stream{\MGL@this@code@line}% + \edef\MGL@this@line{\the\MGL@line}% + \ifx\MGL@this@line\MGL@this@code@line\else% + \def\MGL@future@action{}% \fi% - }% - \mglcode{#1}% -}{% - \immediate\closeout\mgl@out@stream% + \MGL@word{}% + \MGL@line{}% + \else\expandafter\if#1\space% + \MGL@word{}% + \MGL@line\expandafter{\the\MGL@line#1}% + \else% + \MGL@word\expandafter{\the\MGL@word#1}% + \MGL@line\expandafter{\the\MGL@line#1}% + \edef\MGL@this@line{\the\MGL@word}% + \ifx\MGL@this@line\MGL@end@env@cmd% + \def\MGL@next@action{\MGL@end@env}% + \MGL@read\MGL@in@stream{\MGL@this@code@line}% + \ifeof\MGL@in@stream\else% + \def\MGL@future@action{}% + \fi% + \fi% + \fi\fi% + \MGL@next@action% } +\newcounter{MGL@verb@line@no} +\def\MGL@prepare@verb@env{% + \setcounter{MGL@verb@line@no}{0}% + \list{\itshape\footnotesize\arabic{MGL@verb@line@no}.}{}% + \setlength{\labelsep}{1em}% + \itemsep\z@skip% + \leftskip\z@skip\rightskip\z@skip% + \parindent\z@\parfillskip\@flushglue\parskip\z@skip% + \MGL@verb@codes% + \obeyspaces% + \verbatim@font% +} +\def\MGL@rewrite@code@verb{% + \stepcounter{MGL@verb@line@no}% + \MGL@read\MGL@in@stream{\MGL@this@code@line}% + \ifeof\MGL@in@stream% + \def\MGL@next@action{% + \MGL@closein{\MGL@in@stream}% + \endlist% + }% + \else% + \def\MGL@next@action{% + \item\mbox{\MGL@this@code@line}% + \MGL@rewrite@code@verb% + }% + \fi% + \MGL@next@action% +} +%%%%% Anatomy of environments and commands %%%%% -\def\mglfunc@defined{} -\def\mgl@func{} - -\newcommand\mglfunc[2][0]{% - \test@mglfunc@defined{#2}% - \g@addto@macro{\mglfunc@defined}{#2,}% - \let\do\@makeother \dospecials% - \endlinechar`\^^M \catcode`\^^M\active% - \catcode`\ =10% - \g@addto@macro{\mgl@func}{\mgl@write\mgl@script{}}% - \g@addto@macro{\mgl@func}{\mgl@write\mgl@script{func '#2' #1}}% - \expandafter\mglfunc@write@line% -} -\def\test@mglfunc@defined#1{% - \def\this@func{#1}% - \@for\mglfunc@name:=\mglfunc@defined\do{% - \ifx\this@func\mglfunc@name% - \PackageWarning{\mgl@name}{MGL function "#1" has multiple definitions}% - \fi% +\newcommand\mgl[1][]{% + \MGL@setkeys{mgl@keys}{#1}% + \MGL@create@code@label% + \MGL@codes% + \MGL@def@end@env@cmd{mgl}% + \def\MGL@future@action{% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}% + }% + \MGL@set@write@script@out% + \@ifundefined{MGL@@@\MGL@this@code@label}{% + \MGL@write\MGL@script{quality \MGL@quality}% + \MGL@write\MGL@script{setsize \MGL@width\space\MGL@height}% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \def\MGL@save@action{% + \MGL@write\MGL@script{write '\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext'}% + \MGL@write\MGL@script{reset}% + \MGL@write\MGL@script{}% + } + \expandafter\MGL@write@line% + }{% + \def\MGL@save@action{}% + \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \expandafter\MGL@compare@line% }% } -\begingroup% - \catcode`\^^M\active% - \gdef\mglfunc@write@line#1^^M{% - \def\next@action{% - \g@addto@macro{\mgl@func}{\mgl@write\mgl@script{#1}}% - \expandafter\mglfunc@write@line% +\def\endmgl{% + \MGL@closeout{\MGL@out@stream}% + \MGL@closein{\MGL@in@stream}% + \MGL@save@action% + \MGL@future@action% + \MGL@include@graphics% +} + +\def\mgladdon{% + \MGL@codes% + \MGL@def@end@env@cmd{mgladdon}% + \MGL@set@write@out% + \MGL@set@write@script% + \expandafter\MGL@write@line% +} +\def\endmgladdon{% + \MGL@write\MGL@script{}% +} + +\newcommand\mglcode[2][]{% + \MGL@setkeys{mgl@keys}{#1}% + \MGL@test@code@label{#2}% + \MGL@verb@codes% + \MGL@def@end@env@cmd{mglcode}% + \@ifundefined{MGL@@@\MGL@this@code@label}{% + \def\MGL@future@action{% + \MGL@write{18}{% + mglconv -q \MGL@quality\space -S \MGL@scale\space -s "\MGL@dir\MGL@scripts@dir\mglcommonscript.mgl" -o "\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext" "\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl"% + }% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}% + }% + \MGL@set@write@verb@out% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \expandafter\MGL@ignore@verb@line% + }{% + \def\MGL@future@action{% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}% }% - \test@end@mglfunc{#1}% - \next@action% + \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \expandafter\MGL@compare@next@verb@line% }% -\endgroup -\begingroup% - \escapechar=-1 \relax% - \xdef\end@mglfunc{\string\\end\string\{mglfunc\string\}}% -\endgroup -\def\test@end@mglfunc#1{% - \edef\this@line{#1}% - \ifx\this@line\end@mglfunc% - \def\next@action{\end{mglfunc}}% - \fi% +} +\def\endmglcode{% + \MGL@closeout{\MGL@out@stream}% + \MGL@closein{\MGL@in@stream}% + \bgroup% + \endlinechar=-1\relax% + \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}% + \MGL@write\MGL@out@stream{\MGL@signature}% + \MGL@rewrite@code{\MGL@out@stream}% + \MGL@closein{\MGL@in@stream}% + \MGL@closeout{\MGL@out@stream}% + \egroup% + \MGL@future@action% + \MGL@include@graphics% +} + +\def\mglscript#1{% + \MGL@test@code@label{#1}% + \MGL@verb@codes% + \MGL@def@end@env@cmd{mglscript}% + \MGL@set@write@verb@out% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}% + \MGL@write\MGL@out@stream{\MGL@signature}% + \expandafter\MGL@ignore@verb@line% +} +\def\endmglscript{% + \MGL@closeout{\MGL@out@stream}% +} + +\newcommand\mglfunc[2][0]{% + \MGL@test@code@label{#2}% + \MGL@codes% + \MGL@def@end@env@cmd{mglfunc}% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \MGL@write\MGL@out@stream{func #2 #1}% + \g@addto@macro{\MGL@funcs}{\MGL@rewrite@func{#2}}% + \MGL@set@write@out% + \expandafter\MGL@ignore@line% } \def\endmglfunc{% - \g@addto@macro{\mgl@func}{\mgl@write\mgl@script{return}}% + \MGL@write\MGL@out@stream{return}% + \MGL@write\MGL@out@stream{}% + \MGL@closeout{\MGL@out@stream}% +} +\def\MGL@rewrite@func#1{% + \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir#1.mgl.backup}% + \MGL@rewrite@code{\MGL@script}% } +\def\mglverbatim{% + \MGL@def@end@env@cmd{mglverbatim}% + \MGL@prepare@verb@env% + \MGL@set@write@verb@to@doc + \expandafter\MGL@ignore@verb@line% +} +\def\endmglverbatim{\endlist} -\def\mglcommonscript{mgl_common_script} -\bgroup% - \escapechar=-1\relax% - \xdef\end@mglcommon{\string\\end\string\{mglcommon\string\}}% -\egroup% -\newenvironment{mglcommon}{% - \def\test@end@mglcode##1{% - \edef\this@word{##1}% - \ifx\this@word\end@mglcommon% - \def\next@action{\end{mglcommon}}% - \fi% +\def\mglblock#1{% + \MGL@test@code@label{#1}% + \MGL@verb@codes% + \obeyspaces% + \MGL@def@end@env@cmd{mglblock}% + \MGL@set@write@verb@out% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}% + \MGL@write\MGL@out@stream{\MGL@signature}% + \expandafter\MGL@ignore@verb@line% +} +\def\endmglblock{% + \MGL@closeout{\MGL@out@stream}% + \mglinclude{\MGL@this@code@label}% +} + +\def\mglinclude#1{% + \bgroup% + \MGL@prepare@verb@env% + \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@scripts@dir#1.mgl}% + \MGL@rewrite@code@verb% + \egroup% +} + +\newcommand\mglgraphics[2][]{% + \MGL@setkeys{mgl@keys}{#1}% + \edef\MGL@this@code@label{#2}% + \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext}{}{% + \MGL@write{18}{mglconv -q \MGL@quality\space -S \MGL@scale\space -s "\MGL@dir\MGL@scripts@dir\mglcommonscript.mgl" -o "\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext" "\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl"} }% - \mglcode{\mglcommonscript}% -}{% - \mgl@write\mgl@out@stream{quality \mgl@quality}% - \immediate\closeout\mgl@out@stream% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}% + \MGL@include@graphics% +} + +\def\mglcommonscript{common_script} +\def\mglcommon{% + \MGL@test@code@label{\mglcommonscript}% + \MGL@codes% + \MGL@def@end@env@cmd{mglcommon}% + \MGL@set@write@out% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}% + \MGL@write\MGL@out@stream{\MGL@signature}% + \MGL@write\MGL@out@stream{quality \MGL@quality}% + \MGL@write\MGL@out@stream{setsize \MGL@width\space\MGL@height}% + \expandafter\MGL@ignore@line% } \@onlypreamble\mglcommon -\bgroup - \catcode`#=12 - \gdef\mglcomm{#} -\egroup -\def\mgltexsignature{% - \mglcomm^^J% - \mglcomm\space This file was autogenerated from the document \jobname.tex on date \today^^J% - \mglcomm% -} -\newcommand\mglsignature{% - \def\mgltexsignature{}% - \let\do\@makeother \dospecials% - \endlinechar`\^^M \catcode`\^^M\active% - \@vobeyspaces% - \expandafter\mglsignature@write@line% -} -\begingroup% - \escapechar=-1 \relax% - \xdef\end@mglsignature{\string\\end\string\{mglsignature\string\}}% -\endgroup -\begingroup% - \catcode`\^^M\active% - \gdef\mglsignature@write@line#1^^M{% - \def\next@action{% - \g@addto@macro{\mgltexsignature}{\mglcomm\space#1^^J} - \mglsignature@write@line% +\def\endmglcommon{% + \MGL@closeout\MGL@out@stream% + \bgroup% + \endlinechar=-1\relax% + \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@scripts@dir\MGL@this@code@label.mgl}% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \MGL@rewrite@code{\MGL@out@stream}% + \MGL@closein{\MGL@in@stream}% + \MGL@closeout{\MGL@out@stream}% + \egroup% +} + +\def\MGL@setups@written{} +\def\mglsetup#1{% + \MGL@test@code@label{#1}% + \xdef\MGL@setups@written{\MGL@setups@written\MGL@this@code@label,} + \g@addto@macro{\MGL@funcs}{\MGL@rewrite@func{#1}}% + \MGL@codes% + \MGL@def@end@env@cmd{mglsetup}% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \MGL@write\MGL@out@stream{func #1}% + \MGL@set@write@out% + \expandafter\MGL@ignore@line% +} +\def\endmglsetup{% + \MGL@write\MGL@out@stream{return}% + \MGL@write\MGL@out@stream{}% + \MGL@closeout{\MGL@out@stream}% +} + +\def\mglplot@call@setup{% + \ifx\mglplot@setup\@empty\else% + \def\MGL@future@action{% + \PackageWarning{mgltex}{No "\mglplot@setup" setup for \string\mglplot}% + }% + \@for\MGL@setup:=\MGL@setups@written\do{% + \ifx\MGL@setup\mglplot@setup% + \MGL@write\MGL@script{call '\mglplot@setup'}% + \MGL@write\MGL@out@stream{\mglplot@setup}% + \def\MGL@future@action{}% + \fi% }% - \test@end@mglsignature{#1}% - \next@action% - }% -\endgroup -\def\test@end@mglsignature#1{% - \edef\this@line{#1}% - \ifx\this@line\end@mglsignature% - \def\next@action{\end{mglsignature}}% \fi% } -\def\endmglsignature{% - \g@addto@macro{\mgltexsignature}{\mglcomm} -} -\def\mglsignature@write#1{\mgl@write#1{\mgltexsignature}} + +\newcommand\mglplot[2][]{% + \bgroup% + \def\mglplot@setup{}% + \MGL@setkeys{mglplot@keys}{#1}% + \MGL@create@code@label% + \@ifundefined{MGL@@@\MGL@this@code@label}{% + \MGL@write\MGL@script{quality \MGL@quality}% + \MGL@write\MGL@script{setsize \MGL@width\space\MGL@height}% + \MGL@openout{\MGL@out@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \mglplot@call@setup% + \MGL@write\MGL@script{#2}% + \MGL@write\MGL@out@stream{#2}% + \MGL@closeout{\MGL@out@stream}% + \MGL@write\MGL@script{write '\MGL@dir\MGL@graphics@dir\MGL@this@code@label\MGL@graphics@ext'}% + \MGL@write\MGL@script{reset}% + \MGL@write\MGL@script{}% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}% + }{% + \endlinechar=-1\relax% + \MGL@openin{\MGL@in@stream}{\MGL@dir\MGL@backups@dir\MGL@this@code@label.mgl.backup}% + \ifx\mglplot@setup\@empty\else% + \MGL@read\MGL@in@stream{\MGL@this@code@line}% + \ifx\MGL@this@code@line\mglplot@setup% + \MGL@read\MGL@in@stream{\MGL@this@code@line}% + \edef\MGL@this@line{#2}% + \ifx\MGL@this@code@line\MGL@this@line% + \MGL@write\@auxout{\string\MGL@unchanged{\MGL@this@code@label}}% + \fi% + \fi% + \fi% + \MGL@closein{\MGL@in@stream} + }% + \egroup% +}% \def\mglcomment{% - \let\do\@makeother\dospecials% - \obeylines% - \@vobeyspaces% + \MGL@codes% \verbatim@font% \small% \mgl@comment% @@ -428,7 +709,7 @@ \begingroup% \catcode`|=0\catcode`[= 1\catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\\=12% |gdef|mgl@comment#1\end{mglcomment}[% - |if@mgl@comments@% + |if@MGL@comments@% |begin[center]% <------------------ MGL comment ------------------>% #1% @@ -439,275 +720,78 @@ |endgroup% \def\endmglcomment{} - -\def\mglsetup@defined{} -\newcommand\mglsetup[1][generic]{% - \test@mglsetup@defined{#1}% - \g@addto@macro{\mglsetup@defined}{#1,}% - \expandafter\def\csname mgl@setup@#1\endcsname{\mgl@write\mgl@script{}}% - \expandafter\def\csname mgl@setup@#1\endcsname{\mgl@write\mgl@script{quality \mgl@quality}}% - \let\do\@makeother \dospecials% - \endlinechar`\^^M \catcode`\^^M\active% - \catcode`\ =10% - \expandafter\mglsetup@write@line% -} -\def\test@mglsetup@defined#1{% - \def\this@setup{#1}% - \@for\mglsetup@name:=\mglsetup@defined\do{% - \ifx\this@mglsetup\mglsetup@name% - \PackageWarning{\mgl@name}{Redefining "#1" setup for \noexpand\mglplot}% - \fi% - }% -} +\def\MGL@signature{} \begingroup% - \catcode`\^^M\active% - \gdef\mglsetup@write@line#1^^M{% - \def\next@action{% - \expandafter\g@addto@macro\csname mgl@setup@\this@setup\endcsname{% - \mgl@write\mgl@script{#1}% - }% - \expandafter\mglsetup@write@line% - }% - \test@end@mglsetup{#1}% - \next@action% - }% -\endgroup -\begingroup% - \escapechar=-1 \relax% - \xdef\end@mglsetup{\string\\end\string\{mglsetup\string\}}% + \catcode`#=12\relax% + \gdef\MGL@comm@sym{#} \endgroup -\def\test@end@mglsetup#1{% - \edef\this@line{#1}% - \ifx\this@line\end@mglsetup% - \def\next@action{\end{mglsetup}}% - \fi% -} -\def\endmglsetup{} - - -\def\mglplot{% - \@ifnextchar[{\@mglplot}{\@mglplot[]}% -} -\def\@mglplot[#1]{% - \def\mglplot@setup{generic}% - \def\graph@keys{}% - \setkeys{mglplot@keys}{#1}% - \stepcounter{mgl@image@no}% - \ifx\csname mgl@setup@\mglplot@setup\endcsname\@undefined% - \PackageError{\mgl@name}{Setup "\mglplot@setup" undefined}{}% - \else% - \csname mgl@setup@\mglplot@setup\endcsname% - \fi% - \@@mglplot% -} -\long\def\@@mglplot#1{% - \mgl@write\mgl@script{\detokenize{#1}}% - \mgl@write\mgl@script{% - write '\mgl@dir\jobname-mgl-\arabic{mgl@image@no}\mgl@image@ext'% - }% - \mgl@write\mgl@script{reset}% - \mgl@include@image{\mgl@dir\jobname-mgl-\arabic{mgl@image@no}}% -} - -\newcounter{mgl@verb@line@no} - -\def\mglverbatim{% - \setcounter{mgl@verb@line@no}{0}% - \list{\itshape\footnotesize\arabic{mgl@verb@line@no}.}{}% - \setlength{\labelsep}{1em}% - \itemsep\z@skip% - \leftskip\z@skip\rightskip\z@skip% - \parindent\z@\parfillskip\@flushglue\parskip\z@skip% - \let\do\@makeother \dospecials% - \endlinechar`\^^M \catcode`\^^M\active% +\def\mglsignature{% + \MGL@verb@codes% \obeyspaces% - \verbatim@font% - \expandafter\mglverbatim@ignore@line% + \MGL@def@end@env@cmd{mglsignature}% + \def\MGL@write@code@action##1{\g@addto@macro{\MGL@signature}{\MGL@comm@sym\space##1^^J}}% + \catcode`|=0\relax\catcode`[=1\relax\catcode`]=2\relax% + \expandafter\MGL@ignore@line% } -\def\mglverbatim@ignore@line#1{% - \expandafter\mglverbatim@write@line% -} -\def\mglverbatim@write@line#1{% - \let\next@action\mglverbatim@write@line% - \expandafter\if#1\^^M% - \stepcounter{mgl@verb@line@no}% - \item\mbox{\the\mgl@line}% - \mgl@word{}% - \mgl@line{}% - \else\expandafter\if#1\space% - \mgl@word{}% - \mgl@line\expandafter{\the\mgl@line#1}% - \else% - \mgl@word\expandafter{\the\mgl@word#1}% - \mgl@line\expandafter{\the\mgl@line#1}% - \test@end@mglverbatim{\the\mgl@word}% - \fi\fi% - \next@action% -} -\begingroup% - \escapechar=-1\relax% - \xdef\end@mglverbatim{\string\\end\string\{mglverbatim\string\}}% -\endgroup% -\def\test@end@mglverbatim#1{% - \edef\this@word{#1}% - \ifx\this@word\end@mglverbatim% - \def\next@action{\end{mglverbatim}}% - \fi% -} -\def\endmglverbatim{\endlist} +\def\endmglsignature{} -\def\mglblock#1{% - \test@mgl@script@written{#1}% - \xdef\mgl@script@written{\mgl@script@written#1,}% - \let\do\@makeother \dospecials% - \endlinechar`\^^M \catcode`\^^M\active% - \obeyspaces% - \def\this@script{#1}% - \if@mgltex@on@% - \immediate\openout\mgl@out@stream="\mgl@dir\this@script.mgl"% - \mglsignature@write\mgl@out@stream% - \fi% - \expandafter\mglblock@write@line% -} -\def\mglblock@write@line#1{% - \let\next@action\mglblock@write@line% - \expandafter\if#1\^^M% - \mgl@write\mgl@out@stream{\the\mgl@line}% - \mgl@word{}% - \mgl@line{}% - \else\expandafter\if#1\space% - \mgl@word{}% - \mgl@line\expandafter{\the\mgl@line#1}% - \else% - \mgl@word\expandafter{\the\mgl@word#1}% - \mgl@line\expandafter{\the\mgl@line#1}% - \test@end@mglblock{\the\mgl@word}% - \fi\fi% - \next@action% -} -\begingroup% - \escapechar=-1\relax% - \xdef\end@mglblock{\string\\end\string\{mglblock\string\}}% -\endgroup% -\def\test@end@mglblock#1{% - \edef\this@word{#1}% - \ifx\this@word\end@mglblock% - \def\next@action{\end{mglblock}}% - \fi% -} -\newread\mgl@in@stream -\def\endmglblock{% - \immediate\closeout\mgl@out@stream% - \immediate\openin\mgl@in@stream="\mgl@dir\this@script.mgl"% - \begingroup% - \list{\itshape\footnotesize\arabic{mgl@verb@line@no}.}{}% - \setlength{\labelsep}{1em}% - \itemsep\z@skip% - \leftskip\z@skip\rightskip\z@skip% - \parindent\z@\parfillskip\@flushglue\parskip\z@skip% - \verbatim@font% - \@vobeyspaces% - \mglblock@read@line% -} -\def\mglblock@read@line{% - \stepcounter{mgl@verb@line@no}% - \read\mgl@in@stream to \this@line% - \ifeof\mgl@in@stream% - \def\next@action{% - \immediate\closein\mgl@in@stream% - \endlist% - \endgroup% - }% +\def\MGL@quality{2} +\def\mglquality#1{% + \def\MGL@quality{#1}% + \ifcase#1 + \PackageInfo{mgltex}{Quality 0: No face drawing (fastest)}% + \or% + \PackageInfo{mgltex}{Quality 1: No color interpolation (fast)}% + \or% + \PackageInfo{mgltex}{Quality 2: High quality (normal)}% + \or% + \PackageInfo{mgltex}{Quality 3: High quality with 3d primitives (not implemented yet)}% + \or% + \PackageInfo{mgltex}{Quality 4: No face drawing, direct bitmap drawing (low memory usage)}% + \or% + \PackageInfo{mgltex}{Quality 5: No color interpolation, direct bitmap drawing (low memory usage)}% + \or% + \PackageInfo{mgltex}{Quality 6: High quality, direct bitmap drawing (low memory usage)}% + \or% + \PackageInfo{mgltex}{Quality 7: High quality with 3d primitives, direct bitmap drawing (not implemented yet)}% + \or% + \PackageInfo{mgltex}{Quality 8: Draw dots instead of primitives (extremely fast)}% \else% - \def\next@action{% - \item\mbox{\this@line}% - \mglblock@read@line% - }% + \PackageWarning{mgltex}{Quality #1 not available. Using default (2)}% \fi% - \next@action% -} - -\newcommand\mglgraphics[2][]{% - \def\graph@keys{}% - \setkeys{mgl@keys}{#1}% - \mgl@write{18}{mglconv "\mgl@dir#2.mgl" -s "\mgl@dir\mglcommonscript.mgl" -o "\mgl@dir#2\mgl@image@ext"} - \mgl@include@image{\mgl@dir#2}% -} - -\def\mglinclude#1{% - \setcounter{mgl@verb@line@no}{0}% - \immediate\openin\mgl@in@stream="\mgl@dir#1.mgl"% - \begingroup% - \list{\itshape\footnotesize\arabic{mgl@verb@line@no}.}{}% - \setlength{\labelsep}{1em}% - \itemsep\z@skip% - \leftskip\z@skip\rightskip\z@skip% - \parindent\z@\parfillskip\@flushglue\parskip\z@skip% - \let\do\@makeother \dospecials% - \endlinechar`\^^M \catcode`\^^M\active% - \@vobeyspaces% - \verbatim@font% - \mglblock@read@line% } +\@onlypreamble\mglquality -\def\mgl@dir{} -\def\mgldir#1{% - \def\mgl@dir{#1}% -} -\@onlypreamble\mgldir -\def\mgl@quality{2} -\def\mglquality#1{% - \def\mgl@quality{#1}% - \if@mgltex@on@% - \immediate\openout\mgl@out@stream="\mgl@dir\mglcommonscript.mgl"% - \mgl@write\mgl@out@stream{quality #1}% - \immediate\closeout\mgl@out@stream% - \ifcase#1 - \PackageInfo{mgltex}{Quality 0: No face drawing (fastest)}% - \or% - \PackageInfo{mgltex}{Quality 1: No color interpolation (fast)}% - \or% - \PackageInfo{mgltex}{Quality 2: High quality (normal)}% - \or% - \PackageInfo{mgltex}{Quality 3: High quality with 3d primitives (not implemented yet)}% - \or% - \PackageInfo{mgltex}{Quality 4: No face drawing, direct bitmap drawing (low memory usage)}% - \or% - \PackageInfo{mgltex}{Quality 5: No color interpolation, direct bitmap drawing (low memory usage)}% - \or% - \PackageInfo{mgltex}{Quality 6: High quality, direct bitmap drawing (low memory usage)}% - \or% - \PackageInfo{mgltex}{Quality 7: High quality with 3d primitives, direct bitmap drawing (not implemented yet)}% - \or% - \PackageInfo{mgltex}{Quality 8: Draw dots instead of primitives (extremely fast)}% - \else% - \PackageWarning{mgltex}{Quality #1 not available. Using default (2)}% - \fi% - \else% - \PackageWarning{mgltex}{mglTeX is off, quality changes won't have effect}% - \fi% +\def\MGL@width{640} +\def\MGL@height{480} +\def\mglsetsize#1#2{% + \def\MGL@width{#1}% + \def\MGL@height{#2}% } +\@onlypreamble\mglsetsize \def\mgltexon{ - \@mgltex@on@true - \def\mgl@write##1##2{% + \def\MGL@openout##1##2{% + \immediate\openout##1="##2"% + }% + \def\MGL@write##1##2{% \immediate\write##1{##2}% - } + }% + \def\MGL@graph@not@found@text{MGL\\image\\not\\found}% + \def\MGL@graph@not@found@message{MGL image "\MGL@this@code@label" not found}% } \def\mgltexoff{% - \@mgltex@on@false - \def\mgl@write##1##2{}% + \def\MGL@openout##1##2{}% + \def\MGL@write##1##2{}% + \def\MGL@graph@not@found@text{\mglTeX\\is off,\\no image\\generated}% + \def\MGL@graph@not@found@message{mglTeX is off, MGL image "\MGL@this@code@label" not generated}% } \def\mglcomments{ - \@mgl@comments@true + \@MGL@comments@true% } \def\mglnocomments{% - \@mgl@comments@false + \@MGL@comments@false% } -\def\mglTeX{mgl\TeX} - -\endinput -%% -%% End of file `mgltex.sty'. +\def\mglTeX{mgl\TeX} \ No newline at end of file diff --git a/mgltex/sample.tex b/mgltex/sample.tex index 5fe94f8..0fe9dc2 100644 --- a/mgltex/sample.tex +++ b/mgltex/sample.tex @@ -1,16 +1,25 @@ \documentclass{article} -\usepackage[png,comments]{mgltex} +\usepackage[jpg,comments]{mgltex} \title{\mglTeX{} package example} \author{Diego Sejas Viscarra, Alexey Balakin} \date{\today} -\mgldir{scripts/} + +\mgldir{MGL/} +\mglscriptsdir{scripts/} +\mglgraphicsdir{graphics/} +\mglbackupsdir{backups/} \begin{mglcommon} define gravity 9.81 \end{mglcommon} +\begin{mglsignature} + This scripts was generated on date |today. +\end{mglsignature} + + \begin{document} \maketitle @@ -50,11 +59,13 @@ As an alternative to this method of declaring signatures, the user can manually \item Any \LaTeX{} command can be used in this case. \end{itemize} For example, the default signature: + \begin{mglcomment} \begin{quote}\small \mglcomm\\ \mglcomm\ This script was generated from $<$document$>$.mgl on date $<$today$>$\\ \mglcomm \end{quote} + \end{mglcomment} can be achieved with \begin{verbatim} \def\mgltexsignature{% @@ -66,7 +77,7 @@ As an alternative to this method of declaring signatures, the user can manually \item[mglcomment] Used to contain multiline commentaries. This commentaries will be visible/invisible in the output document, depending on the use of the package options \texttt{comments} and \texttt{nocomments} (see above), or the \texttt{\mglcomments} and \texttt{\mglnocomments} commands (see bellow). - When, bisible, the comment will appear like this: + When, visible, the comment will appear like this: \begin{center} \makeatletter \verbatim@font @@ -371,32 +382,31 @@ An example of usage of \texttt{\textbackslash{}mglplot} command would be: \end{figure} \end{verbatim} -\begin{mglsetup} +\begin{mglsetup}{generic} box '@{W9}' : axis \end{mglsetup} -\begin{mglsetup}[2d] +\begin{mglsetup}{2d} box : axis grid 'xy' ';k' \end{mglsetup} -\begin{mglsetup}[3d] +\begin{mglsetup}{3d} rotate 50 60 box : axis : grid 'xyz' ';k' \end{mglsetup} \begin{figure}[!ht] \centering - \mglplot[scale=0.5]{new a 200 'sin(pi*x)':plot a '2B'} + \mglplot[scale=0.5,setup=generic]{new a 200 'x' : fplot 'sin(pi*x)' '2R' : plot a '2B'} \end{figure} \begin{figure}[!ht] \centering - \mglplot[scale=0.5,setup=2d]{ - fplot 'sin(pi*x)' '2B' : - fplot 'cos(pi*x^2)' '2R' + \mglplot[scale=0.5,setup=2d]{% + fplot 'sin(pi*x)' '2B' :% + fplot 'cos(pi*x^2)' '2R'% } \end{figure} \begin{figure}[!ht] \centering - \mglplot[width=0.5 \textwidth, setup=3d] - {fsurf 'sin(pi*x)+cos(pi*y)'} + \mglplot[width=0.5\textwidth, setup=3d]{fsurf 'sin(pi*x)+cos(pi*y)'} \end{figure} As an additional feature, when an image is not found or cannot be included, instead of issuing an error, \texttt{mgltex} prints a box with the word \emph{'MGL image not found'} in the LaTeX document. @@ -459,7 +469,4 @@ The result is: \end{mgl} \end{figure} \mgltexon - - - \end{document} \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 484368a..504e7a8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,7 +4,7 @@ set(mgl_src data.cpp data_io.cpp data_ex.cpp data_png.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 - plot.cpp prim.cpp surf.cpp tex_table.cpp vect.cpp volume.cpp evalc.cpp + plot.cpp prim.cpp surf.cpp tex_table.cc vect.cpp volume.cpp evalc.cpp s_hull/s_hull_pro.cpp window.cpp ) diff --git a/src/addon.cpp b/src/addon.cpp index d1185f0..9537f09 100644 --- a/src/addon.cpp +++ b/src/addon.cpp @@ -45,13 +45,13 @@ void MGL_EXPORT mgl_strcls(char *str) delete []tmp; } //----------------------------------------------------------------------------- -long MGL_EXPORT_PURE mgl_strpos(const char *str,char *fnd) +long MGL_EXPORT mgl_strpos(const char *str,char *fnd) { const char *p=strstr(str,fnd); return p?p-str:-1L; } //----------------------------------------------------------------------------- -long MGL_EXPORT_PURE mgl_chrpos(const char *str,char ch) +long MGL_EXPORT mgl_chrpos(const char *str,char ch) { const char *p=str?strchr(str,ch):0; return p?p-str:-1L; diff --git a/src/axis.cpp b/src/axis.cpp index 30bc089..0bdacba 100644 --- a/src/axis.cpp +++ b/src/axis.cpp @@ -22,6 +22,7 @@ #include "mgl2/data.h" #include "mgl2/canvas.h" #include "mgl2/prim.h" +#include "mgl2/eval.h" 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) @@ -29,7 +30,7 @@ MGL_NO_EXPORT inline struct tm *mgl_localtime (const time_t *clock, tm *result, const tm *res = use_utc?gmtime(clock):localtime(clock); memcpy(result,res,sizeof(tm)); return result; } //----------------------------------------------------------------------------- -long MGL_EXPORT_PURE mgl_have_color(const char *stl) +long MGL_EXPORT mgl_have_color(const char *stl) { long j=0; if(stl) for(long i=0;stl[i];i++) @@ -50,7 +51,7 @@ void MGL_EXPORT mgl_wcstrim(wchar_t *str) str[i-k]=0; } //----------------------------------------------------------------------------- -size_t MGL_EXPORT_PURE mgl_wcslen(const wchar_t *str) +size_t MGL_EXPORT mgl_wcslen(const wchar_t *str) { long i=0; if(str) while(str[i]) i++; @@ -259,7 +260,7 @@ void mglCanvas::SetTickTime(char dir, mreal d, const char *t) MGL_TO_WCS(t,aa.t=wcs); if(strchr("xyztuvw",aa.ch)) - aa.org = mglPoint(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv)); + aa.org.Set(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv)); if(aa.ch=='x') aa.v0 = aa.org.x; if(aa.ch=='y') aa.v0 = aa.org.y; if(aa.ch=='z') aa.v0 = aa.org.z; @@ -305,7 +306,7 @@ void mglCanvas::AdjustTicks(mglAxis &aa, bool ff) { d /= -aa.d; long n = floor(log10(d)); - int k = int(d*pow(10.,-n)+0.5); + int k = mgl_int(d*pow(10.,-n)); aa.dv = pow(10.,n)*k; aa.o=0; aa.ds = pow(10.,n); } @@ -379,7 +380,7 @@ std::wstring MGL_NO_EXPORT mgl_tick_text(mreal z, mreal z0, mreal d, mreal v, in // mglprintf(str,64,fmt.c_str(), u); if(ff) { - if(str==L"-1" || str==L"+1" || str==L"−1") str = str[0] + fact; + if(str==L"-1" || str==L"+1" || str==L"\u22121") str = str[0] + fact; else if(str==L"1") str = fact; else if(str!=L"0") str += fact; } @@ -389,7 +390,7 @@ std::wstring MGL_NO_EXPORT mgl_tick_text(mreal z, mreal z0, mreal d, mreal v, in void mglCanvas::LabelTicks(mglAxis &aa) { if(strchr("xyztuvw",aa.ch)) - aa.org = mglPoint(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv)); + aa.org.Set(GetOrgX(aa.ch,aa.inv), GetOrgY(aa.ch,aa.inv), GetOrgZ(aa.ch,aa.inv)); if(aa.ch=='x') aa.v0 = aa.org.x; if(aa.ch=='y') aa.v0 = aa.org.y; if(aa.ch=='z') aa.v0 = aa.org.z; @@ -410,7 +411,7 @@ void mglCanvas::LabelTicks(mglAxis &aa) if(d==0) wcscpy(buf,L"1"); else if(d==1) wcscpy(buf,L"10"); else if(d>0) mglprintf(buf,64,L"10^{%d}",d); - else mglprintf(buf,64,minus?L"10^{-%d}":L"10^{−%d}",-d); + else mglprintf(buf,64,minus?L"10^{-%d}":L"10^{\u2212%d}",-d); if(d%ds!=0) *buf=0; // remove too often log ticks aa.AddLabel(buf,v); } @@ -422,10 +423,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,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==0) wcscpy(buf,minus?L"-1":L"\u22121"); + else if(d==1) wcscpy(buf,minus?L"-10":L"\u221210"); + else if(d>0) mglprintf(buf,64,minus?L"-10^{%d}":L"\u221210^{%d}",d); + else mglprintf(buf,64,minus?L"-10^{-%d}":L"\u221210^{\u2212%d}",-d); if(d%ds!=0) *buf=0; // remove too often log ticks aa.AddLabel(buf,v); } @@ -452,7 +453,8 @@ void mglCanvas::LabelTicks(mglAxis &aa) 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) - { - mglPnt &pp = Pnt[kk[i]]; - if(pp.u<0 || (pp.u==0 && pp.v<0)) - { pp.u=-pp.u; pp.v=-pp.v; pp.w=-pp.w; } - } } - - for(l=0,c=INFINITY,i=0;iaa.v2 || aa.txt[i+1].val>aa.v2)) continue; if(kk[i]<0 || kk[i+1]<0) continue; - v = (GetPntP(kk[i+1])-GetPntP(kk[i])).norm(); // distance between ticks - vv = (w[i]+w[i+1])/2; // length of labels + mreal v = (GetPntP(kk[i+1])-GetPntP(kk[i])).norm(); // distance between ticks + mreal vv = (w[i]+w[i+1])/2; // length of labels if(v>0 && l < vv/v) l = vv/v; if(c>v) c = v; } - if(mgl_isnum(aa.angl)) // manual rotation + h /= c; + + mreal tet=0; + if(mgl_isnum(aa.angl)) tet = aa.angl*M_PI/180; // manual rotation + else if(get(MGL_ENABLE_RTEXT) && get(MGL_TICKS_ROTATE) && l>1) // try rotate first { - tet = aa.angl*M_PI/180; - mreal s = sin(tet); - if(s>0) - { pos[2]=(aa.ch=='c' && !inv)?'R':'L'; l=0.99*h/s/c; - for(i=0;i1 ? asin((l*sqrt(r2-1/1.21)+h/1.1)/r2):M_PI/2; + tet = t11 && c>0) // try rotate first - { tet = c>1.1*h ? asin(1.1*h/c) : M_PI/2; pos[2]=(aa.ch=='c' && !inv)?'R':'L'; - l=0.99*h/sin(tet)/c; for(i=0;i0) for(i=0;iaa.v1 && cl1?l1:l2; + } + char *align=new char[n], *up=new char[n]; + for(long i=0;i=0) // select proper align + { + mglPoint p(a),r(o+d*aa.txt[i].val); + ScalePoint(M, r, p, false); + mglPnt &pp = Pnt[kk[i]]; + mreal ux=pp.u*cos(tet) + pp.v*sin(tet), uy=pp.v*cos(tet) - pp.u*sin(tet); + bool algn = tet!=0; + if(!get(MGL_ENABLE_RTEXT) || !get(MGL_TICKS_ROTATE)) { ux=1; uy=0; algn=true; } + if(ux<0 || (ux==0 && uy<0)) { ux=-ux; uy=-uy; pp.w=-pp.w; } + pp.u = ux; pp.v = uy; + mreal pu = p.x*ux+p.y*uy, pv = p.y*ux-p.x*uy; /*, su = ps.x*ux+ps.y*uy;*/ + if(aa.ch!='c') up[i] = ((pv>0) ^ inv) ? 'T':'t'; + else up[i]=(aa.ns==0 || aa.ns==3)?'t':'T'; + int t=0; + if(algn) { - if(aa.ch!='c') pos[2] = nn.x<0 ? 'L':'R'; - else pos[2] = aa.ns==1?'L':'R';// nn.x<0 ? 'R':'L'; + if(aa.ch!='c') t= (pu==0)?0:(pu<0? -1:1); + else t=inv?-1:1; } -// if((!get(MGL_ENABLE_RTEXT) || tet) && nn.x!=0 && aa.ch=='c') pos[2] = nn.x<0 ? 'R':'L'; -// if((!get(MGL_ENABLE_RTEXT) || tet) && nn.x!=0 && aa.ch!='c') pos[2] = nn.x<0 ? 'L':'R'; - if(aa.ch=='c' && aa.txt[i].text[0]==' ') qq.u = qq.v = NAN; - int ts = 1; - 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=='c') ts=inv?-1:1; // use manual settings by inv argument - if(aa.ch=='T') ts *= -1; - if(aa.pos=='T') ts *= -1; - pos[0] = ts>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.1,CDef,tet?false:true); + char val[3]={'L','C','R'}; align[i] = val[t+1]; + } + long k = get(MGL_TICKS_SKIP) ? 1+l : 1; + + for(long i=0;i=0) + { + mreal v = aa.txt[i].val; + if(get(MGL_NO_ORIGIN) && v==aa.v0) continue; + if(v>aa.v1 && v0 ? 't':'T'; @@ -735,7 +736,7 @@ void MGL_NO_EXPORT mgl_drw_grid(HMGL gr, double val, const mglPoint &d, const mg } 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; + mglPoint pp[8]={Min,Min,Min,Min,Max,Max,Max,Max},nan(NAN), oo[8], org=Min; pp[1].x=Max.x; pp[2].y=Max.y; pp[3].z=Max.z; pp[4].x=Min.x; pp[5].y=Min.y; pp[6].z=Min.z; mreal zm=INFINITY; @@ -800,50 +801,50 @@ void mglCanvas::Labelw(char dir, const wchar_t *text, mreal pos, const char *opt AdjustTicks(ax,fx!=0); aa = &ax; if(ax.dv) t = (Min.x+Max.x+pos*(Max.x-Min.x))/2; else t = Min.x*pow(Max.x/Min.x, (pos+1)/2); - p = mglPoint(t, GetOrgY(ax.ch,ax.inv), GetOrgZ(ax.ch,ax.inv)); - q = mglPoint(1,0,0); shift += ax.sh; + p.Set(t, GetOrgY(ax.ch,ax.inv), GetOrgZ(ax.ch,ax.inv)); + q.Set(1,0,0); shift += ax.sh; } if(dir=='y' && !(TernAxis&3)) { AdjustTicks(ay,fy!=0); aa = &ay; if(ay.dv) t = (Min.y+Max.y+pos*(Max.y-Min.y))/2; else t = Min.y*pow(Max.y/Min.y, (pos+1)/2); - p = mglPoint(GetOrgX(ay.ch,ay.inv), t, GetOrgZ(ay.ch,ay.inv)); - q = mglPoint(0,1,0); shift += ay.sh; + p.Set(GetOrgX(ay.ch,ay.inv), t, GetOrgZ(ay.ch,ay.inv)); + q.Set(0,1,0); shift += ay.sh; if(TernAxis&3) { - q = mglPoint(-1,1,0); pos=-pos; + q.Set(-1,1,0); pos=-pos; } } if(dir=='y' && (TernAxis&3)) { - ty.ch='T'; ty.dir = mglPoint(-1,1); ty.org = mglPoint(1,0,ay.org.z); + ty.ch='T'; ty.dir.Set(-1,1); ty.org.Set(1,0,ay.org.z); AdjustTicks(ty,fy!=0); aa = &ty; if(ty.dv) t = (Min.y+Max.y+pos*(Max.y-Min.y))/2; else t = Min.y*pow(Max.y/Min.y, (pos+1)/2); - p = mglPoint(GetOrgX(ty.ch,ty.inv), t, GetOrgZ(ty.ch,ty.inv)); - q = mglPoint(0,1,0); shift += ty.sh; + p.Set(GetOrgX(ty.ch,ty.inv), t, GetOrgZ(ty.ch,ty.inv)); + q.Set(0,1,0); shift += ty.sh; if(TernAxis&3) { - q = mglPoint(-1,1,0); pos=-pos; + q.Set(-1,1,0); pos=-pos; } } if(dir=='t' && (TernAxis&3)) { - ty.ch='t'; ty.dir = mglPoint(0,-1); ty.org = mglPoint(0,1,ay.org.z); + ty.ch='t'; ty.dir.Set(0,-1); ty.org.Set(0,1,ay.org.z); AdjustTicks(ty,fy!=0); pos = -pos; aa = &ty; if(ty.dv) t = (Min.y+Max.y+pos*(Max.y-Min.y))/2; else t = Min.y*pow(Max.y/Min.y, (pos+1)/2); - p = mglPoint(GetOrgX(ty.ch,ty.inv), t, GetOrgZ(ty.ch,ty.inv)); - q = mglPoint(0,1,0); shift += ty.sh; + p.Set(GetOrgX(ty.ch,ty.inv), t, GetOrgZ(ty.ch,ty.inv)); + q.Set(0,1,0); shift += ty.sh; } if(dir=='z') { AdjustTicks(az,fz!=0); aa = &az; if(az.dv) t = (Min.z+Max.z+pos*(Max.z-Min.z))/2; else t = Min.z*pow(Max.z/Min.z, (pos+1)/2); - p = mglPoint(GetOrgX(az.ch,az.inv), GetOrgY(az.ch,az.inv), t); - q = mglPoint(0,0,1); shift += az.sh; + p.Set(GetOrgX(az.ch,az.inv), GetOrgY(az.ch,az.inv), t); + q.Set(0,0,1); shift += az.sh; } if(aa) { @@ -879,19 +880,19 @@ void mglCanvas::Box(const char *col, bool ticks) DrawAxis(az, false, 0,col); mglAxis ty(ay); ty.ch='T'; - ty.dir = mglPoint(-1,1); ty.org = mglPoint(1,0,Max.z); + ty.dir.Set(-1,1); ty.org.Set(1,0,Max.z); DrawAxis(ty, false, 0,col); ty.ch='t'; - ty.dir = mglPoint(0,-1); ty.org = mglPoint(0,1,Max.z); + ty.dir.Set(0,-1); ty.org.Set(0,1,Max.z); DrawAxis(ty, false, 0,col); } else if(TernAxis&2) { mglAxis ty(az); - ty.ch='T'; ty.a=mglPoint(1,0); ty.b=mglPoint(-1,1); - ty.dir = mglPoint(-1,0,1); ty.org = mglPoint(1,0,0); + ty.ch='T'; ty.a.Set(1,0); ty.b.Set(-1,1); + ty.dir.Set(-1,0,1); ty.org.Set(1,0,0); DrawAxis(ty, false, 0,col); - ty.ch='t'; ty.a=mglPoint(0,1); ty.b=mglPoint(-1,1); - ty.dir = mglPoint(0,-1,1); ty.org = mglPoint(0,1,0); + ty.ch='t'; ty.a.Set(0,1); ty.b.Set(-1,1); + ty.dir.Set(0,-1,1); ty.org.Set(0,1,0); DrawAxis(ty, false, 0,col); } else @@ -904,7 +905,7 @@ void mglCanvas::Box(const char *col, bool ticks) if(mglchr(col,'@')) { // edge points - mglPoint p[8]={Min,Min,Min,Min,Max,Max,Max,Max},nan=mglPoint(NAN),oo[8]; + mglPoint p[8]={Min,Min,Min,Min,Max,Max,Max,Max},nan(NAN),oo[8]; p[1].x=Max.x; p[2].y=Max.y; p[3].z=Max.z; p[4].x=Min.x; p[5].y=Min.y; p[6].z=Min.z; mreal zm=INFINITY; int im=0; @@ -1091,7 +1092,10 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m SetPenPal(TickStl); for(size_t i=0;iCalc(0,0,0,ac.txt[i].val):ac.txt[i].val; + ac.txt[i].val = d = 2*(d-FMin.c)/(FMax.c-FMin.c)-1; + if(fabs(d)>1) continue; // this is factor +// mreal d = ac.txt[i].val = GetA(ac.txt[i].val)*2-1; p1 = p2 = mglPoint((ss*d+1)*w+x, (ss*d+1)*h+y, s3); switch(where) { @@ -1102,20 +1106,19 @@ void mglCanvas::colorbar(HCDT vv, const mreal *c, int where, mreal x, mreal y, m } line_plot(AddPnt(&M, p1), AddPnt(&M, p2)); } - ac.dir = mglPoint(ss*w,ss*h,0); - ac.org = mglPoint(w+x,h+y,s3+1); + ac.dir.Set(ss*w,ss*h,0); ac.a.Set(0,0,0); + ac.org.Set(w+x,h+y,s3+1); ac.b.Set(0,0,0); switch(where) { - case 1: ac.dir.x = 0; ac.org.x = x+0.1*w-(get(MGL_ENABLE_RTEXT)?0:0.06); break; - case 2: ac.dir.y = 0; ac.org.y = y-0.1*h; break; - case 3: ac.dir.y = 0; ac.org.y = y+0.1*h; break; - default:ac.dir.x = 0; ac.org.x = x-0.1*w; break; + case 1: ac.dir.x = 0; ac.a.x= 1; ac.org.x = x+0.1*w-(get(MGL_ENABLE_RTEXT)?0:0.06); break; + case 2: ac.dir.y = 0; ac.a.y=-1; ac.org.y = y-0.1*h; break; + case 3: ac.dir.y = 0; ac.a.y= 1; ac.org.y = y+0.1*h; break; + default:ac.dir.x = 0; ac.a.x=-1; ac.org.x = x-0.1*w; break; } SetPenPal(AxisStl); -// bool out = fabs(x)>1 && fabs(y)>1; bool inv = where!=3 && where!=0; - ac.ns = where; ac.angl=NAN; - if(text) DrawLabels(ac,inv,&M); // NOTE ns isn't used for colorbar + ac.ns = where; ac.angl=NAN; // NOTE ns isn't used for colorbar + if(text) DrawLabels(ac,inv,&M); clr(MGL_DISABLE_SCALE); EndGroup(); } //----------------------------------------------------------------------------- diff --git a/src/base.cpp b/src/base.cpp index d54571d..a502780 100644 --- a/src/base.cpp +++ b/src/base.cpp @@ -105,18 +105,16 @@ mglBase::mglBase() pthread_mutex_init(&mutexClf,0); Pnt.set_mutex(&mutexClf); Prm.set_mutex(&mutexClf); - Sub.set_mutex(&mutexClf); Txt.set_mutex(&mutexClf); #endif #if MGL_HAVE_OMP omp_init_lock(&lockClf); Pnt.set_mutex(&lockClf); Prm.set_mutex(&lockClf); - Sub.set_mutex(&lockClf); Txt.set_mutex(&lockClf); #endif fnt=0; *FontDef=0; fx=fy=fz=fa=fc=0; - AMin = mglPoint(0,0,0,0); AMax = mglPoint(1,1,1,1); + AMin.Set(0,0,0,0); AMax.Set(1,1,1,1); InUse = 1; SetQuality(); FaceNum = 0; // Always create default palette txt[0] and default scheme txt[1] @@ -126,14 +124,13 @@ mglBase::mglBase() MGL_PUSH(Txt,t2,mutexTxt); strcpy(last_style,"__1 {dFFFF}k\0"); - MinS=mglPoint(-1,-1,-1); MaxS=mglPoint(1,1,1); + MinS.Set(-1,-1,-1); MaxS.Set(1,1,1); fnt = new mglFont; fnt->gr = this; PrevState=NAN; } mglBase::~mglBase() { ClearEq(); ClearPrmInd(); delete fnt; - Pnt.set_mutex(0); Prm.set_mutex(0); - Sub.set_mutex(0); Txt.set_mutex(0); + Pnt.set_mutex(0); Prm.set_mutex(0); Txt.set_mutex(0); #if MGL_HAVE_OMP omp_destroy_lock(&lockClf); #endif @@ -193,7 +190,8 @@ const char *mglWarn[mglWarnEnd] = {"data dimension(s) is incompatible", //mglWar "There are wrong argument(s) in script",//mglScrArg "There are wrong command in script", //mglScrCmd "There are too long string in script", //mglScrLong - "There are unbalanced ' in script"}; //mglScrStr + "There are unbalanced ' in script", //mglScrStr + "There are changing temporary data in script"}; //mglScrTemp //----------------------------------------------------------------------------- extern bool mglPrintWarn; void mglBase::SetWarn(int code, const char *who) @@ -296,7 +294,7 @@ long mglBase::AddPnt(const mglMatrix *mat, mglPoint p, mreal c, mglPoint n, mrea if(!get(MGL_ENABLE_ALPHA)) { q.a=1; if(txt.Smooth!=2) q.ta=1-gap; } if(norefr) q.v=0; if(!get(MGL_ENABLE_LIGHT) && !(scl&4)) q.u=q.v=NAN; - if(mat->norot) q.sub=-1; // NOTE: temporary -- later should be mglInPlot here + q.sub=mat->norot?-Sub.size():Sub.size()-1; long k; #pragma omp critical(pnt) {k=Pnt.size(); MGL_PUSH(Pnt,q,mutexPnt);} return k; @@ -364,8 +362,8 @@ void mglBase::RecalcBorder() { FMin = Min; FMax = Max; } else { - FMin = mglPoint( INFINITY, INFINITY, INFINITY); - FMax = mglPoint(-INFINITY,-INFINITY,-INFINITY); + FMin.Set( INFINITY, INFINITY, INFINITY); + FMax.Set(-INFINITY,-INFINITY,-INFINITY); register int i,j; int n=30; for(i=0;i<=n;i++) for(j=0;j<=n;j++) // x range @@ -444,12 +442,12 @@ bool mglBase::ScalePoint(const mglMatrix *, mglPoint &p, mglPoint &n, bool use_n } else { - if(x1Max.x) {x=Max.x; n=mglPoint(1,0,0);} - if(y1Max.y) {y=Max.y; n=mglPoint(0,1,0);} - if(z1Max.z) {z=Max.z; n=mglPoint(0,0,1);} + if(x1Max.x) {x=Max.x; n.Set(1,0,0);} + if(y1Max.y) {y=Max.y; n.Set(0,1,0);} + if(z1Max.z) {z=Max.z; n.Set(0,0,1);} } x1=x; y1=y; z1=z; @@ -512,7 +510,7 @@ void mglScaleAxis(mreal &v1, mreal &v2, mreal &v0, mreal x1, mreal x2) //----------------------------------------------------------------------------- void mglBase::SetOrigin(mreal x0, mreal y0, mreal z0, mreal c0) { - Org=mglPoint(x0,y0,z0,c0); + Org.Set(x0,y0,z0,c0); if((TernAxis&3)==0) { Min = OMin; Max = OMax; @@ -547,7 +545,7 @@ void mglBase::SetRanges(mglPoint m1, mglPoint m2) mglScaleAxis(Min.c, Max.c, Org.c, AMin.c, AMax.c); } - CutMin = mglPoint(0,0,0); CutMax = mglPoint(0,0,0); + CutMin.Set(0,0,0); CutMax.Set(0,0,0); RecalcBorder(); } //----------------------------------------------------------------------------- @@ -709,7 +707,7 @@ void mglBase::Ternary(int t) { if(c) { x1 = Min; x2 = Max; o = Org; } SetRanges(mglPoint(0,0,0),mglPoint(1,1,(t&3)==1?0:1)); - Org=mglPoint(0,0,(t&3)==1?NAN:0); c = false; + Org.Set(0,0,(t&3)==1?NAN:0); c = false; } else if(!c) { SetRanges(x1,x2); Org=o; c=true; } } @@ -858,8 +856,8 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha) if(strchr(MGL_COLORS,s[i]) && j<1 && (m==0 || s[i-1]=='{')) // {CN,val} format, where val in [0,1] { 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 + { c[2*n].Set(s[i],(s[i+1]-'0')/5.f); i++; } + else c[2*n].Set(s[i]); // usual color 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] @@ -885,7 +883,7 @@ void mglTexture::Set(const char *s, int smooth, mreal alpha) c[2*i+1]=c[2*i]; if(man) c[2*i].a=0; } - if(map && sm) // map texture + if(map && sm && n>1) // map texture { if(n==2) { c[1]=c[2]; c[2]=c[0]; c[0]=BC; c[3]=c[1]+c[2]; } @@ -1008,7 +1006,7 @@ mreal mglBase::NextColor(long id, long sh) return cc; } //----------------------------------------------------------------------------- -MGL_EXPORT_PURE const char *mglchrs(const char *str, const char *chr) +MGL_EXPORT const char *mglchrs(const char *str, const char *chr) { if(!str || !str[0] || !chr || !chr[0]) return NULL; size_t l=strlen(chr); @@ -1020,7 +1018,7 @@ MGL_EXPORT_PURE const char *mglchrs(const char *str, const char *chr) return NULL; } //----------------------------------------------------------------------------- -MGL_EXPORT_PURE const char *mglchr(const char *str, char ch) +MGL_EXPORT const char *mglchr(const char *str, char ch) { if(!str || !str[0]) return NULL; size_t l=strlen(str),k=0; @@ -1209,8 +1207,10 @@ int MGL_LOCAL_PURE mglFindArg(const char *str) return 0; } //----------------------------------------------------------------------------- -void mglBase::SetAmbient(mreal bright) { AmbBr = bright; } -void mglBase::SetDiffuse(mreal bright) { DifBr = bright; } +void mglBase::SetAmbient(mreal bright) +{ AmbBr=bright; size_t n=Sub.size(); if(n>0) Sub[n-1].AmbBr=bright; } +void mglBase::SetDiffuse(mreal bright) +{ DifBr=bright; size_t n=Sub.size(); if(n>0) Sub[n-1].DifBr=bright; } //----------------------------------------------------------------------------- mreal mglBase::SaveState(const char *opt) { @@ -1363,10 +1363,10 @@ bool MGL_EXPORT mgl_check_dim3(HMGL gr, bool both, HCDT x, HCDT y, HCDT z, HCDT bool MGL_EXPORT mgl_check_trig(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, int d) { // if(!gr || !x || !y || !z || !a || !nums) return true; // if data is absent then should be segfault!!! - long n = x->GetNx(), m = nums->GetNy(); + long n = x->GetNN(), m = nums->GetNy(); if(nums->GetNx()SetWarn(mglWarnLow,name); return true; } - if(y->GetNx()!=n || z->GetNx()!=n) { gr->SetWarn(mglWarnDim,name); return true; } - if(a->GetNx()!=m && a->GetNx()!=n) { gr->SetWarn(mglWarnDim,name); return true; } + if(y->GetNN()!=n || z->GetNN()!=n) { gr->SetWarn(mglWarnDim,name); return true; } + if(a->GetNN()!=m && a->GetNN()!=n) { gr->SetWarn(mglWarnDim,name); return true; } return false; } //----------------------------------------------------------------------------- diff --git a/src/base_cf.cpp b/src/base_cf.cpp index 98702b9..a8ec273 100644 --- a/src/base_cf.cpp +++ b/src/base_cf.cpp @@ -30,15 +30,15 @@ void MGL_EXPORT mgl_suppress_warn(int on) { mglPrintWarn = !on; } void MGL_EXPORT mgl_suppress_warn_(int *on) { mgl_suppress_warn(*on); } void MGL_EXPORT mgl_set_quality(HMGL gr, int qual) { gr->SetQuality(qual); } void MGL_EXPORT mgl_set_quality_(uintptr_t *gr, int *qual) { _GR_->SetQuality(*qual); } -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) +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) { 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_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); } +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); } 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); } //----------------------------------------------------------------------------- @@ -58,7 +58,7 @@ 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_PURE const char *mgl_get_plotid(HMGL gr) { return gr->PlotId.c_str(); } +MGL_EXPORT 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_); @@ -66,14 +66,14 @@ int MGL_EXPORT mgl_get_plotid_(uintptr_t *gr, char *out, int len) return strlen(res); } //----------------------------------------------------------------------------- -MGL_EXPORT_PURE const char *mgl_get_mess(HMGL gr) { return gr->Mess.c_str(); } +MGL_EXPORT 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(); } +int MGL_EXPORT 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); } extern bool mglPrintWarn; @@ -87,7 +87,7 @@ void MGL_EXPORT mgl_set_global_warn(const char *txt) } void MGL_EXPORT mgl_set_global_warn_(const char *txt, int l) { char *s=new char[l+1]; memcpy(s,txt,l); s[l]=0; mgl_set_global_warn(s); delete []s; } -MGL_EXPORT_PURE const char *mgl_get_global_warn() { return mglGlobalMess.c_str(); } +MGL_EXPORT const char *mgl_get_global_warn() { return mglGlobalMess.c_str(); } int MGL_EXPORT mgl_get_global_warn_(char *out, int len) { const char *res = mgl_get_global_warn(); @@ -153,7 +153,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_PURE mgl_get_warn_(uintptr_t *gr) { return _GR_->GetWarn(); } +int MGL_EXPORT 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; } diff --git a/src/canvas.cpp b/src/canvas.cpp index 9d4099f..c016c2d 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -34,9 +34,9 @@ mglCanvas::mglCanvas(int w, int h) : mglBase() 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'; - ay.dir = mglPoint(0,1,0); ay.a = mglPoint(1,0,0); ay.b = mglPoint(0,0,1); ay.ch='y'; - az.dir = mglPoint(0,0,1); az.a = mglPoint(0,1,0); az.b = mglPoint(1,0,0); az.ch='z'; + ax.dir.Set(1,0,0); ax.a.Set(0,1,0); ax.b.Set(0,0,1); ax.ch='x'; + ay.dir.Set(0,1,0); ay.a.Set(1,0,0); ay.b.Set(0,0,1); ay.ch='y'; + az.dir.Set(0,0,1); az.a.Set(0,1,0); az.b.Set(1,0,0); az.ch='z'; SetSize(w,h); SetQuality(MGL_DRAW_NORM); DefaultPlotParam(); } @@ -50,7 +50,7 @@ mglCanvas::~mglCanvas() long mglCanvas::PushDrwDat() { mglDrawDat d; - d.Pnt=Pnt; d.Prm=Prm; d.Glf=Glf; d.Ptx=Ptx; d.Txt=Txt; + d.Pnt=Pnt; d.Prm=Prm; d.Sub=Sub; d.Glf=Glf; d.Ptx=Ptx; d.Txt=Txt; #pragma omp critical(drw) MGL_PUSH(DrwDat,d,mutexDrw); return DrwDat.size(); @@ -64,10 +64,9 @@ void mglCanvas::SetFrame(long i) { Finish(); CurFrameId--; mglDrawDat d; - d.Pnt=Pnt; d.Prm=Prm; d.Glf=Glf; d.Ptx=Ptx; d.Txt=Txt; + d.Pnt=Pnt; d.Prm=Prm; d.Sub=Sub; d.Glf=Glf; d.Ptx=Ptx; d.Txt=Txt; #if MGL_HAVE_PTHREAD pthread_mutex_lock(&mutexDrw); -#pragma omp critical(drw) DrwDat[i] = d; pthread_mutex_unlock(&mutexDrw); #else @@ -85,16 +84,18 @@ void mglCanvas::GetFrame(long k) #if MGL_HAVE_PTHREAD pthread_mutex_lock(&mutexPnt); pthread_mutex_lock(&mutexPrm); + pthread_mutex_lock(&mutexSub); pthread_mutex_lock(&mutexGlf); pthread_mutex_lock(&mutexPtx); pthread_mutex_lock(&mutexTxt); #endif #pragma omp critical - { Pnt=d.Pnt; Prm=d.Prm; Glf=d.Glf; Ptx=d.Ptx; Txt=d.Txt; ClearPrmInd(); } + { Pnt=d.Pnt; Prm=d.Prm; Sub=d.Sub; Glf=d.Glf; Ptx=d.Ptx; Txt=d.Txt; ClearPrmInd(); } #if MGL_HAVE_PTHREAD pthread_mutex_unlock(&mutexTxt); pthread_mutex_unlock(&mutexPtx); pthread_mutex_unlock(&mutexGlf); + pthread_mutex_unlock(&mutexSub); pthread_mutex_unlock(&mutexPrm); pthread_mutex_unlock(&mutexPnt); #endif @@ -117,9 +118,10 @@ void mglCanvas::ClearFrame() #pragma omp critical { StartAutoGroup(NULL); - Sub.clear(); Leg.clear(); Grp.clear(); Act.clear(); - Pnt.clear(); Prm.clear(); Ptx.clear(); Glf.clear(); ClearPrmInd(); + Leg.clear(); Grp.clear(); Act.clear(); Glf.clear(); + Pnt.clear(); Prm.clear(); Ptx.clear(); ClearPrmInd(); Txt.clear(); Txt.reserve(3); +// mglBlock inpl = Sub[0]; Sub.clear(); Sub.push_back(inpl); // NOTE at least one inplot should present!!! mglTexture t1(MGL_DEF_PAL,-1), t2(MGL_DEF_SCH,1); Txt.push_back(t1); Txt.push_back(t2); // No extra lock is required } @@ -141,10 +143,11 @@ void mglCanvas::ShowFrame(long k) { if(k<0 || (size_t)k>=DrwDat.size()) return; ClfZB(); - size_t npnt=Pnt.size(), nglf=Glf.size(), nptx=Ptx.size(), ntxt=Txt.size(); + size_t npnt=Pnt.size(), nglf=Glf.size(), nptx=Ptx.size(), ntxt=Txt.size(), nsub=Sub.size(); #if MGL_HAVE_PTHREAD pthread_mutex_lock(&mutexPnt); pthread_mutex_lock(&mutexPrm); + pthread_mutex_lock(&mutexSub); pthread_mutex_lock(&mutexGlf); pthread_mutex_lock(&mutexPtx); pthread_mutex_lock(&mutexTxt); @@ -152,13 +155,16 @@ void mglCanvas::ShowFrame(long k) #pragma omp critical { const mglDrawDat &d=DrwDat[k]; - Glf.reserve(d.Glf.size()); for(size_t i=0;i=0) p.sub += nsub; + else p.sub -= nsub; Pnt.push_back(p); } Prm.reserve(d.Prm.size()); @@ -182,6 +188,7 @@ void mglCanvas::ShowFrame(long k) #if MGL_HAVE_PTHREAD pthread_mutex_unlock(&mutexPnt); pthread_mutex_unlock(&mutexPrm); + pthread_mutex_unlock(&mutexSub); pthread_mutex_unlock(&mutexGlf); pthread_mutex_unlock(&mutexPtx); pthread_mutex_unlock(&mutexTxt); @@ -239,7 +246,8 @@ GifFileType *gif;*/ SetDefScheme(MGL_DEF_SCH); SetPalette(MGL_DEF_PAL); SetPenPal("k-1"); Alpha(false); stack.clear(); Restore(); DefColor('k'); - SetPlotFactor(0); InPlot(0,1,0,1,false); + SetPlotFactor(0); Sub.clear(); + InPlot(0,1,0,1,false); SetTickLen(0); SetCut(true); AdjustTicks("xyzc",true); Clf('w'); @@ -454,9 +462,12 @@ pthread_mutex_lock(&mutexPtx); { Bt = B; Bt.norot=(q.sub<0); // NOTE check this later for mglInPlot inv = inv ^ (strchr(font,'T')!=0); - if(inv) shift = 0.2*h-shift; - shift += 0.015*h; // Correction for glyph rotation around proper point - // shift *= h; + if(strchr(font,'V')) shift = 0.1*h; + else + { + if(inv) shift = 0.2*h-shift; + shift += 0.015*h; // Correction for glyph rotation around proper point + } int align; mreal col1=col, col2=col; @@ -503,19 +514,19 @@ pthread_mutex_lock(&mutexPtx); long k1,k2,k3,k4; mglPnt pt; mglPoint pp; w = fnt->Width(text,font); h = fnt->Height(font); mreal d=-w*align/2.-h*0.2; w+=h*0.4; - pt = q; pp = mglPoint(d,-h*0.4); PostScale(&Bt,pp); + pt = q; pp.Set(d,-h*0.4); PostScale(&Bt,pp); pt.x=pt.xx=pp.x; pt.y=pt.yy=pp.y; #pragma omp critical(pnt) {k1=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);} - pt = q; pp = mglPoint(w+d,-h*0.4); PostScale(&Bt,pp); + pt = q; pp.Set(w+d,-h*0.4); PostScale(&Bt,pp); pt.x=pt.xx=pp.x; pt.y=pt.yy=pp.y; #pragma omp critical(pnt) {k2=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);} - pt = q; pp = mglPoint(d,h*1.2); PostScale(&Bt,pp); + pt = q; pp.Set(d,h*1.2); PostScale(&Bt,pp); pt.x=pt.xx=pp.x; pt.y=pt.yy=pp.y; #pragma omp critical(pnt) {k3=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);} - pt = q; pp = mglPoint(w+d,h*1.2); PostScale(&Bt,pp); + pt = q; pp.Set(w+d,h*1.2); PostScale(&Bt,pp); pt.x=pt.xx=pp.x; pt.y=pt.yy=pp.y; #pragma omp critical(pnt) {k4=Pnt.size(); MGL_PUSH(Pnt,pt,mutexPnt);} @@ -565,10 +576,6 @@ void mglCanvas::InPlot(mreal x1,mreal x2,mreal y1,mreal y2, const char *st) if(!st) { InPlot(x1,x2,y1,y2,false); return; } inW = Width*(x2-x1); inH = Height*(y2-y1); inX=Width*x1; inY=Height*y1; ZMin=1; - mglPrim p; p.id = ObjId; - p.n1=x1*Width; p.n2=x2*Width; p.n3=y1*Height; p.n4=y2*Height; -#pragma omp critical(sub) - MGL_PUSH(Sub,p,mutexSub); if(strchr(st,'T')) { y1*=0.9; y2*=0.9; } // general title bool r = !(strchr(st,'r') || strchr(st,'R') || strchr(st,'>') || strchr(st,'g')); @@ -593,6 +600,12 @@ void mglCanvas::InPlot(mreal x1,mreal x2,mreal y1,mreal y2, const char *st) B.b[8] = sqrt(B.b[0]*B.b[4]); B.z = (1.f-B.b[8]/(2*Depth))*Depth; B1=B; font_factor = B.b[0] < B.b[4] ? B.b[0] : B.b[4]; + + mglBlock p; p.AmbBr = AmbBr; p.DifBr = DifBr; p.B = B; + for(int i=0;i<10;i++) p.light[i] = light[i]; + p.id = ObjId; p.n1=x1*Width; p.n2=x2*Width; p.n3=y1*Height; p.n4=y2*Height; +#pragma omp critical(sub) + MGL_PUSH(Sub,p,mutexSub); } //----------------------------------------------------------------------------- void mglCanvas::InPlot(mglMatrix &M,mreal x1,mreal x2,mreal y1,mreal y2, bool rel) @@ -615,13 +628,15 @@ void mglCanvas::InPlot(mglMatrix &M,mreal x1,mreal x2,mreal y1,mreal y2, bool re M.b[0] = Width*(x2-x1); M.b[4] = Height*(y2-y1); M.b[8] = sqrt(M.b[0]*M.b[4]); M.z = (1.f-M.b[8]/(2*Depth))*Depth; - B1=B; + B1=M; } inW=M.b[0]; inH=M.b[4]; ZMin=1; inX=Width*x1; inY=Height*y1; font_factor = M.b[0] < M.b[4] ? M.b[0] : M.b[4]; - mglPrim p; p.id = ObjId; - p.n1=x1*Width; p.n2=x2*Width; p.n3=y1*Height; p.n4=y2*Height; + + mglBlock p; p.AmbBr = AmbBr; p.DifBr = DifBr; p.B = M; + for(int i=0;i<10;i++) p.light[i] = light[i]; + p.id = ObjId; p.n1=x1*Width; p.n2=x2*Width; p.n3=y1*Height; p.n4=y2*Height; #pragma omp critical(sub) MGL_PUSH(Sub,p,mutexSub); } @@ -656,6 +671,7 @@ void mglCanvas::Rotate(mreal tetz,mreal tetx,mreal tety) mreal h=(fabs(B.b[0])+fabs(B.b[1])+fabs(B.b[2]))/B1.b[0]; B.pf = 1.55+0.6147*(w0) Sub[n-1].B = B; } //----------------------------------------------------------------------------- void mglMatrix::Rotate(mreal tetz,mreal tetx,mreal tety) @@ -689,6 +705,7 @@ void mglCanvas::RotateN(mreal Tet,mreal x,mreal y,mreal z) mreal h=(fabs(B.b[0])+fabs(B.b[1])+fabs(B.b[2]))/B1.b[0]; B.pf = 1.55+0.6147*(w0) Sub[n-1].B = B; } //----------------------------------------------------------------------------- void mglMatrix::RotateN(mreal Tet,mreal x,mreal y,mreal z) @@ -724,10 +741,10 @@ void mglCanvas::Zoom(mreal x1, mreal y1, mreal x2, mreal y2) //----------------------------------------------------------------------------- int mglCanvas::GetSplId(long x,long y) const { - register long i,id=-1; - for(i=Sub.size()-1;i>=0;i--) + long id=-1; + for(long i=Sub.size()-1;i>=0;i--) { - const mglPrim &p = Sub[i]; + const mglBlock &p = Sub[i]; if(p.n1<=x && p.n2>=x && p.n3<=y && p.n4>=y) { id=p.id; break; } } @@ -752,9 +769,10 @@ void mglCanvas::Aspect(mreal Ax,mreal Ay,mreal Az) a = a > fabs(Az) ? a : fabs(Az); if(a==0) { SetWarn(mglWarnZero,"Aspect"); return; } Ax/=a; Ay/=a; Az/=a; - B.b[0] *= Ax; B.b[3] *= Ax; B.b[6] *= Ax; - B.b[1] *= Ay; B.b[4] *= Ay; B.b[7] *= Ay; - B.b[2] *= Az; B.b[5] *= Az; B.b[8] *= Az; + B.b[0] *= Ax; B.b[3] *= Ax; B.b[6] *= Ax; + B.b[1] *= Ay; B.b[4] *= Ay; B.b[7] *= Ay; + B.b[2] *= Az; B.b[5] *= Az; B.b[8] *= Az; + size_t n = Sub.size(); if(n>0) Sub[n-1].B = B; } //----------------------------------------------------------------------------- // Lighting and transparency @@ -765,6 +783,7 @@ void mglCanvas::Light(int n, bool enable) { if(n<0 || n>9) { SetWarn(mglWarnLId,"Light"); return; } light[n].n = enable; + size_t m=Sub.size(); if(m>0) Sub[m-1].light[n].n = enable; } //----------------------------------------------------------------------------- void mglCanvas::AddLight(int n, mglPoint r, mglPoint d, char col, mreal br, mreal ap) @@ -772,7 +791,8 @@ void mglCanvas::AddLight(int n, mglPoint r, mglPoint d, char col, mreal br, mrea if(n<0 || n>9) { SetWarn(mglWarnLId,"AddLight"); return; } light[n].n = true; light[n].a = ap>0?ap*ap:3; light[n].b = br; light[n].r = r; - light[n].d = d; light[n].c = mglColor(col); + light[n].d = d; light[n].c.Set(col); + size_t m=Sub.size(); if(m>0) Sub[m-1].light[n] = light[n]; } //----------------------------------------------------------------------------- void mglCanvas::arrow_plot(long n1, long n2, char st) @@ -839,12 +859,12 @@ std::wstring MGL_EXPORT mgl_ftoa(double v, const char *fmt) 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')) + else if(wcschr(L"+-\u2212",res[0]) && res[1]=='1' && (res[2]=='e' || res[2]=='E')) { res.replace(1,2,L"10^{"); res += L'}'; } else { @@ -875,6 +895,8 @@ void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const 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 if(mglchr(font,'A')) + { 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; } // find sizes mreal h=TextHeight(font,size); @@ -907,7 +929,7 @@ 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 - mglPoint p,q=mglPoint(NAN,NAN,NAN); + mglPoint p,q(NAN,NAN,NAN); mreal cc = AddTexture(font); mreal c1,c2; //=AddTexture(char(k1?k1:'w')), c2=AddTexture(char(k2?k2:'k')); @@ -925,10 +947,10 @@ void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const if(strchr(font,'#')) // draw bounding box { SetPenPal("k-"); - 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); + long k1=AddPnt(&M,mglPoint(x,y,Depth/1.01),c1,q,1,0); + long k2=AddPnt(&M,mglPoint(x+w*ncol,y,Depth/1.01),c1,q,1,0); + long k3=AddPnt(&M,mglPoint(x,y+h*nrow,Depth/1.01),c1,q,1,0); + long k4=AddPnt(&M,mglPoint(x+w*ncol,y+h*nrow,Depth/1.01),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); @@ -944,10 +966,10 @@ void mglCanvas::Legend(const std::vector &leg, mreal x, mreal y, const if(!leg[i].stl.empty()) line_plot(k1,k2); if(m) for(j=0;j(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_PURE mgl_get_obj_id(HMGL gr, int x, int y) +int MGL_EXPORT 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_PURE mgl_get_spl_id(HMGL gr, int x, int y) +int MGL_EXPORT 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_PURE mgl_is_active(HMGL gr, int xs, int ys, int d) +long MGL_EXPORT mgl_is_active(HMGL gr, int xs, int ys, int d) { if(d<=0) d=1; for(size_t i=0;iAct.size();i++) @@ -58,14 +58,14 @@ long MGL_EXPORT_PURE mgl_is_active(HMGL gr, int xs, int ys, int d) } return -1; } -long MGL_EXPORT_PURE mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d) +long MGL_EXPORT 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_PURE mgl_get_num_frame(HMGL gr) +int MGL_EXPORT 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(); } @@ -82,12 +82,11 @@ void MGL_EXPORT mgl_clear_frame(HMGL gr) //----------------------------------------------------------------------------- void MGL_EXPORT mgl_set_transp_type(HMGL gr, int type) { mglCanvas *g = dynamic_cast(gr); if(g) g->SetTranspType(type); } -void MGL_EXPORT mgl_set_alpha(HMGL gr, int enable) -{ mglCanvas *g = dynamic_cast(gr); if(g) g->Alpha(enable); } +void MGL_EXPORT mgl_set_alpha(HMGL gr, int enable) { gr->Alpha(enable); } void MGL_EXPORT mgl_set_fog(HMGL gr, double d, double dz) -{ mglCanvas *g = dynamic_cast(gr); if(g) g->Fog(d,dz); } -void MGL_EXPORT mgl_set_light(HMGL gr, int enable) -{ mglCanvas *g = dynamic_cast(gr); if(g) g->Light(enable); } +{ mglCanvas *g = dynamic_cast(gr); if(g) g->Fog(d,dz); } +void MGL_EXPORT mgl_set_light(HMGL gr, int enable) { gr->Light(enable); } +void MGL_EXPORT mgl_set_attach_light(HMGL gr, int enable) { gr->AttachLight(enable); } void MGL_EXPORT mgl_set_light_n(HMGL gr, int n, int enable) { mglCanvas *g = dynamic_cast(gr); if(g) g->Light(n, enable); } void MGL_EXPORT mgl_add_light_ext(HMGL gr, int n, double x, double y, double z, char c, double br, double ap) @@ -182,7 +181,7 @@ void MGL_EXPORT mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, doubl //----------------------------------------------------------------------------- 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(); } +int MGL_EXPORT 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); } @@ -194,6 +193,7 @@ void MGL_EXPORT mgl_set_transp_type_(uintptr_t *gr, int *type) { _GR_->SetTrans void MGL_EXPORT mgl_set_alpha_(uintptr_t *gr, int *enable) { _GR_->Alpha(*enable); } void MGL_EXPORT mgl_set_fog_(uintptr_t *gr, mreal *d, mreal *dz) { _GR_->Fog(*d, *dz); } void MGL_EXPORT mgl_set_light_(uintptr_t *gr, int *enable) { _GR_->Light(*enable); } +void MGL_EXPORT mgl_set_attach_light_(uintptr_t *gr, int *enable) { _GR_->AttachLight(*enable); } void MGL_EXPORT mgl_set_light_n_(uintptr_t *gr, int *n, int *enable) { _GR_->Light(*n, *enable); } void MGL_EXPORT mgl_add_light_(uintptr_t *gr, int *n, mreal *x, mreal *y, mreal *z) @@ -266,14 +266,20 @@ 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_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); } +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); } //----------------------------------------------------------------------------- +double mgl_size_scl = 1; HMGL MGL_EXPORT mgl_create_graph(int width, int height) { return new mglCanvas(width,height); } void MGL_EXPORT mgl_delete_graph(HMGL gr) { if(gr) delete gr; } +void MGL_EXPORT mgl_set_size_scl(double scl){ if(scl>0) mgl_size_scl = scl; } void MGL_EXPORT mgl_set_size(HMGL gr, int width, int height) -{ mglCanvas *g = dynamic_cast(gr); if(g) g->SetSize(width, height); } +{ + mglCanvas *g = dynamic_cast(gr); + width = int(mgl_size_scl*width); height = int(mgl_size_scl*height); + if(g) g->SetSize(width, height); +} void MGL_EXPORT mgl_set_def_param(HMGL gr) { mglCanvas *g = dynamic_cast(gr); if(g) g->DefaultPlotParam(); } void MGL_EXPORT mgl_combine_gr(HMGL gr, HMGL in) @@ -353,8 +359,9 @@ void MGL_EXPORT mgl_set_legend_marks(HMGL gr, int num) uintptr_t MGL_EXPORT mgl_create_graph_(int *width, int *height) { return uintptr_t(new mglCanvas(*width,*height)); } void MGL_EXPORT mgl_delete_graph_(uintptr_t *gr) { delete _GR_; } +void MGL_EXPORT mgl_set_size_scl_(double *scl) { mgl_set_size_scl(*scl); } void MGL_EXPORT mgl_set_size_(uintptr_t *gr, int *width, int *height) -{ _GR_->SetSize(*width,*height); } +{ mgl_set_size(_GR_,*width,*height); } 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); } @@ -446,10 +453,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_PURE mgl_wnd_get_delay(HMGL gr) +double MGL_EXPORT 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_PURE mgl_wnd_get_delay_(uintptr_t *gr) { return _GR_->GetDelay(); } +double MGL_EXPORT 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); } diff --git a/src/complex.cpp b/src/complex.cpp index 3457c7d..7967e67 100644 --- a/src/complex.cpp +++ b/src/complex.cpp @@ -88,7 +88,7 @@ void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, dual *a, const vo mdual MGL_EXPORT_CONST mgl_expi(dual a) { dual r = exp(dual(0,1)*dual(a)); - return r.real()+r.imag()*_Complex_I; + return r.real()+r.imag()*mgl_I; } //----------------------------------------------------------------------------- MGL_NO_EXPORT void *mgl_csmth_x(void *par) @@ -560,7 +560,7 @@ void MGL_EXPORT mgl_datac_roll(HADT dd, char dir, long num) dual *b,*a=dd->a; if(dir=='z' && nz>1) { - d = num>0 ? num%nz : (num+nz*(1+num/nz))%nz; + d = num>0 ? num%nz : (num+nz*(1-num/nz))%nz; if(d==0) return; // nothing to do b = new dual[nx*ny*nz]; memcpy(b,a+nx*ny*d,nx*ny*(nz-d)*sizeof(dual)); @@ -569,7 +569,7 @@ void MGL_EXPORT mgl_datac_roll(HADT dd, char dir, long num) } if(dir=='y' && ny>1) { - d = num>0 ? num%ny : (num+ny*(1+num/ny))%ny; + d = num>0 ? num%ny : (num+ny*(1-num/ny))%ny; if(d==0) return; // nothing to do b = new dual[nx*ny*nz]; memcpy(b,a+nx*d,(nx*ny*nz-nx*d)*sizeof(dual)); @@ -580,7 +580,7 @@ void MGL_EXPORT mgl_datac_roll(HADT dd, char dir, long num) } if(dir=='x' && nx>1) { - d = num>0 ? num%nx : (num+nx*(1+num/nx))%nx; + d = num>0 ? num%nx : (num+nx*(1-num/nx))%nx; if(d==0) return; // nothing to do b = new dual[nx*ny*nz]; memcpy(b,a+d,(nx*ny*nz-d)*sizeof(dual)); @@ -630,23 +630,23 @@ 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 MGL_EXPORT_PURE mglSpline3Cs(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) +dual MGL_EXPORT 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) +dual MGL_EXPORT 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 MGL_EXPORT_PURE mglLinearC(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) +dual MGL_EXPORT 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); } //----------------------------------------------------------------------------- -mdual MGL_EXPORT_PURE mgl_datac_spline(HCDT d, mreal x,mreal y,mreal z) +mdual MGL_EXPORT mgl_datac_spline(HCDT d, mreal x,mreal y,mreal z) { const mglDataC *dd=dynamic_cast(d); 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; + return r.real()+r.imag()*mgl_I; } //----------------------------------------------------------------------------- -mdual MGL_EXPORT_PURE mgl_datac_spline_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz) +mdual MGL_EXPORT 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) @@ -657,15 +657,15 @@ mdual MGL_EXPORT_PURE mgl_datac_spline_ext(HCDT d, mreal x,mreal y,mreal z, dual return res; } dual r = mglSpline3t(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz); - return r.real()+r.imag()*_Complex_I; + return r.real()+r.imag()*mgl_I; } //----------------------------------------------------------------------------- -mdual MGL_EXPORT_PURE mgl_datac_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +mdual MGL_EXPORT mgl_datac_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) { return mgl_datac_spline(_DA_(d),*x,*y,*z); } -mdual MGL_EXPORT_PURE mgl_datac_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz) +mdual MGL_EXPORT 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); } //----------------------------------------------------------------------------- -mdual MGL_EXPORT_PURE mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual *dx,dual *dy,dual *dz) +mdual MGL_EXPORT 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; @@ -708,14 +708,14 @@ mdual MGL_EXPORT_PURE mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, dual if(dy) *dy = ky>=0?aa[dn]-aa[0]:0; if(dz) *dz = b1-b0; dual r = b0 + z*(b1-b0); - return r.real()+r.imag()*_Complex_I; + return r.real()+r.imag()*mgl_I; } -mdual MGL_EXPORT_PURE mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z) +mdual MGL_EXPORT mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z) { return mgl_datac_linear_ext(d, x,y,z, 0,0,0); } //----------------------------------------------------------------------------- -mdual MGL_EXPORT_PURE mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +mdual MGL_EXPORT mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) { return mgl_datac_linear(_DA_(d),*x,*y,*z); } -mdual MGL_EXPORT_PURE mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, dual *dx,dual *dy,dual *dz) +mdual MGL_EXPORT 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) @@ -726,6 +726,7 @@ void MGL_EXPORT mgl_datac_crop(HADT d, long n1, long n2, char dir) switch(dir) { case 'x': + if(n1>=nx) break; n2 = n2>0 ? n2 : nx+n2; if(n2<0 || n2>=nx || n2a = b; d->link=false; d->NewId(); break; case 'y': + if(n1>=ny) break; n2 = n2>0 ? n2 : ny+n2; if(n2<0 || n2>=ny || n2a = b; d->link=false; break; case 'z': + if(n1>=nz) break; n2 = n2>0 ? n2 : nz+n2; if(n2<0 || n2>=nz || n2(dat); dual r = d ? d->a[i0] : dual(dat->vthr(i0),0); - return r.real()+r.imag()*_Complex_I; + return r.real()+r.imag()*mgl_I; } 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_PURE dual *mgl_datac_data(HADT dat) { return dat->a; } +MGL_EXPORT 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); @@ -874,47 +877,27 @@ MGL_EXPORT dual *mgl_datac_value(HADT dat, long i,long j,long k) //----------------------------------------------------------------------------- void MGL_EXPORT mgl_datac_join(HADT d, HCDT v) { - register long nx=d->nx, ny=d->ny, nz=d->nz; + long nx=d->nx, ny=d->ny, nz=d->nz, k=nx*ny*nz; const mglDataC *mv = dynamic_cast(v); - long vx=v->GetNx(), vy=v->GetNy(), vz=v->GetNz(), k=nx*ny*nz; + long vx=v->GetNx(), vy=v->GetNy(), vz=v->GetNz(), m = vx*vy*vz; - if(nx==vx && ny==vy && (nz>1 || vz>1)) - { - dual *b = new dual[nx*ny*(nz+vz)]; - memcpy(b,d->a,nx*ny*nz*sizeof(dual)); - if(mv) memcpy(b+nx*ny*nz,mv->a,nx*ny*vz*sizeof(dual)); - else -#pragma omp parallel for - for(long i=0;ivthr(i); - if(!d->link) delete []d->a; d->nz += vz; - d->a = b; d->link=false; d->NewId(); - } - else if(nx==vx && (ny>1 || vy>1)) + if(nx==vx && ny==vy && (nz>1 || vz>1)) d->nz += vz; + else { ny *= nz; vy *= vz; - dual *b = new dual[nx*(ny+vy)]; - memcpy(b,d->a,nx*ny*sizeof(dual)); - if(mv) memcpy(b+nx*ny,mv->a,nx*vy*sizeof(dual)); + if(nx==vx && (ny>1 || vy>1)) + { d->nz = 1; d->ny = ny+vy; } else -#pragma omp parallel for - for(long i=0;ivthr(i); - if(!d->link) delete []d->a; - d->nz = 1; d->ny = ny+vy; - d->a = b; d->link=false; d->NewId(); + { d->ny = d->nz = 1; d->nx = k+m; } } + dual *b = new dual[k+m]; + memcpy(b,d->a,k*sizeof(dual)); + if(mv) memcpy(b+k,mv->a,m*sizeof(dual)); else - { - nx *= ny*nz; vx *= vy*vz; - dual *b = new dual[nx+vx]; - memcpy(b,d->a,nx*sizeof(dual)); - if(mv) memcpy(b+nx,mv->a,vx*sizeof(dual)); - else #pragma omp parallel for - for(long i=0;ivthr(i); - if(!d->link) delete []d->a; - d->nz = d->ny = 1; d->nx = nx+vx; - d->a = b; d->link=false; d->NewId(); - } + for(long i=0;ivthr(i); + if(!d->link) delete []d->a; + d->a = b; d->link=false; d->NewId(); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_datac_join_(uintptr_t *d, uintptr_t *val) @@ -1171,8 +1154,163 @@ mdual MGL_EXPORT mgl_gsplinec(HCDT c, mreal dx, dual *d1, dual *d2) 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; + return res.real()+res.imag()*mgl_I; } mdual MGL_EXPORT mgl_gsplinec_(uintptr_t *c, mreal *dx, dual *d1, dual *d2) { return mgl_gsplinec(_DA_(c),*dx,d1,d2); } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_refill_gs(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl) +{ + HADT coef = mgl_gsplinec_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_datac(coef); +} +//----------------------------------------------------------------------------- +mreal MGL_NO_EXPORT mgl_index_1(mreal v, HCDT dat); +void MGL_EXPORT mgl_datac_refill_x(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl) +{ + long nx=dat->nx,mx=vdat->GetNx(),nn=dat->ny*dat->nz; + if(mx!=xdat->GetNx()) return; // incompatible dimensions + mreal 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; + } +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_refill_xy(HADT 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; + bool both=(xdat->GetNN()==vdat->GetNN() && ydat->GetNN()==vdat->GetNN()); + if(!both && (xdat->GetNx()!=mx || ydat->GetNx()!=my)) return; // incompatible dimensions + mreal dx = (x2-x1)/(nx-1), dy = (y2-y1)/(ny-1); + if(both) + { +#pragma omp parallel for + for(long i=0;ia[i]=NAN; +#pragma omp parallel for collapse(2) + for(long j=0;jvthr(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;ia[i0+k*nn] = d; + else dat->a[i0+sl*nn] = d; + } + } +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_refill_xyz(HADT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, mreal z1, mreal z2) +{ + long nx=dat->nx,ny=dat->ny,nz=dat->nz,mx=vdat->GetNx(),my=vdat->GetNy(),mz=vdat->GetNz(); + 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 + 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;k50) { dx=NAN; break; } count++; + dd = -dxx*dyy*dzz+dxy*dyx*dzz+dxx*dyz*dzy-dxz*dyx*dzy-dxy*dyz*dzx+dxz*dyy*dzx; + dx += ((dyz*dzy-dyy*dzz)*(xx-vx)+(dxy*dzz-dxz*dzy)*(yy-vy)+(dxz*dyy-dxy*dyz)*(zz-vz))/dd; + dy += ((dyx*dzz-dyz*dzx)*(xx-vx)+(dxz*dzx-dxx*dzz)*(yy-vy)+(dxx*dyz-dxz*dyx)*(zz-vz))/dd; + dz += ((dyy*dzx-dyx*dzy)*(xx-vx)+(dxx*dzy-dxy*dzx)*(yy-vy)+(dxy*dyx-dxx*dyy)*(zz-vz))/dd; + vx = mgl_data_spline_ext(xdat,dx,dy,dz,&dxx,&dxy,&dxz); + vy = mgl_data_spline_ext(ydat,dx,dy,dz,&dyx,&dyy,&dyz); + vz = mgl_data_spline_ext(zdat,dx,dy,dz,&dzx,&dzy,&dzz); + } while(fabs(xx-vx)>acx && fabs(yy-vy)>acy && fabs(zz-vz)>acz); // this valid for linear interpolation + dat->a[i+nx*(j+ny*k)] = mgl_isnan(dx)?NAN:mgl_data_spline(vdat,dx,dy,dz); + } + else + { + mglData u(nx), v(ny), w(nz); + mreal dx = (x2-x1)/(nx-1), dy = (y2-y1)/(ny-1), dz = (z2-z1)/(nz-1); +#pragma omp parallel for + for(long i=0;ia[i+nx*(j+ny*k)] = mgl_datac_spline(vdat,u.a[i],v.a[j],w.a[k]); + } +} +//----------------------------------------------------------------------------- diff --git a/src/complex_ex.cpp b/src/complex_ex.cpp index 16bae00..b1fc925 100644 --- a/src/complex_ex.cpp +++ b/src/complex_ex.cpp @@ -22,7 +22,7 @@ #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_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector &head); //----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_datac_trace(HCDT d) { @@ -53,7 +53,7 @@ HADT MGL_EXPORT mgl_datac_trace(HCDT d) return r; } uintptr_t MGL_EXPORT mgl_datac_trace_(uintptr_t *d) -{ return uintptr_t(mgl_datac_trace(_DT_)); } +{ return uintptr_t(mgl_datac_trace(_DC_)); } //----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_datac_subdata_ext(HCDT d, HCDT xx, HCDT yy, HCDT zz) { @@ -184,9 +184,9 @@ HADT MGL_EXPORT mgl_datac_subdata(HCDT d, long xx,long yy,long zz) } //----------------------------------------------------------------------------- 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)); } +{ return uintptr_t(mgl_datac_subdata(_DC_,*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))); } +{ return uintptr_t(mgl_datac_subdata_ext(_DC_,_DA_(xx),_DA_(yy),_DA_(zz))); } //----------------------------------------------------------------------------- MGL_NO_EXPORT void *mgl_cresize(void *par) { @@ -225,9 +225,9 @@ HADT MGL_EXPORT mgl_datac_resize_box(HCDT dat, long mx,long my,long mz, mreal x1 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)); } +{ return uintptr_t(mgl_datac_resize(_DC_,*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)); } +{ return uintptr_t(mgl_datac_resize_box(_DC_,*mx,*my,*mz,*x1,*x2,*y1,*y2,*z1,*z2)); } //----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_datac_combine(HCDT d1, HCDT d2) { @@ -348,7 +348,7 @@ HADT MGL_EXPORT mgl_datac_sum(HCDT dat, const char *dir) } 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; } + uintptr_t r=uintptr_t(mgl_datac_sum(_DC_,s)); delete []s; return r; } //----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how) { @@ -360,9 +360,8 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how) 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); + HADT res=mglFormulaCalcC(how,list), b=0; - mglDataC *b=0; if(dir=='x') { b=new mglDataC(nx); @@ -373,7 +372,7 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how) for(long j=0;jvthr(i+nx*j); - i0 += u; i1 += u*res.a[i+nx*j]; + i0 += u; i1 += u*res->a[i+nx*j]; } b->a[i] = i0!=mreal(0) ? i1/i0 : 0; } @@ -388,7 +387,7 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how) for(long k=0;kv(j,i,k); - i0 += u; i1 += u*res.a[j+nx*(i+ny*k)]; + i0 += u; i1 += u*res->a[j+nx*(i+ny*k)]; } b->a[i] = i0!=mreal(0) ? i1/i0 : 0; } @@ -404,16 +403,16 @@ HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how) for(long j=0;jvthr(j+nn*i); - i0 += u; i1 += u*res.a[j+nn*i]; + i0 += u; i1 += u*res->a[j+nn*i]; } b->a[i] = i0!=mreal(0) ? i1/i0 : 0; } } - return b; + mgl_delete_datac(res); 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; } + uintptr_t r=uintptr_t(mgl_datac_momentum(_DC_,*dir, s)); delete []s; return r; } //----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_datac_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm) { @@ -446,7 +445,7 @@ HADT MGL_EXPORT mgl_datac_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, in 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)); } +{ return uintptr_t(mgl_datac_evaluate(_DC_,_DA_(idat),_DA_(jdat),_DA_(kdat),*norm)); } //----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_datac_column(HCDT dat, const char *eq) { @@ -468,13 +467,157 @@ HADT MGL_EXPORT mgl_datac_column(HCDT dat, const char *eq) 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)); + HADT r = mglFormulaCalcC(eq,list); for(size_t i=0;inx, ny=d->ny, nz=d->nz; + long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); + const mglDataC *c = dynamic_cast(a); + + if(mz*my*mx==1) + { + dual v=c?c->a[0]:a->v(0); +#pragma omp parallel for + for(long i=0;ia[i] += v; + } + else + { + long n=0, m=0; + if(nz*ny*nx==mz*my*mx) { n=nx*ny*nz; m=1; } + else if(ny*nx==my*mx) { n=nx*ny; m=nz; } + else if(nx==mx) { n=nx; m=ny*nz; } + if(c) +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] *= c->a[i]; + else +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] *= a->vthr(i); + } +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_mul_num(HADT d, dual a) +{ + long n=d->GetNN(); +#pragma omp parallel for + for(long i=0;ia[i] *= a; +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_div_dat(HADT d, HCDT a) +{ + long nx=d->nx, ny=d->ny, nz=d->nz; + long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); + const mglDataC *c = dynamic_cast(a); + + if(mz*my*mx==1) + { + dual v=c?c->a[0]:a->v(0); +#pragma omp parallel for + for(long i=0;ia[i] /= v; + } + else + { + long n=0, m=0; + if(nz*ny*nx==mz*my*mx) { n=nx*ny*nz; m=1; } + else if(ny*nx==my*mx) { n=nx*ny; m=nz; } + else if(nx==mx) { n=nx; m=ny*nz; } + if(c) +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] /= c->a[i]; + else +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] /= a->vthr(i); + } +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_div_num(HADT d, dual a) +{ + long n=d->GetNN(); +#pragma omp parallel for + for(long i=0;ia[i] /= a; +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_add_dat(HADT d, HCDT a) +{ + long nx=d->nx, ny=d->ny, nz=d->nz; + long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); + const mglDataC *c = dynamic_cast(a); + + if(mz*my*mx==1) + { + dual v=c?c->a[0]:a->v(0); +#pragma omp parallel for + for(long i=0;ia[i] += v; + } + else + { + long n=0, m=0; + if(nz*ny*nx==mz*my*mx) { n=nx*ny*nz; m=1; } + else if(ny*nx==my*mx) { n=nx*ny; m=nz; } + else if(nx==mx) { n=nx; m=ny*nz; } + if(c) +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] += c->a[i]; + else +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] += a->vthr(i); + } +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_add_num(HADT d, dual a) +{ + long n=d->GetNN(); +#pragma omp parallel for + for(long i=0;ia[i] += a; +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_sub_dat(HADT d, HCDT a) +{ + long nx=d->nx, ny=d->ny, nz=d->nz; + long mx=a->GetNx(), my=a->GetNy(), mz=a->GetNz(); + const mglDataC *c = dynamic_cast(a); + + if(mz*my*mx==1) + { + dual v=c?c->a[0]:a->v(0); +#pragma omp parallel for + for(long i=0;ia[i] -= v; + } + else + { + long n=0, m=0; + if(nz*ny*nx==mz*my*mx) { n=nx*ny*nz; m=1; } + else if(ny*nx==my*mx) { n=nx*ny; m=nz; } + else if(nx==mx) { n=nx; m=ny*nz; } + if(c) +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] -= c->a[i]; + else +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] -= a->vthr(i); + } +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_sub_num(HADT d, dual a) +{ + long n=d->GetNN(); +#pragma omp parallel for + for(long i=0;ia[i] -= a; +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_mul_dat_(uintptr_t *d, uintptr_t *b) { mgl_datac_mul_dat(_DC_, _DA_(b)); } +void MGL_EXPORT mgl_datac_div_dat_(uintptr_t *d, uintptr_t *b) { mgl_datac_div_dat(_DC_, _DA_(b)); } +void MGL_EXPORT mgl_datac_add_dat_(uintptr_t *d, uintptr_t *b) { mgl_datac_add_dat(_DC_, _DA_(b)); } +void MGL_EXPORT mgl_datac_sub_dat_(uintptr_t *d, uintptr_t *b) { mgl_datac_sub_dat(_DC_, _DA_(b)); } +void MGL_EXPORT mgl_datac_mul_num_(uintptr_t *d, dual *b) { mgl_datac_mul_num(_DC_, *b); } +void MGL_EXPORT mgl_datac_div_num_(uintptr_t *d, dual *b) { mgl_datac_div_num(_DC_, *b); } +void MGL_EXPORT mgl_datac_add_num_(uintptr_t *d, dual *b) { mgl_datac_add_num(_DC_, *b); } +void MGL_EXPORT mgl_datac_sub_num_(uintptr_t *d, dual *b) { mgl_datac_sub_num(_DC_, *b); } +//----------------------------------------------------------------------------- diff --git a/src/complex_io.cpp b/src/complex_io.cpp index fa7f336..5ddb462 100644 --- a/src/complex_io.cpp +++ b/src/complex_io.cpp @@ -34,7 +34,7 @@ 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_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); } @@ -639,7 +639,7 @@ void MGL_EXPORT mgl_datac_modify_vw(HADT d, const char *eq,HCDT vdat,HCDT wdat) 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); list.push_back(&i); list.push_back(&j); list.push_back(&k); - d->Set(mglFormulaCalcC(eq,list)); d->s = s; + d->Move(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; diff --git a/src/cont.cpp b/src/cont.cpp index 987c5d2..d4776d2 100644 --- a/src/cont.cpp +++ b/src/cont.cpp @@ -114,7 +114,7 @@ void MGL_NO_EXPORT mgl_string_curve(mglBase *gr,long f,long ,const long *ff,cons for(j=0;jtext_plot(gr->AddPnt(pt[j]+(pos*h)*l,c+dc*i,s,-1,-1),L,fnt,size,0.05,c+dc*j); + gr->text_plot(gr->AddPnt(pt[j]+(pos*h)*l,c+dc*i,align!=2?s:-s,-1,-1),L,fnt,size,0.05,c+dc*j); } delete []wdt; delete []pt; delete []fnt; } @@ -1134,6 +1134,7 @@ void MGL_EXPORT mgl_cont3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal * // Dens3 series // //----------------------------------------------------------------------------- +void MGL_NO_EXPORT mgl_surf_gen(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch); void MGL_EXPORT mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt) { bool both = mgl_isboth(x,y,z,a); @@ -1147,7 +1148,8 @@ void MGL_EXPORT mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha _mgl_slice s; 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); + mgl_surf_gen(gr, &s.x,&s.y,&s.z,&s.a, 0, sch); +// mgl_surfc_xy(gr,&s.x,&s.y,&s.z,&s.a,sch,0); gr->EndGroup(); } //----------------------------------------------------------------------------- @@ -1304,8 +1306,8 @@ long MGL_LOCAL_PURE mgl_find_prev(long i, long pc, long *nn) void MGL_NO_EXPORT mgl_axial_plot(mglBase *gr,long pc, mglPoint *ff, long *nn,char dir,mreal cc,int wire) { mglPoint a(0,0,1),b,c,p,q1,q2; - if(dir=='x') a = mglPoint(1,0,0); - if(dir=='y') a = mglPoint(0,1,0); + if(dir=='x') a.Set(1,0,0); + if(dir=='y') a.Set(0,1,0); b = !a; c = a^b; long p1,p2,p3,p4; @@ -1364,14 +1366,14 @@ void MGL_EXPORT mgl_axial_gen(HMGL gr, mreal val, HCDT a, HCDT x, HCDT y, mreal 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); - kk[pc] = mglPoint(i+d,j); pc++; + pp[pc].Set(mx->a[i0]*(1-d)+mx->a[i0+1]*d, my->a[i0]*(1-d)+my->a[i0+1]*d); + kk[pc].Set(i+d,j); pc++; } d = (ja[i0+n*m*ak],ma->a[i0+n*m*ak+n]):-1; if(d>=0 && d<1) { - pp[pc] = mglPoint(mx->a[i0]*(1-d)+mx->a[i0+n]*d, my->a[i0]*(1-d)+my->a[i0+n]*d); - kk[pc] = mglPoint(i,j+d); pc++; + pp[pc].Set(mx->a[i0]*(1-d)+mx->a[i0+n]*d, my->a[i0]*(1-d)+my->a[i0+n]*d); + kk[pc].Set(i,j+d); pc++; } } else for(long j=0;jv(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); - kk[pc] = mglPoint(i+d,j); pc++; + pp[pc].Set(vx*(1-d)+x->v(i+1,j)*d, vy*(1-d)+y->v(i+1,j)*d); + kk[pc].Set(i+d,j); pc++; } d = (jv(i,j+1,ak)):-1; if(d>=0 && d<1) { - pp[pc] = mglPoint(vx*(1-d)+x->v(i,j+1)*d, vy*(1-d)+y->v(i,j+1)*d); - kk[pc] = mglPoint(i,j+d); pc++; + pp[pc].Set(vx*(1-d)+x->v(i,j+1)*d, vy*(1-d)+y->v(i,j+1)*d); + kk[pc].Set(i,j+d); pc++; } } // deallocate arrays and finish if no point @@ -1547,12 +1549,12 @@ void MGL_EXPORT mgl_torus(HMGL gr, HCDT r, HCDT z, const char *sch, const char * if(mr&&mz) for(i=0;ia[i+n*j], mz->a[i+n*j]); + pp[i].Set(mr->a[i+n*j], mz->a[i+n*j]); } else for(i=0;iv(i,j), z->v(i,j)); + pp[i].Set(r->v(i,j), z->v(i,j)); } mgl_axial_plot(gr,n,pp,nn,dir,c,wire); } diff --git a/src/cont.hpp b/src/cont.hpp index 8315684..6562988 100644 --- a/src/cont.hpp +++ b/src/cont.hpp @@ -28,8 +28,8 @@ struct mglSegment 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)); + p1.Set(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.Set(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; } diff --git a/src/crust.cpp b/src/crust.cpp index 32e36c5..5c48f28 100644 --- a/src/crust.cpp +++ b/src/crust.cpp @@ -31,7 +31,7 @@ //----------------------------------------------------------------------------- void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt) { - long n = x->GetNx(), m = nums->GetNy(); + long n = x->GetNN(), m = nums->GetNy(); if(mgl_check_trig(gr,nums,x,y,z,a,"TriPlot")) return; long ss=gr->AddTexture(sch); @@ -39,19 +39,19 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD static int cgid=1; gr->StartGroup("TriPlot",cgid++); bool wire = mglchr(sch,'#'); - long nc = a->GetNx(); + long nc = a->GetNN(); if(nc!=n && nc>=m) // colors per triangle { mglPoint p1,p2,p3,q; gr->Reserve(m*3); - for(long i=0;iv(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0) { register long k1 = long(nums->v(0,i)+0.5); - p1 = mglPoint(x->v(k1), y->v(k1), z->v(k1)); + p1.Set(x->v(k1), y->v(k1), z->v(k1)); register long k2 = long(nums->v(1,i)+0.5); - p2 = mglPoint(x->v(k2), y->v(k2), z->v(k2)); + p2.Set(x->v(k2), y->v(k2), z->v(k2)); register long k3 = long(nums->v(2,i)+0.5); - p3 = mglPoint(x->v(k3), y->v(k3), z->v(k3)); + p3.Set(x->v(k3), y->v(k3), z->v(k3)); q = wire ? mglPoint(NAN,NAN) : (p2-p1) ^ (p3-p1); k1 = gr->AddPnt(p1,gr->GetC(ss,a->v(k1)),q); k2 = gr->AddPnt(p2,gr->GetC(ss,a->v(k2)),q); @@ -64,15 +64,15 @@ 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]; - for(long i=0;iv(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0) // add averaged normales { 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); if(!wire) { - mglPoint q = mglPoint(x->v(k2)-x->v(k1), y->v(k2)-y->v(k1), z->v(k2)-z->v(k1)) ^ - mglPoint(x->v(k3)-x->v(k1), y->v(k3)-y->v(k1), z->v(k3)-z->v(k1)); + mglPoint q(mglPoint(x->v(k2)-x->v(k1), y->v(k2)-y->v(k1), z->v(k2)-z->v(k1)) ^ + mglPoint(x->v(k3)-x->v(k1), y->v(k3)-y->v(k1), z->v(k3)-z->v(k1))); q.Normalize(); // try be sure that in the same direction ... if(q.z<0) q *= -1; @@ -82,7 +82,7 @@ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCD } for(long i=0;iAddPnt(mglPoint(x->v(i), y->v(i), z->v(i)), gr->GetC(ss,a->v(i)), pp[i]); - for(long i=0;iv(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0) // draw triangles { register long k1 = long(nums->v(0,i)+0.5); register long k2 = long(nums->v(1,i)+0.5); @@ -105,7 +105,7 @@ void MGL_EXPORT mgl_triplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, cons void MGL_EXPORT mgl_triplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt) { gr->SaveState(opt); - mglData z(x->GetNx()); + mglData z(x->GetNN()); mreal zm = gr->AdjustZMin(); z.Fill(zm,zm); mgl_triplot_xyzc(gr,nums,x,y,&z,&z,sch,0); } @@ -133,7 +133,7 @@ void MGL_EXPORT mgl_triplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, ui //----------------------------------------------------------------------------- void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt) { - long n = x->GetNx(), m = nums->GetNy(); + long n = x->GetNN(), m = nums->GetNy(); if(mgl_check_trig(gr,nums,x,y,z,a,"QuadPlot",4)) return; long ss=gr->AddTexture(sch); @@ -141,21 +141,21 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC static int cgid=1; gr->StartGroup("QuadPlot",cgid++); mglPoint p1,p2,p3,p4; - long nc = a->GetNx(); + long nc = a->GetNN(); bool wire = mglchr(sch,'#'); if(nc!=n && nc>=m) // colors per triangle { gr->Reserve(m*4); - for(long i=0;iv(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0) { register long k1 = long(nums->v(0,i)+0.5); - p1 = mglPoint(x->v(k1), y->v(k1), z->v(k1)); + p1.Set(x->v(k1), y->v(k1), z->v(k1)); register long k2 = long(nums->v(1,i)+0.5); - p2 = mglPoint(x->v(k2), y->v(k2), z->v(k2)); + p2.Set(x->v(k2), y->v(k2), z->v(k2)); register long k3 = long(nums->v(2,i)+0.5); - p3 = mglPoint(x->v(k3), y->v(k3), z->v(k3)); - register long k4 = floor(nums->v(3,i)+0.5); - p4 = mglPoint(x->v(k4), y->v(k4), z->v(k4)); + p3.Set(x->v(k3), y->v(k3), z->v(k3)); + register long k4 = long(nums->v(3,i)+0.5); + p4.Set(x->v(k4), y->v(k4), z->v(k4)); mglPoint q = wire ? mglPoint(NAN,NAN):(p2-p1) ^ (p3-p1); k1 = gr->AddPnt(p1,gr->GetC(ss,a->v(k1)),q); k2 = gr->AddPnt(p2,gr->GetC(ss,a->v(k2)),q); @@ -169,16 +169,16 @@ 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]; - for(long i=0;iv(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0) + { // add averaged normales register long k1 = long(nums->v(0,i)+0.5); - p1 = mglPoint(x->v(k1), y->v(k1), z->v(k1)); + p1.Set(x->v(k1), y->v(k1), z->v(k1)); register long k2 = long(nums->v(1,i)+0.5); - p2 = mglPoint(x->v(k2), y->v(k2), z->v(k2)); + p2.Set(x->v(k2), y->v(k2), z->v(k2)); register long k3 = long(nums->v(2,i)+0.5); - p3 = mglPoint(x->v(k3), y->v(k3), z->v(k3)); - register long k4 = floor(nums->v(3,i)+0.5); - p4 = mglPoint(x->v(k4), y->v(k4), z->v(k4)); + p3.Set(x->v(k3), y->v(k3), z->v(k3)); + register long k4 = long(nums->v(3,i)+0.5); + p4.Set(x->v(k4), y->v(k4), z->v(k4)); if(wire) pp[k1]=pp[k2]=pp[k3]=pp[k4]=mglPoint(NAN,NAN); else @@ -192,12 +192,12 @@ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HC } for(long i=0;iAddPnt(mglPoint(x->v(i), y->v(i), z->v(i)),gr->GetC(ss,a->v(i)), pp[i]); - for(long i=0;iv(0,i)+0.5); - register long k2 = floor(nums->v(1,i)+0.5); - register long k3 = floor(nums->v(2,i)+0.5); - register long k4 = floor(nums->v(3,i)+0.5); + for(long i=0;iv(0,i)>=0 && nums->v(1,i)>=0 && nums->v(2,i)>=0 && nums->v(3,i)>=0) + { // draw quads + 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); + register long k4 = long(nums->v(3,i)+0.5); if(wire) { gr->line_plot(kk[k1],kk[k2]); gr->line_plot(kk[k1],kk[k3]); @@ -216,7 +216,7 @@ void MGL_EXPORT mgl_quadplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, con void MGL_EXPORT mgl_quadplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt) { gr->SaveState(opt); - mglData z(x->GetNx()); z.Fill(gr->Min.z,gr->Min.z); + mglData z(x->GetNN()); z.Fill(gr->Min.z,gr->Min.z); mgl_quadplot_xyzc(gr,nums,x,y,&z,&z,sch,0); } //----------------------------------------------------------------------------- @@ -245,30 +245,29 @@ void MGL_EXPORT mgl_quadplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, u //----------------------------------------------------------------------------- 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(); + long n = x->GetNN(), m = nums->GetNy(); std::vector lines; for(long i=0;iv(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; + long k1 = long(nums->v(0,i)+0.5), k2 = long(nums->v(1,i)+0.5), k3 = long(nums->v(2,i)+0.5); + if(k1<0 || k1>=n || k2<0 || k2>=n || k3<0 || k3>=n) continue; 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) { - 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); + line.p1.Set(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.Set(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) { - 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); + line.p1.Set(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.Set(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) { - 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); + line.p1.Set(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.Set(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); } @@ -277,7 +276,7 @@ std::vector MGL_NO_EXPORT mgl_tri_lines(mreal val, HCDT nums, HCDT a //----------------------------------------------------------------------------- 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()); + mglDataV zz(x->GetNN()); if(!z) z = &zz; if(mgl_check_trig(gr,nums,x,y,z,a,"TriCont")) return; @@ -342,7 +341,7 @@ void MGL_EXPORT mgl_tricont_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, u //----------------------------------------------------------------------------- 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()); + mglDataV zz(x->GetNN()); if(!z) z = &zz; if(mgl_check_trig(gr,nums,x,y,z,a,"TriContV")) return; @@ -439,7 +438,7 @@ void MGL_EXPORT mgl_dots_ca(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, con for(long i=0;ivthr(i),y->vthr(i),z->vthr(i)); + mglPoint p(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); } @@ -475,11 +474,11 @@ 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) { mglData *nums=0; - long n = x->GetNx(), m; - if(y->GetNx()!=n || z->GetNx()!=n) return nums; + long n = x->GetNN(), m; + if(y->GetNN()!=n || z->GetNN()!=n) return nums; mglPoint *pp = new mglPoint[n]; long *nn=0; - for(long i=0;iv(i), y->v(i), z->v(i)); + for(long i=0;iv(i), y->v(i), z->v(i)); m = mgl_crust(n,pp,&nn,0); if(m>0) @@ -552,12 +551,12 @@ MGL_NO_EXPORT void *mgl_grid_t(void *par) #if !MGL_HAVE_PTHREAD #pragma omp parallel for #endif - for(long i0=t->id;i0n;i0+=mglNumThr) + for(long i0=t->id;i0n;i0+=mglNumThr) if(d[3*i0]>=0 && d[3*i0+1]>=0 && d[3*i0+2]>=0) { 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; 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; + mglPoint d1(x[k2]-x[k1],y[k2]-y[k1],z2-z1), d2(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 @@ -633,7 +632,7 @@ void MGL_EXPORT mgl_data_grid_(uintptr_t *gr, uintptr_t *d, uintptr_t *x, uintpt //----------------------------------------------------------------------------- void MGL_EXPORT mgl_crust(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) { - if(y->GetNx()!=x->GetNx() || z->GetNx()!=x->GetNx()) + if(y->GetNN()!=x->GetNN() || z->GetNN()!=x->GetNN()) { gr->SetWarn(mglWarnDim,"Crust"); return; } HMDT nums = mgl_triangulation_3d(x, y, z); mgl_triplot_xyzc(gr,nums,x,y,z,z,sch,opt); diff --git a/src/data.cpp b/src/data.cpp index 0ab7859..fca5a20 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -116,13 +116,13 @@ void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, mreal *a, const v } } //----------------------------------------------------------------------------- -mreal MGL_EXPORT_PURE mglSpline3s(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) +mreal MGL_EXPORT 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) +mreal MGL_EXPORT 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 MGL_EXPORT_PURE mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z) +mreal MGL_EXPORT 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_EXPORT_CONST mgl_ipow(double x,int n) @@ -136,7 +136,7 @@ double MGL_EXPORT_CONST mgl_ipow(double x,int n) if(n%2==1) t *= x; return t; } -double MGL_EXPORT_PURE mgl_ipow_(mreal *x,int *n) { return mgl_ipow(*x,*n); } +double MGL_EXPORT mgl_ipow_(mreal *x,int *n) { return mgl_ipow(*x,*n); } //----------------------------------------------------------------------------- double mgl_get_time(const char *time, const char *fmt) { @@ -649,7 +649,7 @@ void MGL_EXPORT mgl_data_roll(HMDT dd, char dir, long num) mreal *b,*a=dd->a; if(dir=='z' && nz>1) { - d = num>0 ? num%nz : (num+nz*(1+num/nz))%nz; + d = num>0 ? num%nz : (num+nz*(1-num/nz))%nz; if(d==0) return; // nothing to do b = new mreal[nx*ny*nz]; memcpy(b,a+nx*ny*d,nx*ny*(nz-d)*sizeof(mreal)); @@ -658,7 +658,7 @@ void MGL_EXPORT mgl_data_roll(HMDT dd, char dir, long num) } if(dir=='y' && ny>1) { - d = num>0 ? num%ny : (num+ny*(1+num/ny))%ny; + d = num>0 ? num%ny : (num+ny*(1-num/ny))%ny; if(d==0) return; // nothing to do b = new mreal[nx*ny*nz]; memcpy(b,a+nx*d,(nx*ny*nz-nx*d)*sizeof(mreal)); @@ -669,7 +669,7 @@ void MGL_EXPORT mgl_data_roll(HMDT dd, char dir, long num) } if(dir=='x' && nx>1) { - d = num>0 ? num%nx : (num+nx*(1+num/nx))%nx; + d = num>0 ? num%nx : (num+nx*(1-num/nx))%nx; if(d==0) return; // nothing to do b = new mreal[nx*ny*nz]; memcpy(b,a+d,(nx*ny*nz-d)*sizeof(mreal)); @@ -921,7 +921,7 @@ HMDT MGL_EXPORT mgl_data_solve(HCDT dat, mreal val, char dir, HCDT i0, int norm) return r; } //----------------------------------------------------------------------------- -mreal MGL_EXPORT_PURE mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0) +mreal MGL_EXPORT 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(); @@ -974,7 +974,7 @@ mreal MGL_EXPORT_PURE mgl_data_solve_1d(HCDT d, mreal val, int spl, long i0) return NAN; } //----------------------------------------------------------------------------- -mreal MGL_EXPORT_PURE mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz) +mreal MGL_EXPORT 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); @@ -1047,52 +1047,53 @@ mreal MGL_EXPORT_PURE mgl_data_linear_ext(HCDT d, mreal x,mreal y,mreal z, mreal return b0 + z*(b1-b0); } //----------------------------------------------------------------------------- -mreal MGL_EXPORT_PURE mgl_data_linear(HCDT d, mreal x,mreal y,mreal z) +mreal MGL_EXPORT 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_PURE mgl_data_spline(HCDT d, mreal x,mreal y,mreal z) +mreal MGL_EXPORT mgl_data_spline(HCDT d, mreal x,mreal y,mreal z) { if(mgl_isbad(x) || mgl_isbad(y) || mgl_isbad(z)) return NAN; + mreal res = 0; const mglData *dd=dynamic_cast(d); - 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); + if(dd) res = 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)); + if(dc) res = 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); + if(dv) res = 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 + if(df) res = df->value(x,y,z); + return res; // TODO non-mglData: spline mglDataT, mglDataR } //----------------------------------------------------------------------------- -mreal MGL_EXPORT_PURE mgl_data_spline_ext(HCDT d, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz) +mreal MGL_EXPORT 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; + mreal res = 0; const mglData *dd=dynamic_cast(d); - if(dd) return mglSpline3t(dd->a,dd->nx,dd->ny,dd->nz,x,y,z,dx,dy,dz); + if(dd) res = 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; } + if(dz) *dz = res?(real(a)*real(az)+imag(a)*imag(az))/res:0; } const mglDataV *dv=dynamic_cast(d); - if(dv) return dv->value(x,y,z,dx,dy,dz); + if(dv) res = 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 + if(df) res = df->value(x,y,z,dx,dy,dz); + return res; // TODO non-mglData: spline mglDataT, mglDataR } //----------------------------------------------------------------------------- -mreal MGL_EXPORT_PURE mgl_data_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +mreal MGL_EXPORT mgl_data_spline_(uintptr_t *d, mreal *x,mreal *y,mreal *z) { return mgl_data_spline(_DA_(d),*x,*y,*z); } -mreal MGL_EXPORT_PURE mgl_data_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) +mreal MGL_EXPORT mgl_data_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z) { return mgl_data_linear(_DA_(d),*x,*y,*z); } -mreal MGL_EXPORT_PURE mgl_data_spline_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz) +mreal MGL_EXPORT 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_PURE mgl_data_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz) +mreal MGL_EXPORT 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_PURE mgl_data_solve_1d_(uintptr_t *d, mreal *val, int *spl, int *i0) +mreal MGL_EXPORT 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)); } @@ -1105,6 +1106,7 @@ void MGL_EXPORT mgl_data_crop(HMDT d, long n1, long n2, char dir) switch(dir) { case 'x': + if(n1>=nx) break; n2 = n2>0 ? n2 : nx+n2; if(n2<0 || n2>=nx || n2a = b; d->link=false; d->NewId(); break; case 'y': + if(n1>=ny) break; n2 = n2>0 ? n2 : ny+n2; if(n2<0 || n2>=ny || n2a = b; d->link=false; break; case 'z': + if(n1>=nz) break; n2 = n2>0 ? n2 : nz+n2; if(n2<0 || n2>=nz || n2a; } +MGL_EXPORT 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); @@ -1908,45 +1912,25 @@ void MGL_EXPORT mgl_data_join(HMDT d, HCDT v) { long nx=d->nx, ny=d->ny, nz=d->nz, k=nx*ny*nz; const mglData *mv = dynamic_cast(v); - long vx=v->GetNx(), vy=v->GetNy(), vz=v->GetNz(); + long vx=v->GetNx(), vy=v->GetNy(), vz=v->GetNz(), m = vx*vy*vz; - if(nx==vx && ny==vy && (nz>1 || vz>1)) - { - mreal *b = new mreal[nx*ny*(nz+vz)]; - memcpy(b,d->a,nx*ny*nz*sizeof(mreal)); - if(mv) memcpy(b+nx*ny*nz,mv->a,nx*ny*vz*sizeof(mreal)); - else -#pragma omp parallel for - for(long i=0;ivthr(i); - if(!d->link) delete []d->a; d->nz += vz; - d->a = b; d->link=false; d->NewId(); - } - else if(nx==vx && (ny>1 || vy>1)) + if(nx==vx && ny==vy && (nz>1 || vz>1)) d->nz += vz; + else { ny *= nz; vy *= vz; - mreal *b = new mreal[nx*(ny+vy)]; - memcpy(b,d->a,nx*ny*sizeof(mreal)); - if(mv) memcpy(b+nx*ny,mv->a,nx*vy*sizeof(mreal)); + if(nx==vx && (ny>1 || vy>1)) + { d->nz = 1; d->ny = ny+vy; } else -#pragma omp parallel for - for(long i=0;ivthr(i); - if(!d->link) delete []d->a; - d->nz = 1; d->ny = ny+vy; - d->a = b; d->link=false; d->NewId(); + { d->ny = d->nz = 1; d->nx = k+m; } } + mreal *b = new mreal[k+m]; + memcpy(b,d->a,k*sizeof(mreal)); + if(mv) memcpy(b+k,mv->a,m*sizeof(mreal)); else - { - nx *= ny*nz; vx *= vy*vz; - mreal *b = new mreal[nx+vx]; - memcpy(b,d->a,nx*sizeof(mreal)); - if(mv) memcpy(b+nx,mv->a,vx*sizeof(mreal)); - else #pragma omp parallel for - for(long i=0;ivthr(i); - if(!d->link) delete []d->a; - d->nz = d->ny = 1; d->nx = nx+vx; - d->a = b; d->link=false; d->NewId(); - } + for(long i=0;ivthr(i); + if(!d->link) delete []d->a; + d->a = b; d->link=false; d->NewId(); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_join_(uintptr_t *d, uintptr_t *val) diff --git a/src/data_ex.cpp b/src/data_ex.cpp index 4a39428..031c0b1 100644 --- a/src/data_ex.cpp +++ b/src/data_ex.cpp @@ -21,7 +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_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); //----------------------------------------------------------------------------- HMDT MGL_EXPORT mgl_data_trace(HCDT d) { @@ -475,9 +475,8 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how) 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); + HMDT res=mglFormulaCalc(how,list), b=0; - mglData *b=0; if(dir=='x') { b=new mglData(nx); @@ -488,7 +487,7 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how) for(long j=0;jvthr(i+nx*j); - i0 += u; i1 += u*res.a[i+nx*j]; + i0 += u; i1 += u*res->a[i+nx*j]; } b->a[i] = i0>0 ? i1/i0 : 0; } @@ -503,7 +502,7 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how) for(long k=0;kv(j,i,k); - i0 += u; i1 += u*res.a[j+nx*(i+ny*k)]; + i0 += u; i1 += u*res->a[j+nx*(i+ny*k)]; } b->a[i] = i0>0 ? i1/i0 : 0; } @@ -519,12 +518,12 @@ HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how) for(long j=0;jvthr(j+nn*i); - i0 += u; i1 += u*res.a[j+nn*i]; + i0 += u; i1 += u*res->a[j+nn*i]; } b->a[i] = i0>0 ? i1/i0 : 0; } } - return b; + mgl_delete_data(res); 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; @@ -541,26 +540,22 @@ void MGL_EXPORT mgl_data_mul_dat(HMDT d, HCDT a) for(long k=0;ka[i+nx*(j+ny*k)] *= v; } - 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); + else + { + long n=0, m=0; + if(nz*ny*nx==mz*my*mx) { n=nx*ny*nz; m=1; } + else if(ny*nx==my*mx) { n=nx*ny; m=nz; } + else if(nx==mx) { n=nx; m=ny*nz; } +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] *= a->vthr(i); + } } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_mul_num(HMDT d, mreal a) { - 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; + long n=d->GetNN(); +#pragma omp parallel for + for(long i=0;ia[i] *= a; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_div_dat(HMDT d, HCDT a) @@ -574,26 +569,22 @@ void MGL_EXPORT mgl_data_div_dat(HMDT d, HCDT a) for(long k=0;ka[i+nx*(j+ny*k)] /= v; } - 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); + else + { + long n=0, m=0; + if(nz*ny*nx==mz*my*mx) { n=nx*ny*nz; m=1; } + else if(ny*nx==my*mx) { n=nx*ny; m=nz; } + else if(nx==mx) { n=nx; m=ny*nz; } +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] /= a->vthr(i); + } } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_div_num(HMDT d, mreal a) { - 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; + long n=d->GetNN(); +#pragma omp parallel for + for(long i=0;ia[i] /= a; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_add_dat(HMDT d, HCDT a) @@ -607,26 +598,22 @@ void MGL_EXPORT mgl_data_add_dat(HMDT d, HCDT a) for(long k=0;ka[i+nx*(j+ny*k)] += v; } - 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); + else + { + long n=0, m=0; + if(nz*ny*nx==mz*my*mx) { n=nx*ny*nz; m=1; } + else if(ny*nx==my*mx) { n=nx*ny; m=nz; } + else if(nx==mx) { n=nx; m=ny*nz; } +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] += a->vthr(i); + } } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_add_num(HMDT d, mreal a) { - 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; + long n=d->GetNN(); +#pragma omp parallel for + for(long i=0;ia[i] += a; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_sub_dat(HMDT d, HCDT a) @@ -640,26 +627,22 @@ void MGL_EXPORT mgl_data_sub_dat(HMDT d, HCDT a) for(long k=0;ka[i+nx*(j+ny*k)] -= v; } - 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); + else + { + long n=0, m=0; + if(nz*ny*nx==mz*my*mx) { n=nx*ny*nz; m=1; } + else if(ny*nx==my*mx) { n=nx*ny; m=nz; } + else if(nx==mx) { n=nx; m=ny*nz; } +#pragma omp parallel for collapse(2) + for(long k=0;ka[i+n*k] -= a->vthr(i); + } } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_sub_num(HMDT d, mreal a) { - 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; + long n=d->GetNN(); +#pragma omp parallel for + for(long i=0;ia[i] -= a; } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_mul_dat_(uintptr_t *d, uintptr_t *b) { mgl_data_mul_dat(_DT_, _DA_(b)); } diff --git a/src/data_gr.cpp b/src/data_gr.cpp index 1afc630..82a4beb 100644 --- a/src/data_gr.cpp +++ b/src/data_gr.cpp @@ -28,8 +28,8 @@ #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); +HMDT MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); +HADT 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) { @@ -45,6 +45,20 @@ void MGL_EXPORT mgl_data_refill_gr(HMGL gr, HMDT dat, HCDT xdat, HCDT ydat, HCDT gr->LoadState(); } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_refill_gr(HMGL gr, HADT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, long sl, const char *opt) +{ + if(!vdat) return; + gr->SaveState(opt); + if(!ydat && !zdat) mgl_datac_refill_x(dat,xdat,vdat,gr->Min.x,gr->Max.x,sl); +// else if(!xdat && !zdat) mgl_datac_refill_x(dat,ydat,vdat,gr->Min.y,gr->Max.y,sl); +// else if(!xdat && !ydat) mgl_datac_refill_x(dat,zdat,vdat,gr->Min.z,gr->Max.z,sl); + else if(!zdat) mgl_datac_refill_xy(dat,xdat,ydat,vdat,gr->Min.x,gr->Max.x,gr->Min.y,gr->Max.y,sl); +// else if(!ydat) mgl_datac_refill_xy(dat,xdat,zdat,vdat,gr->Min.x,gr->Max.x,gr->Min.z,gr->Max.z,sl); +// else if(!xdat) mgl_datac_refill_xy(dat,ydat,zdat,vdat,gr->Min.y,gr->Max.y,gr->Min.z,gr->Max.z,sl); + else mgl_datac_refill_xyz(dat,xdat,ydat,zdat,vdat,gr->Min.x,gr->Max.x,gr->Min.y,gr->Max.y,gr->Min.z,gr->Max.z); + gr->LoadState(); +} +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_refill_x_(uintptr_t *d, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl) { mgl_data_refill_x(_DT_,_DA_(xdat),_DA_(vdat),*x1,*x2,*sl); } void MGL_EXPORT mgl_data_refill_xy_(uintptr_t *d, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, long *sl) @@ -55,6 +69,16 @@ 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; } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_datac_refill_x_(uintptr_t *d, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl) +{ mgl_datac_refill_x(_DC_,_DA_(xdat),_DA_(vdat),*x1,*x2,*sl); } +void MGL_EXPORT mgl_datac_refill_xy_(uintptr_t *d, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, long *sl) +{ mgl_datac_refill_xy(_DC_,_DA_(xdat),_DA_(ydat),_DA_(vdat),*x1,*x2,*y1,*y2,*sl); } +void MGL_EXPORT mgl_datac_refill_xyz_(uintptr_t *d, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, mreal *z1, mreal *z2) +{ mgl_datac_refill_xyz(_DC_,_DA_(xdat),_DA_(ydat),_DA_(zdat),_DA_(vdat),*x1,*x2,*y1,*y2,*z1,*z2); } +void MGL_EXPORT mgl_datac_refill_gr_(uintptr_t *gr, uintptr_t *d, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, long *sl, const char *opt,int l) +{ char *s=new char[l+1]; memcpy(s,opt,l); s[l]=0; + mgl_datac_refill_gr(_GR_,_DC_,_DA_(xdat),_DA_(ydat),_DA_(zdat),_DA_(vdat),*sl,s); delete []s; } +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_data_fill_eq(HMGL gr, HMDT d, const char *eq, HCDT vdat, HCDT wdat, const char *opt) { if(vdat && vdat->GetNN()!=d->GetNN()) return; // incompatible dimesions @@ -73,8 +97,7 @@ void MGL_EXPORT mgl_data_fill_eq(HMGL gr, HMDT d, const char *eq, HCDT vdat, HCD 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); list.push_back(&i); list.push_back(&j); list.push_back(&k); - d->Set(mglFormulaCalc(eq,list)); d->s = s; - gr->LoadState(); + d->Move(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) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; @@ -99,8 +122,7 @@ void MGL_EXPORT mgl_datac_fill_eq(HMGL gr, HADT d, const char *eq, HCDT vdat, HC 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); list.push_back(&i); list.push_back(&j); list.push_back(&k); - d->Set(mglFormulaCalcC(eq,list)); d->s = s; - gr->LoadState(); + d->Move(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) { char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0; diff --git a/src/data_io.cpp b/src/data_io.cpp index f1a4439..5761256 100644 --- a/src/data_io.cpp +++ b/src/data_io.cpp @@ -40,7 +40,7 @@ #endif inline bool isn(char ch) {return ch=='\n';} -mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); +HMDT 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); } @@ -903,7 +903,7 @@ void MGL_EXPORT mgl_data_modify_vw(HMDT d, const char *eq,HCDT vdat,HCDT wdat) 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); list.push_back(&i); list.push_back(&j); list.push_back(&k); - d->Set(mglFormulaCalc(eq,list)); d->s = s; + d->Move(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; @@ -1181,8 +1181,7 @@ HMDT MGL_EXPORT mgl_data_column(HCDT dat, const char *eq) 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)); + HMDT r = mglFormulaCalc(eq,list); for(size_t i=0;i1 ? 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 fmin(double a,double b) { return a > b ? b : a; } +double MGL_LOCAL_CONST fmax(double a,double b) { return a > b ? a : b; } #endif //----------------------------------------------------------------------------- typedef double (*func_1)(double); typedef double (*func_2)(double, double); //----------------------------------------------------------------------------- -static 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,3,3,3,3 #if MGL_HAVE_GSL ,3,NAN, 3,NAN, 0,0,3,1,3 #else ,0,0,0,0,0,0,0,0,0 #endif }; -static const 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,fmax,fmin #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_gamma_inc, + gslEllE,gslEllF,gslLegP,gsl_sf_beta,gsl_sf_gamma_inc #else ,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2 #endif @@ -629,14 +638,14 @@ double MGL_LOCAL_CONST gamma_d(double a) {return gsl_sf_psi(a)*gsl_sf_gamma(a);} #endif double MGL_LOCAL_CONST ginc_d(double a, double x) {return -exp(-x)*pow(x,a-1);} //----------------------------------------------------------------------------- -static const func_2 f21[EQ_SIN-EQ_LT] = {mgzz,mgzz,mgzz, mgzz,mgzz,mgp, mgp,mul1,div1, ipw1,pow1,mgp,llg1, mgz2 +static const func_2 f21[EQ_SIN-EQ_LT] = {mgzz,mgzz,mgzz, mgzz,mgzz,mgp, mgp,mul1,div1, ipw1,pow1,mgp,llg1, mgz2,mgzz,mgzz #if MGL_HAVE_GSL ,mgz2,mgz2,mgz2, mgz2,gslEllE1,gslEllF1, mgz2,mgz2,mgz2 #else ,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2,mgz2 #endif }; -static const func_2 f22[EQ_SIN-EQ_LT] = {mgzz,mgzz,mgzz,mgzz,mgzz,mgp,mgm,mul2,div2,pow2,pow2,mgz2,llg2, mgz2 +static const func_2 f22[EQ_SIN-EQ_LT] = {mgzz,mgzz,mgzz,mgzz,mgzz,mgp,mgm,mul2,div2,pow2,pow2,mgz2,llg2, mgz2,mgzz,mgzz #if MGL_HAVE_GSL ,gslJnuD,gslYnuD,gslInuD,gslKnuD,gslEllE2,gslEllF2,mgz2/*gslLegP*/,mgz2,ginc_d #else @@ -725,11 +734,11 @@ int MGL_LOCAL_PURE 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) { if(ex) delete ex; } -double MGL_EXPORT_PURE mgl_expr_eval(HMEX ex, double x, double y,double z) +double MGL_EXPORT 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_PURE mgl_expr_diff(HMEX ex, char dir, double x, double y,double z) +double MGL_EXPORT 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 13ff94a..1eca3d9 100644 --- a/src/evalc.cpp +++ b/src/evalc.cpp @@ -57,6 +57,7 @@ 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_CONJ, // complex conjugate EQ_LAST // id of last entry }; //----------------------------------------------------------------------------- @@ -157,6 +158,7 @@ mglFormulaC::mglFormulaC(const char *string) 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 if(!strcmp(name,"conj")) Kod=EQ_CONJ; else { delete []str; return; } // unknown function n=mglFindInText(str,","); if(n>=0) @@ -220,6 +222,7 @@ dual MGL_NO_EXPORT ic = dual(0,1); 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 conjc(dual x) { return dual(real(x),-imag(x)); } 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); } @@ -243,7 +246,7 @@ dual mglFormulaC::CalcIn(const dual *a1) const { func_2 f2[EQ_SIN-EQ_ADD] = {addc,subc,mulc,divc,ipwc,powc,llgc}; func_1 f1[EQ_LAST-EQ_SIN] = {sinc,cosc,tanc,asinc,acosc,atanc,sinhc,coshc,tanhc, - asinhc,acoshc,atanhc,sqrtc,expc,expi,logc,lgc,absc}; + asinhc,acoshc,atanhc,sqrtc,expc,expi,logc,lgc,absc,argc,conjc}; // if(Error) return 0; if(Kod==EQ_A) return a1[(int)Res.real()]; if(Kod==EQ_RND) return mgl_rnd(); @@ -267,15 +270,18 @@ dual mglFormulaC::CalcIn(const dual *a1) const mdual MGL_EXPORT_CONST mgl_ipowc(dual x,int n) { dual t; - 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.real()+t.imag()*_Complex_I; + if(n==2) t = x*x; + else if(n==1) t = x; + else if(n<0) t = mreal(1)/mgl_ipowc(x,-n); + else if(n==0) t = mreal(1); + else + { + t = mgl_ipowc(x,n/2); t = t*t; + if(n%2==1) t *= x; + } + return t.real()+t.imag()*mgl_I; } -mdual MGL_EXPORT_PURE mgl_ipowc_(dual *x,int *n) { return mgl_ipowc(*x,*n); } +mdual MGL_EXPORT 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) @@ -284,10 +290,10 @@ uintptr_t MGL_EXPORT mgl_create_cexpr_(const char *expr, int l) delete []s; return res; } 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); } -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(HAEX ex, dual x, dual y,dual z) +{ dual r = ex->Calc(x,y,z); return r.real()+r.imag()*mgl_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); } mdual MGL_EXPORT mgl_cexpr_eval_v(HAEX ex, dual *var) -{ dual r = ex->Calc(var); return r.real()+r.imag()*_Complex_I; } +{ dual r = ex->Calc(var); return r.real()+r.imag()*mgl_I; } //----------------------------------------------------------------------------- diff --git a/src/evalp.cpp b/src/evalp.cpp index 0455716..af4d016 100644 --- a/src/evalp.cpp +++ b/src/evalp.cpp @@ -27,102 +27,228 @@ #endif //----------------------------------------------------------------------------- std::wstring mgl_trim_ws(const std::wstring &str); -int mglFormulaError; -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); +HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector &head); +HADT 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) +HMDT 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) +HADT 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)) +HMDT mglApplyFunc(std::wstring str, mglParser *arg, const std::vector &head, double (*func)(double)) { - long n = d.nx*d.ny*d.nz; + HMDT d = mglFormulaCalc(str, arg, head); + long n = d->GetNN(); mreal *dd=d->a; #pragma omp parallel for - for(long i=0;i &head, double (*func)(double,double)) +#if MGL_HAVE_GSL +HMDT mglApplyFuncGSL(std::wstring str, mglParser *arg, const std::vector &head, double (*func)(double, gsl_mode_t)) +{ + HMDT d = mglFormulaCalc(str, arg, head); + long n = d->GetNN(); mreal *dd=d->a; +#pragma omp parallel for + for(long i=0;i &head, double (*func)(double,double)) +{ + HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + mreal va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a; + if(na==nb) +#pragma omp parallel for + for(long i=0;i &head) +{ + HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + mreal *aa=r->a, *bb=d->a, v=bb[0]; + if(na==nb) +#pragma omp parallel for + for(long i=0;i &head) +{ + HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + mreal va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a; + if(na==nb) +#pragma omp parallel for + for(long i=0;i &head) +{ + HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + mreal *aa=r->a, *bb=d->a, v=bb[0]; + if(na==nb) +#pragma omp parallel for + for(long i=0;i &head) +{ + HMDT a = mglFormulaCalc(a1,arg,head), b = mglFormulaCalc(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + mreal va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a; + if(na==nb) +#pragma omp parallel for + for(long i=0;i &head, dual (*func)(dual)) +{ + HADT d = mglFormulaCalcC(str, arg, head); + long n = d->GetNN(); dual *dd=d->a; +#pragma omp parallel for + for(long i=0;i &head, dual (*func)(dual,dual)) +{ + HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + dual va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a; + if(na==nb) +#pragma omp parallel for + for(long i=0;i &head) +{ + HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + dual *aa=r->a, *bb=d->a, v=bb[0]; + if(na==nb) +#pragma omp parallel for + for(long i=0;i &head) { - 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) + HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + dual va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a; + if(na==nb) #pragma omp parallel for - for(long i=0;i &head) { - long n = d.nx*d.ny*d.nz; + HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + dual *aa=r->a, *bb=d->a, v=bb[0]; + if(na==nb) #pragma omp parallel for - for(long i=0;i &head, dual (*func)(dual,dual)) +HADT mglApplyOperDivC(std::wstring a1, std::wstring a2, mglParser *arg, const std::vector &head) { - 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) + HADT a = mglFormulaCalcC(a1,arg,head), b = mglFormulaCalcC(a2,arg,head), r,d; + long na = a->GetNN(), nb = b->GetNN(), nn; + if(na!=1) { r=a; d=b; nn=na; } + else { r=b; d=a; nn=nb; } + dual va=a->a[0], vb=b->a[0], *aa=a->a, *bb=b->a, *cc=r->a; + if(na==nb) #pragma omp parallel for - for(long i=0;ib?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 stp(double a);// {return a>0?1:0;} +double MGL_LOCAL_CONST sgn(double a);// {return a>0?1:(a<0?-1:0);} 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)); } @@ -166,6 +290,13 @@ double MGL_LOCAL_CONST llg(double a,double b);// {return log(a)/log(b);} 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);} +#ifdef WIN32 +double MGL_LOCAL_CONST asinh(double x); +double MGL_LOCAL_CONST acosh(double x); +double MGL_LOCAL_CONST atanh(double x); +double MGL_LOCAL_CONST fmin(double a,double b); +double MGL_LOCAL_CONST fmax(double a,double b); +#endif //----------------------------------------------------------------------------- // 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) @@ -194,164 +325,179 @@ void MGL_EXPORT mgl_wcslwr(wchar_t *str) // 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' -mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std::vector &head) +HMDT 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(arg) head = arg->DataList; + if(str.empty()) return new mglData; // nothing to parse 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; + HMDT res=0; for(i=1,j=1;i0) br--; if(str[i]==',' && !br) { - a1=mglFormulaCalc(str.substr(j,i-j), arg, head); + HMDT 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); } + { 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); } + { k = res->nx; res->Insert('x',k); mgl_data_put_dat(res,a1,k,-1,-1); } else if(mt) // res 2d array - { k = res.ny; res.Insert('y',k); res.Put(a1,-1,k); } + { k = res->ny; res->Insert('y',k); mgl_data_put_dat(res,a1,-1,k,-1); } else // res 3d array - { k = res.nz; res.Insert('z',k); res.Put(a1,-1,-1,k); } + { k = res->nz; res->Insert('z',k); mgl_data_put_dat(res,a1,-1,-1,k); } + mgl_delete_data(a1); } j=i+1; } } - a1=mglFormulaCalc(str.substr(j,i-j), arg, head); + HMDT 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); } + { 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); } + { k = res->nx; res->Insert('x',k); mgl_data_put_dat(res,a1,k,-1,-1); } else if(mt) // res 2d array - { k = res.ny; res.Insert('y',k); res.Put(a1,-1,k); } + { k = res->ny; res->Insert('y',k); mgl_data_put_dat(res,a1,-1,k,-1); } else // res 3d array - { k = res.nz; res.Insert('z',k); res.Put(a1,-1,-1,k); } + { k = res->nz; res->Insert('z',k); mgl_data_put_dat(res,a1,-1,-1,k); } + mgl_delete_data(a1); } return res; } - n=mglFindInText(str,"&|"); // lowest priority -- logical + n=mglFindInText(str,"&|"); // lowest priority -- logical if(n>=0) return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='|'?cor:cand); - n=mglFindInText(str,"<>="); // low priority -- conditions + n=mglFindInText(str,"<>="); // low priority -- conditions if(n>=0) return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='<'?clt:(str[n]=='>'?cgt:ceq)); - n=mglFindInText(str,"+-"); // normal priority -- additions - if(n>=0 && (n<2 || str[n-1]!='e' || (str[n-2]!='.' && !isdigit(str[n-2])))) - return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='+'?add:sub); - n=mglFindInText(str,"*/"); // high priority -- multiplications + n=mglFindInText(str,"+-"); // normal priority -- additions + if(n>=0 && (n<2 || str[n-1]!='e' || (str[n-2]!='.' && !isdigit(str[n-2])) )) + return str[n]=='+'? mglApplyOperAdd(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperSub(str.substr(0,n),str.substr(n+1),arg, head); + n=mglFindInText(str,"*/"); // high priority -- multiplications if(n>=0) - return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, str[n]=='*'?mul:del); - n=mglFindInText(str,"@"); // high priority -- combine + return str[n]=='*'? mglApplyOperMul(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperDiv(str.substr(0,n),str.substr(n+1),arg, head); + n=mglFindInText(str,"@"); // high priority -- combine if(n>=0) - return mglFormulaCalc(str.substr(0,n),arg, head).Combine(mglFormulaCalc(str.substr(n+1),arg, head)); - n=mglFindInText(str,"^"); // highest priority -- power - if(n>=0) - return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, ipw); - n=mglFindInText(str,":"); // highest priority -- array + { + HMDT a1 = mglFormulaCalc(str.substr(0,n),arg, head); + HMDT a2 = mglFormulaCalc(str.substr(n+1),arg, head); + HMDT res = mgl_data_combine(a1,a2); + mgl_delete_data(a1); mgl_delete_data(a2); + return res; + } + n=mglFindInText(str,"^"); // highest priority -- power + if(n>=0) return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, ipw); + 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]); + HMDT a1=mglFormulaCalc(str.substr(0,n), arg, head); + HMDT a2=mglFormulaCalc(str.substr(n+1), arg, head); + HMDT res = new mglData(abs(int(a2->a[0]+0.5)-int(a1->a[0]+0.5))+1); + res->Fill(a1->a[0], a2->a[0]); + mgl_delete_data(a1); mgl_delete_data(a2); return res; } n=mglFindInText(str,"."); // highest priority -- suffixes - if(n>=0) + wchar_t c0 = str[n+1]; + if(n>=0 && c0>='a' && c0!='e') { mreal x,y,z,k,v=NAN; - mglData d = mglFormulaCalc(str.substr(0,n), arg, head); + HMDT d = mglFormulaCalc(str.substr(0,n), arg, head); + long ns[3] = {d->nx, d->ny, d->nz}; 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(); v = v>0?v:0; } - 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=d.Minimal(); v = v<0?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; } + wchar_t ch = p[1]; + if(c0=='a') + { + if(ch==0) v = d->a[0]; + else + { + d->Momentum(ch,x,y); + if(ch=='a') v = x; + else if(ch>='x' && ch<='z') v = x/ns[ch-'x']; + } + } + else if(c0=='n') + { + if(ch>='x' && ch<='z') v = ns[p[1]-'x']; + else if(!p.compare(L"nmax")) { v=d->MaximalNeg(); } + else if(!p.compare(L"nmin")) { v=d->Minimal(); v = v<0?v:0; } + } + else if(c0=='k') + { + d->Momentum(ch,x,y,z,k); + if(ch=='a') v = k; + else if(ch>='x' && ch<='z') v = k/ns[ch-'x']; + } + else if(c0=='w') + { + d->Momentum(ch,x,y); + if(ch=='a') v = y; + else if(ch>='x' && ch<='z') v = y/ns[ch-'x']; + } + else if(c0=='m') + { + if(ch=='a' && p[2]=='x') v = d->Maximal(); + else if(ch=='i' && p[2]=='n') v = d->Minimal(); + else if(ch=='x') { v = d->Maximal(x,y,z); v = x/ns[0]; } + else if(ch=='y') { v = d->Maximal(x,y,z); v = y/ns[1]; } + else if(ch=='z') { v = d->Maximal(x,y,z); v = z/ns[2]; } + } + else if(c0=='s') + { + if(ch=='u' && p[2]=='m') v = d->Momentum('x',x,y); + else if(ch=='a') + { d->Momentum(ch,x,y,z,k); v = z; } + else if(ch>='x' && ch<='z') + { d->Momentum(ch,x,y,z,k); v = z/ns[ch-'x']; } + } + 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"pmax")) { v=d->Maximal(); v = v>0?v:0; } + else if(!p.compare(L"pmin")) { v=d->MinimalPos(); } + delete d; // if this is valid suffix when finish parsing (it can be mreal number) - if(mgl_isfin(v)) { res.a[0] = v; return res; } + if(mgl_isfin(v)) + { HMDT res = new mglData; 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 + if(v) return new mglData(v); + const mglNum *f = arg?arg->FindNum(str.c_str()):0; + if(f) { HMDT res = new mglData; res->a[0] = f->d; return res; } + else if(!str.compare(L"rnd")) { v=FindVar(head, L"#$mgl"); - if(v) res.Create(v->GetNx(),v->GetNy(),v->GetNz()); - if(!str.compare(L"rnd")) for(long i=0;icurGr) - { - if(res.GetNN()==1) res.Create(100); - res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,'x'); - } - else if(!str.compare(L"y") && arg && arg->curGr) - { - if(res.GetNN()==1) res.Create(100); - res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,res.ny>1?'y':'x'); - } - else if(!str.compare(L"z") && arg && arg->curGr) - { - if(res.GetNN()==1) res.Create(100); - res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,res.nz>1?'z':'x'); - }*/ - else res = wcstod(str.c_str(),0); // this is number + HMDT res = v?new mglData(v->GetNx(),v->GetNy(),v->GetNz()) : new mglData; + for(long i=0;iGetNN();i++) res->a[i] = mgl_rnd(); + return res; + } + else + { + HMDT res = new mglData; + char ch = str[0]; + if(ch<':') res->a[0] = wcstod(str.c_str(),0); // this is number + else if(!str.compare(L"pi")) res->a[0] = M_PI; + else if(ch==':') res->a[0] = -1; + else if(!str.compare(L"nan")) res->a[0] = NAN; + else if(!str.compare(L"inf")) res->a[0] = INFINITY; + return res; } - return res; } else { @@ -360,23 +506,19 @@ mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std HCDT v = FindVar(head, nm); // mglVar *v = arg->FindVar(nm.c_str()); if(!v && !nm.compare(0,7,L"jacobi_")) nm = nm.substr(7); + n = mglFindInText(str,","); 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; + HMDT res = mgl_data_column(v,buf); + delete []buf; return res; } else { - mglData a1, a2, a3; - a1.a[0] = a2.a[0] = a3.a[0] = -1; - n=mglFindInText(str,","); + HMDT a1=0, a2=0, a3=0; if(n>0) { long m=mglFindInText(str.substr(0,n),","); @@ -394,282 +536,187 @@ mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring str, mglParser *arg, const std } } else a1 = mglFormulaCalc(str, arg, head); - res = mglSubData(*v,a1,a2,a3); + HMDT res = mgl_data_subdata_ext(v,a1,a2,a3); + mgl_delete_data(a1); mgl_delete_data(a2); + mgl_delete_data(a3); return res; } } else if(nm[0]=='a') // function { - if(!nm.compare(L"asin")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,asin); } - else if(!nm.compare(L"acos")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,acos); } - else if(!nm.compare(L"atan")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,atan); } + if(!nm.compare(L"asin")) return mglApplyFunc(str, arg, head, asin); + else if(!nm.compare(L"acos")) return mglApplyFunc(str, arg, head, acos); + else if(!nm.compare(L"atan")) return mglApplyFunc(str, arg, head, atan); + else if(!nm.compare(L"asinh")) return mglApplyFunc(str, arg, head, asinh); + else if(!nm.compare(L"acosh")) return mglApplyFunc(str, arg, head, acosh); + else if(!nm.compare(L"atanh")) return mglApplyFunc(str, arg, head, atanh); else if(!nm.compare(L"arg")) { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, atan2); + if(n>0) return mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, atan2); + else + { + HADT a1 = mglFormulaCalcC(str, arg, head); + HMDT res = mgl_datac_arg(a1); + mgl_delete_datac(a1); return res; + } } else if(!nm.compare(L"abs")) { - n=mglFindInText(str,","); - if(n<=0) { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,fabs); } - else res = mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, hypot); + if(n>0) return mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, hypot); + else + { + HADT a1 = mglFormulaCalcC(str, arg, head); + HMDT res = mgl_datac_abs(a1); + mgl_delete_datac(a1); return res; + } } #if MGL_HAVE_GSL else if(!nm.compare(L"ai") || !nm.compare(L"airy_ai")) - { res=mglFormulaCalc(str, arg, head); -#pragma omp parallel for - for(long i=0;i0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_beta); else if(!nm.compare(L"bi")) - { res=mglFormulaCalc(str, arg, head); -#pragma omp parallel for - for(long i=0;i0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Inu); + else if(!nm.compare(L"bessel_j") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Jnu); + else if(!nm.compare(L"bessel_k") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Knu); + else if(!nm.compare(L"bessel_y") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Ynu); #endif } else if(nm[0]=='c') { - if(!nm.compare(L"cos")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,cos); } - else if(!nm.compare(L"cosh") || !nm.compare(L"ch")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,cosh); } + if(!nm.compare(L"cos")) return mglApplyFunc(str, arg, head, cos); + else if(!nm.compare(L"cosh") || !nm.compare(L"ch")) return mglApplyFunc(str, arg, head, cosh); + else if(!nm.compare(L"conj")) + { + HADT a1 = mglFormulaCalcC(str, arg, head); + HMDT res = mgl_datac_real(a1); + mgl_delete_datac(a1); return res; + } #if MGL_HAVE_GSL - else if(!nm.compare(L"ci")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_Ci); } + else if(!nm.compare(L"ci")) return mglApplyFunc(str, arg, head, gsl_sf_Ci); #endif } else if(nm[0]=='e') { - if(!nm.compare(L"exp")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,exp); } + if(!nm.compare(L"exp")) return mglApplyFunc(str, arg, head, exp); #if MGL_HAVE_GSL - else if(!nm.compare(L"erf")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_erf); } -// else if(!nm.compare(L"en")) Kod=EQ_EN; // NOTE: not supported + else if(!nm.compare(L"erf")) return mglApplyFunc(str, arg, head, gsl_sf_erf); else if(!nm.compare(L"ee") || !nm.compare(L"elliptic_ec")) - { res=mglFormulaCalc(str, arg, head); -#pragma omp parallel for - for(long i=0;i0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllE); else if(!nm.compare(L"elliptic_f")) - { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllF); - } + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllF); - else if(!nm.compare(L"ei")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_expint_Ei); } - else if(!nm.compare(L"e1")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_expint_E1); } - else if(!nm.compare(L"e2")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_expint_E2); } - else if(!nm.compare(L"eta")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_eta); } - else if(!nm.compare(L"ei3")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_expint_3); } + else if(!nm.compare(L"ei")) return mglApplyFunc(str, arg, head, gsl_sf_expint_Ei); + else if(!nm.compare(L"e1")) return mglApplyFunc(str, arg, head, gsl_sf_expint_E1); + else if(!nm.compare(L"e2")) return mglApplyFunc(str, arg, head, gsl_sf_expint_E2); + else if(!nm.compare(L"eta")) return mglApplyFunc(str, arg, head, gsl_sf_eta); + else if(!nm.compare(L"ei3")) return mglApplyFunc(str, arg, head, gsl_sf_expint_3); #endif } else if(nm[0]=='l') { - if(!nm.compare(L"log")) - { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, llg); - } - else if(!nm.compare(L"lg")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,log10); } - else if(!nm.compare(L"ln")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,log); } + if(!nm.compare(L"log") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, llg); + else if(!nm.compare(L"lg")) return mglApplyFunc(str, arg, head, log10); + else if(!nm.compare(L"ln")) return mglApplyFunc(str, arg, head, log); #if MGL_HAVE_GSL - else if(!nm.compare(L"li2")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_dilog); } - else if(!nm.compare(L"legendre")) - { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslLegP); - } + else if(!nm.compare(L"li2")) return mglApplyFunc(str, arg, head, gsl_sf_dilog); + else if(!nm.compare(L"legendre") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslLegP); #endif } else if(nm[0]=='s') { - if(!nm.compare(L"sqrt")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,sqrt); } - else if(!nm.compare(L"sin")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,sin); } - else if(!nm.compare(L"step")) - { res=mglFormulaCalc(str, arg, head); -#pragma omp parallel for - for(long i=0;i0?1:0; } - else if(!nm.compare(L"sign")) - { res=mglFormulaCalc(str, arg, head); -#pragma omp parallel for - for(long i=0;i0?1:(res.a[i]<0?-1:0); } - else if(!nm.compare(L"sinh") || !nm.compare(L"sh")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,sinh); } + if(!nm.compare(L"sqrt")) return mglApplyFunc(str, arg, head, sqrt); + else if(!nm.compare(L"sin")) return mglApplyFunc(str, arg, head, sin); + else if(!nm.compare(L"step")) return mglApplyFunc(str, arg, head, stp); + else if(!nm.compare(L"sign")) return mglApplyFunc(str, arg, head, sgn); + else if(!nm.compare(L"sinh") || !nm.compare(L"sh")) return mglApplyFunc(str, arg, head, sinh); #if MGL_HAVE_GSL - else if(!nm.compare(L"si")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_Si); } - else if(!nm.compare(L"sinc")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_sinc); } + else if(!nm.compare(L"si")) return mglApplyFunc(str, arg, head, gsl_sf_Si); + else if(!nm.compare(L"sinc")) return mglApplyFunc(str, arg, head, gsl_sf_sinc); #endif } else if(nm[0]=='t') { if(!nm.compare(L"tg") || !nm.compare(L"tan")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,tan); } + return mglApplyFunc(str, arg, head, tan); else if(!nm.compare(L"tanh") || !nm.compare(L"th")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,tanh); } + return mglApplyFunc(str, arg, head, tanh); } - else if(!nm.compare(L"pow")) + else if(!nm.compare(L"pow") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, pow); + else if(nm[0]=='m') { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, pow); + if(!nm.compare(L"mod") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, fmod); + else if(!nm.compare(L"min") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, fmin); + else if(!nm.compare(L"max") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, fmax); } - else if(!nm.compare(L"mod")) - { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, fmod); - } - else if(!nm.compare(L"int")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,floor); } + else if(!nm.compare(L"int")) return mglApplyFunc(str, arg, head, floor); else if(!nm.compare(L"random")) - { res=mglFormulaCalc(str, arg, head); register long n = res.GetNN(), i; - for(i=0;ia; + for(long i=0;iGetNN();i++) a[i] = mgl_rnd(); return res; } + else if(!nm.compare(L"real")) { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Inu); + HADT a1 = mglFormulaCalcC(str, arg, head); + HMDT res = mgl_datac_real(a1); + mgl_delete_datac(a1); return res; } - else if(!nm.compare(L"j")) + else if(!nm.compare(L"imag")) { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Jnu); + HADT a1 = mglFormulaCalcC(str, arg, head); + HMDT res = mgl_datac_imag(a1); + mgl_delete_datac(a1); return res; } - else if(!nm.compare(L"k")) - { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Knu); - } - else if(!nm.compare(L"y")) - { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Ynu); - } - else if(!nm.compare(L"f")) - { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllF); - } - else if(!nm.compare(L"hypot")) - { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, hypot); - } - else if(!nm.compare(L"gamma")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_gamma); } - else if(!nm.compare(L"gamma_inc")) - { - n=mglFindInText(str,","); - if(n<=0) mglFormulaError=true; - else res = mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_gamma_inc); - } - else if(!nm.compare(L"w0")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_lambert_W0); } - else if(!nm.compare(L"w1")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_lambert_Wm1); } - else if(!nm.compare(L"psi")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_psi); } - else if(!nm.compare(L"zeta")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_zeta); } - else if(!nm.compare(L"z")) - { res=mglFormulaCalc(str, arg, head); mglApplyFunc(res,gsl_sf_dawson); } +#if MGL_HAVE_GSL + else if(!nm.compare(L"i") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Inu); + else if(!nm.compare(L"j") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Jnu); + else if(!nm.compare(L"k") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Knu); + else if(!nm.compare(L"y") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_bessel_Ynu); + else if(!nm.compare(L"f") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gslEllF); + else if(!nm.compare(L"hypot") && n>0) + return mglApplyOper(str.substr(n+1),str.substr(0,n),arg, head, hypot); + else if(!nm.compare(L"gamma")) return mglApplyFunc(str, arg, head, gsl_sf_gamma); + else if(!nm.compare(L"gamma_inc") && n>0) + return mglApplyOper(str.substr(0,n),str.substr(n+1),arg, head, gsl_sf_gamma_inc); + else if(!nm.compare(L"w0")) return mglApplyFunc(str, arg, head, gsl_sf_lambert_W0); + else if(!nm.compare(L"w1")) return mglApplyFunc(str, arg, head, gsl_sf_lambert_Wm1); + else if(!nm.compare(L"psi")) return mglApplyFunc(str, arg, head, gsl_sf_psi); + else if(!nm.compare(L"zeta")) return mglApplyFunc(str, arg, head, gsl_sf_zeta); + else if(!nm.compare(L"z")) return mglApplyFunc(str, arg, head, gsl_sf_dawson); #endif } - return res; + HMDT res = new mglData; res->a[0]=NAN; return res; } //----------------------------------------------------------------------------- dual MGL_LOCAL_CONST ceqc(dual a,dual b) {return a==b?1:0;} dual MGL_LOCAL_CONST cltc(dual a,dual b) {return real(a-b)<0?1:0;} dual MGL_LOCAL_CONST cgtc(dual a,dual b) {return real(a-b)>0?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); } @@ -679,6 +726,7 @@ 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 conjc(dual x); //{ return dual(real(x),-imag(x)); } 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); } @@ -694,160 +742,184 @@ 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);} +dual MGL_LOCAL_CONST realc(dual x) { return real(x); } +dual MGL_LOCAL_CONST imagc(dual x) { return dual(0,imag(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) +HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const std::vector &head) { #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; + if(str.empty()) return new mglDataC; // nothing to parse 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; + HADT res=0; for(i=1,j=1;i0) br--; if(str[i]==',' && !br) { - a1=mglFormulaCalc(str.substr(j,i-j), arg, head); + HADT a1=mglFormulaCalcC(str.substr(j,i-j), arg, head); if(j==1) - { res = a1; ar = (a1.nx==1); mt = (a1.nx>1 && a1.ny==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); } + { k = res->nx; res->Insert('x',k); mgl_datac_put_dat(res,a1,k,-1,-1); } else if(mt) // res 2d array - { k = res.ny; res.Insert('y',k); res.Put(a1,-1,k); } + { k = res->ny; res->Insert('y',k); mgl_datac_put_dat(res,a1,-1,k,-1); } else // res 3d array - { k = res.nz; res.Insert('z',k); res.Put(a1,-1,-1,k); } + { k = res->nz; res->Insert('z',k); mgl_datac_put_dat(res,a1,-1,-1,k); } } - j=i+1; + mgl_delete_datac(a1); j=i+1; } } - a1=mglFormulaCalc(str.substr(j,i-j), arg, head); + HADT a1=mglFormulaCalcC(str.substr(j,i-j), arg, head); if(j==1) - { res = a1; ar = (a1.nx==1); mt = (a1.nx>1 && a1.ny==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); } + { k = res->nx; res->Insert('x',k); mgl_datac_put_dat(res,a1,k,-1,-1); } else if(mt) // res 2d array - { k = res.ny; res.Insert('y',k); res.Put(a1,-1,k); } + { k = res->ny; res->Insert('y',k); mgl_datac_put_dat(res,a1,-1,k,-1); } else // res 3d array - { k = res.nz; res.Insert('z',k); res.Put(a1,-1,-1,k); } + { k = res->nz; res->Insert('z',k); mgl_datac_put_dat(res,a1,-1,-1,k); } } - return res; + mgl_delete_datac(a1); return res; } - n=mglFindInText(str,"<>="); // low priority -- conditions + 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 + 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 + return str[n]=='+'? mglApplyOperAddC(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperSubC(str.substr(0,n),str.substr(n+1),arg, head); + 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 + return str[n]=='*'? mglApplyOperMulC(str.substr(0,n),str.substr(n+1),arg, head) : mglApplyOperDivC(str.substr(0,n),str.substr(n+1),arg, head); + n=mglFindInText(str,"@"); // high priority -- combine if(n>=0) - return mglFormulaCalcC(str.substr(0,n),arg, head).Combine(mglFormulaCalcC(str.substr(n+1),arg, head));*/ + { + HADT a1 = mglFormulaCalcC(str.substr(0,n),arg, head); + HADT a2 = mglFormulaCalcC(str.substr(n+1),arg, head); + HADT res = mgl_datac_combine(a1,a2); + mgl_delete_datac(a1); mgl_delete_datac(a2); + return res; + } 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]); + HMDT a1=mglFormulaCalc(str.substr(0,n), arg, head); + HMDT a2=mglFormulaCalc(str.substr(n+1), arg, head); + HADT res = new mglDataC(abs(int(a2->a[0]+0.5)-int(a1->a[0]+0.5))+1); + res->Fill(a1->a[0], a2->a[0]); + mgl_delete_data(a1); mgl_delete_data(a2); return res; } n=mglFindInText(str,"."); // highest priority -- suffixes - if(n>=0) + wchar_t c0 = str[n+1]; + if(n>=0 && c0>='a' && c0!='e') { - mreal x,y,z,k; dual v=NAN; - mglDataC d = mglFormulaCalcC(str.substr(0,n), arg, head); + HADT d = mglFormulaCalcC(str.substr(0,n), arg, head); + long ns[3] = {d->nx, d->ny, d->nz}; 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; } + wchar_t ch = p[1]; + if(c0=='a') + { + if(ch==0) v = d->a[0]; + else + { + mreal x,y; + d->Momentum(ch,x,y); + if(ch=='a') v = x; + else if(ch>='x' && ch<='z') v = x/ns[ch-'x']; + } + } + else if(c0=='n' && ch>='x' && ch<='z') v = ns[ch-'x']; + else if(c0=='k') + { + mreal x,y,z,k; + d->Momentum(ch,x,y,z,k); + if(ch=='a') v = k; + else if(ch>='x' && ch<='z') v = k/ns[ch-'x']; + } + else if(c0=='w') + { + mreal x,y; + d->Momentum(ch,x,y); + if(ch=='a') v = y; + else if(ch>='x' && ch<='z') v = y/ns[ch-'x']; + } + else if(c0=='m') + { + mreal x,y,z; + if(ch=='a' && p[2]=='x') v = d->Maximal(); + else if(ch=='i' && p[2]=='n') v = d->Minimal(); + else if(ch=='x') { v = d->Maximal(x,y,z); v = x/ns[0]; } + else if(ch=='y') { v = d->Maximal(x,y,z); v = y/ns[1]; } + else if(ch=='z') { v = d->Maximal(x,y,z); v = z/ns[2]; } + } + else if(c0=='s') + { + mreal x,y,z,k; + if(ch=='u' && p[2]=='m') v = d->Momentum('x',x,y); + else if(ch=='a') + { d->Momentum(ch,x,y,z,k); v = z; } + else if(ch>='x' && ch<='z') + { d->Momentum(ch,x,y,z,k); v = z/ns[ch-'x']; } + } + 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); } + delete d; // if this is valid suffix when finish parsing (it can be mreal number) - if(mgl_isfin(v)) { res.a[0] = v; return res; } + if(mgl_isfin(v)) + { HADT res = new mglDataC; 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 + if(v) return new mglDataC(v); + const mglNum *f = arg?arg->FindNum(str.c_str()):0; + if(f) { HADT res = new mglDataC; res->a[0] = f->c; return res; } + else if(!str.compare(L"rnd")) { v=FindVar(head, L"#$mgl"); - if(v) res.Create(v->GetNx(),v->GetNy(),v->GetNz()); - if(!str.compare(L"rnd")) for(long i=0;icurGr) - res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,'x'); - else if(!str.compare(L"y") && arg && arg->curGr) - res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,res.ny>1?'y':'x'); - else if(!str.compare(L"z") && arg && arg->curGr) - res.Fill(arg->curGr->Min.x, arg->curGr->Max.x,res.nz>1?'z':'x');*/ - else if(str[0]=='i') // this is imaginary number - res = dual(0,(str.length()>1 && str[1]>' ')?wcstod(str.c_str(),0):1); - else res = mreal(wcstod(str.c_str(),0)); // this is real number + HADT res = v?new mglDataC(v->GetNx(),v->GetNy(),v->GetNz()) : new mglDataC; + for(long i=0;iGetNN();i++) + res->a[i] = dual(mgl_rnd(), mgl_rnd()); + return res; + } + else + { + HADT res = new mglDataC; + char ch = str[0]; + if(ch<':') // this is real number + res->a[0] = (str[str.length()-1]=='i') ? dual(0,wcstod(str.c_str(),0)) : mreal(wcstod(str.c_str(),0)); + else if(ch=='i') // this is imaginary number + res->a[0] = dual(0,str[1]>' '?wcstod(str.c_str()+1,0):1); + else if(!str.compare(L"pi")) res->a[0] = M_PI; + else if(ch==':') res->a[0] = -1; + else if(!str.compare(L"nan")) res->a[0] = NAN; + else if(!str.compare(L"inf")) res->a[0] = INFINITY; + return res; } - return res; } else { @@ -856,98 +928,83 @@ mglDataC MGL_NO_EXPORT mglFormulaCalcC(std::wstring str, mglParser *arg, const s HCDT v = FindVar(head, nm); // mglVar *v = arg->FindVar(nm.c_str()); if(!v && !nm.compare(0,7,L"jacobi_")) nm = nm.substr(7); + n = mglFindInText(str,","); 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; + HADT res = mgl_datac_column(v,buf); + delete []buf; return res; } else { - mglData a1, a2, a3; - a1.a[0] = a2.a[0] = a3.a[0] = -1; - n=mglFindInText(str,","); + HMDT a1=0, a2=0, a3=0; 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); + a1 = mglFormulaCalc(str.substr(0,m), arg, head); + a2 = mglFormulaCalc(str.substr(m+1,n-m-1), arg, head); + a3 = mglFormulaCalc(str.substr(n+1), arg, head); } else { - a1 = mglFormulaCalcC(str.substr(0,n), arg, head); - a2 = mglFormulaCalcC(str.substr(n+1), arg, head); + a1 = mglFormulaCalc(str.substr(0,n), arg, head); + a2 = mglFormulaCalc(str.substr(n+1), arg, head); } } - else a1 = mglFormulaCalcC(str, arg, head); - res = mglSubData(*v,a1,a2,a3); + else a1 = mglFormulaCalc(str, arg, head); + HADT res = mgl_datac_subdata_ext(v,a1,a2,a3); + mgl_delete_data(a1); mgl_delete_data(a2); + mgl_delete_data(a3); return res; } } 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); } + if(!nm.compare(L"asin")) return mglApplyFuncC(str, arg, head, asinc); + else if(!nm.compare(L"acos")) return mglApplyFuncC(str, arg, head, acosc); + else if(!nm.compare(L"atan")) return mglApplyFuncC(str, arg, head, atanc); + else if(!nm.compare(L"asinh")) return mglApplyFuncC(str, arg, head, asinhc); + else if(!nm.compare(L"acosh")) return mglApplyFuncC(str, arg, head, acoshc); + else if(!nm.compare(L"atanh")) return mglApplyFuncC(str, arg, head, atanhc); + else if(!nm.compare(L"arg")) return mglApplyFuncC(str, arg, head, argc); + else if(!nm.compare(L"abs")) return mglApplyFuncC(str, arg, head, 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); } + if(!nm.compare(L"cos")) return mglApplyFuncC(str, arg, head, cosc); + else if(!nm.compare(L"cosh") || !nm.compare(L"ch")) return mglApplyFuncC(str, arg, head, coshc); + else if(!nm.compare(L"conj")) return mglApplyFuncC(str, arg, head, conjc); } - else if(!nm.compare(L"exp")) - { res=mglFormulaCalcC(str, arg, head); mglApplyFuncC(res,expc); } + else if(!nm.compare(L"exp")) return mglApplyFuncC(str, arg, head, 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); } + if(!nm.compare(L"log") || !nm.compare(L"ln")) return mglApplyFuncC(str, arg, head, logc); + else if(!nm.compare(L"lg")) return mglApplyFuncC(str, arg, head, 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); } + if(!nm.compare(L"sqrt")) return mglApplyFuncC(str, arg, head, sqrtc); + else if(!nm.compare(L"sin")) return mglApplyFuncC(str, arg, head, sinc); + else if(!nm.compare(L"sinh") || !nm.compare(L"sh")) return mglApplyFuncC(str, arg, head, 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); + if(!nm.compare(L"tg") || !nm.compare(L"tan")) return mglApplyFuncC(str, arg, head, tanc); + else if(!nm.compare(L"tanh") || !nm.compare(L"th")) return mglApplyFuncC(str, arg, head, tanhc); } + else if(!nm.compare(L"pow") && n>0) + return 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;ia; + for(long i=0;iGetNN();i++) a[i] = dual(mgl_rnd(), mgl_rnd()); return res; } + else if(!nm.compare(L"real")) return mglApplyFuncC(str, arg, head, realc); + else if(!nm.compare(L"imag")) return mglApplyFuncC(str, arg, head, imagc); } - return res; + HADT res = new mglDataC; res->a[0]=NAN; return res; } //----------------------------------------------------------------------------- diff --git a/src/exec.cpp b/src/exec.cpp index e91e1ac..98e8b0a 100644 --- a/src/exec.cpp +++ b/src/exec.cpp @@ -26,7 +26,6 @@ #include "mgl2/base.h" #include "mgl2/parser.h" -inline long iint(mreal x) {return long(x+0.5);} wchar_t *mgl_str_copy(const char *s); //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_addlegend(mglGraph *gr, long , mglArg *a, const char *k, const char *) @@ -39,27 +38,30 @@ int MGL_NO_EXPORT mgls_addlegend(mglGraph *gr, long , mglArg *a, const char *k, int MGL_NO_EXPORT mgls_addto(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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; + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dd")) *d += *(a[1].d); + else if(d && !strcmp(k,"dn")) *d += a[1].v; + else if(c && !strcmp(k,"dd")) *c += *(a[1].d); + else if(c && !strcmp(k,"dn")) *c += a[1].c; else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_sort(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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); + if(d && !strcmp(k,"dn")) d->Sort(a[1].v, -1); + else if(d && !strcmp(k,"dnn")) d->Sort(a[1].v, a[2].v); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_alpha(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->Alpha(true); + if(k[0]==0) gr->Alpha(true); else if(!strcmp(k,"n")) gr->Alpha(a[0].v!=0); else res = 1; return res; } @@ -76,7 +78,7 @@ int MGL_NO_EXPORT mgls_mask(mglGraph *gr, long , mglArg *a, const char *k, const int res=0; if(!strcmp(k,"sn")) gr->SetMask(a[0].s[0],a[1].v); else if(!strcmp(k,"ss")) gr->SetMask(a[0].s[0],a[1].s.c_str()); - else if(!strcmp(k,"n")) gr->SetMaskAngle(iint(a[0].v)); + else if(!strcmp(k,"n")) gr->SetMaskAngle(mgl_int(a[0].v)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -134,12 +136,14 @@ int MGL_NO_EXPORT mgls_axial(mglGraph *gr, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_axis(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - if(!strcmp(k,"")) gr->Axis("xyz","",opt); + if(k[0]==0) gr->Axis("xyz","",opt); else if(!strcmp(k,"s")) gr->Axis(a[0].s.c_str(), "",opt); else if(!strcmp(k,"ss")) gr->Axis(a[0].s.c_str(), a[1].s.c_str(),opt); else if(!strcmp(k,"sss")) gr->SetFunc(a[0].s.c_str(),a[1].s.c_str(),a[2].s.c_str(),""); else if(!strcmp(k,"ssss")) gr->SetFunc(a[0].s.c_str(),a[1].s.c_str(),a[2].s.c_str(),a[3].s.c_str()); - else if(!strcmp(k,"n")) gr->SetCoor(iint(a[0].v)); + else if(!strcmp(k,"n")) gr->SetCoor(mgl_int(a[0].v)); + else if(!strcmp(k,"nnnn")) gr->SetRanges(a[0].v,a[2].v, a[1].v,a[3].v); + else if(!strcmp(k,"nnnnnn"))gr->SetRanges(a[0].v,a[3].v, a[1].v,a[4].v, a[2].v,a[5].v); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -156,7 +160,7 @@ int MGL_NO_EXPORT mgls_ball(mglGraph *gr, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_box(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; gr->Self()->SaveState(opt); - if(!strcmp(k,"")) gr->Box(); + if(k[0]==0) gr->Box(); else if(!strcmp(k,"s")) gr->Box(a[0].s.c_str()); else if(!strcmp(k,"sn")) gr->Box(a[0].s.c_str(), a[1].v); else res = 1; gr->Self()->LoadState(); return res; @@ -234,22 +238,22 @@ int MGL_NO_EXPORT mgls_beam(mglGraph *gr, long , mglArg *a, const char *k, const else if(!strcmp(k,"ddddns")) gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),0, 3); else if(!strcmp(k,"ddddnsn")) - gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),iint(a[6].v), 3); + gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),mgl_int(a[6].v), 3); else if(!strcmp(k,"ddddnsnn")) - gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),iint(a[6].v), iint(a[7].v)); + gr->Beam(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].v,a[5].s.c_str(),mgl_int(a[6].v), mgl_int(a[7].v)); else if(!strcmp(k,"nddddn")) gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,"",0); else if(!strcmp(k,"nddddns")) gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,a[6].s.c_str(),0); else if(!strcmp(k,"nddddnsn")) - gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,a[6].s.c_str(),iint(a[7].v)); + gr->Beam(a[0].v,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].v,a[6].s.c_str(),mgl_int(a[7].v)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_clearlegend(mglGraph *gr, long , mglArg *, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->ClearLegend(); + if(k[0]==0) gr->ClearLegend(); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -269,7 +273,7 @@ int MGL_NO_EXPORT mgls_background(mglGraph *gr, long , mglArg *a, const char *k, int MGL_NO_EXPORT mgls_clf(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->Clf(); + if(k[0]==0) gr->Clf(); 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; @@ -278,7 +282,7 @@ int MGL_NO_EXPORT mgls_clf(mglGraph *gr, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_reset(mglGraph *gr, long , mglArg *, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->DefaultPlotParam(); + if(k[0]==0) gr->DefaultPlotParam(); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -317,27 +321,31 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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]); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dnns")) d->Crop(mgl_int(a[1].v),mgl_int(a[2].v),a[3].s.c_str()[0]); + else if(c && !strcmp(k,"dnns")) c->Crop(mgl_int(a[1].v),mgl_int(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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!d) return 1; - if(!strcmp(k,"dn")) d->Clean(iint(a[1].v)); + if(d && !strcmp(k,"dn")) d->Clean(mgl_int(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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!d) return 1; - if(!strcmp(k,"ds")) d->CumSum(a[1].s.c_str()); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->CumSum(a[1].s.c_str()); + else if(c && !strcmp(k,"ds")) c->CumSum(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -388,7 +396,7 @@ int MGL_NO_EXPORT mgls_crust(mglGraph *gr, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_colorbar(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; gr->Self()->SaveState(opt); - if(!strcmp(k,"")) gr->Colorbar(); + if(k[0]==0) gr->Colorbar(); else if(!strcmp(k,"s")) gr->Colorbar(a[0].s.c_str()); else if(!strcmp(k,"d")) gr->Colorbar(*(a[0].d)); else if(!strcmp(k,"ds")) gr->Colorbar(*(a[0].d), a[1].s.c_str()); @@ -405,11 +413,21 @@ 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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!d) return 1; - if(!strcmp(k,"dd")) d->Set(*(a[1].d)); + mglDataC *c = dynamic_cast(a[0].d); + if(c && !strcmp(k,"dd")) c->Set(a[1].d); + else if(!d) return 1; + else if(!strcmp(k,"dd")) d->Set(a[1].d); else if(!strcmp(k,"dds")) - { d->Set(*(a[1].d)); gr->Fill(*d, a[2].s.c_str()); } + { d->Set(a[1].d); gr->Fill(*d, a[2].s.c_str()); } + else if(!strcmp(k,"ddd")) + { + mglData *D = dynamic_cast(a[1].d); + mglDataC *C = dynamic_cast(a[2].d); + if(D && C) { d->Set(C->Real()); D->Set(C->Imag()); } + else res = 1; + } else if(!strcmp(k,"dn")) *d = a[1].v; else res = 1; return res; } @@ -475,16 +493,16 @@ int MGL_NO_EXPORT mgls_cont3(mglGraph *gr, long , mglArg *a, const char *k, cons int res=0; if(!strcmp(k,"d")) gr->Cont3(*(a[0].d), "", -1,opt); else if(!strcmp(k,"ds")) gr->Cont3(*(a[0].d), a[1].s.c_str(), -1,opt); - else if(!strcmp(k,"dsn")) gr->Cont3(*(a[0].d), a[1].s.c_str(), iint(a[2].v),opt); + else if(!strcmp(k,"dsn")) gr->Cont3(*(a[0].d), a[1].s.c_str(), mgl_int(a[2].v),opt); else if(!strcmp(k,"dd")) gr->Cont3(*(a[0].d), *(a[1].d), "", -1,opt); else if(!strcmp(k,"dds")) gr->Cont3(*(a[0].d), *(a[1].d), a[2].s.c_str(),-1,opt); - else if(!strcmp(k,"ddsn")) gr->Cont3(*(a[0].d), *(a[1].d), a[2].s.c_str(),iint(a[3].v),opt); + else if(!strcmp(k,"ddsn")) gr->Cont3(*(a[0].d), *(a[1].d), a[2].s.c_str(),mgl_int(a[3].v),opt); else if(!strcmp(k,"dddd")) gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "", -1,opt); else if(!strcmp(k,"dddds")) gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),-1,opt); - else if(!strcmp(k,"ddddsn")) gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),iint(a[5].v),opt); + else if(!strcmp(k,"ddddsn")) gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),mgl_int(a[5].v),opt); else if(!strcmp(k,"ddddd")) gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), "", -1,opt); else if(!strcmp(k,"ddddds")) gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),-1,opt); - else if(!strcmp(k,"dddddsn"))gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),iint(a[6].v),opt); + else if(!strcmp(k,"dddddsn"))gr->Cont3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),mgl_int(a[6].v),opt); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -493,16 +511,16 @@ int MGL_NO_EXPORT mgls_contf3(mglGraph *gr, long , mglArg *a, const char *k, con int res=0; if(!strcmp(k,"d")) gr->ContF3(*(a[0].d), "", -1,opt); else if(!strcmp(k,"ds")) gr->ContF3(*(a[0].d), a[1].s.c_str(), -1,opt); - else if(!strcmp(k,"dsn")) gr->ContF3(*(a[0].d), a[1].s.c_str(), iint(a[2].v),opt); + else if(!strcmp(k,"dsn")) gr->ContF3(*(a[0].d), a[1].s.c_str(), mgl_int(a[2].v),opt); else if(!strcmp(k,"dd")) gr->ContF3(*(a[0].d), *(a[1].d), "", -1,opt); else if(!strcmp(k,"dds")) gr->ContF3(*(a[0].d), *(a[1].d), a[2].s.c_str(),-1,opt); - else if(!strcmp(k,"ddsn")) gr->ContF3(*(a[0].d), *(a[1].d), a[2].s.c_str(),iint(a[3].v),opt); + else if(!strcmp(k,"ddsn")) gr->ContF3(*(a[0].d), *(a[1].d), a[2].s.c_str(),mgl_int(a[3].v),opt); else if(!strcmp(k,"dddd")) gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), "", -1,opt); else if(!strcmp(k,"dddds")) gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),-1,opt); - else if(!strcmp(k,"ddddsn")) gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),iint(a[5].v),opt); + else if(!strcmp(k,"ddddsn")) gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), a[4].s.c_str(),mgl_int(a[5].v),opt); else if(!strcmp(k,"ddddd")) gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), "", -1,opt); else if(!strcmp(k,"ddddds")) gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),-1,opt); - else if(!strcmp(k,"dddddsn"))gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),iint(a[6].v),opt); + else if(!strcmp(k,"dddddsn"))gr->ContF3(*(a[0].d), *(a[1].d), *(a[2].d), *(a[3].d), *(a[4].d), a[5].s.c_str(),mgl_int(a[6].v),opt); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -612,13 +630,13 @@ int MGL_NO_EXPORT mgls_polygon(mglGraph *gr, long , mglArg *a, const char *k, co { 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)); + gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), mgl_int(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()); + gr->Polygon(mglPoint(a[0].v,a[1].v,NAN), mglPoint(a[2].v,a[3].v,NAN), mgl_int(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)); + gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), mgl_int(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()); + gr->Polygon(mglPoint(a[0].v,a[1].v,a[2].v), mglPoint(a[3].v,a[4].v,a[5].v), mgl_int(a[6].v), a[7].s.c_str()); else res = 1; gr->Self()->LoadState(); return res; } //----------------------------------------------------------------------------- @@ -655,10 +673,10 @@ int MGL_NO_EXPORT mgls_dens3(mglGraph *gr, long , mglArg *a, const char *k, cons int res=0; if(!strcmp(k,"d")) gr->Dens3(*(a[0].d),"",-1,opt); else if(!strcmp(k,"ds")) gr->Dens3(*(a[0].d),a[1].s.c_str(),-1,opt); - else if(!strcmp(k,"dsn")) gr->Dens3(*(a[0].d),a[1].s.c_str(),iint(a[2].v),opt); + else if(!strcmp(k,"dsn")) gr->Dens3(*(a[0].d),a[1].s.c_str(),mgl_int(a[2].v),opt); else if(!strcmp(k,"dddd")) gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"", -1,opt); else if(!strcmp(k,"dddds")) gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),-1,opt); - else if(!strcmp(k,"ddddsn")) gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),iint(a[5].v),opt); + else if(!strcmp(k,"ddddsn")) gr->Dens3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),mgl_int(a[5].v),opt); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -692,30 +710,39 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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; + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dd")) *d /= *(a[1].d); + else if(d && !strcmp(k,"dn")) *d /= a[1].v; + else if(c && !strcmp(k,"dd")) *c /= *(a[1].d); + else if(c && !strcmp(k,"dn")) *c /= a[1].c; else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_multo(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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; + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dd")) *d *= *(a[1].d); + else if(d && !strcmp(k,"dn")) *d *= a[1].v; + else if(c && !strcmp(k,"dd")) *c *= *(a[1].d); + else if(c && !strcmp(k,"dn")) *c *= a[1].c; else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_subto(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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; + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dd")) *d -= *(a[1].d); + else if(d && !strcmp(k,"dn")) *d -= a[1].v; + else if(c && !strcmp(k,"dd")) *c -= *(a[1].d); + else if(c && !strcmp(k,"dn")) *c -= a[1].c; else res = 1; return res; } //----------------------------------------------------------------------------- @@ -734,20 +761,26 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->Diff(a[1].s.c_str()); + else if(d && !strcmp(k,"ddd")) d->Diff(*(a[1].d), *(a[2].d)); + else if(d && !strcmp(k,"dddd")) d->Diff(*(a[1].d), *(a[2].d), *(a[3].d)); + else if(c && !strcmp(k,"ds")) c->Diff(a[1].s.c_str()); +// else if(c && !strcmp(k,"ddd")) c->Diff(*(a[1].d), *(a[2].d)); // TODO Add later +// else if(c && !strcmp(k,"dddd")) c->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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!d) return 1; - if(!strcmp(k,"ds")) d->Diff2(a[1].s.c_str()); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->Diff2(a[1].s.c_str()); + else if(c && !strcmp(k,"ds")) c->Diff2(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -833,6 +866,16 @@ int MGL_NO_EXPORT mgls_surfa(mglGraph *gr, long , mglArg *a, const char *k, cons else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_surfca(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) +{ + int res=0; + if(!strcmp(k,"ddd")) gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),"",opt); + else if(!strcmp(k,"ddds")) gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt); + else if(!strcmp(k,"ddddd")) gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),"",opt); + else if(!strcmp(k,"ddddds"))gr->SurfCA(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),a[5].s.c_str(),opt); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_flow(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; @@ -881,45 +924,76 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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); + mglDataC *c = dynamic_cast(a[0].d); + if(d && k[0]=='d') + { + 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; + } + else if(c && k[0]=='d') + { + if(!strcmp(k,"dnn")) c->Fill(a[1].v,a[2].v); + else if(!strcmp(k,"dnns")) c->Fill(a[1].v,a[2].v,a[3].s.c_str()[0]); + else if(!strcmp(k,"ds")) gr->Fill(*c,a[1].s.c_str(),opt); + else if(!strcmp(k,"dsd")) gr->Fill(*c,a[1].s.c_str(), *(a[2].d),opt); + else if(!strcmp(k,"dsdd")) gr->Fill(*c,a[1].s.c_str(), *(a[2].d), *(a[3].d),opt); + else res = 1; + } 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(k[0]=='d' && a[0].d->temp) return 5; 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); + mglDataC *c = dynamic_cast(a[0].d); + if(d && k[0]=='d' && k[1]=='d' && k[2]=='d') + { + if(k[3]==0) gr->Refill(*d,*(a[1].d),*(a[2].d),-1,opt); + else if(!strcmp(k+3,"n")) gr->Refill(*d,*(a[1].d),*(a[2].d),mgl_int(a[3].v),opt); + else if(!strcmp(k+3,"d")) gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),-1,opt); + else if(!strcmp(k+3,"dn")) gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),mgl_int(a[4].v),opt); + else if(!strcmp(k+3,"dd")) gr->Refill(*d,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),opt); + else res = 1; + } + else if(c && k[0]=='d' && k[1]=='d' && k[2]=='d') + { + if(k[3]==0) gr->Refill(*c,*(a[1].d),*(a[2].d),-1,opt); + else if(!strcmp(k+3,"n")) gr->Refill(*c,*(a[1].d),*(a[2].d),mgl_int(a[3].v),opt); + else if(!strcmp(k+3,"d")) gr->Refill(*c,*(a[1].d),*(a[2].d),*(a[3].d),-1,opt); + else if(!strcmp(k+3,"dn")) gr->Refill(*c,*(a[1].d),*(a[2].d),*(a[3].d),mgl_int(a[4].v),opt); + else if(!strcmp(k+3,"dd")) gr->Refill(*c,*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),opt); + else res = 1; + } 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; + if(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ddd")) d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,-1); + else if(d && !strcmp(k,"dddn")) d->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,mgl_int(a[3].v)); + else if(c && !strcmp(k,"ddd")) c->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,-1); + else if(c && !strcmp(k,"dddn")) c->RefillGS(*(a[1].d),*(a[2].d),gr->Self()->Min.x,gr->Self()->Max.x,mgl_int(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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!d) return 1; - if(!strcmp(k,"ds")) d->FillSample(a[1].s.c_str()); + if(d && !strcmp(k,"ds")) d->FillSample(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -943,7 +1017,7 @@ int MGL_NO_EXPORT mgls_font(mglGraph *gr, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_loadfont(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"") || (!strcmp(k,"s") && a[0].s[0]==0)) gr->RestoreFont(); + if(k[0]==0 || (!strcmp(k,"s") && a[0].s[0]==0)) gr->RestoreFont(); else if(!strcmp(k,"s")) gr->LoadFont(a[0].s.c_str()); else res = 1; return res; } @@ -951,7 +1025,7 @@ int MGL_NO_EXPORT mgls_loadfont(mglGraph *gr, long , mglArg *a, const char *k, c int MGL_NO_EXPORT mgls_grid(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - if(!strcmp(k,"")) gr->Grid("xyzt", "B",opt); + if(k[0]==0) gr->Grid("xyzt", "B",opt); else if(!strcmp(k,"s")) gr->Grid(a[0].s.c_str(), "B",opt); else if(!strcmp(k,"ss"))gr->Grid(a[0].s.c_str(), a[1].s.c_str(),opt); else res = 1; return res; @@ -972,35 +1046,42 @@ int MGL_NO_EXPORT mgls_grid3(mglGraph *gr, long , mglArg *a, const char *k, cons int res=0; if(!strcmp(k,"d")) gr->Grid3(*(a[0].d),"",-1,opt); else if(!strcmp(k,"ds")) gr->Grid3(*(a[0].d),a[1].s.c_str(),-1,opt); - else if(!strcmp(k,"dsn")) gr->Grid3(*(a[0].d),a[1].s.c_str(),iint(a[2].v),opt); + else if(!strcmp(k,"dsn")) gr->Grid3(*(a[0].d),a[1].s.c_str(),mgl_int(a[2].v),opt); else if(!strcmp(k,"dddd")) gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),"",-1,opt); else if(!strcmp(k,"dddds")) gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),-1,opt); - else if(!strcmp(k,"ddddsn"))gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),iint(a[5].v),opt); + else if(!strcmp(k,"ddddsn"))gr->Grid3(*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),a[4].s.c_str(),mgl_int(a[5].v),opt); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_light(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->Light(true); + if(k[0]==0) gr->Light(true); else if(!strcmp(k,"n")) gr->Light(a[0].v!=0); - else if(!strcmp(k,"nn")) gr->Light(iint(a[0].v),a[1].v!=0); - else if(!strcmp(k,"nnnn")) gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v)); - else if(!strcmp(k,"nnnns")) gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0]); - else if(!strcmp(k,"nnnnsn"))gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v); + else if(!strcmp(k,"nn")) gr->Light(mgl_int(a[0].v),a[1].v!=0); + else if(!strcmp(k,"nnnn")) gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v)); + else if(!strcmp(k,"nnnns")) gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0]); + else if(!strcmp(k,"nnnnsn"))gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v); else if(!strcmp(k,"nnnnsnn")) - gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v,a[6].v); + gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v), a[4].s.c_str()[0],a[5].v,a[6].v); else if(!strcmp(k,"nnnnnnn")) - gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v)); + gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v)); else if(!strcmp(k,"nnnnnnns")) - gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0]); + gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0]); else if(!strcmp(k,"nnnnnnnsn")) - gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v); + gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v); else if(!strcmp(k,"nnnnnnnsnn")) - gr->AddLight(iint(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v,a[9].v); + gr->AddLight(mgl_int(a[0].v),mglPoint(a[1].v,a[2].v,a[3].v),mglPoint(a[4].v,a[5].v,a[6].v), a[7].s.c_str()[0],a[8].v,a[9].v); return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_attachlight(mglGraph *gr, long , mglArg *a, const char *k, const char *) +{ + int res=0; + if(!strcmp(k,"n")) gr->AttachLight(a[0].v!=0); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_line(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; gr->Self()->SaveState(opt); @@ -1032,9 +1113,9 @@ int MGL_NO_EXPORT mgls_errbox(mglGraph *gr, long , mglArg *a, const char *k, con int MGL_NO_EXPORT mgls_legend(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - if(!strcmp(k,"")) gr->Legend(3, "#", opt); - else if(!strcmp(k,"n")) gr->Legend(iint(a[0].v), "#", opt); - else if(!strcmp(k,"ns")) gr->Legend(iint(a[0].v), a[1].s.c_str(), opt); + if(k[0]==0) gr->Legend(3, "#", opt); + else if(!strcmp(k,"n")) gr->Legend(mgl_int(a[0].v), "#", opt); + else if(!strcmp(k,"ns")) gr->Legend(mgl_int(a[0].v), a[1].s.c_str(), opt); else if(!strcmp(k,"nn")) gr->Legend(a[0].v, a[1].v, "#", opt); else if(!strcmp(k,"nns")) gr->Legend(a[0].v, a[1].v, a[2].s.c_str(), opt); else res = 1; return res; @@ -1050,46 +1131,53 @@ int MGL_NO_EXPORT mgls_barwidth(mglGraph *gr, long , mglArg *a, const char *k, c int MGL_NO_EXPORT mgls_legendmarks(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"n")) gr->SetLegendMarks(iint(a[0].v)); + if(!strcmp(k,"n")) gr->SetLegendMarks(mgl_int(a[0].v)); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_modify(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->Modify(a[1].s.c_str()); + else if(d && !strcmp(k,"dsn")) d->Modify(a[1].s.c_str(), mgl_int(a[2].v)); + else if(d && !strcmp(k,"dsd")) d->Modify(a[1].s.c_str(),*(a[2].d)); + else if(d && !strcmp(k,"dsdd")) d->Modify(a[1].s.c_str(),*(a[2].d),*(a[3].d)); + else if(c && !strcmp(k,"ds")) c->Modify(a[1].s.c_str()); + else if(c && !strcmp(k,"dsn")) c->Modify(a[1].s.c_str(), mgl_int(a[2].v)); + else if(c && !strcmp(k,"dsd")) c->Modify(a[1].s.c_str(),*(a[2].d)); + else if(c && !strcmp(k,"dsdd")) c->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(k[0]=='d' && a[0].d->temp) return 5; 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())); + if(d && !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(k[0]=='d' && a[0].d->temp) return 5; 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())); + if(d && !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(k[0]=='d' && a[0].d->temp) return 5; 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())); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dds")) *d = mglData(true,mgl_data_sum(a[1].d,a[2].s.c_str())); + else if(c && !strcmp(k,"dds")) *c = mglDataC(true,mgl_datac_sum(a[1].d,a[2].s.c_str())); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1110,8 +1198,8 @@ int MGL_NO_EXPORT mgls_facenum(mglGraph *gr, long , mglArg *a, const char *k, co int MGL_NO_EXPORT mgls_quality(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->SetQuality(); - else if(!strcmp(k,"n")) gr->SetQuality(iint(a[0].v)); + if(k[0]==0) gr->SetQuality(); + else if(!strcmp(k,"n")) gr->SetQuality(mgl_int(a[0].v)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1148,26 +1236,38 @@ int MGL_NO_EXPORT mgls_read(mglGraph *gr, long , mglArg *a, const char *k, const { int res=0; bool rr=true; + if(k[0]=='d' && a[0].d->temp) return 5; + if(k[1]=='d' && a[1].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); mglData *f = dynamic_cast(a[1].d); - if(!d) return 1; - mglDataC c; - if(!strcmp(k,"ds")) - { rr=c.Read(a[1].s.c_str()); *d = c.Real(); } - else if(!strcmp(k,"dsn")) - { rr=c.Read(a[1].s.c_str(), iint(a[2].v)); *d = c.Real(); } - else if(!strcmp(k,"dsnn")) - { rr=c.Read(a[1].s.c_str(), iint(a[2].v),iint(a[3].v)); *d = c.Real(); } - else if(!strcmp(k,"dsnnn")) - { rr=c.Read(a[1].s.c_str(), iint(a[2].v),iint(a[3].v),iint(a[4].v)); *d = c.Real(); } - if(!strcmp(k,"dds") && f) - { rr=c.Read(a[2].s.c_str()); *d = c.Real(); *f = c.Imag(); } - if(!strcmp(k,"ddsn") && f) - { rr=c.Read(a[2].s.c_str(), iint(a[3].v)); *d = c.Real(); *f = c.Imag(); } - if(!strcmp(k,"ddsnn") && f) - { rr=c.Read(a[2].s.c_str(), iint(a[3].v),iint(a[4].v)); *d = c.Real(); *f = c.Imag(); } - if(!strcmp(k,"ddsnnn") && f) - { rr=c.Read(a[2].s.c_str(), iint(a[3].v),iint(a[4].v),iint(a[5].v)); *d = c.Real(); *f = c.Imag(); } + mglDataC *c = dynamic_cast(a[0].d); + if(c) + { + if(!strcmp(k,"ds")) rr=c->Read(a[1].s.c_str()); + else if(!strcmp(k,"dsn")) rr=c->Read(a[1].s.c_str(), mgl_int(a[2].v)); + else if(!strcmp(k,"dsnn")) rr=c->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v)); + else if(!strcmp(k,"dsnnn")) rr=c->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v)); + else res = 1; + } + else if(d && f && k[0]=='d' && k[1]=='d' && k[2]=='s') + { + mglDataC r; + if(k[3]==0) rr=r.Read(a[2].s.c_str()); + else if(!strcmp(k+3,"n")) rr=r.Read(a[2].s.c_str(), mgl_int(a[3].v)); + else if(!strcmp(k+3,"nn")) rr=r.Read(a[2].s.c_str(), mgl_int(a[3].v),mgl_int(a[4].v)); + else if(!strcmp(k+3,"nnn")) rr=r.Read(a[2].s.c_str(), mgl_int(a[3].v),mgl_int(a[4].v),mgl_int(a[5].v)); + else res = 1; + if(res==0) { *d = r.Real(); *f = r.Imag(); } + } + else if(d) + { + 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(), mgl_int(a[2].v)); + else if(!strcmp(k,"dsnn")) rr=d->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v)); + else if(!strcmp(k,"dsnnn")) rr=d->Read(a[1].s.c_str(), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v)); + else res = 1; + } + else res = 1; if(!rr) gr->SetWarn(mglWarnFile,"Read"); return res; } @@ -1176,10 +1276,13 @@ int MGL_NO_EXPORT mgls_readmat(mglGraph *gr, long , mglArg *a, const char *k, co { int res=0; bool rr=true; + if(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) rr=d->ReadMat(a[1].s.c_str()); + else if(d && !strcmp(k,"dsn")) rr=d->ReadMat(a[1].s.c_str(), mgl_int(a[2].v)); + else if(c && !strcmp(k,"ds")) rr=c->ReadMat(a[1].s.c_str()); + else if(c && !strcmp(k,"dsn")) rr=c->ReadMat(a[1].s.c_str(), mgl_int(a[2].v)); else res = 1; if(!rr) gr->SetWarn(mglWarnFile,"ReadMat"); return res; @@ -1189,24 +1292,32 @@ int MGL_NO_EXPORT mgls_readall(mglGraph *gr, long , mglArg *a, const char *k, co { int res=0; bool rr=true; + if(k[0]=='d' && a[0].d->temp) return 5; 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); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) rr=d->ReadAll(a[1].s.c_str()); + else if(d && !strcmp(k,"dsn")) rr=d->ReadAll(a[1].s.c_str(), a[2].v); + else if(d && !strcmp(k,"dsnn")) rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v); + else if(d && !strcmp(k,"dsnnn")) rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v); + else if(d && !strcmp(k,"dsnnnn")) rr=d->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v, a[5].v); + else if(c && !strcmp(k,"ds")) rr=c->ReadAll(a[1].s.c_str()); + else if(c && !strcmp(k,"dsn")) rr=c->ReadAll(a[1].s.c_str(), a[2].v); + else if(c && !strcmp(k,"dsnn")) rr=c->ReadRange(a[1].s.c_str(), a[2].v, a[3].v); + else if(c && !strcmp(k,"dsnnn")) rr=c->ReadRange(a[1].s.c_str(), a[2].v, a[3].v, a[4].v); + else if(c && !strcmp(k,"dsnnnn")) rr=c->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"); + if(!rr) gr->SetWarn(mglWarnFile,"ReadAll"); return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_readhdf(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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()); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dss")) d->ReadHDF(a[1].s.c_str(), a[2].s.c_str()); + else if(c && !strcmp(k,"dss")) c->ReadHDF(a[1].s.c_str(), a[2].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1264,18 +1375,22 @@ int MGL_NO_EXPORT mgls_logo(mglGraph *gr, long , mglArg *a, const char *k, const { int res=0; if(!strcmp(k,"s")) gr->Logo(a[0].s.c_str(),false,opt); - else if(!strcmp(k,"sn")) gr->Logo(a[0].s.c_str(),iint(a[1].v),opt); + else if(!strcmp(k,"sn")) gr->Logo(a[0].s.c_str(),mgl_int(a[1].v),opt); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_resize(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ddn")) *d = mglData(true,mgl_data_resize_box(a[1].d, mgl_int(a[2].v),0,0, 0,1, 0,1, 0,1)); + else if(d && !strcmp(k,"ddnn")) *d = mglData(true,mgl_data_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),0, 0,1, 0,1, 0,1)); + else if(d && !strcmp(k,"ddnnn"))*d = mglData(true,mgl_data_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v), 0,1, 0,1, 0,1)); + else if(c && !strcmp(k,"ddn")) *c = mglDataC(true,mgl_datac_resize_box(a[1].d, mgl_int(a[2].v),0,0, 0,1, 0,1, 0,1)); + else if(c && !strcmp(k,"ddnn")) *c = mglDataC(true,mgl_datac_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),0, 0,1, 0,1, 0,1)); + else if(c && !strcmp(k,"ddnnn"))*c = mglDataC(true,mgl_datac_resize_box(a[1].d, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v), 0,1, 0,1, 0,1)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1298,8 +1413,8 @@ int MGL_NO_EXPORT mgls_rotatetext(mglGraph *gr, long , mglArg *a, const char *k, int MGL_NO_EXPORT mgls_tuneticks(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"n")) gr->SetTuneTicks(iint(a[0].v)); - else if(!strcmp(k,"nn")) gr->SetTuneTicks(iint(a[0].v),a[1].v); + if(!strcmp(k,"n")) gr->SetTuneTicks(mgl_int(a[0].v)); + else if(!strcmp(k,"nn")) gr->SetTuneTicks(mgl_int(a[0].v),a[1].v); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1322,29 +1437,35 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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()); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"d")) d->Smooth(); + else if(d && !strcmp(k,"ds")) d->Smooth(a[1].s.c_str()); + else if(c && !strcmp(k,"d")) c->Smooth(); + else if(c && !strcmp(k,"ds")) c->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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!d) return 1; - if(!strcmp(k,"ds")) d->Swap(a[1].s.c_str()); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->Swap(a[1].s.c_str()); + else if(c && !strcmp(k,"ds")) c->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(k[0]=='d' && a[0].d->temp) return 5; 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()); + if(d && !strcmp(k,"ds")) d->SetColumnId(a[1].s.c_str()); + else if(c && !strcmp(k,"ds")) c->SetColumnId(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1433,24 +1554,28 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dn")) d->Squeeze(mgl_int(a[1].v)); + else if(d && !strcmp(k,"dnn")) d->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v)); + else if(d && !strcmp(k,"dnnn")) d->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v)); + else if(d && !strcmp(k,"dnnnn"))d->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v), a[4].v); + else if(c && !strcmp(k,"dn")) c->Squeeze(mgl_int(a[1].v)); + else if(c && !strcmp(k,"dnn")) c->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v)); + else if(c && !strcmp(k,"dnnn")) c->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(a[3].v)); + else if(c && !strcmp(k,"dnnnn"))c->Squeeze(mgl_int(a[1].v), mgl_int(a[2].v),mgl_int(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; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; - if(!strcmp(k,"dddn")) - *d = mglSTFA(*(a[1].d),*(a[2].d), iint(a[3].v)); - else if(!strcmp(k,"dddns")) - *d = mglSTFA(*(a[1].d),*(a[2].d), iint(a[3].v), a[4].s.c_str()[0]); + if(!strcmp(k,"dddn")) *d = mglSTFA(*(a[1].d),*(a[2].d), mgl_int(a[3].v)); + else if(!strcmp(k,"dddns")) *d = mglSTFA(*(a[1].d),*(a[2].d), mgl_int(a[3].v), a[4].s.c_str()[0]); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1458,7 +1583,7 @@ int MGL_NO_EXPORT mgls_setsize(mglGraph *gr, long , mglArg *a, const char *k, co { int res=0; if(!strcmp(k,"nn") && a[1].v>1 && a[0].v>1) - gr->SetSize(iint(a[0].v), iint(a[1].v)); + gr->SetSize(mgl_int(a[0].v), mgl_int(a[1].v)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1476,13 +1601,13 @@ int MGL_NO_EXPORT mgls_stfa(mglGraph *gr, long , mglArg *a, const char *k, const { int res=0; if(!strcmp(k,"ddn")) - gr->STFA(*(a[0].d),*(a[1].d), iint(a[2].v), "",opt); + gr->STFA(*(a[0].d),*(a[1].d), mgl_int(a[2].v), "",opt); else if(!strcmp(k,"ddns")) - gr->STFA(*(a[0].d),*(a[1].d), iint(a[2].v), a[3].s.c_str(),opt); + gr->STFA(*(a[0].d),*(a[1].d), mgl_int(a[2].v), a[3].s.c_str(),opt); else if(!strcmp(k,"ddddn")) - gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), iint(a[4].v), "",opt); + gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), mgl_int(a[4].v), "",opt); else if(!strcmp(k,"ddddns")) - gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), iint(a[4].v), a[5].s.c_str(),opt); + gr->STFA(*(a[0].d),*(a[1].d), *(a[2].d),*(a[3].d), mgl_int(a[4].v), a[5].s.c_str(),opt); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1536,12 +1661,30 @@ int MGL_NO_EXPORT mgls_surf3a(mglGraph *gr, long , mglArg *a, const char *k, con else res = 1; return res; } //----------------------------------------------------------------------------- +int MGL_NO_EXPORT mgls_surf3ca(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) +{ + int res=0; + if(!strcmp(k,"ddd")) gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),"",opt); + else if(!strcmp(k,"ddds")) gr->Surf3CA(*(a[0].d),*(a[1].d),*(a[2].d),a[3].s.c_str(),opt); + else if(!strcmp(k,"dddn")) gr->Surf3CA(a[4].v,*(a[0].d),*(a[1].d),*(a[2].d),"",opt); + else if(!strcmp(k,"dddns")) gr->Surf3CA(a[4].v,*(a[0].d),*(a[1].d),*(a[2].d),a[4].s.c_str(),opt); + else if(!strcmp(k,"dddddd")) + gr->Surf3CA(*(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->Surf3CA(*(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 if(!strcmp(k,"ddddddn")) + gr->Surf3CA(a[6].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),"",opt); + else if(!strcmp(k,"ddddddns")) + gr->Surf3CA(a[6].v,*(a[0].d),*(a[1].d),*(a[2].d),*(a[3].d),*(a[4].d),*(a[5].d),a[7].s.c_str(),opt); + else res = 1; return res; +} +//----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_subplot(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"nnn")) gr->SubPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v)); - else if(!strcmp(k,"nnns")) gr->SubPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), a[3].s.c_str()); - else if(!strcmp(k,"nnnsnn")) gr->SubPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), a[3].s.c_str(), a[4].v,a[5].v); + if(!strcmp(k,"nnn")) gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v)); + else if(!strcmp(k,"nnns")) gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].s.c_str()); + else if(!strcmp(k,"nnnsnn")) gr->SubPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].s.c_str(), a[4].v,a[5].v); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1549,9 +1692,9 @@ int MGL_NO_EXPORT mgls_multiplot(mglGraph *gr, long , mglArg *a, const char *k, { int res=0; 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)); + gr->MultiPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(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[5].s.c_str()); + gr->MultiPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v), a[5].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1567,33 +1710,51 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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())); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dds")) *d = mglData(true,mgl_data_column(a[1].d,a[2].s.c_str())); + else if(c && !strcmp(k,"dds")) *c = mglDataC(true,mgl_datac_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(k[0]=='d' && a[0].d->temp) return 5; 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; + mglDataC *c = dynamic_cast(a[0].d); + if(d) + { + if(!strcmp(k,"ddn")) *d = mglData(true,mgl_data_subdata(a[1].d, mgl_int(a[2].v), -1, -1)); + else if(!strcmp(k,"ddnn")) *d = mglData(true,mgl_data_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), -1)); + else if(!strcmp(k,"ddnnn")) *d = mglData(true,mgl_data_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v))); + else if(!strcmp(k,"ddd")) *d = mglData(true,mgl_data_subdata_ext(a[1].d, a[2].d, 0, 0)); + else if(!strcmp(k,"dddd")) *d = mglData(true,mgl_data_subdata_ext(a[1].d, a[2].d, a[3].d, 0)); + else if(!strcmp(k,"ddddd")) *d = mglData(true,mgl_data_subdata_ext(a[1].d, a[2].d, a[3].d, a[4].d)); + else res = 1; + } + else if(c) + { + if(!strcmp(k,"ddn")) *c = mglDataC(true,mgl_datac_subdata(a[1].d, mgl_int(a[2].v), -1, -1)); + else if(!strcmp(k,"ddnn")) *c = mglDataC(true,mgl_datac_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), -1)); + else if(!strcmp(k,"ddnnn")) *c = mglDataC(true,mgl_datac_subdata(a[1].d, mgl_int(a[2].v), mgl_int(a[3].v), mgl_int(a[4].v))); + else if(!strcmp(k,"ddd")) *c = mglDataC(true,mgl_datac_subdata_ext(a[1].d, a[2].d, 0, 0)); + else if(!strcmp(k,"dddd")) *c = mglDataC(true,mgl_datac_subdata_ext(a[1].d, a[2].d, a[3].d, 0)); + else if(!strcmp(k,"ddddd")) *c = mglDataC(true,mgl_datac_subdata_ext(a[1].d, a[2].d, a[3].d, a[4].d)); + else res = 1; + } + else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_trace(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!d) return 1; - if(!strcmp(k,"dd")) *d = mglData(true,mgl_data_trace(a[1].d)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dd")) *d = mglData(true,mgl_data_trace(a[1].d)); + else if(c && !strcmp(k,"dd")) *c = mglDataC(true,mgl_datac_trace(a[1].d)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1665,14 +1826,18 @@ 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(k[0]=='d' && a[0].d->temp) return 5; mglData *re = dynamic_cast(a[0].d), *im = dynamic_cast(a[1].d); + mglDataC *c = dynamic_cast(a[0].d); if(!strcmp(k,"dds") && re && im) mglFourier(*re,*im,a[2].s.c_str()); + else if(!strcmp(k,"ds") && c) c->FFT(a[1].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(k[0]=='d' && a[0].d->temp) return 5; 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; @@ -1681,6 +1846,7 @@ int MGL_NO_EXPORT mgls_transform(mglGraph *, long , mglArg *a, const char *k, co int MGL_NO_EXPORT mgls_transforma(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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; @@ -1800,10 +1966,13 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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()); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"d")) d->Transpose(); + else if(d && !strcmp(k,"ds")) d->Transpose(a[1].s.c_str()); + else if(c && !strcmp(k,"d")) c->Transpose(); + else if(c && !strcmp(k,"ds")) c->Transpose(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -1965,10 +2134,10 @@ int MGL_NO_EXPORT mgls_xtick(mglGraph *gr, long n, mglArg *a, const char *k, con 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,"nn")) gr->SetTicks('x', a[0].v, mgl_int(a[1].v)); + else if(!strcmp(k,"nns")) gr->SetTicks('x', a[0].v, mgl_int(a[1].v), NAN, a[2].w.c_str()); + else if(!strcmp(k,"nnn")) gr->SetTicks('x', a[0].v, mgl_int(a[1].v), a[2].v); + else if(!strcmp(k,"nnns")) gr->SetTicks('x', a[0].v, mgl_int(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); @@ -1991,10 +2160,10 @@ 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,"nn")) gr->SetTicks('y', a[0].v, mgl_int(a[1].v)); + else if(!strcmp(k,"nns")) gr->SetTicks('y', a[0].v, mgl_int(a[1].v), NAN, a[2].w.c_str()); + else if(!strcmp(k,"nnn")) gr->SetTicks('y', a[0].v, mgl_int(a[1].v), a[2].v); + else if(!strcmp(k,"nnns")) gr->SetTicks('y', a[0].v, mgl_int(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); @@ -2017,10 +2186,10 @@ 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,"nn")) gr->SetTicks('z', a[0].v, mgl_int(a[1].v)); + else if(!strcmp(k,"nns")) gr->SetTicks('z', a[0].v, mgl_int(a[1].v), NAN, a[2].w.c_str()); + else if(!strcmp(k,"nnn")) gr->SetTicks('z', a[0].v, mgl_int(a[1].v), a[2].v); + else if(!strcmp(k,"nnns")) gr->SetTicks('z', a[0].v, mgl_int(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); @@ -2053,19 +2222,26 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dn")) d->Extend(mgl_int(a[1].v)); + else if(d && !strcmp(k,"dnn")) d->Extend(mgl_int(a[1].v),mgl_int(a[2].v)); + else if(c && !strcmp(k,"dn")) c->Extend(mgl_int(a[1].v)); + else if(c && !strcmp(k,"dnn")) c->Extend(mgl_int(a[1].v),mgl_int(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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!strcmp(k,"dd") && d) d->Join(*(a[1].d)); - else res = 1; return res; + mglDataC *c = dynamic_cast(a[0].d); + if((!d && !c) || k[1]!='d') res = 1; + else if(d) for(long i=1;k[i]=='d';i++) d->Join(*(a[i].d)); + else if(c) for(long i=1;k[i]=='d';i++) c->Join(*(a[i].d)); + return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_datas(mglGraph *gr, long , mglArg *a, const char *k, const char *) @@ -2094,8 +2270,11 @@ 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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!strcmp(k,"ds") && d) d->Integral(a[1].s.c_str()); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->Integral(a[1].s.c_str()); + else if(c && !strcmp(k,"ds")) c->Integral(a[1].s.c_str()); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2110,23 +2289,23 @@ int MGL_NO_EXPORT mgls_inplot(mglGraph *gr, long , mglArg *a, const char *k, con int MGL_NO_EXPORT mgls_columnplot(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"nn")) gr->ColumnPlot(iint(a[0].v), iint(a[1].v)); - else if(!strcmp(k,"nnn")) gr->ColumnPlot(iint(a[0].v), iint(a[1].v), a[2].v); + if(!strcmp(k,"nn")) gr->ColumnPlot(mgl_int(a[0].v), mgl_int(a[1].v)); + else if(!strcmp(k,"nnn")) gr->ColumnPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_gridplot(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"nnn")) gr->GridPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v)); - else if(!strcmp(k,"nnnn")) gr->GridPlot(iint(a[0].v), iint(a[1].v), iint(a[2].v), a[3].v); + if(!strcmp(k,"nnn")) gr->GridPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v)); + else if(!strcmp(k,"nnnn")) gr->GridPlot(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v), a[3].v); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_stickplot(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"nnnn")) gr->StickPlot(iint(a[0].v), iint(a[1].v), a[2].v, a[3].v); + if(!strcmp(k,"nnnn")) gr->StickPlot(mgl_int(a[0].v), mgl_int(a[1].v), a[2].v, a[3].v); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2168,48 +2347,57 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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 if(!strcmp(k,"dnnnn")) d->Norm(a[1].v,a[2].v,a[3].v!=0,mgl_int(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(k[0]=='d' && a[0].d->temp) return 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 if(!strcmp(k,"ddnnnn")) *d = mglData(true,mgl_data_hist(a[1].d,mgl_int(a[2].v), a[3].v, a[4].v, mgl_int(a[5].v))); + else if(!strcmp(k,"dddnnn")) *d = mglData(true,mgl_data_hist_w(a[1].d,a[2].d, mgl_int(a[3].v), 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, mgl_int(a[3].v), a[4].v, a[5].v, mgl_int(a[6].v))); else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_mirror(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!strcmp(k,"ds") && d) d->Mirror(a[1].s.c_str()); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->Mirror(a[1].s.c_str()); + else if(c && !strcmp(k,"ds")) c->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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!strcmp(k,"ds") && d) d->Hankel(a[1].s.c_str()); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->Hankel(a[1].s.c_str()); + else if(c && !strcmp(k,"ds")) c->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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!strcmp(k,"ds") && d) d->SinFFT(a[1].s.c_str()); else res = 1; return res; @@ -2218,40 +2406,58 @@ int MGL_NO_EXPORT mgls_sinfft(mglGraph *, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_cosfft(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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_wavelet(mglGraph *, long , mglArg *a, const char *k, const char *) +{ + int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; + mglData *d = dynamic_cast(a[0].d); + if(!strcmp(k,"dsn") && d) d->Wavelet(a[1].s.c_str(), mgl_int(a[2].v)); + 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(k[0]=='d' && a[0].d->temp) return 5; 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")) - { 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")) - { 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")) - { d->Create(iint(a[1].v),iint(a[2].v),iint(a[3].v)); - d->Fill(gr->Self(),a[4].s.c_str(),opt); } + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dn")) d->Create(mgl_int(a[1].v)); + else if(d && !strcmp(k,"dns")) + { d->Create(mgl_int(a[1].v)); d->Fill(gr->Self(),a[2].s.c_str(),opt); } + else if(d && !strcmp(k,"dnn")) d->Create(mgl_int(a[1].v),mgl_int(a[2].v)); + else if(d && !strcmp(k,"dnns")) + { d->Create(mgl_int(a[1].v),mgl_int(a[2].v)); d->Fill(gr->Self(),a[3].s.c_str(),opt); } + else if(d && !strcmp(k,"dnnn")) d->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v)); + else if(d && !strcmp(k,"dnnns")) + { d->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v)); d->Fill(gr->Self(),a[4].s.c_str(),opt); } + else if(c && !strcmp(k,"dn")) c->Create(mgl_int(a[1].v)); + else if(c && !strcmp(k,"dns")) + { c->Create(mgl_int(a[1].v)); c->Fill(gr->Self(),a[2].s.c_str(),opt); } + else if(c && !strcmp(k,"dnn")) c->Create(mgl_int(a[1].v),mgl_int(a[2].v)); + else if(c && !strcmp(k,"dnns")) + { c->Create(mgl_int(a[1].v),mgl_int(a[2].v)); c->Fill(gr->Self(),a[3].s.c_str(),opt); } + else if(c && !strcmp(k,"dnnn")) c->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v)); + else if(c && !strcmp(k,"dnnns")) + { c->Create(mgl_int(a[1].v),mgl_int(a[2].v),mgl_int(a[3].v)); c->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; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); // TODO use mglDataV here?! if(!d) return 1; if(!strcmp(k,"dnn")) - { d->Create(iint(a[1].v)); d->Fill(a[2].v, NAN); } + { d->Create(mgl_int(a[1].v)); d->Fill(a[2].v, NAN); } else if(!strcmp(k,"dnnn")) - { d->Create(iint(a[1].v)); d->Fill(a[2].v, a[3].v); } + { d->Create(mgl_int(a[1].v)); d->Fill(a[2].v, a[3].v); } else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2300,6 +2506,7 @@ 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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; if(!strcmp(k,"dnn")) d->NormSl(a[1].v, a[2].v); @@ -2312,16 +2519,20 @@ int MGL_NO_EXPORT mgls_normsl(mglGraph *, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_momentum(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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())); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dds")) *d = mglData(true,mgl_data_momentum(a[1].d,'z', a[2].s.c_str())); + else if(d && !strcmp(k,"ddss")) *d = mglData(true,mgl_data_momentum(a[1].d,a[3].s.c_str()[0], a[2].s.c_str())); + else if(c && !strcmp(k,"dds")) *c = mglDataC(true,mgl_datac_momentum(a[1].d,'z', a[2].s.c_str())); + else if(c && !strcmp(k,"ddss")) *c = mglDataC(true,mgl_datac_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; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; if(!strcmp(k,"dddddssd")) @@ -2362,6 +2573,7 @@ int MGL_NO_EXPORT mgls_fit(mglGraph *gr, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_fits(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; if(!strcmp(k,"ddddddssd")) @@ -2424,10 +2636,13 @@ int MGL_NO_EXPORT mgls_rearrange(mglGraph *, long , mglArg *a, const char *k, co { int res=0; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dn")) d->Rearrange(mgl_int(a[1].v)); + else if(d && !strcmp(k,"dnn")) d->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v)); + else if(d && !strcmp(k,"dnnn")) d->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v)); + else if(c && !strcmp(k,"dn")) c->Rearrange(mgl_int(a[1].v)); + else if(c && !strcmp(k,"dnn")) c->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v)); + else if(c && !strcmp(k,"dnnn")) c->Rearrange(mgl_int(a[1].v), mgl_int(a[2].v), mgl_int(a[3].v)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2458,7 +2673,7 @@ int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, cons FILE *fp; if(!strncmp(k,"nns",3)) { - int i, n = (k[3]=='n'?iint(a[3].v):0); + int i, n = (k[3]=='n'?mgl_int(a[3].v):0); fp = fopen(a[2].s.c_str(),"rt"); if(!fp) { @@ -2478,7 +2693,7 @@ int MGL_NO_EXPORT mgls_fgets(mglGraph *gr, long , mglArg *a, const char *k, cons } else if(!strncmp(k,"nnns",4)) { - int i, n = (k[4]=='n'?iint(a[4].v):0); + int i, n = (k[4]=='n'?mgl_int(a[4].v):0); fp = fopen(a[3].s.c_str(),"rt"); if(!fp) { @@ -2502,6 +2717,7 @@ 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(k[0]=='d' && a[0].d->temp) return 5; 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()); @@ -2520,7 +2736,7 @@ int MGL_NO_EXPORT mgls_export(mglGraph *, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_write(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->WriteFrame("", "MathGL"); + if(k[0]==0) gr->WriteFrame("", "MathGL"); else if(!strcmp(k,"s")) gr->WriteFrame(a[0].s.c_str(), "MathGL"); else res = 1; return res; } @@ -2542,6 +2758,7 @@ 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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; if(!strcmp(k,"d")) d->Envelop(); @@ -2552,6 +2769,7 @@ int MGL_NO_EXPORT mgls_envelop(mglGraph *, long , mglArg *a, const char *k, cons int MGL_NO_EXPORT mgls_sew(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; if(!strcmp(k,"d")) d->Sew(); @@ -2563,20 +2781,36 @@ int MGL_NO_EXPORT mgls_sew(mglGraph *, long , mglArg *a, const char *k, const ch int MGL_NO_EXPORT mgls_evaluate(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && k[0]=='d' && k[1]=='d' && k[2]=='d') + { + if(k[3]==0) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0,true)); + else if(!strcmp(k+3,"n")) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,0,0, a[3].v!=0)); + else if(!strcmp(k+3,"d")) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0,true)); + else if(!strcmp(k+3,"dn")) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,0, a[4].v!=0)); + else if(!strcmp(k+3,"dd")) *d = mglData(true,mgl_data_evaluate(a[1].d,a[2].d,a[3].d,a[4].d,true)); + else if(!strcmp(k+3,"ddn")) *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; + } + else if(c && k[0]=='d' && k[1]=='d' && k[2]=='d') + { + if(k[3]==0) *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,0,0,true)); + else if(!strcmp(k+3,"n")) *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,0,0, a[3].v!=0)); + else if(!strcmp(k+3,"d")) *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,0,true)); + else if(!strcmp(k+3,"dn")) *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,0, a[4].v!=0)); + else if(!strcmp(k+3,"dd")) *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,a[4].d,true)); + else if(!strcmp(k+3,"ddn")) *c = mglDataC(true,mgl_datac_evaluate(a[1].d,a[2].d,a[3].d,a[4].d, a[5].v!=0)); + else res = 1; + } else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_solve(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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)); @@ -2589,16 +2823,33 @@ int MGL_NO_EXPORT mgls_solve(mglGraph *, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_put(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d) + { + if(!strcmp(k,"dn")) d->Put(a[1].v); + else if(!strcmp(k,"dnn")) d->Put(a[1].v, mgl_int(a[2].v)); + else if(!strcmp(k,"dnnn")) d->Put(a[1].v, mgl_int(a[2].v),mgl_int(a[3].v)); + else if(!strcmp(k,"dnnnn")) d->Put(a[1].v, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v)); + else if(!strcmp(k,"dd")) d->Put(*(a[1].d)); + else if(!strcmp(k,"ddn")) d->Put(*(a[1].d), mgl_int(a[2].v)); + else if(!strcmp(k,"ddnn")) d->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v)); + else if(!strcmp(k,"ddnnn")) d->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v)); + else res = 1; + } + else if(c) + { + if(!strcmp(k,"dn")) c->Put(a[1].c); + else if(!strcmp(k,"dnn")) c->Put(a[1].c, mgl_int(a[2].v)); + else if(!strcmp(k,"dnnn")) c->Put(a[1].c, mgl_int(a[2].v),mgl_int(a[3].v)); + else if(!strcmp(k,"dnnnn")) c->Put(a[1].c, mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v)); + else if(!strcmp(k,"dd")) c->Put(*(a[1].d)); + else if(!strcmp(k,"ddn")) c->Put(*(a[1].d), mgl_int(a[2].v)); + else if(!strcmp(k,"ddnn")) c->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v)); + else if(!strcmp(k,"ddnnn")) c->Put(*(a[1].d), mgl_int(a[2].v),mgl_int(a[3].v),mgl_int(a[4].v)); + else res = 1; + } else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2612,22 +2863,29 @@ 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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!strcmp(k,"ddd") && d) *d = mglData(true,mgl_data_combine(a[1].d, a[2].d)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ddd")) *d = mglData(true,mgl_data_combine(a[1].d, a[2].d)); + else if(c && !strcmp(k,"ddd")) *c = mglDataC(true,mgl_datac_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(k[0]=='d' && a[0].d->temp) return 5; 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())); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ddds")) *d = mglData(true,mgl_data_correl(a[1].d, a[2].d, a[3].s.c_str())); + else if(c && !strcmp(k,"ddds")) *c = mglDataC(true,mgl_datac_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(k[0]=='d' && a[0].d->temp) return 5; 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])); @@ -2640,6 +2898,7 @@ int MGL_NO_EXPORT mgls_roots(mglGraph *, long , mglArg *a, const char *k, const int MGL_NO_EXPORT mgls_ode(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; if(!strcmp(k,"dssd")) @@ -2652,85 +2911,145 @@ int MGL_NO_EXPORT mgls_ode(mglGraph *, long , mglArg *a, const char *k, const ch int MGL_NO_EXPORT mgls_pde(mglGraph *gr, long , mglArg *a, const char *k, const char *opt) { int res=0; - 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")) - *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt); - else if(!strcmp(k,"dsddnn")) - *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(); } + if(k[0]=='d' && a[0].d->temp) return 5; + if(k[1]=='d' && a[1].d->temp) return 5; + mglData *d = dynamic_cast(a[0].d), *f = dynamic_cast(a[1].d); + mglDataC *c = dynamic_cast(a[0].d); + if(d && f) + { + mglDataC r; + if(!strcmp(k,"ddsdd")) + r = gr->PDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), 0.1,100,opt); + else if(!strcmp(k,"ddsddn")) + r = gr->PDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), a[5].v,100,opt); + else if(!strcmp(k,"ddsddnn")) + r = gr->PDEc(a[2].s.c_str(), *(a[3].d), *(a[4].d), a[5].v,a[6].v,opt); + else res = 1; + if(res==0) { *d = r.Abs(); *f = r.Arg(); } + } + else if(d) + { + if(!strcmp(k,"dsdd")) + *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt); + else if(!strcmp(k,"dsddn")) + *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt); + else if(!strcmp(k,"dsddnn")) + *d = gr->PDE(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt); + else res = 1; + } + else if(c) + { + if(!strcmp(k,"dsdd")) + *c = gr->PDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), 0.1,100,opt); + else if(!strcmp(k,"dsddn")) + *c = gr->PDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,100,opt); + else if(!strcmp(k,"dsddnn")) + *c = gr->PDEc(a[1].s.c_str(), *(a[2].d), *(a[3].d), a[4].v,a[5].v,opt); + else res = 1; + } 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")) - *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")) - *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")) - *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")) - *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(); } + if(k[0]=='d' && a[0].d->temp) return 5; + if(k[1]=='d' && a[1].d->temp) return 5; + mglData *d = dynamic_cast(a[0].d), *f = dynamic_cast(a[1].d); + mglDataC *c = dynamic_cast(a[0].d); + if(d && f) + { + mglDataC r; + if(!strcmp(k,"ddsddd")) + r = mglDataC(true, mgl_qo2d_solve_c(a[2].s.c_str(), a[3].d, a[4].d, a[5].d, 1,100, 0,0)); + else if(!strcmp(k,"ddsdddn")) + r = 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)); + else if(!strcmp(k,"ddsdddnn")) + r = 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)); + else if(!strcmp(k,"ddsdddnndd")) + r = 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))); + else res = 1; + if(res==0) { *d = r.Abs(); *f = r.Arg(); } + } + else if(d) + { + if(!strcmp(k,"dsddd")) + *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")) + *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")) + *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")) + *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 res = 1; + } + else if(c) + { + if(!strcmp(k,"dsddd")) + *c = mglDataC(true, mgl_qo2d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0)); + else if(!strcmp(k,"dsdddn")) + *c = mglDataC(true, mgl_qo2d_solve_c(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")) + *c = mglDataC(true, mgl_qo2d_solve_c(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")) + *c = mglDataC(true, mgl_qo2d_solve_c(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 res = 1; + } 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")) - *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")) - *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")) - *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")) - *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(); } + if(k[0]=='d' && a[0].d->temp) return 5; + if(k[1]=='d' && a[1].d->temp) return 5; + mglData *d = dynamic_cast(a[0].d), *f = dynamic_cast(a[1].d); + mglDataC *c = dynamic_cast(a[0].d); + if(d && f) + { + mglDataC r; + if(!strcmp(k,"ddsddd")) + r = 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)); + else if(!strcmp(k,"ddsdddn")) + r = 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)); + else if(!strcmp(k,"ddsdddnn")) + r = 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)); + else if(!strcmp(k,"ddsdddnnddd")) + r = 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))); + else res = 1; + if(res==0) { *d = r.Abs(); *f = r.Arg(); } + } + else if(d) + { + if(!strcmp(k,"dsddd")) + *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")) + *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")) + *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")) + *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 res = 1; + } + else if(c) + { + if(!strcmp(k,"dsddd")) + *c = mglDataC(true, mgl_qo3d_solve_c(a[1].s.c_str(), a[2].d, a[3].d, a[4].d, 1,100, 0,0,0)); + else if(!strcmp(k,"dsdddn")) + *c = mglDataC(true, mgl_qo3d_solve_c(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")) + *c = mglDataC(true, mgl_qo3d_solve_c(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")) + *c = mglDataC(true, mgl_qo3d_solve_c(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 res = 1; + } else res = 1; return res; } //----------------------------------------------------------------------------- int MGL_NO_EXPORT mgls_ray(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; if(!strcmp(k,"dsnnnn")) @@ -2747,6 +3066,7 @@ int MGL_NO_EXPORT mgls_ray(mglGraph *, long , mglArg *a, const char *k, const ch int MGL_NO_EXPORT mgls_jacobian(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; if(!strcmp(k,"ddd")) *d = mglJacobian(*(a[1].d), *(a[2].d)); @@ -2794,7 +3114,7 @@ int MGL_NO_EXPORT mgls_origintick(mglGraph *gr, long , mglArg *a, const char *k, int MGL_NO_EXPORT mgls_axisstl(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->SetAxisStl(); + if(k[0]==0) gr->SetAxisStl(); else if(!strcmp(k,"s")) gr->SetAxisStl(a[0].s.c_str()); else if(!strcmp(k,"ss")) gr->SetAxisStl(a[0].s.c_str(), a[1].s.c_str()); else if(!strcmp(k,"sss")) gr->SetAxisStl(a[0].s.c_str(), a[1].s.c_str(), a[2].s.c_str()); @@ -2815,7 +3135,7 @@ int MGL_NO_EXPORT mgls_ranges(mglGraph *gr, long , mglArg *a, const char *k, con int MGL_NO_EXPORT mgls_adjust(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->Adjust(); + if(k[0]==0) gr->Adjust(); else if(!strcmp(k,"s")) gr->Adjust(a[0].s.c_str()); else res = 1; return res; } @@ -2823,36 +3143,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(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->Insert(a[1].s.c_str()[0]); + else if(d && !strcmp(k,"dsn")) d->Insert(a[1].s.c_str()[0], mgl_int(a[2].v)); + else if(d && !strcmp(k,"dsnn")) d->Insert(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v)); + else if(c && !strcmp(k,"ds")) c->Insert(a[1].s.c_str()[0]); + else if(c && !strcmp(k,"dsn")) c->Insert(a[1].s.c_str()[0], mgl_int(a[2].v)); + else if(c && !strcmp(k,"dsnn")) c->Insert(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(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(k[0]=='d' && a[0].d->temp) return 5; 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)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"ds")) d->Delete(a[1].s.c_str()[0]); + else if(d && !strcmp(k,"dsn")) d->Delete(a[1].s.c_str()[0], mgl_int(a[2].v)); + else if(d && !strcmp(k,"dsnn")) d->Delete(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(a[3].v)); + else if(c && !strcmp(k,"ds")) c->Delete(a[1].s.c_str()[0]); + else if(c && !strcmp(k,"dsn")) c->Delete(a[1].s.c_str()[0], mgl_int(a[2].v)); + else if(c && !strcmp(k,"dsnn")) c->Delete(a[1].s.c_str()[0], mgl_int(a[2].v), mgl_int(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(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); - if(!strcmp(k,"dsn") && d) d->Roll(a[1].s.c_str()[0], iint(a[2].v)); + mglDataC *c = dynamic_cast(a[0].d); + if(d && !strcmp(k,"dsn")) d->Roll(a[1].s.c_str()[0], mgl_int(a[2].v)); + else if(c && !strcmp(k,"dsn")) c->Roll(a[1].s.c_str()[0], mgl_int(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(k[0]=='d' && a[0].d->temp) return 5; 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; @@ -2861,6 +3193,7 @@ int MGL_NO_EXPORT mgls_datagrid(mglGraph *gr, long , mglArg *a, const char *k, c int MGL_NO_EXPORT mgls_triangulate(mglGraph *, long , mglArg *a, const char *k, const char *) { int res=0; + if(k[0]=='d' && a[0].d->temp) return 5; mglData *d = dynamic_cast(a[0].d); if(!d) return 1; if(!strcmp(k,"ddd")) *d = mglTriangulation(*(a[1].d), *(a[2].d)); @@ -2896,8 +3229,8 @@ int MGL_NO_EXPORT mgls_zoomaxis(mglGraph *gr, long , mglArg *a, const char *k, c int MGL_NO_EXPORT mgls_drawreg(mglGraph *gr, long , mglArg *a, const char *k, const char *) { int res=0; - if(!strcmp(k,"")) gr->SetDrawReg(); - else if(!strcmp(k,"nnn")) gr->SetDrawReg(iint(a[0].v), iint(a[1].v), iint(a[2].v)); + if(k[0]==0) gr->SetDrawReg(); + else if(!strcmp(k,"nnn")) gr->SetDrawReg(mgl_int(a[0].v), mgl_int(a[1].v), mgl_int(a[2].v)); else res = 1; return res; } //----------------------------------------------------------------------------- @@ -2905,7 +3238,7 @@ int MGL_NO_EXPORT mgls_version(mglGraph *gr, long , mglArg *a, const char *k, co { int res=0; char buf[32]; sprintf(buf,"MathGL version is 2.%g",MGL_VER2); - if(!strcmp(k,"")) gr->SetWarn(-1,buf); + if(k[0]==0) 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; } @@ -2922,6 +3255,7 @@ mglCommand mgls_base_cmd[] = { {"arrowsize","Set size of arrows","arrowsize val", mgls_arrowsize ,2}, {"ask","Define parameter from user input","ask $N 'question'", 0, 6}, {"aspect","Set aspect ration","aspect valx valy [valz]", mgls_aspect ,5}, + {"attachlight","Attach light settings to inplot","attachlight val", mgls_attachlight ,2}, {"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}, @@ -2979,7 +3313,7 @@ mglCommand mgls_base_cmd[] = { {"defchr","Define parameter as character","defchr $N val", 0, 6}, {"define","Define constant or parameter","define $N sth | Var val", 0, 6}, {"defnum","Define parameter as numerical value","defnum $N val", 0, 6}, - {"defpal","Define parameter as palette color","defpal $N val", 0, 6}, +// {"defpal","Define parameter as palette color","defpal $N val", 0, 6}, {"delete","Delete slice of data","delete Dat 'dir' [pos=0 num=1]", mgls_delete ,3}, {"dens","Draw density plot","dens Zdat ['fmt' zpos]|Xdat Ydat Zdat ['fmt' zpos]", mgls_dens ,8}, {"dens3","Draw density plot at slices of 3D data","dens3 Adat 'dir' [pos 'fmt']|Xdat Ydat Zdat Adat 'dir' [pos 'fmt']", mgls_dens3 ,9}, @@ -3020,7 +3354,7 @@ mglCommand mgls_base_cmd[] = { {"fog","Switch on/off fog","fog val [pos]", mgls_fog ,2}, {"font","Setup font","font 'fmt' [size]", mgls_font ,15}, {"for","For cycle","for $N v1 v2 [dv] | $N Dat", 0, 6}, - {"fourier","In-place Fourier transform","fourier ReDat ImDat 'dir'", mgls_fourier , 16}, + {"fourier","In-place Fourier transform","fourier ReDat ImDat 'dir'|Cmplx 'dir'", mgls_fourier , 16}, {"fplot","Plot curve by formula","fplot 'y_x' ['fmt']|'x_t' 'y_t' 'z_t' ['fmt']", mgls_fplot ,1}, {"fsurf","Plot surface by formula","fsurf 'z_xy' ['fmt']|'x_uv' 'y_uv' 'z_uv' ['fmt']", mgls_fsurf ,1}, {"func","Start function definition and stop execution of main script","func 'name' [narg]", 0, 6}, @@ -3101,6 +3435,7 @@ mglCommand mgls_base_cmd[] = { {"resize","Resize data","resize Res Dat mx [my mz]", mgls_resize ,4}, {"return","Return from function","return", 0, 6}, {"rhomb","Draw rhombus","rhomb x1 y1 x2 y2 r ['fmt']|x1 y1 z1 x2 y2 z2 r ['fmt']", mgls_rhomb ,13}, + {"rkstep","Apply Runge-Kutta","rkstep 'Diff1;Diff2;...' 'Var1;Var2;...' [dt]", 0, 6}, {"roll","Roll data along direction","roll Dat 'dir' num", mgls_roll ,16}, {"roots", "Find roots using data as initial values", "roots Res 'func' Ini ['var']|Res 'func' ini ['var']", mgls_roots ,4}, {"rotate","Rotate plot","rotate tetz tetx [tety] | tet x y z", mgls_rotate ,5}, @@ -3129,8 +3464,10 @@ mglCommand mgls_base_cmd[] = { {"surf3","Draw isosurface for 3D data","surf3 Adat ['fmt' num]|Xdat Ydat Zdat Adat ['fmt' num]|Adat val ['fmt']|Xdat Ydat Zdat Adat val ['fmt']", mgls_surf3 ,9}, {"surf3a","Draw isosurface for 3D data transpared by other data","surf3a Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3a ,10}, {"surf3c","Draw isosurface for 3D data colored by other data","surf3c Adat Cdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat ['fmt' num]|Adat Cdat val ['fmt']|Xdat Ydat Zdat Adat Cdat val ['fmt']", mgls_surf3c ,10}, + {"surf3ca","Draw isosurface for 3D data colored and transpared by other data","surf3c Adat Cdat Bdat ['fmt' num]|Xdat Ydat Zdat Adat Cdat Bdat ['fmt' num]|Adat Cdat Bdat val ['fmt']|Xdat Ydat Zdat Adat Cdat Bdat val ['fmt']", mgls_surf3ca ,10}, {"surfa","Draw solid surface transpared by other data","surfa Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfa ,10}, {"surfc","Draw solid surface colored by other data","surfc Zdat Cdat ['fmt']|Xdat Ydat Zdat Cdat ['fmt']", mgls_surfc ,10}, + {"surfca","Draw solid surface colored and transpared by other data","surfca Zdat Cdat Adat ['fmt']|Xdat Ydat Zdat Cdat Adat ['fmt']", mgls_surfca ,10}, {"swap","Swap data (usefull after Fourier transform)","swap Dat 'dir'", mgls_swap ,16}, {"table","Draw table with data values","table Dat ['txt' 'fmt']|x y Dat ['txt' 'fmt']", mgls_table ,7}, {"tape","Draw binormales for 1D data","tape Ydat ['fmt']|Xdat Ydat ['fmt']|Xdat Ydat Zdat ['fmt']", mgls_tape ,7}, @@ -3163,6 +3500,7 @@ mglCommand mgls_base_cmd[] = { {"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}, + {"wavelet","Wavelet transform at some direction","wavelet Dat 'dir' k", mgls_wavelet ,16}, {"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}, diff --git a/src/export_2d.cpp b/src/export_2d.cpp index 01a9b94..4c6c7a2 100644 --- a/src/export_2d.cpp +++ b/src/export_2d.cpp @@ -62,16 +62,16 @@ bool MGL_LOCAL_PURE mgl_is_same(HMGL gr, long i, mreal wp,uint32_t cp, int st) return (cp==_Gr_->GetPrmCol(i)); } //----------------------------------------------------------------------------- -void MGL_NO_EXPORT put_line(HMGL gr, void *fp, bool gz, long i, mreal wp, uint32_t cp,int st, const char *ifmt, const char *nfmt, bool neg, mreal fc) +std::vector MGL_NO_EXPORT put_line(HMGL gr, long i, mreal wp, uint32_t cp,int st) { + std::vector ids; long n1=gr->GetPrm(i).n1, n2=gr->GetPrm(i).n2; if(n1>n2) { n1=gr->GetPrm(i).n2; n2=gr->GetPrm(i).n1; } - if(n1<0 || n2<0) return; + if(n1<0 || n2<0) return ids; const mglPnt &pp1 = gr->GetPnt(n1), &pp2 = gr->GetPnt(n2); mreal x0=pp1.x, y0=pp1.y; bool ok=true; - register long j; // first point - std::vector ids; + long j; // first point while(ok) // try to find starting point { for(ok=false,j=i+1;jGetPrmNum();j++) @@ -121,12 +121,7 @@ void MGL_NO_EXPORT put_line(HMGL gr, void *fp, bool gz, long i, mreal wp, uint32 } } } - for(size_t j=0;jGetPnt(ids[j]); - x0 = p.x; y0 = p.y; - mgl_printf(fp, gz, j>0?nfmt:ifmt,fc*x0,(neg?_Gr_->GetHeight()-y0:y0)*fc); - } + return ids; } //----------------------------------------------------------------------------- //put_desc(fp,"%c%c%c_%04x {", "np %d %d mt %d %d ll %d %d ll cp fill\n", @@ -343,7 +338,13 @@ 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.); str[255]=0; 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); + std::vector ids = put_line(gr,i,wp,cp.c,st); + for(size_t j=0;jGetPnt(ids[j]); + register float x0 = p.x, y0 = p.y; + mgl_printf(fp, gz, j==0?"np %g %g mt ":"%g %g ll ",x0,y0); + } 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); @@ -514,7 +515,13 @@ void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr) } if(q.w>1) mgl_printf(fp, gz, " stroke-width=\"%g\"", q.w); wp = q.w>1 ? q.w:1; st = q.n3; - put_line(gr,fp,gz,i,wp,cp.c,st, "> ids = put_line(gr,i,wp,cp.c,st); + for(size_t j=0;jGetPnt(ids[j]); + register float x0 = p.x, y0 = p.y; + mgl_printf(fp, gz, j==0?">GetHeight()-y0); + } mgl_printf(fp, gz, "\"/> \n"); } else if(q.type==2 && cp.r[3]) @@ -573,32 +580,32 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr) if(gr->GetPrmNum()<1) return; _Gr_->clr(MGL_FINISHED); _Gr_->PreparePrim(1); - FILE *fp = fopen(fname,"wt"); + FILE *fp = fopen(fname,"w"); fwide(fp,1); if(!fp) { gr->SetWarn(mglWarnOpen,fname); return; } 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); + fwprintf(fp, L"%% 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"); - fprintf(fp, "\\providecommand{\\mglx}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2+#4) (#1+#4,#2-#4) -- (#1-#4,#2+#4);}\n"); - fprintf(fp, "\\providecommand{\\mgls}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglS}[4]{\\fill[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mgld}[4]{\\draw[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglD}[4]{\\fill[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglv}[4]{\\draw[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglV}[4]{\\fill[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglt}[4]{\\draw[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglT}[4]{\\fill[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mgll}[4]{\\draw[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglL}[4]{\\fill[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglr}[4]{\\draw[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglR}[4]{\\fill[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n"); - fprintf(fp, "\\providecommand{\\mglR}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) -- (#1-#4,#2+#4) (#1,#2) -- (#1+#4,#2+#4);}\n"); - fprintf(fp, "\\providecommand{\\mgla}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1-0.6*#4,#2-0.8*#4) -- (#1+0.6*#4,#2+0.8*#4) (#1-0.6*#4,#2+0.8*#4) -- (#1+0.6*#4,#2-0.8*#4);}\n"); - fprintf(fp, "\\providecommand{\\mglY}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) (#1-#4,#2+#4) -- (#1,#2) (#1+#4,#2+#4) -- (#1,#2);}\n"); - fprintf(fp, "\\providecommand{\\mglo}[4]{\\draw[#3] (#1, #2) circle (#4);}\n"); - fprintf(fp, "\\providecommand{\\mglO}[4]{\\fill[#3] (#1, #2) circle (#4);}\n"); - fprintf(fp, "\\providecommand{\\mglc}[3]{\\draw[#3] (#1, #2) circle (%g);}\n\n", 4e-4*gr->mark_size()); - fprintf(fp, "\\begin{tikzpicture}\n"); + fwprintf(fp, L"\\providecommand{\\mglp}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1,#2-#4) -- (#1,#2+#4);}\n"); + fwprintf(fp, L"\\providecommand{\\mglx}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2+#4) (#1+#4,#2-#4) -- (#1-#4,#2+#4);}\n"); + fwprintf(fp, L"\\providecommand{\\mgls}[4]{\\draw[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglS}[4]{\\fill[#3] (#1-#4, #2-#4) -- (#1+#4,#2-#4) -- (#1+#4,#2+#4) -- (#1-#4,#2+#4) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mgld}[4]{\\draw[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglD}[4]{\\fill[#3] (#1, #2-#4) -- (#1+#4,#2) -- (#1,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglv}[4]{\\draw[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglV}[4]{\\fill[#3] (#1-#4, #2+#4/2) -- (#1+#4,#2+#4/2) -- (#1,#2-#4) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglt}[4]{\\draw[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglT}[4]{\\fill[#3] (#1-#4, #2-#4/2) -- (#1+#4,#2-#4/2) -- (#1,#2+#4) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mgll}[4]{\\draw[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglL}[4]{\\fill[#3] (#1+#4/2, #2-#4) -- (#1+#4/2,#2+#4) -- (#1-#4,#2) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglr}[4]{\\draw[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglR}[4]{\\fill[#3] (#1-#4/2, #2-#4) -- (#1-#4/2,#2+#4) -- (#1+#4,#2) -- cycle;}\n"); + fwprintf(fp, L"\\providecommand{\\mglR}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) -- (#1-#4,#2+#4) (#1,#2) -- (#1+#4,#2+#4);}\n"); + fwprintf(fp, L"\\providecommand{\\mgla}[4]{\\draw[#3] (#1-#4, #2) -- (#1+#4,#2) (#1-0.6*#4,#2-0.8*#4) -- (#1+0.6*#4,#2+0.8*#4) (#1-0.6*#4,#2+0.8*#4) -- (#1+0.6*#4,#2-0.8*#4);}\n"); + fwprintf(fp, L"\\providecommand{\\mglY}[4]{\\draw[#3] (#1, #2-#4) -- (#1,#2) (#1-#4,#2+#4) -- (#1,#2) (#1+#4,#2+#4) -- (#1,#2);}\n"); + fwprintf(fp, L"\\providecommand{\\mglo}[4]{\\draw[#3] (#1, #2) circle (#4);}\n"); + fwprintf(fp, L"\\providecommand{\\mglO}[4]{\\fill[#3] (#1, #2) circle (#4);}\n"); + fwprintf(fp, L"\\providecommand{\\mglc}[3]{\\draw[#3] (#1, #2) circle (%g);}\n\n", 4e-4*gr->mark_size()); + fwprintf(fp, L"\\begin{tikzpicture}\n"); // write primitives first mreal wp=-1; @@ -622,47 +629,47 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr) switch(q.n4) // NOTE: no thickness for marks in TeX { case 'P': - fprintf(fp, "\\mglp{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s); break; + fwprintf(fp, L"\\mglp{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s); break; case 'X': - fprintf(fp, "\\mglx{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s); break; + fwprintf(fp, L"\\mglx{%.4g}{%.4g}{%s}{%.4g} \\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s); break; case 'C': - fprintf(fp, "\\mglc{%.4g}{%.4g}{%s}{%.4g} \\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s); break; - case '+': fprintf(fp, "\\mglp{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'x': fprintf(fp, "\\mglx{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 's': fprintf(fp, "\\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'S': fprintf(fp, "\\mglS{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'd': fprintf(fp, "\\mgld{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'D': fprintf(fp, "\\mglD{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case '^': fprintf(fp, "\\mglt{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'T': fprintf(fp, "\\mglT{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'v': fprintf(fp, "\\mglv{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'V': fprintf(fp, "\\mglV{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case '<': fprintf(fp, "\\mgll{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'L': fprintf(fp, "\\mglL{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case '>': fprintf(fp, "\\mglr{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'R': fprintf(fp, "\\mglR{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'Y': fprintf(fp, "\\mglY{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'o': fprintf(fp, "\\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case 'O': fprintf(fp, "\\mglO{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - case '*': fprintf(fp, "\\mgla{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; - default: fprintf(fp, "\\mglc{%.4g}{%.4g}{%s}\n", x,y,cname); break; + fwprintf(fp, L"\\mglc{%.4g}{%.4g}{%s}{%.4g} \\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s,x,y,cname,s); break; + case '+': fwprintf(fp, L"\\mglp{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'x': fwprintf(fp, L"\\mglx{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 's': fwprintf(fp, L"\\mgls{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'S': fwprintf(fp, L"\\mglS{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'd': fwprintf(fp, L"\\mgld{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'D': fwprintf(fp, L"\\mglD{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case '^': fwprintf(fp, L"\\mglt{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'T': fwprintf(fp, L"\\mglT{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'v': fwprintf(fp, L"\\mglv{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'V': fwprintf(fp, L"\\mglV{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case '<': fwprintf(fp, L"\\mgll{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'L': fwprintf(fp, L"\\mglL{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case '>': fwprintf(fp, L"\\mglr{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'R': fwprintf(fp, L"\\mglR{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'Y': fwprintf(fp, L"\\mglY{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'o': fwprintf(fp, L"\\mglo{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case 'O': fwprintf(fp, L"\\mglO{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + case '*': fwprintf(fp, L"\\mgla{%.4g}{%.4g}{%s}{%.4g}\n", x,y,cname,s); break; + default: fwprintf(fp, L"\\mglc{%.4g}{%.4g}{%s}\n", x,y,cname); break; } } else if(q.type==2 && cp.r[3]) { const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3); if(cp.r[3]<255) - fprintf(fp, "\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100); + fwprintf(fp, L"\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100); else - fprintf(fp, "\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100); + fwprintf(fp, L"\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p3.x/100,p3.y/100); } else if(q.type==3 && cp.r[3]) { const mglPnt p2=gr->GetPnt(q.n2), p3=gr->GetPnt(q.n3), p4=gr->GetPnt(q.n4); if(cp.r[3]<255) - fprintf(fp, "\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100); + fwprintf(fp, L"\\fill[%s, fill opacity=%.4g] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname,cp.r[3]/255., x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100); else - fprintf(fp, "\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100); + fwprintf(fp, L"\\fill[%s, fill] (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- (%.4g,%.4g) -- cycle;\n", cname, x,y, p2.x/100,p2.y/100, p4.x/100,p4.y/100, p3.x/100,p3.y/100); } else if(q.type==1) // lines @@ -670,12 +677,18 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr) //const char *dash[]={"", "8 8","4 4","1 3","7 4 1 4","3 2 1 2"}; const char *w[]={"semithick","thick","very thick","ultra thick"}; register int iw=int(q.w-0.5); if(iw>3) iw=3; - if(iw<0) fprintf(fp,"\\draw[%s] ",cname); - else fprintf(fp,"\\draw[%s,%s] ",cname,w[iw]); + if(iw<0) fwprintf(fp,L"\\draw[%s] ",cname); + else fwprintf(fp,L"\\draw[%s,%s] ",cname,w[iw]); // TODO: add line dashing wp = q.w>1 ? q.w:1; st = q.n3; - put_line(gr,fp,false,i,wp,cp.c,st, "(%.4g,%.4g)", " -- (%.4g,%.4g)", false, 0.01); - fprintf(fp, ";\n"); + std::vector ids = put_line(gr,i,wp,cp.c,st); + for(size_t j=0;jGetPnt(ids[j]); + register float x0 = p.x, y0 = p.y; + fwprintf(fp, j==0?L"(%.4g,%.4g)":L" -- (%.4g,%.4g)",0.01*x0,y0*0.01); + } + fwprintf(fp, L";\n"); } else if(q.type==6 && mgl_isnum(q.p)) // text { @@ -689,12 +702,12 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr) // if(f&MGL_FONT_ITAL) ss.append(",font=\\itshape"); // if(f&MGL_FONT_BOLD) ss.append(",font=\\bfshape"); if(t.text.find('\\')!=std::string::npos || t.text.find('{')!=std::string::npos || t.text.find('_')!=std::string::npos || t.text.find('^')!=std::string::npos) - fprintf(fp,"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{$%ls$};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str()); + fwprintf(fp,L"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{$%ls$};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str()); else - fprintf(fp,"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{%ls};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str()); + fwprintf(fp,L"\\draw[%s] (%.4g,%.4g) node[rotate=%.2g]{%ls};\n", ss.c_str(),x-dx,y-dy, -q.p, t.text.c_str()); } } - fprintf(fp, "\\end{tikzpicture}\n"); + fwprintf(fp, L"\\end{tikzpicture}\n"); for(long i=0;iGetPrmNum();i++) { mglPrim &q=gr->GetPrm(i); if(q.type==-1) q.type = 1; } fclose(fp); @@ -706,6 +719,7 @@ void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr) { fprintf(fp, "%% this file just show figure\n"); fprintf(fp, "\\documentclass{article}\n\\usepackage{tikz}\n"); + fprintf(fp, "\\usepackage[T2A]{fontenc}\n\\usepackage[utf8]{inputenc}\n"); fprintf(fp, "\\begin{document}\n\\input{%s}\n\\end{document}\n",fname); fclose(fp); } diff --git a/src/export_3d.cpp b/src/export_3d.cpp index 5c9232a..9ba30f2 100644 --- a/src/export_3d.cpp +++ b/src/export_3d.cpp @@ -575,7 +575,7 @@ std::string mglCanvas::GetJSON() n3 = p.n3; n4 = p.n4; } if(p.type==1 && n1>n2) { n1=p.n2; n2=p.n1; } - register long ps=p.s==p.s?long(100*factor*p.s):0, pw=p.w==p.w?long(100*p.w):0, pp=p.p==p.p?long(1e5*p.p+0.5):0; + register long ps=p.s==p.s?long(100*factor*p.s):0, pw=p.w==p.w?long(100*p.w):0, pp=p.p==p.p?mgl_int(1e5*p.p):0; if(cp.r[3]==255 || p.type==0 || p.type==1 || p.type==4 || p.type==6) buf = mgl_sprintf("[%d,%ld,%ld,%ld,%ld,%d,%ld,%ld,%ld,0,\"#%02x%02x%02x\"],\n", p.type, n1, n2, n3, n4, p.id, ps,pw,pp, int(cp.r[0]),int(cp.r[1]),int(cp.r[2])); diff --git a/src/fft.cpp b/src/fft.cpp index a0a4bb8..7ea43f8 100644 --- a/src/fft.cpp +++ b/src/fft.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #endif //----------------------------------------------------------------------------- void MGL_EXPORT mglStartThreadT(void *(*func)(void *), long n, void *a, double *b, const void *v, void **w, const long *p, const void *re, const void *im) @@ -1292,5 +1293,81 @@ uintptr_t MGL_EXPORT mgl_data_correl_(uintptr_t *d1, uintptr_t *d2, const char * uintptr_t res = uintptr_t(mgl_datac_correl(_DA_(d1),_DA_(d2),s)); delete []s; return res; } //----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_data_wavelet(HMDT dat, const char *how, int k) +{ +#if MGL_HAVE_GSL + gsl_wavelet *w=0; + if(mglchr(how,'d')) w = gsl_wavelet_alloc(gsl_wavelet_daubechies, k); + else if(mglchr(how,'D')) w = gsl_wavelet_alloc(gsl_wavelet_daubechies_centered, k); + else if(mglchr(how,'h')) w = gsl_wavelet_alloc(gsl_wavelet_haar, k); + else if(mglchr(how,'H')) w = gsl_wavelet_alloc(gsl_wavelet_haar_centered, k); + else if(mglchr(how,'b')) w = gsl_wavelet_alloc(gsl_wavelet_bspline, k); + else if(mglchr(how,'B')) w = gsl_wavelet_alloc(gsl_wavelet_bspline_centered, k); + if(!w) return; + + double *a; +#if MGL_USE_DOUBLE + a = dat->a; +#else + long nn = dat->GetNN(); + a = new double[nn]; +#pragma omp parallel for + for(long i=0;ia[i]; +#endif + if(mglchr(how,'x')) +#pragma omp parallel + { + long n = dat->nx; + gsl_wavelet_workspace *work = gsl_wavelet_workspace_alloc(n); + if(mglchr(how,'i')) +#pragma omp for + for(long i=0;iny*dat->nz;i++) + gsl_wavelet_transform_inverse(w, a+i*n, 1, n, work); + else +#pragma omp for + for(long i=0;iny*dat->nz;i++) + gsl_wavelet_transform_forward(w, a+i*n, 1, n, work); + gsl_wavelet_workspace_free(work); + } + if(mglchr(how,'y')) +#pragma omp parallel + { + long n = dat->ny, s = dat->nx; + gsl_wavelet_workspace *work = gsl_wavelet_workspace_alloc(n); + if(mglchr(how,'i')) +#pragma omp for collapse(2) + for(long i=0;inx;i++) for(long j=0;jnz;j++) + gsl_wavelet_transform_inverse(w, a+i+n*s*j, s, n, work); + else +#pragma omp for collapse(2) + for(long i=0;inx;i++) for(long j=0;jnz;j++) + gsl_wavelet_transform_forward(w, a+i+n*s*j, s, n, work); + gsl_wavelet_workspace_free(work); + } + if(mglchr(how,'z')) +#pragma omp parallel + { + long n = dat->nz, s = dat->nx*dat->ny; + gsl_wavelet_workspace *work = gsl_wavelet_workspace_alloc(n); + if(mglchr(how,'i')) +#pragma omp for + for(long i=0;inx*dat->ny;i++) + gsl_wavelet_transform_inverse(w, a+i, s, n, work); + else +#pragma omp for + for(long i=0;inx*dat->ny;i++) + gsl_wavelet_transform_forward(w, a+i, s, n, work); + gsl_wavelet_workspace_free(work); + } +#if !MGL_USE_DOUBLE +#pragma omp parallel for + for(long i=0;ia[i] = a[i]; + delete []a; +#endif + gsl_wavelet_free (w); +#endif +} +void MGL_EXPORT mgl_data_wavelet_(uintptr_t *d, const char *dir, int *k,int l) +{ char *s=new char[l+1]; memcpy(s,dir,l); s[l]=0; + mgl_data_wavelet(_DT_,s,*k); delete []s; } //----------------------------------------------------------------------------- diff --git a/src/fit.cpp b/src/fit.cpp index 4a78964..6a42a4b 100644 --- a/src/fit.cpp +++ b/src/fit.cpp @@ -28,15 +28,19 @@ #include #include #endif -mglData MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector &head); +HMDT 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 mreal mglFitChi=NAN; ///< Chi value for last fitted formula +mglData mglFitCovar; ///< Covar matrix for lat fitted formula //----------------------------------------------------------------------------- mreal MGL_EXPORT mgl_get_fit_chi() { return mglFitChi; } mreal MGL_EXPORT mgl_get_fit_chi_() { return mglFitChi; } //----------------------------------------------------------------------------- +HCDT MGL_EXPORT mgl_get_fit_covar() { return &mglFitCovar; } +uintptr_t MGL_EXPORT mgl_get_fit_covar_() { return (uintptr_t)&mglFitCovar; } +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_puts_fit(HMGL gr, double x, double y, double z, const char *pre, const char *font, double size) { long n = strlen(mglFitRes)+(pre?strlen(pre):0)+1; @@ -77,16 +81,16 @@ int mgl_fit__f (const gsl_vector *x, void *data, gsl_vector *f) 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); + HMDT res = mglFormulaCalc(fd->eq, list); #pragma omp parallel for for(long i=0;in;i++) { mreal aa = fd->a[i], ss = fd->s[i]; if(mgl_isnum(aa) && ss==ss && ss!=0) - gsl_vector_set (f, i, (res.a[i] - aa)/ss); + gsl_vector_set (f, i, (res->a[i] - aa)/ss); else gsl_vector_set (f, i, 0); } - delete []var; + delete []var; mgl_delete_data(res); return GSL_SUCCESS; } //----------------------------------------------------------------------------- @@ -100,23 +104,24 @@ int MGL_NO_EXPORT mgl_fit__df (const gsl_vector * x, void *data, gsl_matrix * J) 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); + HMDT res = mglFormulaCalc(fd->eq, list); 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; + HMDT dif = mglFormulaCalc(fd->eq, list); var[j].Fill(gsl_vector_get(x,j)); #pragma omp parallel for for(long i=0;in;i++) { mreal aa = fd->a[i], ss = fd->s[i]; if(mgl_isnum(aa) && ss==ss && ss!=0) - gsl_matrix_set (J, i, j, dif.a[i]/ss); + gsl_matrix_set (J, i, j, (dif->a[i]-res->a[i])/(eps*ss)); else gsl_matrix_set (J, i, j, 0); } + mgl_delete_data(dif); } - delete []var; + delete []var; mgl_delete_data(res); return GSL_SUCCESS; } //----------------------------------------------------------------------------- @@ -130,31 +135,32 @@ int MGL_NO_EXPORT mgl_fit__fdf (const gsl_vector * x, void *data, gsl_vector * f 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); + HMDT res = mglFormulaCalc(fd->eq, list); #pragma omp parallel for for(long i=0;in;i++) { mreal aa = fd->a[i], ss = fd->s[i]; if(mgl_isnum(aa) && ss==ss && ss!=0) - gsl_vector_set (f, i, (res.a[i] - aa)/ss); + gsl_vector_set (f, i, (res->a[i] - aa)/ss); else gsl_vector_set (f, i, 0); } 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; + HMDT dif = mglFormulaCalc(fd->eq, list); var[j].Fill(gsl_vector_get(x,j)); #pragma omp parallel for for(long i=0;in;i++) { mreal aa = fd->a[i], ss = fd->s[i]; if(mgl_isnum(aa) && ss==ss && ss!=0) - gsl_matrix_set (J, i, j, dif.a[i]/ss); + gsl_matrix_set (J, i, j, (dif->a[i]-res->a[i])/(eps*ss)); else gsl_matrix_set (J, i, j, 0); } + mgl_delete_data(dif); } - delete []var; + delete []var; mgl_delete_data(res); return GSL_SUCCESS; } #endif @@ -169,7 +175,6 @@ mreal MGL_NO_EXPORT mgl_fit_base(mglFitData &fd, mreal *ini) double *x_init = new double[fd.m]; for(i=0;idx, s->x, 1e-4, 1e-4 ); } while ( status == GSL_CONTINUE && iter < 500 ); + gsl_matrix *covar = gsl_matrix_alloc(m, m); gsl_multifit_covar (s->J, 0.0, covar ); + mglFitCovar.Set(covar); mreal res = gsl_blas_dnrm2(s->f); for(i=0;ix, i); // free memory @@ -289,10 +296,10 @@ void MGL_NO_EXPORT mgl_fill_fit(HMGL gr, mglData &fit, mglData &in, mglFitData & mglDataV x(nx,ny,nz, gr->Min.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); + HMDT res = mglFormulaCalc(fd.eq, list); long nn = nx*ny*nz; - memcpy(fit.a+k*nn,res.a,nn*sizeof(mreal)); - delete []vv; + memcpy(fit.a+k*nn,res->a,nn*sizeof(mreal)); + delete []vv; mgl_delete_data(res); } //----------------------------------------------------------------------------- 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) @@ -495,7 +502,7 @@ 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 const char *mgl_get_fit(HMGL ) { return mglFitRes; } +MGL_EXPORT 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_); diff --git a/src/font.cpp b/src/font.cpp index d1b1318..78c24b3 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -29,7 +29,7 @@ #include "mgl2/base.h" #include "mgl2/font.h" -#include "def_font.cpp" +#include "def_font.cc" //----------------------------------------------------------------------------- extern mglTeXsymb mgl_tex_symb[]; extern long mgl_tex_num; @@ -277,6 +277,7 @@ unsigned mglFont::Parse(const wchar_t *s) const else if(!wcscmp(s,L"textbf")) res = MGL_FONT_BOLD; else if(!wcscmp(s,L"textit")) res = MGL_FONT_ITAL; else if(!wcscmp(s,L"textrm")) res = unsigned(-1); + else if(!wcscmp(s,L"T2A")) res = unsigned(-1); else if(!wcscmp(s,L"w")) res = MGL_FONT_WIRE; else if(!wcscmp(s,L"wire")) res = MGL_FONT_WIRE; else if(!wcsncmp(s,L"color",5)) res = MGL_COLOR_MASK + (0xff & s[5]); @@ -310,6 +311,7 @@ void mglFont::Convert(const wchar_t *str, unsigned *res) const } } } + else if(ch=='-' && str[i+1]=='-') { res[j++] = 0x2212; i++; } else if(ch=='\b'){} else if(ch<=' ' && ch!='\n') res[j++] = ' '; // no \t at this moment :( else if(ch=='_') res[j++] = MGL_FONT_LOWER; @@ -506,15 +508,27 @@ float mglFont::Puts(const unsigned *text, float x,float y,float f,int style,floa if(ss) // draw symbol (glyph) { long j = Internal('!'); + float dx=0; if(ss>' ') { j = Internal(ss); if(j==-1) continue; - if(s & MGL_FONT_ZEROW) yy += 100*ff/fact[a]; + if(s & MGL_FONT_ZEROW) + { + long j=1; + yy += 100*ff/fact[a]; + while(str[i+j]>=unsigned(-15)) j++; + unsigned sn = str[i+j]; + if(sn' ') // specially center + { + dx = 0.75*ff*(GetWidth(a,Internal(sn&MGL_FONT_MASK))-GetWidth(a,j))/fact[a]; + if(dx<0) dx=0; + } + } if(gr && !(style&0x10)) { - if(st & MGL_FONT_WIRE) gr->Glyph(x,yy,ff,a+4,j,ccol); - else gr->Glyph(x,yy,ff,a,j,ccol); + if(st & MGL_FONT_WIRE) gr->Glyph(x+dx,yy,ff,a+4,j,ccol); + else gr->Glyph(x+dx,yy,ff,a,j,ccol); } } ww = ff*GetWidth(a,j)/fact[a]; @@ -665,6 +679,48 @@ bool mglFont::read_main(const char *fname, std::vector &buf) return true; } //----------------------------------------------------------------------------- +size_t mglFont::SaveBin(const char *fname) +{ + FILE *fp = fopen(fname,"wb"); + if(!fp) return 0; + size_t sum=0; + fwrite(&numb,sizeof(long),1,fp); sum += sizeof(long); + fwrite(fact,sizeof(float),4,fp); sum += sizeof(float)*4; + fwrite(Buf,sizeof(short),numb,fp); sum += sizeof(short)*numb; + size_t len = glyphs.size(); + fwrite(&len,sizeof(size_t),1,fp); sum += sizeof(long); + fwrite(&(glyphs[0]),sizeof(mglGlyphDescr),len,fp); sum += sizeof(mglGlyphDescr)*len; + fclose(fp); return sum; +} +//----------------------------------------------------------------------------- +bool mglFont::LoadBin(const char *base, const char *path) +{ + Clear(); // first clear old + if(!path) path = MGL_FONT_PATH; + char str[256], sep='/'; + snprintf(str,256,"%s%c%s.vfmb",path,sep,base?base:""); str[255]=0; + FILE *fp = fopen(str,"rb"); if(!fp) return false; + size_t s, len; + bool res = true; + s = fread(&numb,sizeof(long),1,fp); + if(s<1) res = false; + s = fread(fact,sizeof(float),4,fp); + if(s<4) res = false; + Buf = new short[numb]; + s = fread(Buf,sizeof(short),numb,fp); + if(s=0 && buf[i]!=sep;i--); path = buf; buf[i]=0; base = buf+i+1; } + if(LoadBin(base,path)) + { delete []buf; return true; } } Clear(); // first clear old @@ -719,12 +777,12 @@ bool mglFont::Load(const char *base, const char *path) // now collect data numb = norm.size()+bold.size()+ital.size()+both.size(); Buf = new short[numb]; - memcpy(Buf,norm.data(),norm.size()*sizeof(short)); + memcpy(Buf,&norm[0],norm.size()*sizeof(short)); long cur = norm.size(), len = long(bold.size()); if(bold.size()>0) - memcpy(Buf+cur,bold.data(),bold.size()*sizeof(short)); + memcpy(Buf+cur,&bold[0],bold.size()*sizeof(short)); #pragma omp parallel for - for(long i=0;i0) - memcpy(Buf+cur,ital.data(),ital.size()*sizeof(short)); + memcpy(Buf+cur,&ital[0],ital.size()*sizeof(short)); #pragma omp parallel for - for(long i=0;i0) - memcpy(Buf+cur,both.data(),both.size()*sizeof(short)); + memcpy(Buf+cur,&both[0],both.size()*sizeof(short)); #pragma omp parallel for - for(long i=0;inumb; 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)); + memcpy(&glyphs[0],&(f->glyphs)[0],glyphs.size()*sizeof(mglGlyphDescr)); } //----------------------------------------------------------------------------- diff --git a/src/opengl.cpp b/src/opengl.cpp index 0c327e0..abdf610 100644 --- a/src/opengl.cpp +++ b/src/opengl.cpp @@ -21,6 +21,23 @@ mglCanvasGL::mglCanvasGL() : mglCanvas(1,1) { Clf(); Zoom(0,0,1,1); } //----------------------------------------------------------------------------- mglCanvasGL::~mglCanvasGL(){} //----------------------------------------------------------------------------- +void set_pen(unsigned style, mreal width, mreal pos) +{ + if(style==0) return; + unsigned long pdef = style*0x100010001; + pdef >>= long(32*pos)%32; // NOTE try to bypass OpenGL limitations + style = pdef & 0xffff; + width *= 20; + if(style!=0xffff) + { + glEnable(GL_LINE_STIPPLE); + glLineStipple(int(width+0.5),style); + } + else glDisable(GL_LINE_STIPPLE); + if(width>1) glLineWidth(width); // NOTE bypass bug on some drivers, where width>1 must be + else glLineWidth(1); +} +//----------------------------------------------------------------------------- void mglCanvasGL::Finish() { #if MGL_USE_DOUBLE @@ -87,48 +104,48 @@ bool mglCanvasGL::Alpha(bool enable) return mglCanvas::Alpha(enable); } //----------------------------------------------------------------------------- -void mglCanvasGL::AddLight(int n,mglPoint r,mglPoint d,char cc, mreal br,mreal /*ap*/) +void mglCanvasGL::AddLight(int n,mglPoint r,mglPoint d,char cc, mreal br,mreal ap) { mglColor c(cc); - mglColor AmbLight = mglColor(AmbBr,AmbBr,AmbBr); - mglColor DifLight = mglColor(br,br,br); - GLenum lght[8] = {GL_LIGHT0,GL_LIGHT1,GL_LIGHT2,GL_LIGHT3,GL_LIGHT4, - GL_LIGHT5,GL_LIGHT6,GL_LIGHT7}; - float amb[4], pos[4],dif[4],dir[4]; + float amb[4],dif[4],spc[4], pos[4],dir[4]; bool inf = mgl_isnan(r.x); if(n<0 || n>7) { SetWarn(mglWarnLId,"AddLight"); return; } if(c.Valid()) { - DifLight = c*br; - AmbLight = c*AmbBr; + spc[0] = br*c.r; spc[1] = br*c.g; spc[2] = br*c.b; + amb[0] = AmbBr*c.r; amb[1] = AmbBr*c.g; amb[2] = AmbBr*c.b; } - dif[0] = DifLight.r; dif[1] = DifLight.g; - dif[2] = DifLight.b; dif[3] = 1.; - amb[0] = AmbLight.r; amb[1] = AmbLight.g; - amb[2] = AmbLight.b; amb[3] = 1.; + else + { + spc[0] = spc[1] = spc[2] = br; + amb[0] = amb[1] = amb[2] = AmbBr; + } + ap = 90-180*atan(fabs(ap))/M_PI; + dif[0] = dif[1] = dif[2] = DifBr; + dif[3] = amb[3] = spc[3] = 1.; if(inf) { pos[0] = d.x; pos[1] = d.y; pos[2] = d.z; pos[3] = 0; } else { pos[0] = r.x; pos[1] = r.y; pos[2] = r.z; pos[3] = 1; } - dir[0] = d.x; dir[1] = d.y; dir[2] = d.z; - glShadeModel(GL_SMOOTH); - //glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 5.0); - //glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, pos); + dir[0] = d.x; dir[1] = d.y; dir[2] = d.z; dir[3] = 0; - glLightfv(lght[n], GL_AMBIENT, amb); - glLightfv(lght[n], GL_DIFFUSE, dif); - //glLightfv(lght[n], GL_SPECULAR, spc); - glLightfv(lght[n], GL_POSITION, pos); - if(!inf) glLightfv(lght[n], GL_SPOT_DIRECTION, dir); - glEnable(lght[n]); + glShadeModel(GL_SMOOTH); + glLightfv(GL_LIGHT0+n, GL_AMBIENT, amb); + glLightfv(GL_LIGHT0+n, GL_DIFFUSE, dif); + glLightfv(GL_LIGHT0+n, GL_SPECULAR, spc); + glLightfv(GL_LIGHT0+n, GL_POSITION, pos); + if(!inf) + { + glLightfv(GL_LIGHT0+n, GL_SPOT_DIRECTION, dir); + glLightf(GL_LIGHT0+n, GL_SPOT_CUTOFF, ap); + } + glEnable(GL_LIGHT0+n); } //----------------------------------------------------------------------------- void mglCanvasGL::Light(int n, bool enable) { - GLenum lght[8] = {GL_LIGHT0,GL_LIGHT1,GL_LIGHT2,GL_LIGHT3,GL_LIGHT4, - GL_LIGHT5,GL_LIGHT6,GL_LIGHT7}; - if(enable) glEnable(lght[n]); - else glDisable(lght[n]); + if(enable) glEnable(GL_LIGHT0+n); + else glDisable(GL_LIGHT0+n); } //----------------------------------------------------------------------------- bool mglCanvasGL::Light(bool enable) @@ -144,7 +161,7 @@ void mglCanvasGL::LightScale(const mglMatrix *M) GLenum ll[8] = {GL_LIGHT0,GL_LIGHT1,GL_LIGHT2,GL_LIGHT3,GL_LIGHT4, GL_LIGHT5,GL_LIGHT6,GL_LIGHT7}; float pos[4]={0,0,0,0}; - for(int i=0;i<8;i++) + for(int i=0;i<8;i++) // NOTE only global light is used in OpenGL mode { pos[0] = light[i].p.x; pos[1] = light[i].p.y; @@ -185,7 +202,7 @@ void mglCanvasGL::Fog(mreal d, mreal) void mglCanvasGL::Clf(mglColor Back) { mglCanvas::Clf(Back); - if(Back==NC) Back = mglColor(BDef[0]/255.,BDef[1]/255.,BDef[2]/255.); + if(Back==NC) Back.Set(BDef[0]/255.,BDef[1]/255.,BDef[2]/255.); gl_clf(Back); } //----------------------------------------------------------------------------- @@ -212,19 +229,10 @@ void mglCanvasGL::gl_clf(mglColor Back) // glTranslated(-0.5,-0.5,-0.5); glScaled(2,2,2); glTranslated(-0.5,-0.5,-0.5); -} -//----------------------------------------------------------------------------- -void mglCanvasGL::set_pen(unsigned style,mreal width) -{ - if(style==0) return; - if(style!=0xffff) - { - glEnable(GL_LINE_STIPPLE); - glLineStipple(int(width+0.5),style); - } - else glDisable(GL_LINE_STIPPLE); - if(width>0) glLineWidth(width); - else glLineWidth(1); + +// float dif[4]={DifBr,DifBr,DifBr,1}, spc[4]={1,1,1,1}; +// glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, dif); +// glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spc); } //----------------------------------------------------------------------------- /*void mglCanvasGL::EndFrame() @@ -276,10 +284,7 @@ void mglCanvasGL::trig_draw(long k1, long k2, long k3) void mglCanvasGL::line_draw(long k1, long k2) { if(PDef==0) return; -/* unsigned pdef = PDef*0x10001; - pdef = pdef << (int(100*pPos+0.5)%16); - set_pen(pdef&0xffff,PenWidth);*/ - set_pen(PDef,PenWidth); + set_pen(PDef,PenWidth, pPos); glBegin(GL_LINES); glArrayElement(k1); glArrayElement(k2); glEnd(); @@ -307,7 +312,7 @@ void mglCanvasGL::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3 void mglCanvasGL::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *) { if(PDef==0) return; - set_pen(PDef,PenWidth); + set_pen(PDef,PenWidth, pPos); glBegin(GL_LINES); glColor4f(p1.r,p1.g,p1.b,p1.a); glVertex3f(p1.x,p1.y,p1.z); glColor4f(p2.r,p2.g,p2.b,p2.a); glVertex3f(p2.x,p2.y,p2.z); diff --git a/src/parser.cpp b/src/parser.cpp index 0949ef7..7d34b41 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -48,7 +48,7 @@ long mglParser::IsFunc(const std::wstring &name, int *na) { const mglFunc &f = func[i]; if(f.func==name) - { if(na) *na=f.narg; return f.pos; } + { if(na) *na=f.narg; return f.pos+1; } } return 0; } @@ -80,9 +80,10 @@ int MGL_LOCAL_PURE mgl_cmd_cmp(const void *a, const void *b) return strcmp(aa->name, bb->name); } //----------------------------------------------------------------------------- -bool mgl_check_for_name(const std::wstring &s) +bool mglParser::CheckForName(const std::wstring &s) { - return !isalpha(s[0])||s.find_first_of(L".:()")!=std::wstring::npos; + return !isalpha(s[0]) || s.find_first_of(L"!@#$%%^&*()-+|,.<>:")!=std::wstring::npos || s==L"rnd" || FindNum(s.c_str()); +// return !isalpha(s[0])||s.find_first_of(L".:()")!=std::wstring::npos; } //----------------------------------------------------------------------------- const mglCommand *mglParser::FindCommand(const char *com) const @@ -120,12 +121,12 @@ int mglParser::Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const s } const mglCommand *rts=FindCommand(com); if(!rts || rts->type==6) return 2; - if(rts->type == 4) +/* if(rts->type == 4) { - if(n<1 || mgl_check_for_name(var)) return 2; + if(n<1 || CheckForName(var)) return 2; a[0].type = 0; a[0].d = AddVar(var.c_str()); a[0].w = var; k[0] = 'd'; - } + }*/ char *o=0; if(opt && *opt) // TODO: parse arguments of options { @@ -152,6 +153,12 @@ mglParser::mglParser(bool setsize) AllowSetSize=setsize; AllowFileIO=true; AllowDllCall=true; Once = true; fval = new mglData[40]; + mglNum *v; + v = new mglNum(0); v->s = L"off"; NumList.push_back(v); + v = new mglNum(1); v->s = L"on"; NumList.push_back(v); + v = new mglNum(NAN); v->s = L"nan"; NumList.push_back(v); + v = new mglNum(M_PI); v->s = L"pi"; NumList.push_back(v); + v = new mglNum(INFINITY); v->s = L"inf"; NumList.push_back(v); #if MGL_HAVE_LTDL lt_dlinit(); #endif @@ -173,6 +180,12 @@ void mglParser::DeleteAll() for(size_t i=0;is = L"off"; NumList.push_back(v); + v = new mglNum(1); v->s = L"on"; NumList.push_back(v); + v = new mglNum(NAN); v->s = L"nan"; NumList.push_back(v); + v = new mglNum(M_PI); v->s = L"pi"; NumList.push_back(v); + v = new mglNum(INFINITY); v->s = L"inf"; NumList.push_back(v); if(Cmd && Cmd!=mgls_base_cmd) { delete []Cmd; Cmd = mgls_base_cmd; } #if MGL_HAVE_LTDL @@ -194,9 +207,9 @@ int mglParser::Parse(mglGraph *gr, const char *str, long pos) return r; } //----------------------------------------------------------------------------- -mglData *mglParser::AddVar(const char *str) +mglDataA *mglParser::AddVar(const char *str) { - mglData *v=0; + mglDataA *v=0; MGL_TO_WCS(str,v = AddVar(wcs)); return v; } @@ -230,22 +243,19 @@ void mglParser::AddParam(int n, const wchar_t *str) //----------------------------------------------------------------------------- mglDataA *mglParser::FindVar(const wchar_t *name) { + if(name[0]=='!') name = name+1; // ignore complex prefix for(size_t i=0;is==name) return DataList[i]; return 0; } //----------------------------------------------------------------------------- -mglData *mglParser::AddVar(const wchar_t *name) +mglDataA *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); + mglDataA *d=FindVar(name); + if(name[0]=='!' && dynamic_cast(d)==0) + { d = new mglDataC; d->s=(name+1); DataList.push_back(d); } + else if(!d) + { d = new mglData; d->s = name; DataList.push_back(d); } return d; } //----------------------------------------------------------------------------- @@ -259,12 +269,7 @@ mglNum *mglParser::FindNum(const wchar_t *name) mglNum *mglParser::AddNum(const wchar_t *name) { mglNum *v = FindNum(name); - if(!v) - { - mglNum *n=new mglNum; n->s = name; - NumList.push_back(n); - v = NumList[NumList.size()-1]; - } + if(!v) { v=new mglNum; v->s = name; NumList.push_back(v); } return v; } //----------------------------------------------------------------------------- @@ -285,8 +290,10 @@ int MGL_LOCAL_PURE mglFindArg(const std::wstring &str) return 0; } //----------------------------------------------------------------------------- +HMDT MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector &head); +HADT MGL_NO_EXPORT mglFormulaCalcC(std::wstring string, mglParser *arg, const std::vector &head); +//----------------------------------------------------------------------------- // convert substrings to arguments -mglData MGL_NO_EXPORT mglFormulaCalc(std::wstring string, mglParser *arg, const std::vector &head); void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a) { register long n; @@ -312,8 +319,20 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a) for(;ii1) { - mglData d = mglFormulaCalc(w.substr(i1,i-i1-(w[i]=='\''?1:0)), this, DataList); - mglprintf(buf,32,L"%g",d.a[0]); a[n-1].w += buf; + if(w[i1]=='!') + { + HADT d = mglFormulaCalcC(w.substr(i1+1,i-i1-(w[i]=='\''?1:0)), this, DataList); + mreal di = imag(d->a[0]), dr = real(d->a[0]); + if(di>0) mglprintf(buf,32,L"%g+%gi",dr,di); + else if(di<0) mglprintf(buf,32,L"%g-%gi",dr,-di); // TODO use \u2212 ??? + else mglprintf(buf,32,L"%g",dr); + a[n-1].w += buf; delete d; + } + else + { + HMDT d = mglFormulaCalc(w.substr(i1,i-i1-(w[i]=='\''?1:0)), this, DataList); + mglprintf(buf,32,L"%g",d->a[0]); a[n-1].w += buf; delete d; + } } } else a[n-1].w += w[i]; @@ -331,18 +350,41 @@ void mglParser::FillArg(mglGraph *gr, int k, std::wstring *arg, mglArg *a) 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) // 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; } + { a[n-1].type=2; a[n-1].d=0; a[n-1].v=f->d; a[n-1].c=f->c; a[n-1].w = f->s; } + else if(arg[n][0]=='!') // complex array is asked + { // parse all numbers and formulas by unified way + HADT d = mglFormulaCalcC(arg[n].substr(1), this, DataList); + if(d->GetNN()==1) + { + if(CheckForName(arg[n].substr(1))) + { a[n-1].type = 2; a[n-1].v = d->v(0); a[n-1].c = d->a[0]; } + else + { a[n-1].type = 0; a[n-1].d = AddVar(arg[n].c_str()); } + delete d; + } + else + { + a[n-1].w = L"/*"+arg[n]+L"*/"; + d->temp=true; DataList.push_back(d); + a[n-1].type = 0; a[n-1].d = d; + } + } else { // parse all numbers and formulas by unified way - mglData d = mglFormulaCalc(arg[n], this, DataList); - if(d.nx*d.ny*d.nz==1) - { a[n-1].type = 2; a[n-1].v = d.a[0]; } + HMDT d = mglFormulaCalc(arg[n], this, DataList); + if(d->GetNN()==1) + { + if(CheckForName(arg[n])) + { a[n-1].type = 2; a[n-1].c = a[n-1].v = d->v(0); } + else + { a[n-1].type = 0; a[n-1].d = AddVar(arg[n].c_str()); } + delete d; + } else { - mglData *u=new mglData; u->Set(d); a[n-1].w = L"/*"+arg[n]+L"*/"; - u->temp=true; DataList.push_back(u); - a[n-1].type = 0; a[n-1].d = u; + d->temp=true; DataList.push_back(d); + a[n-1].type = 0; a[n-1].d = d; } } } @@ -356,7 +398,7 @@ int mglParser::PreExec(mglGraph *, long k, std::wstring *arg, mglArg *a) { 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; + if(k<3 || CheckForName(arg[1])) return 2; long nx=0, ny=1,j=0,i,t=0; for(i=2;inx ? j:nx; j=0; ny++; } } - mglData *v = AddVar(arg[1].c_str()); - if(t==1) nx = j>nx ? j:nx; - if(t==1) // list of numeric values + mglDataA *vv = AddVar(arg[1].c_str()); + mglData *v = dynamic_cast(vv); + mglDataC *vc = dynamic_cast(vv); + if(v) { - v->Create(nx,ny); - j=t=0; - for(i=2;inx ? j:nx; + if(t==1) // list of numeric values { - if(arg[i][0]=='|') { t++; j=0; } - else - { v->a[j+nx*t] = a[i-1].v; j++; } + v->Create(nx,ny); + j=t=0; + for(i=2;ia[j+nx*t] = a[i-1].v; j++; } + } + } + if(t==2) // list of data + { + v->Set(a[1].d); + for(long i=2;iJoin(*(a[i].d)); } + n=1; } - if(t==2) // list of data + if(vc) { - mglData *b = dynamic_cast(a[1].d); - if(!b) return 1; - long nn = 0; - if(b->nz>1) return 2; - if(b->ny>1) + if(t==1) nx = j>nx ? j:nx; + if(t==1) // list of numeric values { - v->Create(b->nx, b->ny, nx); - nn = b->nx*b->ny; - for(i=2,j=0;iCreate(nx,ny); + j=t=0; + for(i=2;iGetNx()*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(); + if(arg[i][0]=='|') { t++; j=0; } + else + { vc->a[j+nx*t] = a[i-1].c; j++; } } } - else + if(t==2) // list of data { - v->Create(b->nx, nx); - nn = b->nx; - for(i=2,j=0;iGetNx()) 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; - } + vc->Set(a[1].d); + for(long i=2;iJoin(*(a[i].d)); } + n=1; } - n=1; } return n; } @@ -433,11 +472,12 @@ void mglParser::PutArg(std::wstring &str, bool def) { wchar_t ch = str[pos+1]; if(ch>='0' && ch<='9') str.replace(pos,2,par[ch-'0']); - if(ch>='a' && ch<='z') str.replace(pos,2,par[ch-'a'+10]); - if(ch=='$') str.replace(pos,2,L"\xffff"); + else if(ch>='a' && ch<='z') str.replace(pos,2,par[ch-'a'+10]); + else if(ch=='$') str.replace(pos,2,L"\uffff"); + else str.replace(pos,1,L"\uffff"); pos = str.find('$',def?10:0); } - while((pos = str.find(L'\xffff'))=0 && nn<='z'-'a'+10) { res = 0; - d = mglFormulaCalc(mgl_trim_ws(s.substr(2)), this, DataList).a[0]; + HMDT dd = mglFormulaCalc(mgl_trim_ws(s.substr(2)), this, DataList); + d = dd->a[0]; delete dd; char buf[32]; snprintf(buf,32,"%g",d); buf[31] = 0; AddParam(nn, buf); } @@ -481,7 +522,8 @@ int mglParser::ParseDef(std::wstring &str) if(s[0]=='$' && nn>=0 && nn<='z'-'a'+10) { res = 0; - d=mglFormulaCalc(mgl_trim_ws(s.substr(2)), this, DataList).a[0]; + HMDT dd = mglFormulaCalc(mgl_trim_ws(s.substr(2)), this, DataList); + d=dd->a[0]; delete dd; wchar_t buf[2]={0,0}; buf[0] = wchar_t(d); AddParam(nn, buf); } return res+1; @@ -583,7 +625,7 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) if(!skip() && !arg[0].compare(L"stop")) { Stop = true; delete []a; return 0; } if(!arg[0].compare(L"func")) - { delete []a; return 0; } + { Stop = true; delete []a; return 0; } n = FlowExec(gr, arg[0].c_str(),k-1,a); if(n) { delete []a; return n-1; } if(skip()) { delete []a; return 0; } @@ -598,11 +640,29 @@ int mglParser::Parse(mglGraph *gr, std::wstring str, long pos) { if(k==3) { + DeleteVar(arg[1].c_str()); // force to delete variable with the same name mglNum *v=AddNum(arg[1].c_str()); - v->d = mglFormulaCalc(arg[2],this, DataList).a[0]; + if(arg[2][0]=='!') // complex number is added + { HADT dd = mglFormulaCalcC(arg[2].substr(1),this, DataList); + v->d=NAN; v->c = dd->a[0]; delete dd; } + else + { HMDT dd = mglFormulaCalc(arg[2],this, DataList); + v->c = v->d = dd->a[0]; delete dd; } } delete []a; return k==3?0:1; } + if(!arg[0].compare(L"rkstep")) + { + int res=1; + if(k>2 && a[0].type==1 && a[1].type==1) + { + std::wstring a1 = arg[1], a2=arg[2]; res = 0; + if(a1[0]=='\'') a1 = a1.substr(1,a1.length()-2); + if(a2[0]=='\'') a2 = a2.substr(1,a2.length()-2); + mgl_rk_step_w(this, a1.c_str(), a2.c_str(), (k>=3 && a[2].type==2)?a[2].v:1); + } + delete []a; return res; + } if(!arg[0].compare(L"call")) { n = 1; @@ -836,7 +896,7 @@ void mglParser::Execute(mglGraph *gr, FILE *fp, bool print) if(gr==0 || fp==0) return; std::wstring str; wchar_t ch; - while((ch=fgetwc(fp))!=WEOF) str.push_back(ch); + while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF) str.push_back(ch); // while(!feof(fp)) str.push_back(fgetwc(fp)); Execute(gr,str.c_str()); if(print) printf("%s\n",gr->Message()); @@ -859,13 +919,14 @@ void mglParser::Execute(mglGraph *gr, int n, const wchar_t **text) else if(r==2) snprintf(buf,64,"\nWrong command in line %ld\n", i+1); else if(r==3) snprintf(buf,64,"\nString too long in line %ld\n", i+1); else if(r==4) snprintf(buf,64,"\nUnbalanced ' in line %ld\n", i+1); + else if(r==5) snprintf(buf,64,"\nChange temporary data in line %ld\n", i+1); else if(gr->GetWarn()>0) snprintf(buf,64," in line %ld\n", i+1); else *buf=0; buf[63] = 0; if(*buf) gr->SetWarn(-2,buf); if(r>0 && r<5) res=r; } - int code[]={mglScrArg, mglScrCmd, mglScrLong, mglScrStr}; + int code[]={mglScrArg, mglScrCmd, mglScrLong, mglScrStr, mglScrTemp}; if(res>0) gr->SetWarn(code[res-1],"MGL Parser"); } //----------------------------------------------------------------------------- @@ -933,11 +994,11 @@ 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) { return p->AddVar(name); } -MGL_EXPORT_PURE mglDataA *mgl_parser_find_var(HMPR p, const char *name) { return p->FindVar(name);} +MGL_EXPORT mglDataA *mgl_parser_add_var(HMPR p, const char *name) { return p->AddVar(name); } +MGL_EXPORT 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) { return p->AddVar(name); } -MGL_EXPORT_PURE mglDataA *mgl_parser_find_varw(HMPR p, const wchar_t *name) { return p->FindVar(name);} +MGL_EXPORT mglDataA *mgl_parser_add_varw(HMPR p, const wchar_t *name) { return p->AddVar(name); } +MGL_EXPORT 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); } @@ -964,9 +1025,9 @@ 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; - mglData *v=_PR_->AddVar(s); delete []s; return uintptr_t(v); } + mglDataA *v=_PR_->AddVar(s); delete []s; return uintptr_t(v); } /*===!!! NOTE !!! You must not delete obtained data arrays !!!===============*/ -uintptr_t MGL_EXPORT_PURE mgl_parser_find_var_(uintptr_t* p, const char *name, int l) +uintptr_t MGL_EXPORT 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; 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) @@ -989,52 +1050,56 @@ 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; } //--------------------------------------------------------------------------- -MGL_EXPORT_PURE mglDataA *mgl_parser_get_var(HMPR p, unsigned long id) +MGL_EXPORT 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) +uintptr_t MGL_EXPORT 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) +long MGL_EXPORT mgl_parser_num_var(HMPR p) { return p->DataList.size(); } -long MGL_EXPORT_PURE mgl_parser_num_var_(uintptr_t* p) +long MGL_EXPORT 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) +int MGL_EXPORT mgl_parser_cmd_type(HMPR pr, const char *name) { const mglCommand *cmd = pr->FindCommand(name); return cmd ? cmd->type + 1 : 0; } -int MGL_EXPORT_PURE mgl_parser_cmd_type_(uintptr_t* p, const char *str, int l) +int MGL_EXPORT 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_PURE const char *mgl_parser_cmd_desc(HMPR pr, const char *name) +MGL_EXPORT const char *mgl_parser_cmd_desc(HMPR pr, const char *name) { const mglCommand *cmd = pr->FindCommand(name); return cmd ? cmd->desc : 0; } -MGL_EXPORT_PURE const char *mgl_parser_cmd_frmt(HMPR pr, const char *name) +MGL_EXPORT const char *mgl_parser_cmd_frmt(HMPR pr, const char *name) { const mglCommand *cmd = pr->FindCommand(name); return cmd ? cmd->form : 0; } //--------------------------------------------------------------------------- -MGL_EXPORT_PURE const char *mgl_parser_cmd_name(HMPR pr, long id) +MGL_EXPORT const char *mgl_parser_cmd_name(HMPR pr, long id) { return (id=0) ? pr->Cmd[id].name:""; } -long MGL_EXPORT_PURE mgl_parser_cmd_num(HMPR pr) +long MGL_EXPORT 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) -{ - HMDT d=0; - MGL_TO_WCS(formula,d = mgl_parser_calcw(pr,wcs)); - return d; -} +{ HMDT d=0; MGL_TO_WCS(formula,d = mgl_parser_calcw(pr,wcs)); return d; } HMDT MGL_EXPORT mgl_parser_calcw(HMPR pr, const wchar_t *formula) -{ mglData *d = new mglData(mglFormulaCalc(formula,pr, pr->DataList)); return d; } +{ return mglFormulaCalc(formula,pr, pr->DataList); } uintptr_t MGL_EXPORT mgl_parser_calc_(uintptr_t *p, const char *str,int l) { char *s=new char[l+1]; memcpy(s,str,l); s[l]=0; uintptr_t d = (uintptr_t)mgl_parser_calc(_PR_, s); delete []s; return d; } //--------------------------------------------------------------------------- +HADT MGL_EXPORT mgl_parser_calc_complex(HMPR pr, const char *formula) +{ HADT d=0; MGL_TO_WCS(formula,d = mgl_parser_calc_complexw(pr,wcs)); return d; } +HADT MGL_EXPORT mgl_parser_calc_complexw(HMPR pr, const wchar_t *formula) +{ return mglFormulaCalcC(formula,pr, pr->DataList); } +uintptr_t MGL_EXPORT mgl_parser_calc_complex_(uintptr_t *p, const char *str,int l) +{ char *s=new char[l+1]; memcpy(s,str,l); s[l]=0; + uintptr_t d = (uintptr_t)mgl_parser_calc_complex(_PR_, s); delete []s; return d; } +//--------------------------------------------------------------------------- void MGL_EXPORT mgl_parser_del_all(HMPR p) { p->DeleteAll(); } void MGL_EXPORT mgl_parser_del_all_(uintptr_t *p) { _PR_->DeleteAll(); } //--------------------------------------------------------------------------- @@ -1067,3 +1132,178 @@ void MGL_EXPORT mgl_parser_load_(uintptr_t *p, const char *dll_name,int l) { char *s=new char[l+1]; memcpy(s,dll_name,l); s[l]=0; mgl_parser_load(_PR_, s); delete []s; } //--------------------------------------------------------------------------- +struct mglRKdat +{ + mglDataA *v; + std::wstring e; + bool cmplx; + mglDataC cin,c1,c2,c3,c4, *cc; + mglData din,d1,d2,d3,d4, *dd; + mglRKdat(mglDataA *var, std::wstring &eq):v(var), e(eq) + { cmplx = dynamic_cast(var); cc=0; dd=0; } + void allocate() + { + if(cmplx) + { cc = dynamic_cast(v); cin.Set(v); } + else + { dd = dynamic_cast(v); din.Set(v); } + } +}; +void MGL_EXPORT mgl_rk_step_w(HMPR pr, const wchar_t *Eqs, const wchar_t *Vars, mreal dt) +{ + const std::wstring eqs(Eqs); + const std::wstring vars(Vars); + std::vector rkv; + size_t iv=0,jv=0,ie=0,je=0; + while(1) + { + iv = vars.find(';',jv); ie = eqs.find(';',je); + mglDataA *vv=mgl_parser_find_varw(pr,vars.substr(jv,iv-jv).c_str()); + std::wstring eq = eqs.substr(je,ie-je).c_str(); + if(vv) rkv.push_back(mglRKdat(vv, eq )); + jv = iv+1; je = ie+1; + if(iv==std::wstring::npos || ie==std::wstring::npos) break; + } + for(size_t i=0;iDataList)); + else rk.d1.Move(mglFormulaCalc(rk.e, pr, pr->DataList)); + } + for(size_t i=0;iGetNN(); dual a = hh*rk.c1.a[0]; + if(rk.c1.GetNN()==n) +#pragma omp parallel for + for(long j=0;ja[j] = rk.cin.a[j] + hh*rk.c1.a[j]; + else +#pragma omp parallel for + for(long j=0;ja[j] = rk.cin.a[j] + a; + } + if(rk.dd) + { + long n = rk.dd->GetNN(); mreal a = hh*rk.d1.a[0]; + if(rk.d1.GetNN()==n) +#pragma omp parallel for + for(long j=0;ja[j] = rk.din.a[j] + hh*rk.d1.a[j]; + else +#pragma omp parallel for + for(long j=0;ja[j] = rk.din.a[j] + a; + } + } + + for(size_t i=0;iDataList)); + else rk.d2.Move(mglFormulaCalc(rk.e, pr, pr->DataList)); + } + for(size_t i=0;iGetNN(); dual a = hh*rk.c2.a[0]; + if(rk.c2.GetNN()==n) +#pragma omp parallel for + for(long j=0;ja[j] = rk.cin.a[j] + hh*rk.c2.a[j]; + else +#pragma omp parallel for + for(long j=0;ja[j] = rk.cin.a[j] + a; + } + if(rk.dd) + { + long n = rk.dd->GetNN(); mreal a = hh*rk.d2.a[0]; + if(rk.d2.GetNN()==n) +#pragma omp parallel for + for(long j=0;ja[j] = rk.din.a[j] + hh*rk.d2.a[j]; + else +#pragma omp parallel for + for(long j=0;ja[j] = rk.din.a[j] + a; + } + } + + for(size_t i=0;iDataList)); + else rk.d3.Move(mglFormulaCalc(rk.e, pr, pr->DataList)); + } + for(size_t i=0;iGetNN(); dual a = dt*rk.c3.a[0]; + if(rk.c3.GetNN()==n) +#pragma omp parallel for + for(long j=0;ja[j] = rk.cin.a[j] + dt*rk.c3.a[j]; + else +#pragma omp parallel for + for(long j=0;ja[j] = rk.cin.a[j] + a; + } + if(rk.dd) + { + long n = rk.dd->GetNN(); mreal a = dt*rk.d3.a[0]; + if(rk.d3.GetNN()==n) +#pragma omp parallel for + for(long j=0;ja[j] = rk.din.a[j] + dt*rk.d3.a[j]; + else +#pragma omp parallel for + for(long j=0;ja[j] = rk.din.a[j] + a; + } + } + + for(size_t i=0;iDataList)); + else rk.d4.Move(mglFormulaCalc(rk.e, pr, pr->DataList)); + } + for(size_t i=0;iGetNN(); + dual a = (rk.c1.a[0]+rk.c2.a[0]+mreal(2)*(rk.c3.a[0]+rk.c4.a[0]))*(dt/6); + if(rk.c1.GetNN()==n) +#pragma omp parallel for + for(long j=0;ja[j] = rk.cin.a[j] + (rk.c1.a[j]+rk.c2.a[j]+mreal(2)*(rk.c3.a[j]+rk.c4.a[j]))*(dt/6); + else +#pragma omp parallel for + for(long j=0;ja[j] = rk.cin.a[j] + a; + } + if(rk.dd) + { + long n = rk.dd->GetNN(); + mreal a = (rk.d1.a[0]+rk.d2.a[0]+2*(rk.d3.a[0]+rk.d4.a[0]))*(dt/6); + if(rk.d1.GetNN()==n) +#pragma omp parallel for + for(long j=0;ja[j] = rk.din.a[j] + (rk.d1.a[j]+rk.d2.a[j]+2*(rk.d3.a[j]+rk.d4.a[j]))*(dt/6); + else +#pragma omp parallel for + for(long j=0;ja[j] = rk.din.a[j] + a; + } + } +} +void MGL_EXPORT mgl_rk_step(HMPR pr, const char *Eqs, const char *Vars, mreal dt) +{ + if(Eqs && *Eqs && Vars && *Vars) + { + size_t s=mbstowcs(0,Eqs,0), w=mbstowcs(0,Vars,0); + wchar_t *eqs=new wchar_t[s+1]; mbstowcs(eqs,Eqs ,s); eqs[s]=0; + wchar_t *wcs=new wchar_t[s+1]; mbstowcs(wcs,Vars,s); wcs[w]=0; + mgl_rk_step_w(pr,eqs,wcs,dt); delete []wcs; delete []eqs; + } +} +void MGL_EXPORT mgl_rk_step_(uintptr_t *p, const char *eqs, const char *vars, double *dt,int l,int m) +{ char *e=new char[l+1]; memcpy(e,eqs,l); e[l]=0; + char *s=new char[m+1]; memcpy(s,vars,m); s[m]=0; + mgl_rk_step(_PR_,e,s,*dt); delete []e; delete []s; } +//--------------------------------------------------------------------------- diff --git a/src/pde.cpp b/src/pde.cpp index a1dd088..079dee0 100644 --- a/src/pde.cpp +++ b/src/pde.cpp @@ -23,8 +23,7 @@ #include "mgl2/thread.h" #include "mgl2/base.h" 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); +HADT MGL_NO_EXPORT mglFormulaCalcC(const char *str, const std::vector &head); //----------------------------------------------------------------------------- struct mgl_pde_ham { @@ -51,34 +50,38 @@ void MGL_NO_EXPORT mgl_pde_hprep(const mgl_pde_ham *f) 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); + HADT res = mglFormulaCalcC(f->eqs, list); #pragma omp parallel for - for(long i=0;ihxy[i] = res.a[i]*dd; + for(long i=0;ihxy[i] = res->a[i]*dd; + delete res; if(ny>2) { 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; + for(long i=0;ihuy[i] = res->a[i]*dd; + delete res; } 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; + for(long i=0;ihuv[i] = res->a[i]*dd; + delete res; 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; + for(long i=0;ihxv[i] = res->a[i]*dd; + delete res; } } //----------------------------------------------------------------------------- // 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). HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, mreal dz, mreal k0, const char *opt) { - gr->SaveState(opt); + mreal gamma = gr->SaveState(opt); if(mgl_isnan(gamma)) gamma = GAMMA; mglPoint Min=gr->Min, Max=gr->Max; long nx=ini_re->GetNx(), ny=ini_re->GetNy(), nz = long((Max.z-Min.z)/dz)+1; if(nx<2 || nz<2 || Max.x==Min.x) // Too small data @@ -106,10 +109,10 @@ HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_ for(long j=0;j<2*ny;j++) for(long i=0;i<2*nx;i++) // step 1 { register long i0 = i+2*nx*j; - if(i3*nx/2) dmp[i0] += GAMMA*mgl_ipow((i-3*nx/2-1)/(nx/2.),2); - if(j3*ny/2) dmp[i0] += GAMMA*mgl_ipow((j-3*ny/2-1)/(ny/2.),2); + if(i3*nx/2) dmp[i0] += gamma*mgl_ipow((i-3*nx/2-1)/(nx/2.),2); + if(j3*ny/2) dmp[i0] += gamma*mgl_ipow((j-3*ny/2-1)/(ny/2.),2); } mreal dx = (Max.x-Min.x)/(nx-1), dy = ny>1?(Max.y-Min.y)/(ny-1):0; mreal dp = M_PI/(Max.x-Min.x)/k0, dq = M_PI/(Max.y-Min.y)/k0; diff --git a/src/pixel.cpp b/src/pixel.cpp index 9e94096..3a753ed 100644 --- a/src/pixel.cpp +++ b/src/pixel.cpp @@ -31,10 +31,21 @@ inline mreal get_pfact(float pf, float Depth) void mglCanvas::SetSize(int w,int h,bool clf) { if(w<=0 || h<=0) { SetWarn(mglWarnSize,"SetSize"); return; } + if(Width==w || Height==h) + { + InPlot(0,1,0,1,false); + if(clf || (Quality&4)) Clf(); + 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))); long s = long(w)*long(h); -#pragma omp critical(rgb) +#if MGL_HAVE_PTHREAD + pthread_mutex_lock(&mutexClf); +#elif MGL_HAVE_OMP + omp_set_lock(&lockClf); +#endif 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]; @@ -44,10 +55,22 @@ void mglCanvas::SetSize(int w,int h,bool clf) OI= new int[s]; #pragma omp parallel for for(long i=0;i &pnt = DrwDat[k].Pnt; @@ -71,7 +96,16 @@ void mglCanvas::SetSize(int w,int h,bool clf) if(mgl_isnum(q.w)) { q.u*=dx; q.v*=dy; q.w*=dz; } } + std::vector &sub = DrwDat[k].Sub; + for(size_t i=0;i=0) { - mglPoint q = RestorePnt(pp)/(2*B.pf); - mglPoint u = RestorePnt(nn,true); u.Normalize(); + mglPoint q(RestorePnt(pp)/(2*B.pf)); + mglPoint u(RestorePnt(nn,true)); u.Normalize(); if(nf==0) { p.x = xx + q.x*w; p.y = yy + q.y*h; p.z = B1.z + q.z*d; n = u; } else if(nf==1) - { p.x = xx + q.x*w; p.y = yy+h + q.z*h; p.z = B1.z - q.y*d; n = mglPoint(u.x,u.z,-u.y); } + { p.x = xx + q.x*w; p.y = yy+h + q.z*h; p.z = B1.z - q.y*d; n.Set(u.x,u.z,-u.y); } 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); } + { p.x = xx+w + q.z*w; p.y = yy + q.y*h; p.z = B1.z - q.x*d; n.Set(u.z,u.y,-u.x); } else { const mreal *b=B.b; n = nn; @@ -155,15 +189,18 @@ long mglCanvas::ProjScale(int nf, long id, bool text) return CopyProj(id,p,text?n:nn,pi.sub); } //----------------------------------------------------------------------------- +void mglCanvas::LightScale(const mglMatrix *M, mglLight &ls) +{ + ls.p=ls.d; ls.q=ls.r; + ScalePoint(M,ls.q,ls.p,false); + ls.p /= ls.p.norm(); +} +//----------------------------------------------------------------------------- void mglCanvas::LightScale(const mglMatrix *M) { - for(long i=0;i<10;i++) - { - if(!light[i].n) continue; - light[i].p=light[i].d; light[i].q=light[i].r; - ScalePoint(M,light[i].q,light[i].p,false); - light[i].p /= light[i].p.norm(); - } + for(long i=0;i<10;i++) if(light[i].n) LightScale(M,light[i]); + for(size_t j=0;j=0) { register float x = p.xx-Width/2., y = p.yy-Height/2., z = p.zz-Depth/2.; p.x = b[0]*x + b[1]*y + b[2]*z + dx; @@ -495,12 +532,12 @@ void mglCanvas::pxl_primdr(long id, long , const void *) register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4; switch(p.type) { - case 0: mark_draw(Pnt[n1],n4,p.s,&d); break; + case 3: fast_draw(Pnt[n1],Pnt[n4],&d); fast_draw(Pnt[n2],Pnt[n3],&d); break; case 1: fast_draw(Pnt[n1],Pnt[n2],&d); break; + case 4: glyph_draw(p,&d); break; + case 0: mark_draw(Pnt[n1],n4,p.s,&d); break; case 2: fast_draw(Pnt[n1],Pnt[n2],&d); fast_draw(Pnt[n1],Pnt[n3],&d); fast_draw(Pnt[n2],Pnt[n3],&d); break; - case 3: fast_draw(Pnt[n1],Pnt[n4],&d); fast_draw(Pnt[n2],Pnt[n3],&d); break; - case 4: glyph_draw(p,&d); break; } } } @@ -522,12 +559,12 @@ void mglCanvas::pxl_primdr(long id, long , const void *) register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4; switch(p.type) { - case 0: mark_draw(Pnt[n1],n4,p.s,&d); break; - case 1: line_draw(Pnt[n1],Pnt[n2],&d); break; - case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d); break; case 3: trig_draw(Pnt[n1],Pnt[n2],Pnt[n4],true,&d); trig_draw(Pnt[n1],Pnt[n3],Pnt[n4],true,&d); break; + case 1: line_draw(Pnt[n1],Pnt[n2],&d); break; case 4: glyph_draw(p,&d); break; + case 0: mark_draw(Pnt[n1],n4,p.s,&d); break; + case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d); break; } } } @@ -549,11 +586,11 @@ void mglCanvas::pxl_primdr(long id, long , const void *) register long n1=p.n1, n2=p.n2, n3=p.n3, n4=p.n4; switch(p.type) { - case 0: mark_draw(Pnt[n1],n4,p.s,&d); break; - case 1: line_draw(Pnt[n1],Pnt[n2],&d); break; - case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d); break; case 3: quad_draw(Pnt[n1],Pnt[n2],Pnt[n3],Pnt[n4],&d); break; + case 1: line_draw(Pnt[n1],Pnt[n2],&d); break; case 4: glyph_draw(p,&d); break; + case 0: mark_draw(Pnt[n1],n4,p.s,&d); break; + case 2: trig_draw(Pnt[n1],Pnt[n2],Pnt[n3],true,&d); break; } } } @@ -599,7 +636,7 @@ void mglCanvas::pxl_dotsdr(long id, long n, const void *) { unsigned char r[4]={0,0,0,255}; const mglPnt &p=Pnt[i]; - if(p.sub) continue; + if(p.sub<0) continue; register float x = p.xx-Width/2., y = p.yy-Height/2., z = p.zz-Depth/2.,xx,yy,zz; xx = b[0]*x + b[1]*y + b[2]*z + dx; yy = b[3]*x + b[4]*y + b[5]*z + dy; @@ -677,7 +714,7 @@ void mglCanvas::Clf(mglColor Back) { Fog(0); PDef = 0xffff; pPos = 0; ClearFrame(); - if((Flag&3)==2) Back = mglColor(0,0,0,0); + if((Flag&3)==2) Back.Set(0,0,0,0); if(Back!=NC) FillBackground(Back); } //----------------------------------------------------------------------------- @@ -788,8 +825,11 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id) { // 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; + register float b0=0,b1=0,b2=0, ar,ag,ab,dif; + size_t nl = p.sub>=0?p.sub:1-p.sub; + bool glob = !get(MGL_LOCAL_LIGHT); + ar = ag = ab = glob?AmbBr:Sub[nl].AmbBr; + dif = glob?DifBr:Sub[nl].DifBr; if(mgl_isnum(p.u+p.v+p.w)) { @@ -797,7 +837,7 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id) register long i; for(i=0;i<10;i++) { - const mglLight &ll=light[i]; + const mglLight &ll=glob?light[i]:Sub[nl].light[i]; if(!ll.n) continue; if(mgl_isnan(ll.q.x)) // source at infinity { @@ -818,7 +858,7 @@ unsigned char* mglCanvas::col2int(const mglPnt &p,unsigned char *r, int obj_id) d1 = ll.q.y-p.y; d2 = ll.q.z-p.z; nn = 1+(d0*ll.p.x+d1*ll.p.y+d2*ll.p.z)/sqrt(d0*d0+d1*d1+d2*d2+1e-6); - float bb = exp(-3*ll.a*nn); nn = bb*DifBr*2; + float bb = exp(-3*ll.a*nn); nn = bb*dif*2; ar += nn*ll.c.r; ag += nn*ll.c.g; ab += nn*ll.c.b; @@ -921,10 +961,10 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, unsigned char r[4]; long y1,x1,y2,x2; float dd,dsx,dsy; - mglPnt d1=p2-p1, d2=p3-p1, d3=p4+p1-p2-p3, p; + mglPnt d1(p2-p1), d2(p3-p1), d3(p4+p1-p2-p3); - 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; } + if(d1.x==0 && d1.y==0) { trig_draw(p1,p3,p4,true,d); return; } + if(d2.x==0 && d2.y==0) { trig_draw(p1,p2,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))); @@ -938,9 +978,9 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, dsx =-4*(d2.y*d3.x - d2.x*d3.y)*d1.y; dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x; - 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; + 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.x+n2.x)*0.5,(n1.y+n2.y)*0.5,(n1.z+n2.z)*0.5); float x0 = p1.x, y0 = p1.y; int oi = d->ObjId, ang=d->angle; @@ -967,7 +1007,7 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, 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); + mglPnt 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); @@ -979,7 +1019,7 @@ void mglCanvas::quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, void mglCanvas::quad_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, const mglDrawReg *d) { if(!visible(i,j,d->m, d->PenWidth,d->angle)) return; - mglPnt d1=p2-p1, d2=p3-p1, d3=p4+p1-p2-p3; + mglPnt d1(p2-p1), d2(p3-p1), d3(p4+p1-p2-p3); register float dd = d1.x*d2.y-d1.y*d2.x; register float dsx =-4*(d2.y*d3.x - d2.x*d3.y)*d1.y; register float dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x; @@ -1006,11 +1046,11 @@ void mglCanvas::quad_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, con } if(u*(1.f-u)<0.f || v*(1.f-v)<0.f) return; // second root bad } - mglPnt p = p1+d1*u+d2*v+d3*(u*v); + mglPnt p(p1+d1*u+d2*v+d3*(u*v)); if(mgl_isnan(p.u) && mgl_isnum(p.v)) { - 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 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)); p.u = (n1.x+n2.x)*0.5; p.v = (n1.y+n2.y)*0.5; p.w = (n1.z+n2.z)*0.5; @@ -1029,7 +1069,7 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, unsigned char r[4]; long y1,x1,y2,x2; float dxu,dxv,dyu,dyv; - mglPnt d1=p2-p1, d2=p3-p1, p; + mglPnt d1(p2-p1), d2(p3-p1), p; dxu = d2.x*d1.y - d1.x*d2.y; if(fabs(dxu)<1e-5) return; // points lies on the same line @@ -1044,7 +1084,7 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, y1=y1>d->y1?y1:d->y1; y2=y2y2?y2:d->y2; // 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); + 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; float dz = Width>2 ? 1 : 1e-5*Width; // provide additional height to be well visible on the surfaces if(anorm) dz=0; @@ -1084,16 +1124,16 @@ void mglCanvas::trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, void mglCanvas::trig_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, const mglDrawReg *d) { if(!visible(i,j,d->m, d->PenWidth,d->angle)) return; - mglPnt d1=p2-p1, d2=p3-p1; + mglPnt d1(p2-p1), d2(p3-p1); register float dd = d2.x*d1.y - d1.x*d2.y; if(fabs(dd)<1e-5) return; // points lies on the same line register float dyv =-d1.x/dd, dxv = d1.y/dd, dyu = d2.x/dd, dxu =-d2.y/dd; register float xx = (i-p1.x), yy = (j-p1.y); register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy; if(u<0 || v<0 || u+v>1) return; - mglPnt p = p1+d1*u+d2*v; + mglPnt p(p1+d1*u+d2*v); if(mgl_isnan(p.u) && mgl_isnum(p.v) && anorm) - { 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); + { 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)); p.u = nr.x; p.v = nr.y; p.w = nr.z; } unsigned char r[4]; pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId); @@ -1112,7 +1152,7 @@ void mglCanvas::line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg * int oi = dr->ObjId; if(oi==HighId) { pw *= 2; dpw=2; } - mglPnt d=p2-p1, p; + mglPnt d(p2-p1), p; bool hor = fabs(d.x)>fabs(d.y); x1 = long(p1.xObjId; unsigned char r[4]; col2int(p1,r,oi); long y1,x1,y2,x2; @@ -1212,7 +1252,7 @@ void mglCanvas::fast_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg * void mglCanvas::line_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglDrawReg *dr) { register float xx = (i-p1.x), yy = (j-p1.y); - mglPnt d=p2-p1; + mglPnt d(p2-p1); register float dd = hypot(d.x, d.y); register float dxv = d.y/dd, dyv =-d.x/dd, dxu = d.x/dd, dyu = d.y/dd; register float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy; v = v*v; @@ -1221,7 +1261,7 @@ void mglCanvas::line_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, con register float pw=dr->PenWidth, dpw=3; if(dr->ObjId==HighId) { pw *= 2; dpw=2; } if(v>pw*pw || !(dr->PDef & ( 1L<pPos+u/pw/1.5, 16)) ) )) return; - mglPnt p = p1+d*(u/dd); + mglPnt p(p1+d*(u/dd)); unsigned char r[4]; col2int(p,r,dr->ObjId); r[3] = v<(pw-1)*(pw-1)/4 ? 255 : mgl_sline(255,dpw*(sqrt(v)+(1-pw)/2)); @@ -1797,7 +1837,7 @@ void mglCanvas::mark_pix(long i, long j, const mglPnt &q, char type, mreal size, float mglCanvas::GetGlyphPhi(const mglPnt &q, float phi) { float x,y,z,ll; - if(q.sub) + if(q.sub<0) { x = q.u; y = q.v; z = q.w; } else { @@ -1830,7 +1870,7 @@ void mglCanvas::glyph_draw(const mglPrim &P, mglDrawReg *d) mglPnt p=Pnt[P.n1]; // NOTE check this later for mglInPlot 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; + 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; @@ -1859,11 +1899,11 @@ void mglCanvas::glyph_fill(const mglMatrix *M, const mglPnt &pp, mreal f, const for(long ik=0;ik0) { n2=n1; p2 = p1; t2=t1; } - p1 = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz)); + p1.Set(x->v(i,mx), y->v(i,my), z->v(i,mz)); mreal c = sh ? gr->NextColor(pal,i):gr->CDef; n1 = gr->AddPnt(p1,c); t1 = n1>=0; if(mk && t1) gr->mark_plot(n1,mk); @@ -418,7 +418,7 @@ void MGL_EXPORT mgl_tens_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char for(i=0;i0) { n2=n1; p2=p1; t2=t1; } - p1 = mglPoint(x->v(i,mx), y->v(i,my), z->v(i,mz), c->v(i,mc)); + p1.Set(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; if(mk && t1) gr->mark_plot(n1,mk); if(t1 && t2) @@ -509,15 +509,15 @@ void MGL_EXPORT mgl_area_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c if(gr->GetNumPal(pal)==2*m && !sh) c2 = gr->NextColor(pal); 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)); + nn.Set(-y->dvx(0,my),x->dvx(0,mx)); + mglPoint p(x->v(0,mx),y->v(0,my),z->v(0,mz)); long n1 = gr->AddPnt(p,c1,nn,-1,11); p.z = z0; long n2 = gr->AddPnt(p,c2,nn,-1,11); for(long i=1;idvx(i,my),x->dvx(i,mx)); - p = mglPoint(x->v(i,mx),y->v(i,my),z->v(i,mz)); + nn.Set(-y->dvx(i,my),x->dvx(i,mx)); + p.Set(x->v(i,mx),y->v(i,my),z->v(i,mz)); if(sh) c2=c1=gr->NextColor(pal,i); n1 = gr->AddPnt(p,c1,nn,-1,11); p.z = z0; n2 = gr->AddPnt(p,c2,nn,-1,11); if(wire) @@ -541,7 +541,7 @@ void MGL_EXPORT mgl_area_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char mreal zm = gr->AdjustZMin(); mreal y0=gr->GetOrgY('x'); mreal c1,c2; - mglPoint nn=mglPoint(0,0,1); + mglPoint nn(0,0,1); bool sh = mglchr(pen,'!'); bool wire = mglchr(pen,'#'); @@ -555,13 +555,13 @@ void MGL_EXPORT mgl_area_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char 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); + mglPoint p(x->v(0,mx),y->v(0,my),z0); long n1 = gr->AddPnt(p,c1,nn,-1,11); p.y = y0; long n2 = gr->AddPnt(p,c2,nn,-1,11); for(long i=1;iv(i,mx),y->v(i,my),z0); + p.Set(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); if(wire) @@ -616,7 +616,7 @@ void MGL_EXPORT mgl_region_3d(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT gr->SaveState(opt); static int cgid=1; gr->StartGroup("Region",cgid++); mreal c1,c2; - mglPoint nn=mglPoint(0,0,1); + mglPoint nn(0,0,1); mreal zm = gr->AdjustZMin(); // bool inside = (mglchr(pen,'i')); // NOTE: check if 'i' is free (used here for inside flag) bool sh = mglchr(pen,'!'); @@ -654,7 +654,7 @@ void MGL_EXPORT mgl_region_xy(HMGL gr, HCDT x, HCDT y1, HCDT y2, const char *pen gr->SaveState(opt); static int cgid=1; gr->StartGroup("Region",cgid++); mreal c1,c2; - mglPoint nn=mglPoint(0,0,1); + mglPoint nn(0,0,1); mreal zm = gr->AdjustZMin(); bool inside = (mglchr(pen,'i')); // NOTE: check if 'i' is free (used here for inside flag) bool sh = mglchr(pen,'!'); @@ -734,7 +734,7 @@ void MGL_EXPORT mgl_step_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c for(long i=1;iv(i,mx), y->v(i,my), z->v(i-1,mz)); + p.Set(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); if(i==1) gr->arrow_plot(n2,n1,gr->Arrow1); @@ -772,7 +772,7 @@ void MGL_EXPORT mgl_step_xy(HMGL gr, HCDT x, HCDT y, const char *pen, const char for(long i=1;iv(i,mx), y->v(i-1,my), zVal); + p.Set(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); if(i==1) gr->arrow_plot(n2,n1,gr->Arrow1); @@ -946,7 +946,7 @@ void MGL_EXPORT mgl_bars_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c 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)); + mglPoint nn(-y->dvx(i,my),x->dvx(i,mx)); long n1 = gr->AddPnt(mglPoint(x1,y1,zz),c,nn); long n2 = gr->AddPnt(mglPoint(x1,y1,z0),c,nn); long n3 = gr->AddPnt(mglPoint(x2,y2,z0),c,nn); @@ -1662,9 +1662,9 @@ void MGL_EXPORT mgl_tube_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const cha long mz = jGetNy() ? j:0, mr = jGetNy() ? j:0; for(long i=0;idvx(i,mx),y->dvx(i,my),z->dvx(i,mz)); + l.Set(x->dvx(i,mx),y->dvx(i,my),z->dvx(i,mz)); t = !l; t.Normalize(); u = t^l; u.Normalize(); - q = mglPoint(x->v(i,mx),y->v(i,my),z->v(i,mz)); + q.Set(x->v(i,mx),y->v(i,my),z->v(i,mz)); mreal rr=r->v(i,mr), dr=r->dvx(i,mr); mreal c = sh ? gr->NextColor(pal,i):gr->CDef; for(long k=0;kMax-gr->Min)*gr->BarWidth/25; m = x->GetNy() > y->GetNy() ? x->GetNy() : y->GetNy(); m = z->GetNy() > m ? z->GetNy() : m; gr->SetPenPal(pen,&pal); gr->Reserve(4*n*m); - mglPoint p1,p2,q1,q2,l,nn,qn=mglPoint(NAN,NAN); + mglPoint p1,p2,q1,q2,l,nn,qn(NAN,NAN); long n1=-1,n2=-1,n3=-1,n4=-1, m1=-1,m2=-1,m3=-1,m4=-1; bool sh = mglchr(pen,'!'), xo = mglchr(pen,'x'), zo = mglchr(pen,'z'), wire = mglchr(pen,'#'); if(!xo && !zo) xo = zo = true; @@ -1787,10 +1787,10 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c if(gr->GetNumPal(pal)==2*m && !sh) c2 = gr->NextColor(pal); 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); - q1 = mglPoint(-l.y,l.x,0); ll = mgl_norm(q1); - if(ll) q1 /= ll; else q1 = mglPoint(0,1,0); + p2.Set(x->v(0,mx), y->v(0,my), z->v(0,mz)); + l.Set(x->v(1,mx)-p2.x, y->v(1,my)-p2.y, z->v(1,mz)-p2.z); l /= mgl_norm(l); + q1.Set(-l.y,l.x,0); ll = mgl_norm(q1); + if(ll) q1 /= ll; else q1.Set(0,1,0); q2 = (q1^l); if(p2>gr->Min && p2Max) { @@ -1801,7 +1801,7 @@ void MGL_EXPORT mgl_tape_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *pen, c register long i; for(i=1;iv(i,mx), y->v(i,my), z->v(i,mz)); + p1 = p2; p2.Set(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); m1 = n1; m2 = n2; m3 = n3; m4 = n4; diff --git a/src/prim.cpp b/src/prim.cpp index ac4679f..8d5c1f2 100644 --- a/src/prim.cpp +++ b/src/prim.cpp @@ -57,7 +57,7 @@ void MGL_EXPORT mgl_line(HMGL gr, double x1, double y1, double z1, double x2, do { static int cgid=1; gr->StartGroup("Line",cgid++); 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), p=p1,nn=mglPoint(NAN); + mglPoint p1(x1,y1,z1), p2(x2,y2,z2), p=p1,nn(NAN); gr->SetPenPal(pen); n = (n<2) ? 2 : n; @@ -83,7 +83,7 @@ void MGL_EXPORT mgl_curve(HMGL gr, double x1, double y1, double z1, double dx1, { static int cgid=1; gr->StartGroup("Curve",cgid++); 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), d1(dx1,dy1,dz1), d2(dx2,dy2,dz2), a,b,p=p1,nn=mglPoint(NAN); + mglPoint p1(x1,y1,z1), p2(x2,y2,z2), d1(dx1,dy1,dz1), d2(dx2,dy2,dz2), a,b,p=p1,nn(NAN); a = 3*(p2-p1)-d2-2*d1; b = d1+d2-2*(p2-p1); n = (n<2) ? 2 : n; gr->SetPenPal(pen); @@ -112,7 +112,7 @@ void MGL_EXPORT mgl_error_box(HMGL gr, double x, double y, double z, double ex, { static int cgid=1; gr->StartGroup("ErBox",cgid++); char mk=gr->SetPenPal(pen); - mglPoint p(x,y,z), q,nn=mglPoint(NAN); + mglPoint p(x,y,z), q,nn(NAN); gr->Reserve(7); long k1,k2; q = p; q.x += ex; k1 = gr->AddPnt(q,gr->CDef,nn,0,3); @@ -411,7 +411,7 @@ void MGL_EXPORT mgl_arc_ext(HMGL gr, double x0, double y0, double z0, double xr, 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; + 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); @@ -461,8 +461,8 @@ void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2, 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), v=p2-p1; d = v.norm(); - if(d==0) v = mglPoint(1); else v /= d; - mglPoint u=mglPoint(0,0,1)^v, q=u^v, p, s=(p1+p2)/2.; + if(d==0) v.Set(1); else v /= d; + mglPoint u(mglPoint(0,0,1)^v), q(u^v), p, s=(p1+p2)/2.; u *= r; v *= sqrt(d*d/4+r*r); // central point first n0 = gr->AddPnt(p1,c,q,-1,11); gr->AddActive(n0); @@ -533,7 +533,7 @@ void MGL_EXPORT mgl_sphere_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal * void MGL_EXPORT mgl_drop(HMGL gr, mglPoint p, mglPoint q, double r, double c, double sh, double a) { mglPoint p1,p2,pp,qq; - if(q.norm()==0) { q = mglPoint(1,0,0); sh=0; } + if(q.norm()==0) { q.Set(1,0,0); sh=0; } q.Normalize(); p1 = !q; p2 = q^p1; r /= 2; static int cgid=1; gr->StartGroup("Drop",cgid++); @@ -614,7 +614,7 @@ void MGL_EXPORT mgl_dew_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char register mreal dy = jv(i,j,k),ay->v(i,j,k)); dd = q.norm(); + mglPoint q(ax->v(i,j,k),ay->v(i,j,k)); dd = q.norm(); if(inv) q = -q; mgl_drop(gr,mglPoint(xx, yy, zVal),q,(dxGetC(ss,dd*xm,false),dd*xm,1); } @@ -714,7 +714,7 @@ void MGL_EXPORT mgl_textmarkw_xyzr(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, cons long mz = jGetNy() ? j:0, mr = jGetNy() ? j:0; for(long i=0;iv(i,mx), y->v(i,my), z->v(i,mz)); + p.Set(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))); } diff --git a/src/surf.cpp b/src/surf.cpp index 3734b42..288569d 100644 --- a/src/surf.cpp +++ b/src/surf.cpp @@ -66,21 +66,20 @@ 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); +HMDT 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) { // 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),res; + mglData z(n,n); mglDataV x(n,n,1, gr->Min.x,gr->Max.x,'x'); x.s=L"x"; mglDataV y(n,n,1, 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; + z.Move(mglFormulaCalc(eqZ,list)); mgl_surf(gr, &z, sch,0); } //----------------------------------------------------------------------------- @@ -89,18 +88,15 @@ void MGL_EXPORT mgl_fsurf_xyz(HMGL gr, const char *eqX, const char *eqY, const c 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), x(n,n), y(n,n), res; + mglData z(n,n), x(n,n), y(n,n); mglDataV u(n,n,1, 0,1,'x'); u.s=L"u"; mglDataV v(n,n,1, 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; + x.Move(mglFormulaCalc(eqX,list)); + y.Move(mglFormulaCalc(eqY,list)); + z.Move(mglFormulaCalc(eqZ,list)); mgl_surf_xy(gr,&x,&y,&z,sch,0); } //----------------------------------------------------------------------------- @@ -267,29 +263,31 @@ void MGL_EXPORT mgl_grid_(uintptr_t *gr, uintptr_t *a,const char *sch, const cha // Surf series // //----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) +void MGL_NO_EXPORT mgl_surf_gen(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch) { long n=z->GetNx(),m=z->GetNy(); - if(mgl_check_dim2(gr,x,y,z,0,"Surf")) return; - - gr->SaveState(opt); - static int cgid=1; gr->StartGroup("Surf",cgid++); long ss = gr->AddTexture(sch); long *pos = new long[n*m]; bool wire = (mglchr(sch,'#')); gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1)); - mglPoint p,q,s,xx,yy; + mglPoint q,s,xx,yy; for(long k=0;kGetNz();k++) { if(gr->NeedStop()) break; - for(long j=0;jv(i,j,k)); - q = mglPoint(xx.y, yy.y, z->dvx(i,j,k)); - s = mglPoint(xx.z, yy.z, z->dvy(i,j,k)); - pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,p.z),q^s); + q.Set(xx.y, yy.y, z->dvx(i,j,k)); + s.Set(xx.z, yy.z, z->dvy(i,j,k)); + pos[i+n*j] = gr->AddPnt(mglPoint(xx.x, yy.x, z->v(i,j,k)), gr->GetC(ss,c->v(i,j,k)), q^s, gr->GetA(a->v(i,j,k))); + } + else for(long j=0;jdvx(i,j,k)); + s.Set(xx.z, yy.z, z->dvy(i,j,k)); + pos[i+n*j] = gr->AddPnt(mglPoint(xx.x, yy.x, z->v(i,j,k)), gr->GetC(ss,c->v(i,j,k)), q^s); } if(sch && mglchr(sch,'.')) for(long i=0;imark_plot(pos[i],'.'); @@ -304,6 +302,14 @@ void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co delete []pos; gr->EndGroup(); } //----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) +{ + if(mgl_check_dim2(gr,x,y,z,0,"Surf")) return; + gr->SaveState(opt); + static int cgid=1; gr->StartGroup("Surf",cgid++); + mgl_surf_gen(gr, x, y, z, z, 0, sch); +} +//----------------------------------------------------------------------------- void MGL_EXPORT mgl_surf(HMGL gr, HCDT z, const char *sch, const char *opt) { gr->SaveState(opt); @@ -324,6 +330,100 @@ void MGL_EXPORT mgl_surf_(uintptr_t *gr, uintptr_t *a, const char *sch, const ch mgl_surf(_GR_, _DA_(a), s, o); delete []o; delete []s; } //----------------------------------------------------------------------------- // +// SurfCA series +// +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfca_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt) +{ + if(mgl_check_dim2(gr,x,y,z,c,"SurfCA")) return; + if(mgl_check_dim2(gr,x,y,z,a,"SurfCA")) return; + gr->SaveState(opt); + static int cgid=1; gr->StartGroup("SurfCA",cgid++); + mgl_surf_gen(gr, x, y, z, c, a, sch); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfca(HMGL gr, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt) +{ + gr->SaveState(opt); + mglDataV x(z->GetNx()), y(z->GetNy()); + x.Fill(gr->Min.x,gr->Max.x); + y.Fill(gr->Min.y,gr->Max.y); + mgl_surfca_xy(gr,&x,&y,z,c,a,sch,0); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfca_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, uintptr_t *a, 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_surfca_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(c), _DA_(a), s, o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfca_(uintptr_t *gr, uintptr_t *z, uintptr_t *c, uintptr_t *a, 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_surfca(_GR_, _DA_(z), _DA_(c), _DA_(a), s, o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +// +// SurfC series +// +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt) +{ + if(mgl_check_dim2(gr,x,y,z,c,"SurfC")) return; + gr->SaveState(opt); + static int cgid=1; gr->StartGroup("SurfC",cgid++); + mgl_surf_gen(gr, x, y, z, c, 0, sch); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfc(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt) +{ + gr->SaveState(opt); + 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); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfc_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, 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_surfc_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfc_(uintptr_t *gr, uintptr_t *z, uintptr_t *a, 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_surfc(_GR_, _DA_(z), _DA_(a), s, o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +// +// SurfA series +// +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt) +{ + if(mgl_check_dim2(gr,x,y,z,c,"SurfA")) return; + gr->SaveState(opt); + static int cgid=1; gr->StartGroup("SurfA",cgid++); + mgl_surf_gen(gr, x, y, z, z, c, sch); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfa(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt) +{ + gr->SaveState(opt); + 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); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfa_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, 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_surfa_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surfa_(uintptr_t *gr, uintptr_t *z, uintptr_t *a, 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_surfa(_GR_, _DA_(z), _DA_(a), s, o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +// // Belt series // //----------------------------------------------------------------------------- @@ -349,11 +449,11 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co for(long j=0;jv(i,j,k)); - s = mglPoint(xx.z, yy.z, z->dvy(i,j,k)); - q = mglPoint(xx.y, yy.y, 0); s = q^s; + p1.Set(xx.x, yy.x, z->v(i,j,k)); + s.Set(xx.z, yy.z, z->dvy(i,j,k)); + q.Set(xx.y, yy.y, 0); s = q^s; register mreal c = gr->GetC(ss,p1.z); - p2 = mglPoint(GetX(x,i+dx,j,k).x,GetY(y,i+dx,j,k).x,p1.z); + p2.Set(GetX(x,i+dx,j,k).x,GetY(y,i+dx,j,k).x,p1.z); pos[2*j] = gr->AddPnt(p1,c,s); pos[2*j+1]=gr->AddPnt(p2,c,s); } @@ -364,11 +464,11 @@ void MGL_EXPORT mgl_belt_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co for(long i=0;iv(i,j,k)); - q = mglPoint(xx.y, yy.y, z->dvx(i,j,k)); - s = mglPoint(xx.z, yy.z, 0); s = q^s; + p1.Set(xx.x, yy.x, z->v(i,j,k)); + q.Set(xx.y, yy.y, z->dvx(i,j,k)); + s.Set(xx.z, yy.z, 0); s = q^s; register mreal c = gr->GetC(ss,p1.z); - p2 = mglPoint(GetX(x,i,j+dy,k).x,GetY(y,i,j+dy,k).x,p1.z); + p2.Set(GetX(x,i,j+dy,k).x,GetY(y,i,j+dy,k).x,p1.z); pos[2*i] = gr->AddPnt(p1,c,s); pos[2*i+1]=gr->AddPnt(p2,c,s); } @@ -401,54 +501,26 @@ void MGL_EXPORT mgl_belt_(uintptr_t *gr, uintptr_t *a, const char *sch, const ch // Dens series // //----------------------------------------------------------------------------- -void MGL_EXPORT mgl_dens_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt) +void MGL_EXPORT mgl_dens_xy(HMGL gr, HCDT x, HCDT y, HCDT c, const char *sch, const char *opt) { - long n=z->GetNx(),m=z->GetNy(); - if(mgl_check_dim2(gr,x,y,z,0,"Dens")) return; - + if(mgl_check_dim2(gr,x,y,c,0,"Dens")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Dens",cgid++); mreal zVal = gr->Min.z; - long ss = gr->AddTexture(sch); - long *pos = new long[n*m]; - bool wire = (mglchr(sch,'#')); - gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1)); - - mglPoint p,s=mglPoint(0,0,1); - 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); - for(long j=0;jv(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,'.')) - for(long i=0;imark_plot(pos[i],'.'); - else mgl_surf_plot(gr,pos,n,m); - if(wire) - { - gr->SetPenPal("k-"); - for(long i=0;iCopyNtoC(pos[i],gr->CDef); - mgl_mesh_plot(gr,pos,n,m,3); - } - } - delete []pos; gr->EndGroup(); + mglDataV z(c->GetNx(),c->GetNy(),c->GetNz()); + if(z.GetNz()>1) z.Fill(gr->Min.z,gr->Max.z,'z'); + else z.Fill(zVal); + mgl_surf_gen(gr, x, y, &z, c, 0, sch); } //----------------------------------------------------------------------------- -void MGL_EXPORT mgl_dens(HMGL gr, HCDT z, const char *sch, const char *opt) +void MGL_EXPORT mgl_dens(HMGL gr, HCDT c, const char *sch, const char *opt) { gr->SaveState(opt); - mglDataV x(z->GetNx()), y(z->GetNy()); + mglDataV x(c->GetNx()), y(c->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); + mgl_dens_xy(gr,&x,&y,c,sch,0); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_dens_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int l,int lo) @@ -482,126 +554,6 @@ void MGL_EXPORT mgl_stfa_(uintptr_t *gr, uintptr_t *re, uintptr_t *im, int *dn, mgl_stfa(_GR_,_DA_(re), _DA_(im), *dn, s, o); delete []o; delete []s; } //----------------------------------------------------------------------------- // -// SurfC series -// -//----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surfc_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt) -{ - long n=z->GetNx(),m=z->GetNy(); - if(mgl_check_dim2(gr,x,y,z,c,"SurfC")) return; - - gr->SaveState(opt); - static int cgid=1; gr->StartGroup("SurfC",cgid++); - long ss = gr->AddTexture(sch); - long *pos = new long[n*m]; - bool wire = (mglchr(sch,'#')); - gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1)); - - mglPoint p,q,s,xx,yy; - for(long k=0;kGetNz();k++) - { - if(gr->NeedStop()) break; - for(long j=0;jv(i,j,k)); - q = mglPoint(xx.y, yy.y, z->dvx(i,j,k)); - s = mglPoint(xx.z, yy.z, z->dvy(i,j,k)); - pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,c->v(i,j,k)),q^s); - } - if(sch && mglchr(sch,'.')) - for(long i=0;imark_plot(pos[i],'.'); - else mgl_surf_plot(gr,pos,n,m); - if(wire) - { - gr->SetPenPal("k-"); - for(long i=0;iCopyNtoC(pos[i],gr->CDef); - mgl_mesh_plot(gr,pos,n,m,3); - } - } - delete []pos; gr->EndGroup(); -} -//----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surfc(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt) -{ - gr->SaveState(opt); - 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); -} -//----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surfc_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, 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_surfc_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o); delete []o; delete []s; } -//----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surfc_(uintptr_t *gr, uintptr_t *z, uintptr_t *a, 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_surfc(_GR_, _DA_(z), _DA_(a), s, o); delete []o; delete []s; } -//----------------------------------------------------------------------------- -// -// SurfA series -// -//----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surfa_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt) -{ - long k,n=z->GetNx(),m=z->GetNy(); - if(mgl_check_dim2(gr,x,y,z,c,"SurfA")) return; - - gr->SaveState(opt); - static int cgid=1; gr->StartGroup("SurfA",cgid++); - long ss = gr->AddTexture(sch); - long *pos = new long[n*m]; - bool wire = (mglchr(sch,'#')); - gr->Reserve((n+1)*(m+1)*z->GetNz()*(wire?2:1)); - - mglPoint p,q,s,xx,yy; - for(k=0;kGetNz();k++) - { - if(gr->NeedStop()) break; - for(long j=0;jv(i,j,k); p = mglPoint(xx.x, yy.x, vv); - q = mglPoint(xx.y, yy.y, z->dvx(i,j,k)); - s = mglPoint(xx.z, yy.z, z->dvy(i,j,k)); - pos[i+n*j] = gr->AddPnt(p,gr->GetC(ss,vv),q^s,gr->GetA(c->v(i,j,k))); - } - if(sch && mglchr(sch,'.')) - for(long i=0;imark_plot(pos[i],'.'); - else mgl_surf_plot(gr,pos,n,m); - if(wire) - { - gr->SetPenPal("k-"); - for(long i=0;iCopyNtoC(pos[i],gr->CDef); - mgl_mesh_plot(gr,pos,n,m,3); - } - } - delete []pos; gr->EndGroup(); -} -//----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surfa(HMGL gr, HCDT z, HCDT c, const char *sch, const char *opt) -{ - gr->SaveState(opt); - 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); -} -//----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surfa_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, 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_surfa_xy(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, o); delete []o; delete []s; } -//----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surfa_(uintptr_t *gr, uintptr_t *z, uintptr_t *a, 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_surfa(_GR_, _DA_(z), _DA_(a), s, o); delete []o; delete []s; } -//----------------------------------------------------------------------------- -// // Boxs series // //----------------------------------------------------------------------------- @@ -638,12 +590,12 @@ void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co y3 = iv(i+dx,j,k):NAN; z2 = jv(i,j+dy,k):NAN; - q = mglPoint(xx.y,yy.y,0); - s = mglPoint(xx.z,yy.z,0); - p1 = mglPoint(xx.x,yy.x,zz); k1 = gr->AddPnt(p1,c,t); - p2 = mglPoint(x1,y1,zz); k2 = gr->AddPnt(p2,c,t); - p3 = mglPoint(x2,y2,zz); k3 = gr->AddPnt(p3,c,t); - p4 = mglPoint(x3,y3,zz); k4 = gr->AddPnt(p4,c,t); + q.Set(xx.y,yy.y,0); + s.Set(xx.z,yy.z,0); + p1.Set(xx.x,yy.x,zz); k1 = gr->AddPnt(p1,c,t); + p2.Set(x1,y1,zz); k2 = gr->AddPnt(p2,c,t); + p3.Set(x2,y2,zz); k3 = gr->AddPnt(p3,c,t); + p4.Set(x3,y3,zz); k4 = gr->AddPnt(p4,c,t); if(wire) { gr->line_plot(k1,k2); gr->line_plot(k1,k3); @@ -653,10 +605,10 @@ void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co if(full) { - p1 = mglPoint(xx.x,yy.x,z0); k5 = gr->AddPnt(p1,c,t); - p2 = mglPoint(x1,y1,z0); k6 = gr->AddPnt(p2,c,t); - p3 = mglPoint(x2,y2,z0); k7 = gr->AddPnt(p3,c,t); - p4 = mglPoint(x3,y3,z0); k8 = gr->AddPnt(p4,c,t); + p1.Set(xx.x,yy.x,z0); k5 = gr->AddPnt(p1,c,t); + p2.Set(x1,y1,z0); k6 = gr->AddPnt(p2,c,t); + p3.Set(x2,y2,z0); k7 = gr->AddPnt(p3,c,t); + p4.Set(x3,y3,z0); k8 = gr->AddPnt(p4,c,t); if(wire) { gr->line_plot(k5,k6); gr->line_plot(k5,k7); @@ -673,13 +625,13 @@ void MGL_EXPORT mgl_boxs_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co } else { - p3 = mglPoint(x1,y1,z1); k5 = gr->AddPnt(p3,c,wire?t:q); - p4 = mglPoint(x3,y3,z1); k6 = gr->AddPnt(p4,c,wire?t:q); + p3.Set(x1,y1,z1); k5 = gr->AddPnt(p3,c,wire?t:q); + p4.Set(x3,y3,z1); k6 = gr->AddPnt(p4,c,wire?t:q); if(wire) { gr->line_plot(k2,k5); gr->line_plot(k6,k5); gr->line_plot(k6,k4); } else gr->quad_plot(k2,k4,k5,k6); - p3 = mglPoint(x2,y2,z2); k7 = gr->AddPnt(p3,c,wire?t:s); - p4 = mglPoint(x3,y3,z2); k8 = gr->AddPnt(p4,c,wire?t:s); + p3.Set(x2,y2,z2); k7 = gr->AddPnt(p3,c,wire?t:s); + p4.Set(x3,y3,z2); k8 = gr->AddPnt(p4,c,wire?t:s); if(wire) { gr->line_plot(k3,k7); gr->line_plot(k4,k8); gr->line_plot(k7,k8); } else gr->quad_plot(k3,k4,k7,k8); @@ -725,7 +677,7 @@ void MGL_EXPORT mgl_tile_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, co long ss = gr->AddTexture(sch); gr->Reserve(4*n*m*z->GetNz()); - mglPoint s=mglPoint(0,0,1); + mglPoint s(0,0,1); for(long k=0;kGetNz();k++) { if(gr->NeedStop()) break; @@ -785,7 +737,7 @@ void MGL_EXPORT mgl_tiles_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, const char long cc = gr->AddTexture(sch); gr->Reserve(4*n*m*z->GetNz()); - mglPoint t=mglPoint(0,0,1); + mglPoint t(0,0,1); mreal x1,x2,x3,x4,y1,y2,y3,y4; for(long k=0;kGetNz();k++) { @@ -850,7 +802,7 @@ void MGL_EXPORT mgl_map_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char long ss = gr->AddTexture(mgl_have_color(sch)?sch:"rgb",2); long s = nboth ?1:n; - mglPoint t=mglPoint(NAN); + mglPoint t(NAN); long *pos = new long[n*m]; gr->Reserve(n*m); diff --git a/src/tex_table.cc b/src/tex_table.cc new file mode 100644 index 0000000..6f277e6 --- /dev/null +++ b/src/tex_table.cc @@ -0,0 +1,1951 @@ +/*************************************************************************** + * tex_table.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 "mgl2/font.h" + +/// Table of LaTeX symbols and its UTF8 codes. This array MUST BE sorted!!! +MGL_EXPORT long mgl_tex_num=1924; +MGL_EXPORT mglTeXsymb mgl_tex_symb[] = { + {0x23, L"#"}, + {0x25, L"%"}, + {0x26, L"&"}, + {0xc5, L"AA"}, + {0xc6, L"AE"}, + {0x2370, L"APLboxquestion"}, + {0x2353, L"APLboxupcaret"}, + {0x2340, L"APLnotbackslash"}, + {0x233f, L"APLnotslash"}, + {0x391, L"Alpha"}, + {0x26, L"And"}, + {0x212b, L"Angstrom"}, + {0x2ae7, L"Barv"}, + {0x2102, L"BbbC"}, + {0x213e, L"BbbGamma"}, + {0x210d, L"BbbH"}, + {0x2115, L"BbbN"}, + {0x2119, L"BbbP"}, + {0x213f, L"BbbPi"}, + {0x211a, L"BbbQ"}, + {0x211d, L"BbbR"}, + {0x2124, L"BbbZ"}, + {0x213d, L"Bbbgamma"}, + {0x213c, L"Bbbpi"}, + {0x2140, L"Bbbsum"}, + {0x392, L"Beta"}, + {0x224e, L"Bumpeq"}, + {0x410, L"CYRA"}, + {0x411, L"CYRB"}, + {0x426, L"CYRC"}, + {0x427, L"CYRCH"}, + {0x414, L"CYRD"}, + {0x415, L"CYRE"}, + {0x42d, L"CYREREV"}, + {0x42b, L"CYRERY"}, + {0x424, L"CYRF"}, + {0x413, L"CYRG"}, + {0x425, L"CYRH"}, + {0x42a, L"CYRHRDSN"}, + {0x418, L"CYRI"}, + {0x419, L"CYRISHRT"}, + {0x41a, L"CYRK"}, + {0x41b, L"CYRL"}, + {0x41c, L"CYRM"}, + {0x41d, L"CYRN"}, + {0x41e, L"CYRO"}, + {0x41f, L"CYRP"}, + {0x420, L"CYRR"}, + {0x421, L"CYRS"}, + {0x42c, L"CYRSFTSN"}, + {0x428, L"CYRSH"}, + {0x429, L"CYRSHCH"}, + {0x422, L"CYRT"}, + {0x423, L"CYRU"}, + {0x412, L"CYRV"}, + {0x42f, L"CYRYA"}, + {0x401, L"CYRYO"}, + {0x42e, L"CYRYU"}, + {0x417, L"CYRZ"}, + {0x416, L"CYRZH"}, + {0x22d2, L"Cap"}, + {0x3a7, L"Chi"}, + {0x2237, L"Colon"}, + {0x2a74, L"Coloneq"}, + {0x22d3, L"Cup"}, + {0x27f1, L"DDownarrow"}, + {0xd0, L"DH"}, + {0x110, L"DJ"}, + {0x2ae5, L"DashV"}, + {0x27da, L"DashVDash"}, + {0x2ae4, L"Dashv"}, + {0x290b, L"Ddownarrow"}, + {0x394, L"Delta"}, + {0x3dc, L"Digamma"}, + {0x2251, L"Doteq"}, + {0x21d3, L"Downarrow"}, + {0x395, L"Epsilon"}, + {0x2263, L"Equiv"}, + {0x397, L"Eta"}, + {0x2107, L"Eulerconst"}, + {0x203c, L"Exclam"}, + {0x2132, L"Finv"}, + {0x2141, L"Game"}, + {0x393, L"Gamma"}, + {0x2aa2, L"Gt"}, + {0x26a5, L"Hermaphrodite"}, + {0x2111, L"Im"}, + {0x399, L"Iota"}, + {0x39a, L"Kappa"}, + {0x3de, L"Koppa"}, + {0x141, L"L"}, + {0x2b45, L"LLeftarrow"}, + {0x39b, L"Lambda"}, + {0x27ec, L"Lbrbrak"}, + {0x21b2, L"Ldsh"}, + {0x21d0, L"Leftarrow"}, + {0x21d4, L"Leftrightarrow"}, + {0x21da, L"Lleftarrow"}, + {0x27f8, L"Longleftarrow"}, + {0x27fa, L"Longleftrightarrow"}, + {0x27fd, L"Longmapsfrom"}, + {0x27fe, L"Longmapsto"}, + {0x27f9, L"Longrightarrow"}, + {0x2995, L"Lparengtr"}, + {0x21b0, L"Lsh"}, + {0x2aa1, L"Lt"}, + {0x29da, L"Lvzigzag"}, + {0x2906, L"Mapsfrom"}, + {0x2907, L"Mapsto"}, + {0x39c, L"Mu"}, + {0x14a, L"NG"}, + {0x21d7, L"Nearrow"}, + {0x2aec, L"Not"}, + {0x39d, L"Nu"}, + {0x21d6, L"Nwarrow"}, + {0xd8, L"O"}, + {0x152, L"OE"}, + {0x1a0, L"Ohorn"}, + {0x3a9, L"Omega"}, + {0x39f, L"Omicron"}, + {0x2a37, L"Otimes"}, + {0xb6, L"P"}, + {0x3a6, L"Phi"}, + {0x3a0, L"Pi"}, + {0x210e, L"Planckconst"}, + {0x2abb, L"Prec"}, + {0x214a, L"PropertyLine"}, + {0x3a8, L"Psi"}, + {0x220e, L"QED"}, + {0x2047, L"Question"}, + {0x2b46, L"RRightarrow"}, + {0x27ed, L"Rbrbrak"}, + {0x21b3, L"Rdsh"}, + {0x211c, L"Re"}, + {0x3a1, L"Rho"}, + {0x21d2, L"Rightarrow"}, + {0x2996, L"Rparenless"}, + {0x21db, L"Rrightarrow"}, + {0x21b1, L"Rsh"}, + {0x29db, L"Rvzigzag"}, + {0xa7, L"S"}, + {0x2abc, L"Sc"}, + {0x21d8, L"Searrow"}, + {0x3a3, L"Sigma"}, + {0x2a4e, L"Sqcap"}, + {0x2a4f, L"Sqcup"}, + {0x3da, L"Stigma"}, + {0x22d0, L"Subset"}, + {0x22d1, L"Supset"}, + {0x21d9, L"Swarrow"}, + {0xde, L"TH"}, + {0x3a4, L"Tau"}, + {0x398, L"Theta"}, + {0x27f0, L"UUparrow"}, + {0x1af, L"Uhorn"}, + {0x21d1, L"Uparrow"}, + {0x21d5, L"Updownarrow"}, + {0x290a, L"Uuparrow"}, + {0x22ab, L"VDash"}, + {0x2aeb, L"Vbar"}, + {0x22a9, L"Vdash"}, + {0x2a54, L"Vee"}, + {0x2016, L"Vert"}, + {0x22aa, L"Vvdash"}, + {0x2980, L"Vvert"}, + {0x2a53, L"Wedge"}, + {0x2612, L"XBox"}, + {0x39e, L"Xi"}, + {0x2144, L"Yup"}, + {0x1b5, L"Zbar"}, + {0x396, L"Zeta"}, + {0x5e, L"^"}, + {0xe5, L"aa"}, + {0x223e, L"ac"}, + {0x23e6, L"accurrent"}, + {0x267e, L"acidfree"}, + {0x2940, L"acwcirclearrow"}, + {0x27f2, L"acwgapcirclearrow"}, + {0x2939, L"acwleftarcarrow"}, + {0x21ba, L"acwopencirclearrow"}, + {0x293a, L"acwoverarcarrow"}, + {0x293b, L"acwundercurvearrow"}, + {0x22f0, L"adots"}, + {0xe6, L"ae"}, + {0x2135, L"aleph"}, + {0x3b1, L"alpha"}, +// {0x2210, L"amalg"}, + {0x2a3f, L"amalg"}, + {0x299f, L"angdnr"}, + {0x2220, L"angle"}, + {0x299e, L"angles"}, + {0x29a4, L"angleubar"}, + {0x2248, L"approx"}, + {0x224a, L"approxeq"}, + {0x2a70, L"approxeqq"}, + {0x224b, L"approxident"}, + {0x2258, L"arceq"}, + {0x2648, L"aries"}, + {0x22a6, L"assert"}, + {0x2217, L"ast"}, + {0x2a6e, L"asteq"}, + {0x2609, L"astrosun"}, + {0x224d, L"asymp"}, + {0x2a11, L"awint"}, + {0x2aed, L"bNot"}, + {0x224c, L"backcong"}, + {0x2036, L"backdprime"}, + {0x3f6, L"backepsilon"}, + {0x2035, L"backprime"}, + {0x223d, L"backsim"}, + {0x22cd, L"backsimeq"}, + {0x5c, L"backslash"}, + {0x2037, L"backtrprime"}, + {0x22ff, L"bagmember"}, + {0x2aea, L"barV"}, + {0x2a43, L"barcap"}, + {0x2a42, L"barcup"}, + {0x2961, L"bardownharpoonleft"}, + {0x295d, L"bardownharpoonright"}, + {0x21e4, L"barleftarrow"}, + {0x21b9, L"barleftarrowrightarrowbar"}, + {0x2956, L"barleftharpoondown"}, + {0x2952, L"barleftharpoonup"}, + {0x21b8, L"barovernorthwestarrow"}, + {0x2920, L"barrightarrowdiamond"}, + {0x295f, L"barrightharpoondown"}, + {0x295b, L"barrightharpoonup"}, + {0x2912, L"baruparrow"}, + {0x2958, L"barupharpoonleft"}, + {0x2954, L"barupharpoonright"}, + {0x22bd, L"barvee"}, + {0x22bc, L"barwedge"}, + {0x23b6, L"bbrktbrk"}, + {0x2550, L"bdHrule"}, + {0x2551, L"bdVrule"}, + {0x256c, L"bdbVbH"}, + {0x256b, L"bdbVbh"}, + {0x2563, L"bdbVlH"}, + {0x2562, L"bdbVlh"}, + {0x2560, L"bdbVrH"}, + {0x255f, L"bdbVrh"}, + {0x256a, L"bdbvbH"}, + {0x253c, L"bdbvbh"}, + {0x2561, L"bdbvlH"}, + {0x2524, L"bdbvlh"}, + {0x255e, L"bdbvrH"}, + {0x251c, L"bdbvrh"}, + {0x2566, L"bddVbH"}, + {0x2565, L"bddVbh"}, + {0x2557, L"bddVlH"}, + {0x2556, L"bddVlh"}, + {0x2554, L"bddVrH"}, + {0x2553, L"bddVrh"}, + {0x2564, L"bddvbH"}, + {0x252c, L"bddvbh"}, + {0x2555, L"bddvlH"}, + {0x2510, L"bddvlh"}, + {0x2552, L"bddvrH"}, + {0x250c, L"bddvrh"}, + {0x2500, L"bdhrule"}, + {0x2571, L"bdnesw"}, + {0x2572, L"bdnwse"}, + {0x2508, L"bdquadhdash"}, + {0x250a, L"bdquadvdash"}, + {0x2506, L"bdtriplevdash"}, + {0x2569, L"bduVbH"}, + {0x2568, L"bduVbh"}, + {0x255d, L"bduVlH"}, + {0x255c, L"bduVlh"}, + {0x255a, L"bduVrH"}, + {0x2559, L"bduVrh"}, + {0x2567, L"bduvbH"}, + {0x2534, L"bduvbh"}, + {0x255b, L"bduvlH"}, + {0x2518, L"bduvlh"}, + {0x2558, L"bduvrH"}, + {0x2514, L"bduvrh"}, + {0x2502, L"bdvrule"}, + {0x2235, L"because"}, + {0x23e3, L"benzenr"}, + {0x3b2, L"beta"}, + {0x2136, L"beth"}, + {0x226c, L"between"}, + {0x25bc, L"bigblacktriangledown"}, + {0x25b2, L"bigblacktriangleup"}, + {0x27d8, L"bigbot"}, + {0x22c2, L"bigcap"}, + {0x22c3, L"bigcup"}, + {0x2a57, L"bigslopedvee"}, + {0x2a58, L"bigslopedwedge"}, + {0x2605, L"bigstar"}, + {0x27d9, L"bigtop"}, + {0x25bd, L"bigtriangledown"}, + {0x25b3, L"bigtriangleup"}, + {0x22c1, L"bigvee"}, + {0x22c0, L"bigwedge"}, + {0x2606, L"bigwhitestar"}, + {0x29ed, L"blackcircledownarrow"}, + {0x2688, L"blackcircledrightdot"}, + {0x2791, L"blackcircledsanseight"}, + {0x278e, L"blackcircledsansfive"}, + {0x278d, L"blackcircledsansfour"}, + {0x2792, L"blackcircledsansnine"}, + {0x278a, L"blackcircledsansone"}, + {0x2790, L"blackcircledsansseven"}, + {0x278f, L"blackcircledsanssix"}, + {0x2793, L"blackcircledsansten"}, + {0x278c, L"blackcircledsansthree"}, + {0x278b, L"blackcircledsanstwo"}, + {0x2689, L"blackcircledtwodots"}, + {0x25d5, L"blackcircleulquadwhite"}, + {0x29ea, L"blackdiamonddownarrow"}, + {0x29d7, L"blackhourglass"}, + {0x25c8, L"blackinwhitediamond"}, + {0x25a3, L"blackinwhitesquare"}, + {0x25d6, L"blacklefthalfcircle"}, + {0x25c4, L"blackpointerleft"}, + {0x25ba, L"blackpointerright"}, + {0x25d7, L"blackrighthalfcircle"}, + {0x263b, L"blacksmiley"}, + {0x25b4, L"blacktriangle"}, + {0x25be, L"blacktriangledown"}, + {0x25c0, L"blacktriangleleft"}, + {0x25b6, L"blacktriangleright"}, + {0x2b2c, L"blkhorzoval"}, + {0x2b2e, L"blkvertoval"}, + {0x2588, L"blockfull"}, + {0x2592, L"blockhalfshaded"}, + {0x258c, L"blocklefthalf"}, + {0x2584, L"blocklowhalf"}, + {0x2591, L"blockqtrshaded"}, + {0x2590, L"blockrighthalf"}, + {0x2593, L"blockthreeqtrshaded"}, + {0x2580, L"blockuphalf"}, + {0x22a5, L"bot"}, + {0x25e1, L"botsemicircle"}, + {0x22c8, L"bowtie"}, + {0x25fb, L"box"}, + {0x29c6, L"boxast"}, + {0x25eb, L"boxbar"}, + {0x29c8, L"boxbox"}, + {0x29c5, L"boxbslash"}, + {0x29c7, L"boxcircle"}, + {0x29c4, L"boxdiag"}, + {0x22a1, L"boxdot"}, + {0x229f, L"boxminus"}, + {0x29c9, L"boxonbox"}, + {0x229e, L"boxplus"}, + {0x22a0, L"boxtimes"}, + {0x2b41, L"bsimilarleftarrow"}, + {0x2b47, L"bsimilarrightarrow"}, + {0x27c8, L"bsolhsub"}, + {0x2a32, L"btimes"}, + {0x2219, L"bullet"}, + {0x25ce, L"bullseye"}, + {0x224f, L"bumpeq"}, + {0x2aae, L"bumpeqq"}, + {0x212c, L"calB"}, + {0x2130, L"calE"}, + {0x2131, L"calF"}, + {0x210b, L"calH"}, + {0x2110, L"calI"}, + {0x2112, L"calL"}, + {0x2133, L"calM"}, + {0x211b, L"calR"}, + {0x2229, L"cap"}, + {0x2a40, L"capdot"}, + {0x2a44, L"capwedge"}, + {0x2038, L"caretinsert"}, + {0x23ce, L"carreturn"}, + {0x21b5, L"carriagereturn"}, + {0x293f, L"ccwundercurvearrow"}, + {0x22c5, L"cdot"}, + {0xb7, L"cdotp"}, + {0x22ef, L"cdots"}, + {0x2ba, L"cdprime"}, + {0x2713, L"checkmark"}, + {0x3c7, L"chi"}, + {0x29c3, L"cirE"}, + {0x27df, L"cirbot"}, + {0x2218, L"circ"}, + {0x2257, L"circeq"}, + {0x2a10, L"circfint"}, + {0x25d2, L"circlebottomhalfblack"}, + {0x24b6, L"circledA"}, + {0x24b7, L"circledB"}, + {0x24b8, L"circledC"}, + {0x24b9, L"circledD"}, + {0x24ba, L"circledE"}, + {0x24bb, L"circledF"}, + {0x24bc, L"circledG"}, + {0x24bd, L"circledH"}, + {0x24be, L"circledI"}, + {0x24bf, L"circledJ"}, + {0x24c0, L"circledK"}, + {0x24c1, L"circledL"}, + {0x24c2, L"circledM"}, + {0x24c3, L"circledN"}, + {0x24c4, L"circledO"}, + {0x24c5, L"circledP"}, + {0x24c6, L"circledQ"}, + {0x24c7, L"circledR"}, + {0x24c8, L"circledS"}, + {0x24c9, L"circledT"}, + {0x24ca, L"circledU"}, + {0x24cb, L"circledV"}, + {0x24cc, L"circledW"}, + {0x24cd, L"circledX"}, + {0x24ce, L"circledY"}, + {0x24cf, L"circledZ"}, + {0x24d0, L"circleda"}, + {0x229b, L"circledast"}, + {0x24d1, L"circledb"}, + {0x29bf, L"circledbullet"}, + {0x24d2, L"circledc"}, + {0x229a, L"circledcirc"}, + {0x24d3, L"circledd"}, + {0x229d, L"circleddash"}, + {0x24d4, L"circlede"}, + {0x2467, L"circledeight"}, + {0x229c, L"circledequal"}, + {0x24d5, L"circledf"}, + {0x2464, L"circledfive"}, + {0x2463, L"circledfour"}, + {0x24d6, L"circledg"}, + {0x24d7, L"circledh"}, + {0x24d8, L"circledi"}, + {0x24d9, L"circledj"}, + {0x24da, L"circledk"}, + {0x24db, L"circledl"}, + {0x24dc, L"circledm"}, + {0x24dd, L"circledn"}, + {0x2468, L"circlednine"}, + {0x24de, L"circledo"}, + {0x2460, L"circledone"}, + {0x29ec, L"circledownarrow"}, + {0x24df, L"circledp"}, + {0x29b7, L"circledparallel"}, + {0x24e0, L"circledq"}, + {0x24e1, L"circledr"}, + {0x2686, L"circledrightdot"}, + {0x24e2, L"circleds"}, + {0x2787, L"circledsanseight"}, + {0x2784, L"circledsansfive"}, + {0x2783, L"circledsansfour"}, + {0x2788, L"circledsansnine"}, + {0x2780, L"circledsansone"}, + {0x2786, L"circledsansseven"}, + {0x2785, L"circledsanssix"}, + {0x2789, L"circledsansten"}, + {0x2782, L"circledsansthree"}, + {0x2781, L"circledsanstwo"}, + {0x2466, L"circledseven"}, + {0x2465, L"circledsix"}, + {0x272a, L"circledstar"}, + {0x24e3, L"circledt"}, + {0x2462, L"circledthree"}, + {0x2461, L"circledtwo"}, + {0x2687, L"circledtwodots"}, + {0x24e4, L"circledu"}, + {0x24e5, L"circledv"}, + {0x29b6, L"circledvert"}, + {0x24e6, L"circledw"}, + {0x29be, L"circledwhitebullet"}, + {0x24e7, L"circledx"}, + {0x24e8, L"circledy"}, + {0x24e9, L"circledz"}, + {0x24ea, L"circledzero"}, + {0x29b5, L"circlehbar"}, + {0x25d0, L"circlelefthalfblack"}, + {0x25f5, L"circlellquad"}, + {0x25f6, L"circlelrquad"}, + {0x2b30, L"circleonleftarrow"}, + {0x21f4, L"circleonrightarrow"}, + {0x25d1, L"circlerighthalfblack"}, + {0x25d3, L"circletophalfblack"}, + {0x25f4, L"circleulquad"}, + {0x25f7, L"circleurquad"}, + {0x25d4, L"circleurquadblack"}, + {0x25cd, L"circlevertfill"}, + {0x2aef, L"cirmid"}, + {0x29c2, L"cirscir"}, + {0x2329, L"clangle"}, + {0x2a4d, L"closedvarcap"}, + {0x2a4c, L"closedvarcup"}, + {0x2a50, L"closedvarcupsmashprod"}, + {0x2050, L"closure"}, + {0x2318, L"cloverleaf"}, + {0x2663, L"clubsuit"}, + {0x3a, L"colon"}, + {0x2236, L"colon"}, + {0x2254, L"coloneq"}, + {0x2a29, L"commaminus"}, + {0x2201, L"complement"}, + {0x27e1, L"concavediamond"}, + {0x27e2, L"concavediamondtickleft"}, + {0x27e3, L"concavediamondtickright"}, + {0x2245, L"cong"}, + {0x2a6d, L"congdot"}, + {0x2332, L"conictaper"}, + {0x260c, L"conjunction"}, + {0x2210, L"coprod"}, + {0x2b9, L"cprime"}, + {0x232a, L"crangle"}, + {0x2acf, L"csub"}, + {0x2ad1, L"csube"}, + {0x2ad0, L"csup"}, + {0x2ad2, L"csupe"}, + {0x221b, L"cuberoot"}, + {0x222a, L"cup"}, + {0x228d, L"cupdot"}, + {0x228c, L"cupleftarrow"}, + {0x2a45, L"cupvee"}, + {0x22de, L"curlyeqprec"}, + {0x22df, L"curlyeqsucc"}, + {0x22ce, L"curlyvee"}, + {0x22cf, L"curlywedge"}, + {0x21b6, L"curvearrowleft"}, + {0x293d, L"curvearrowleftplus"}, + {0x21b7, L"curvearrowright"}, + {0x293c, L"curvearrowrightminus"}, + {0x2941, L"cwcirclearrow"}, + {0x27f3, L"cwgapcirclearrow"}, + {0x21bb, L"cwopencirclearrow"}, + {0x2938, L"cwrightarcarrow"}, + {0x293e, L"cwundercurvearrow"}, + {0x232d, L"cylcty"}, + {0x430, L"cyra"}, + {0x431, L"cyrb"}, + {0x446, L"cyrc"}, + {0x447, L"cyrch"}, + {0x434, L"cyrd"}, + {0x435, L"cyre"}, + {0x44d, L"cyrerev"}, + {0x44b, L"cyrery"}, + {0x444, L"cyrf"}, + {0x433, L"cyrg"}, + {0x445, L"cyrh"}, + {0x44a, L"cyrhrdsn"}, + {0x438, L"cyri"}, + {0x439, L"cyrishrt"}, + {0x43a, L"cyrk"}, + {0x43b, L"cyrl"}, + {0x43c, L"cyrm"}, + {0x43d, L"cyrn"}, + {0x43e, L"cyro"}, + {0x43f, L"cyrp"}, + {0x440, L"cyrr"}, + {0x441, L"cyrs"}, + {0x44c, L"cyrsftsn"}, + {0x448, L"cyrsh"}, + {0x449, L"cyrshch"}, + {0x442, L"cyrt"}, + {0x443, L"cyru"}, + {0x432, L"cyrv"}, + {0x44f, L"cyrya"}, + {0x451, L"cyryo"}, + {0x44e, L"cyryu"}, + {0x437, L"cyrz"}, + {0x436, L"cyrzh"}, + {0x2020, L"dag"}, + {0x2020, L"dagger"}, + {0x2138, L"daleth"}, + {0x2621, L"danger"}, + {0x2ae3, L"dashV"}, + {0x27db, L"dashVdash"}, + {0x2239, L"dashcolon"}, + {0x296b, L"dashleftharpoondown"}, + {0x296d, L"dashrightharpoondown"}, + {0x22a3, L"dashv"}, + {0x290f, L"dbkarow"}, + {0x2021, L"ddag"}, + {0x2021, L"ddagger"}, + {0x22f1, L"ddots"}, + {0x2a77, L"ddotseq"}, + {0xb0, L"degree"}, + {0x3b4, L"delta"}, + {0xf0, L"dh"}, + {0x2300, L"diameter"}, + {0x25c7, L"diamond"}, + {0x2b19, L"diamondbotblack"}, + {0x27d0, L"diamondcdot"}, + {0x291d, L"diamondleftarrow"}, + {0x291f, L"diamondleftarrowbar"}, + {0x2b16, L"diamondleftblack"}, + {0x2b17, L"diamondrightblack"}, + {0x2662, L"diamondsuit"}, + {0x2b18, L"diamondtopblack"}, + {0x2680, L"dicei"}, + {0x2681, L"diceii"}, + {0x2682, L"diceiii"}, + {0x2683, L"diceiv"}, + {0x2684, L"dicev"}, + {0x2685, L"dicevi"}, + {0x3dd, L"digamma"}, + {0x273d, L"dingasterisk"}, + {0x2393, L"dircurrent"}, + {0x22f2, L"disin"}, + {0xf7, L"div"}, + {0x22c7, L"divideontimes"}, + {0x111, L"dj"}, + {0x230d, L"dlcrop"}, + {0x2250, L"doteq"}, + {0x2a67, L"dotequiv"}, + {0x2238, L"dotminus"}, + {0x2214, L"dotplus"}, + {0x2026, L"dots"}, + {0x2a6a, L"dotsim"}, + {0x223a, L"dotsminusdots"}, + {0x25cc, L"dottedcircle"}, + {0x2b1a, L"dottedsquare"}, + {0x2a30, L"dottimes"}, + {0x2a62, L"doublebarvee"}, + {0x2a5e, L"doublebarwedge"}, + {0x29fa, L"doubleplus"}, + {0x2193, L"downarrow"}, + {0x2913, L"downarrowbar"}, + {0x2908, L"downarrowbarred"}, + {0x21e3, L"downdasharrow"}, + {0x21ca, L"downdownarrows"}, + {0x297f, L"downfishtail"}, + {0x21c3, L"downharpoonleft"}, + {0x2959, L"downharpoonleftbar"}, + {0x21c2, L"downharpoonright"}, + {0x2955, L"downharpoonrightbar"}, + {0x2965, L"downharpoonsleftright"}, + {0x2935, L"downrightcurvedarrow"}, + {0x29e8, L"downtriangleleftblack"}, + {0x29e9, L"downtrianglerightblack"}, + {0x21f5, L"downuparrows"}, + {0x296f, L"downupharpoonsleftright"}, + {0x21e9, L"downwhitearrow"}, + {0x21af, L"downzigzagarrow"}, + {0x2033, L"dprime"}, + {0x279b, L"draftingarrow"}, + {0x2910, L"drbkarow"}, + {0x230c, L"drcrop"}, + {0x29f6, L"dsol"}, + {0x2a64, L"dsub"}, + {0x29df, L"dualmap"}, + {0x2641, L"earth"}, + {0x2a98, L"egsdot"}, + {0x266a, L"eighthnote"}, + {0x23e7, L"elinters"}, + {0x2113, L"ell"}, + {0x2a97, L"elsdot"}, + {0x2014, L"emdash"}, + {0x2205, L"emptyset"}, + {0x29b3, L"emptysetoarr"}, + {0x29b4, L"emptysetoarrl"}, + {0x29b1, L"emptysetobar"}, + {0x29b2, L"emptysetocirc"}, + {0x2013, L"endash"}, + {0x2025, L"enleadertwodots"}, + {0x2709, L"envelope"}, + {0x29e3, L"eparsl"}, + {0x3f5, L"epsilon"}, + {0x2256, L"eqcirc"}, + {0x2255, L"eqcolon"}, + {0x225d, L"eqdef"}, + {0x2a66, L"eqdot"}, + {0x2a75, L"eqeq"}, + {0x2a76, L"eqeqeq"}, + {0x22dd, L"eqgtr"}, + {0x22dc, L"eqless"}, + {0x2a9a, L"eqqgtr"}, + {0x2a99, L"eqqless"}, + {0x2a71, L"eqqplus"}, + {0x2a73, L"eqqsim"}, + {0x2a9c, L"eqqslantgtr"}, + {0x2a9b, L"eqqslantless"}, + {0x2242, L"eqsim"}, + {0x2a96, L"eqslantgtr"}, + {0x2a95, L"eqslantless"}, + {0x2b40, L"equalleftarrow"}, + {0x22d5, L"equalparallel"}, + {0x2971, L"equalrightarrow"}, + {0x2261, L"equiv"}, + {0x2a78, L"equivDD"}, + {0x2a68, L"equivVert"}, + {0x2a69, L"equivVvert"}, + {0x29e5, L"eqvparsl"}, + {0x29f3, L"errbarblackcircle"}, + {0x29f1, L"errbarblackdiamond"}, + {0x29ef, L"errbarblacksquare"}, + {0x29f2, L"errbarcircle"}, + {0x29f0, L"errbardiamond"}, + {0x29ee, L"errbarsquare"}, + {0x3b7, L"eta"}, + {0x20ac, L"euro"}, + {0x2203, L"exists"}, + {0x2252, L"fallingdotseq"}, + {0x29d3, L"fbowtie"}, + {0x2a3e, L"fcmp"}, + {0x292f, L"fdiagovnearrow"}, + {0x292c, L"fdiagovrdiag"}, + {0x2640, L"female"}, + {0x2012, L"figdash"}, + {0x2a0f, L"fint"}, + {0x25c9, L"fisheye"}, + {0x266d, L"flat"}, + {0x23e5, L"fltns"}, + {0x2200, L"forall"}, + {0x2adc, L"forks"}, + {0x2add, L"forksnot"}, + {0x2ad9, L"forkv"}, + {0x221c, L"fourthroot"}, + {0x2999, L"fourvdots"}, + {0x215d, L"fracfiveeighths"}, + {0x215a, L"fracfivesixths"}, + {0x2158, L"fracfourfifths"}, + {0x215b, L"fraconeeighth"}, + {0x2155, L"fraconefifth"}, + {0x2159, L"fraconesixth"}, + {0x2153, L"fraconethird"}, + {0x215e, L"fracseveneights"}, + {0x2044, L"fracslash"}, + {0x215c, L"fracthreeeighths"}, + {0x2157, L"fracthreefifths"}, + {0x2156, L"fractwofifths"}, + {0x2154, L"fractwothirds"}, + {0x212d, L"frakC"}, + {0x210c, L"frakH"}, + {0x2128, L"frakZ"}, + {0x2322, L"frown"}, + {0x2639, L"frownie"}, + {0x27d7, L"fullouterjoin"}, + {0x3b3, L"gamma"}, + {0x2265, L"ge"}, + {0x2265, L"geq"}, + {0x2267, L"geqq"}, + {0x2a7e, L"geqslant"}, + {0x2aa9, L"gescc"}, + {0x2a80, L"gesdot"}, + {0x2a82, L"gesdoto"}, + {0x2a84, L"gesdotol"}, + {0x2a94, L"gesles"}, + {0x2190, L"gets"}, + {0x226b, L"gg"}, + {0x22d9, L"ggg"}, + {0x2af8, L"gggnest"}, + {0x2137, L"gimel"}, + {0x2a92, L"glE"}, + {0x2aa5, L"gla"}, + {0x29e6, L"gleichstark"}, + {0x2aa4, L"glj"}, + {0x2a8a, L"gnapprox"}, + {0x2a88, L"gneq"}, + {0x2269, L"gneqq"}, + {0x22e7, L"gnsim"}, + {0x3e, L"greater"}, + {0x2a8e, L"gsime"}, + {0x2a90, L"gsiml"}, + {0x2aa7, L"gtcc"}, + {0x2a7a, L"gtcir"}, + {0x29a0, L"gtlpar"}, + {0x2a7c, L"gtquest"}, + {0x2a86, L"gtrapprox"}, + {0x2978, L"gtrarr"}, + {0x22d7, L"gtrdot"}, + {0x22db, L"gtreqless"}, + {0x2a8c, L"gtreqqless"}, + {0x2277, L"gtrless"}, + {0x2273, L"gtrsim"}, + {0xab, L"guillemotleft"}, + {0xbb, L"guillemotright"}, + {0x2039, L"guilsinglleft"}, + {0x203a, L"guilsinglright"}, + {0x23af, L"harrowextender"}, + {0x2a6f, L"hatapprox"}, + {0x210f, L"hbar"}, + {0x2661, L"heartsuit"}, + {0x22b9, L"hermitmatrix"}, + {0x2394, L"hexagon"}, + {0x2b23, L"hexagonblack"}, + {0x306e, L"hiraganano"}, + {0x2924, L"hknearrow"}, + {0x2923, L"hknwarrow"}, + {0x2925, L"hksearow"}, + {0x2926, L"hkswarow"}, + {0x21a9, L"hookleftarrow"}, + {0x21aa, L"hookrightarrow"}, + {0x2015, L"horizbar"}, + {0x29d6, L"hourglass"}, + {0x2302, L"house"}, + {0x25ad, L"hrectangle"}, + {0x25ac, L"hrectangleblack"}, + {0x210f, L"hslash"}, + {0x2043, L"hyphenbullet"}, + {0x3030, L"hzigzag"}, + {0x2a0c, L"iiiint"}, + {0x222d, L"iiint"}, + {0x29dc, L"iinfin"}, + {0x222c, L"iint"}, + {0x22b7, L"imageof"}, + {0x2208, L"in"}, + {0x2105, L"incare"}, + {0x2206, L"increment"}, + {0x221e, L"infty"}, + {0x222b, L"int"}, + {0x2a0e, L"intBar"}, + {0x2a0d, L"intbar"}, + {0x2321, L"intbottom"}, + {0x2a19, L"intcap"}, + {0x2231, L"intclockwise"}, + {0x2a1a, L"intcup"}, + {0x22ba, L"intercal"}, + {0x2af4, L"interleave"}, + {0x23ae, L"intextender"}, + {0x2a17, L"intlharhk"}, + {0x2a3c, L"intprod"}, + {0x2a3d, L"intprodr"}, + {0x2320, L"inttop"}, + {0x2a18, L"intx"}, + {0x25d8, L"inversebullet"}, + {0x25d9, L"inversewhitecircle"}, + {0x2310, L"invnot"}, + {0x25db, L"invwhitelowerhalfcircle"}, + {0x25da, L"invwhiteupperhalfcircle"}, + {0x3b9, L"iota"}, + {0x2e0, L"ipasupgamma"}, + {0x2e1, L"ipasupl"}, + {0x2e4, L"ipasuprerglotstpp"}, + {0x2e2, L"ipasups"}, + {0x2e3, L"ipasupx"}, + {0x2ed, L"ipaunaspirated"}, + {0x2ec, L"ipavoicing"}, + {0x22f9, L"isinE"}, + {0x22f5, L"isindot"}, + {0x22f7, L"isinobar"}, + {0x22f4, L"isins"}, + {0x22f8, L"isinvb"}, + {0x2145, L"itBbbD"}, + {0x2146, L"itBbbd"}, + {0x2147, L"itBbbe"}, + {0x2148, L"itBbbi"}, + {0x2149, L"itBbbj"}, + {0x2643, L"jupiter"}, + {0x3ba, L"kappa"}, + {0x223b, L"kernelcontraction"}, + {0x3df, L"koppa"}, + {0x142, L"l"}, + {0x27ea, L"lAngle"}, + {0x2983, L"lBrace"}, + {0x27e6, L"lBrack"}, + {0x2985, L"lParen"}, + {0x3bb, L"lambda"}, + {0x19b, L"lambdabar"}, + {0x27e8, L"langle"}, + {0x2991, L"langledot"}, + {0x29e0, L"laplac"}, + {0x2bd, L"lasp"}, + {0x2aab, L"lat"}, + {0x2aad, L"late"}, + {0x27c5, L"lbag"}, + {0x2997, L"lblkbrbrak"}, + {0x7b, L"lbrace"}, + {0x23a9, L"lbracelend"}, + {0x23a8, L"lbracemid"}, + {0x23a7, L"lbraceuend"}, + {0x5b, L"lbrack"}, + {0x23a2, L"lbrackextender"}, + {0x23a3, L"lbracklend"}, + {0x298f, L"lbracklltick"}, + {0x298b, L"lbrackubar"}, + {0x23a1, L"lbrackuend"}, + {0x298d, L"lbrackultick"}, + {0x2772, L"lbrbrak"}, + {0x2308, L"lceil"}, + {0x29fc, L"lcurvyangle"}, + {0x21e0, L"ldasharrhead"}, + {0x2264, L"le"}, + {0x219d, L"leadsto"}, + {0x2190, L"leftarrow"}, + {0x2b4a, L"leftarrowapprox"}, + {0x2b42, L"leftarrowbackapprox"}, + {0x2b4b, L"leftarrowbsimilar"}, + {0x2977, L"leftarrowless"}, + {0x2b32, L"leftarrowonoplus"}, + {0x2946, L"leftarrowplus"}, + {0x2943, L"leftarrowshortrightarrow"}, + {0x2973, L"leftarrowsimilar"}, + {0x297a, L"leftarrowsubset"}, + {0x21a2, L"leftarrowtail"}, + {0x21fd, L"leftarrowtriangle"}, + {0x2b3e, L"leftarrowx"}, + {0x290c, L"leftbkarrow"}, + {0x2b3f, L"leftcurvedarrow"}, + {0x21e0, L"leftdasharrow"}, + {0x21e1, L"leftdasharrowhead"}, + {0x290e, L"leftdbkarrow"}, + {0x291b, L"leftdbltail"}, + {0x2b38, L"leftdotarrow"}, + {0x2936, L"leftdowncurvedarrow"}, + {0x297c, L"leftfishtail"}, + {0x21bd, L"leftharpoondown"}, + {0x295e, L"leftharpoondownbar"}, + {0x2962, L"leftharpoonsupdown"}, + {0x21bc, L"leftharpoonup"}, + {0x295a, L"leftharpoonupbar"}, + {0x296a, L"leftharpoonupdash"}, + {0x21c7, L"leftleftarrows"}, + {0x263e, L"leftmoon"}, + {0x27d5, L"leftouterjoin"}, + {0x2194, L"leftrightarrow"}, + {0x2948, L"leftrightarrowcircle"}, + {0x21c6, L"leftrightarrows"}, + {0x21ff, L"leftrightarrowtriangle"}, + {0x2950, L"leftrightharpoondowndown"}, + {0x294b, L"leftrightharpoondownup"}, + {0x21cb, L"leftrightharpoons"}, + {0x2967, L"leftrightharpoonsdown"}, + {0x2966, L"leftrightharpoonsup"}, + {0x294a, L"leftrightharpoonupdown"}, + {0x294e, L"leftrightharpoonupup"}, + {0x21ad, L"leftrightsquigarrow"}, + {0x219c, L"leftsquigarrow"}, + {0x21dc, L"leftsquigarrow"}, + {0x2919, L"lefttail"}, + {0x2b31, L"leftthreearrows"}, + {0x22cb, L"leftthreetimes"}, + {0x21e6, L"leftwhitearrow"}, + {0x2264, L"leq"}, + {0x2266, L"leqq"}, + {0x2af9, L"leqqslant"}, + {0x2afa, L"leqqslant"}, + {0x2a7d, L"leqslant"}, + {0x2aa8, L"lescc"}, + {0x2a7f, L"lesdot"}, + {0x2a81, L"lesdoto"}, + {0x2a83, L"lesdotor"}, + {0x2a93, L"lesges"}, + {0x3c, L"less"}, + {0x2a85, L"lessapprox"}, + {0x22d6, L"lessdot"}, + {0x22da, L"lesseqgtr"}, + {0x2a8b, L"lesseqqgtr"}, + {0x2276, L"lessgtr"}, + {0x2272, L"lesssim"}, + {0x29d1, L"lfbowtie"}, + {0x230a, L"lfloor"}, + {0x29d4, L"lftimes"}, + {0x2a91, L"lgE"}, + {0x2b24, L"lgblkcircle"}, + {0x2b1b, L"lgblksquare"}, + {0x25ef, L"lgwhtcircle"}, + {0x2b1c, L"lgwhtsquare"}, + {0x22b2, L"lhd"}, + {0x21b4, L"linefeed"}, + {0x226a, L"ll"}, + {0x2989, L"llangle"}, + {0x25df, L"llarc"}, + {0x25e3, L"llblacktriangle"}, + {0x231e, L"llcorner"}, + {0x22d8, L"lll"}, + {0x2af7, L"lllnest"}, + {0x2987, L"llparenthesis"}, + {0x25fa, L"lltriangle"}, + {0x23b0, L"lmoustache"}, + {0x2a89, L"lnapprox"}, + {0x2a87, L"lneq"}, + {0x2268, L"lneqq"}, + {0x22e6, L"lnsim"}, + {0x27de, L"longdashv"}, + {0x27cc, L"longdivision"}, + {0x27f5, L"longleftarrow"}, + {0x27f7, L"longleftrightarrow"}, + {0x2b33, L"longleftsquigarrow"}, + {0x27fb, L"longmapsfrom"}, + {0x27fc, L"longmapsto"}, + {0x27f6, L"longrightarrow"}, + {0x27ff, L"longrightsquigarrow"}, + {0x21ab, L"looparrowleft"}, + {0x21ac, L"looparrowright"}, + {0x2a1c, L"lowint"}, + {0x25ca, L"lozenge"}, + {0x27e0, L"lozengeminus"}, + {0x239c, L"lparenextender"}, + {0x239d, L"lparenlend"}, + {0x2993, L"lparenless"}, + {0x239b, L"lparenuend"}, + {0x2018, L"lq"}, + {0x25de, L"lrarc"}, + {0x25e2, L"lrblacktriangle"}, + {0x231f, L"lrcorner"}, + {0x25ff, L"lrtriangle"}, + {0x29e1, L"lrtriangleeq"}, + {0x2a8d, L"lsime"}, + {0x2a8f, L"lsimg"}, + {0x2acd, L"lsqhook"}, + {0x2aa6, L"ltcc"}, + {0x2a79, L"ltcir"}, + {0x22c9, L"ltimes"}, + {0x2976, L"ltlarr"}, + {0x2a7b, L"ltquest"}, + {0x29cf, L"ltrivb"}, + {0x23b8, L"lvboxline"}, + {0x29d8, L"lvzigzag"}, + {0x2642, L"male"}, + {0x2720, L"maltese"}, + {0x21a7, L"mapsdown"}, + {0x21a4, L"mapsfrom"}, + {0x21a6, L"mapsto"}, + {0x21a5, L"mapsup"}, + {0x2b25, L"mdblkdiamond"}, + {0x2b27, L"mdblklozenge"}, + {0x26ab, L"mdblkrcl"}, + {0x25fc, L"mdblksquare"}, + {0x25cf, L"mdlgblkcircle"}, + {0x25c6, L"mdlgblkdiamond"}, + {0x29eb, L"mdlgblklozenge"}, + {0x25a0, L"mdlgblksquare"}, + {0x25cb, L"mdlgwhtcircle"}, + {0x25c7, L"mdlgwhtdiamond"}, + {0x25a1, L"mdlgwhtsquare"}, + {0x2981, L"mdsmblkcircle"}, + {0x25fe, L"mdsmblksquare"}, + {0x26ac, L"mdsmwhtcircl"}, + {0x25fd, L"mdsmwhtsquare"}, + {0x26aa, L"mdwhtcircl"}, + {0x2b26, L"mdwhtdiamond"}, + {0x2b28, L"mdwhtlozenge"}, + {0x25fb, L"mdwhtsquare"}, + {0x29af, L"measangledltosw"}, + {0x29ae, L"measangledrtose"}, + {0x29ab, L"measangleldtosw"}, + {0x29a9, L"measanglelutonw"}, + {0x29aa, L"measanglerdtose"}, + {0x29a8, L"measanglerutone"}, + {0x29ad, L"measangleultonw"}, + {0x29ac, L"measangleurtone"}, + {0x225e, L"measeq"}, + {0x2221, L"measuredangle"}, + {0x299b, L"measuredangleleft"}, + {0x22be, L"measuredrightangle"}, + {0x2b51, L"medblackstar"}, + {0x205f, L"medmathspace"}, + {0x2b50, L"medwhitestar"}, + {0x263f, L"mercury"}, + {0x2127, L"mho"}, + {0x2223, L"mid"}, + {0x2a5d, L"midbarvee"}, + {0x2a5c, L"midbarwedge"}, + {0x2af0, L"midcir"}, + {0x2212, L"minus"}, + {0x2a2a, L"minusdot"}, + {0x2a2b, L"minusfdots"}, + {0x2a2c, L"minusrdots"}, + {0x2adb, L"mlcp"}, + {0x22a7, L"models"}, + {0x2213, L"mp"}, + {0x3bc, L"mu"}, + {0x22b8, L"multimap"}, + {0x27dc, L"multimapinv"}, + {0x21df, L"nHdownarrow"}, + {0x21de, L"nHuparrow"}, + {0x21cd, L"nLeftarrow"}, + {0x21ce, L"nLeftrightarrow"}, + {0x21cf, L"nRightarrow"}, + {0x22af, L"nVDash"}, + {0x22ae, L"nVdash"}, + {0x21fa, L"nVleftarrow"}, + {0x2b3a, L"nVleftarrowtail"}, + {0x21fc, L"nVleftrightarrow"}, + {0x21fb, L"nVrightarrow"}, + {0x2915, L"nVrightarrowtail"}, + {0x2b35, L"nVtwoheadleftarrow"}, + {0x2b3d, L"nVtwoheadleftarrowtail"}, + {0x2901, L"nVtwoheadrightarrow"}, + {0x2918, L"nVtwoheadrightarrowtail"}, + {0x2207, L"nabla"}, + {0x2249, L"napprox"}, + {0x226d, L"nasymp"}, + {0x266e, L"natural"}, + {0x2247, L"ncong"}, + {0x2260, L"ne"}, + {0x2197, L"nearrow"}, + {0xac, L"neg"}, + {0x2931, L"neovnwarrow"}, + {0x292e, L"neovsearrow"}, + {0x2646, L"neptune"}, + {0x2260, L"neq"}, + {0x2262, L"nequiv"}, + {0x2922, L"neswarrow"}, + {0x26b2, L"neuter"}, + {0x2204, L"nexists"}, + {0x14b, L"ng"}, + {0x2271, L"ngeq"}, + {0x226f, L"ngtr"}, + {0x2279, L"ngtrless"}, + {0x2275, L"ngtrsim"}, + {0x2af5, L"nhVvert"}, + {0x2af2, L"nhpar"}, + {0x220b, L"ni"}, + {0x22fe, L"niobar"}, + {0x22fc, L"nis"}, + {0x22fa, L"nisd"}, + {0x219a, L"nleftarrow"}, + {0x21ae, L"nleftrightarrow"}, + {0x2270, L"nleq"}, + {0x226e, L"nless"}, + {0x2278, L"nlessgtr"}, + {0x2274, L"nlesssim"}, + {0x2224, L"nmid"}, + {0x220c, L"nni"}, + {0x2011, L"nobreakhyphen"}, + {0x2209, L"notin"}, + {0x2226, L"nparallel"}, + {0x2a14, L"npolint"}, + {0x2280, L"nprec"}, + {0x22e0, L"npreccurlyeq"}, + {0x219b, L"nrightarrow"}, + {0x2241, L"nsim"}, + {0x2244, L"nsime"}, + {0x22e2, L"nsqsubseteq"}, + {0x22e3, L"nsqsupseteq"}, + {0x2284, L"nsubset"}, + {0x2288, L"nsubseteq"}, + {0x2281, L"nsucc"}, + {0x22e1, L"nsucccurlyeq"}, + {0x2285, L"nsupset"}, + {0x2289, L"nsupseteq"}, + {0x22ea, L"ntriangleleft"}, + {0x22ec, L"ntrianglelefteq"}, + {0x22eb, L"ntriangleright"}, + {0x22ed, L"ntrianglerighteq"}, + {0x3bd, L"nu"}, + {0x22ad, L"nvDash"}, + {0x2902, L"nvLeftarrow"}, + {0x2904, L"nvLeftrightarrow"}, + {0x2903, L"nvRightarrow"}, + {0x22ac, L"nvdash"}, + {0x29de, L"nvinfty"}, + {0x21f7, L"nvleftarrow"}, + {0x2b39, L"nvleftarrowtail"}, + {0x21f9, L"nvleftrightarrow"}, + {0x21f8, L"nvrightarrow"}, + {0x2914, L"nvrightarrowtail"}, + {0x2b34, L"nvtwoheadleftarrow"}, + {0x2b3c, L"nvtwoheadleftarrowtail"}, + {0x2900, L"nvtwoheadrightarrow"}, + {0x2917, L"nvtwoheadrightarrowtail"}, + {0x2196, L"nwarrow"}, + {0x2932, L"nwovnearrow"}, + {0x2921, L"nwsearrow"}, + {0xf8, L"o"}, + {0x233d, L"obar"}, + {0x29ba, L"obot"}, + {0x23e0, L"obrbrak"}, + {0x29b8, L"obslash"}, + {0x2a38, L"odiv"}, + {0x2299, L"odot"}, + {0x29bc, L"odotslashdot"}, + {0x153, L"oe"}, + {0x29c1, L"ogreaterthan"}, + {0x1a1, L"ohorn"}, + {0x2230, L"oiiint"}, + {0x222f, L"oiint"}, + {0x222e, L"oint"}, + {0x2233, L"ointctrclockwise"}, + {0x29bb, L"olcross"}, + {0x3d8, L"oldKoppa"}, + {0x3d9, L"oldkoppa"}, + {0x29c0, L"olessthan"}, + {0x3c9, L"omega"}, + {0x3bf, L"omicron"}, + {0x2296, L"ominus"}, + {0x29b9, L"operp"}, + {0x2295, L"oplus"}, + {0x2a2d, L"opluslhrim"}, + {0x2a2e, L"oplusrhrim"}, + {0x22b6, L"origof"}, + {0x2298, L"oslash"}, + {0x2297, L"otimes"}, + {0x2a36, L"otimeshat"}, + {0x2a34, L"otimeslhrim"}, + {0x2a35, L"otimesrhrim"}, + {0x23de, L"overbrace"}, + {0x23b4, L"overbracket"}, + {0x203e, L"overline"}, + {0x23dc, L"overparen"}, + {0x220b, L"owns"}, + {0x2225, L"parallel"}, + {0x25b1, L"parallelogram"}, + {0x25b0, L"parallelogramblack"}, + {0x2af3, L"parsim"}, + {0x2202, L"partial"}, + {0x2aa3, L"partialmeetcontraction"}, + {0x2b20, L"pentagon"}, + {0x2b1f, L"pentagonblack"}, + {0x27c2, L"perp"}, + {0x2ae1, L"perps"}, + {0x3d5, L"phi"}, + {0x260e, L"phone"}, + {0x3c0, L"pi"}, + {0x22d4, L"pitchfork"}, + {0x2a25, L"plusdot"}, + {0x2a72, L"pluseqq"}, + {0x2a23, L"plushat"}, + {0x2a26, L"plussim"}, + {0x2a27, L"plussubtwo"}, + {0x2a28, L"plustrif"}, + {0x2647, L"pluto"}, + {0xb1, L"pm"}, + {0x2a15, L"pointnt"}, + {0x3012, L"postalmark"}, + {0x227a, L"prec"}, + {0x2ab7, L"precapprox"}, + {0x227c, L"preccurlyeq"}, + {0x2aaf, L"preceq"}, + {0x2ab3, L"preceqq"}, + {0x2ab9, L"precnapprox"}, + {0x2ab1, L"precneq"}, + {0x2ab5, L"precneqq"}, + {0x22e8, L"precnsim"}, + {0x227e, L"precsim"}, + {0x2032, L"prime"}, + {0x220f, L"prod"}, + {0x232e, L"profalar"}, + {0x2312, L"profline"}, + {0x2313, L"profsurf"}, + {0x221d, L"propto"}, + {0x22b0, L"prurel"}, + {0x3c8, L"psi"}, + {0x27d3, L"pullback"}, + {0x27d4, L"pushout"}, + {0x2057, L"qprime"}, + {0x2669, L"quarternote"}, + {0x225f, L"questeq"}, + {0x201e, L"quotdblbase"}, + {0x201f, L"quotdblright"}, + {0x27, L"quote"}, + {0x201a, L"quotsinglbase"}, + {0x201b, L"quotsinglright"}, + {0x27eb, L"rAngle"}, + {0x2984, L"rBrace"}, + {0x27e7, L"rBrack"}, + {0x2986, L"rParen"}, + {0x27e9, L"rangle"}, + {0x2992, L"rangledot"}, + {0x237c, L"rangledownzigzagarrow"}, + {0x2bc, L"rasp"}, + {0x27c6, L"rbag"}, + {0x2998, L"rblkbrbrak"}, + {0x7d, L"rbrace"}, + {0x23ad, L"rbracelend"}, + {0x23ac, L"rbracemid"}, + {0x23ab, L"rbraceuend"}, + {0x5d, L"rbrack"}, + {0x23a5, L"rbrackextender"}, + {0x23a6, L"rbracklend"}, + {0x298e, L"rbracklrtick"}, + {0x298c, L"rbrackubar"}, + {0x23a4, L"rbrackuend"}, + {0x2990, L"rbrackurtick"}, + {0x2773, L"rbrbrak"}, + {0x2309, L"rceil"}, + {0x29fd, L"rcurvyangle"}, + {0x292b, L"rdiagovfdiag"}, + {0x2930, L"rdiagovsearrow"}, + {0x2315, L"recorder"}, + {0x29a3, L"revangle"}, + {0x29a5, L"revangleubar"}, + {0x29b0, L"revemptyset"}, + {0x2aee, L"revnmid"}, + {0x29d2, L"rfbowtie"}, + {0x230b, L"rfloor"}, + {0x29d5, L"rftimes"}, + {0x22b3, L"rhd"}, + {0x3c1, L"rho"}, + {0x2b4c, L"righarrowbsimilar"}, + {0x221f, L"rightangle"}, + {0x299d, L"rightanglemdot"}, + {0x299c, L"rightanglesqr"}, + {0x2192, L"rightarrow"}, + {0x2975, L"rightarrowapprox"}, + {0x2b48, L"rightarrowbackapprox"}, + {0x21e5, L"rightarrowbar"}, + {0x291e, L"rightarrowdiamond"}, + {0x2b43, L"rightarrowgtr"}, + {0x27f4, L"rightarrowonoplus"}, + {0x2945, L"rightarrowplus"}, + {0x2942, L"rightarrowshortleftarrow"}, + {0x2974, L"rightarrowsimilar"}, + {0x2b44, L"rightarrowsupset"}, + {0x21a3, L"rightarrowtail"}, + {0x21fe, L"rightarrowtriangle"}, + {0x2947, L"rightarrowx"}, + {0x290d, L"rightbkarrow"}, + {0x2933, L"rightcurvedarrow"}, + {0x21e2, L"rightdasharrow"}, + {0x291c, L"rightdbltail"}, + {0x2911, L"rightdotarrow"}, + {0x2937, L"rightdowncurvedarrow"}, + {0x297d, L"rightfishtail"}, + {0x21c1, L"rightharpoondown"}, + {0x2957, L"rightharpoondownbar"}, + {0x2964, L"rightharpoonsupdown"}, + {0x21c0, L"rightharpoonup"}, + {0x2953, L"rightharpoonupbar"}, + {0x296c, L"rightharpoonupdash"}, + {0x2970, L"rightimply"}, + {0x21c4, L"rightleftarrows"}, + {0x21cc, L"rightleftharpoons"}, + {0x2969, L"rightleftharpoonsdown"}, + {0x2968, L"rightleftharpoonsup"}, + {0x263d, L"rightmoon"}, + {0x27d6, L"rightouterjoin"}, + {0x2b54, L"rightpentagon"}, + {0x2b53, L"rightpentagonblack"}, + {0x21c9, L"rightrightarrows"}, + {0x219d, L"rightsquigarrow"}, + {0x21dd, L"rightsquigarrow"}, + {0x291a, L"righttail"}, + {0x21f6, L"rightthreearrows"}, + {0x22cc, L"rightthreetimes"}, + {0x21e8, L"rightwhitearrow"}, + {0x2a22, L"ringplus"}, + {0x2253, L"risingdotseq"}, + {0x23b1, L"rmoustache"}, + {0x239f, L"rparenextender"}, + {0x2994, L"rparengtr"}, + {0x23a0, L"rparenlend"}, + {0x239e, L"rparenuend"}, + {0x2a12, L"rppolint"}, + {0x2019, L"rq"}, + {0x298a, L"rrangle"}, + {0x2988, L"rrparenthesis"}, + {0x29f7, L"rsolbar"}, + {0x2ace, L"rsqhook"}, + {0x2a65, L"rsub"}, + {0x22ca, L"rtimes"}, + {0x29ce, L"rtriltri"}, + {0x29f4, L"ruledelayed"}, + {0x23b9, L"rvboxline"}, + {0x29d9, L"rvzigzag"}, + {0x3e1, L"sampi"}, + {0x2143, L"sansLmirrored"}, + {0x2142, L"sansLturned"}, + {0x2644, L"saturn"}, + {0x2702, L"scissors"}, + {0x2a13, L"scpolint"}, + {0x212c, L"scrB"}, + {0x2130, L"scrE"}, + {0x2131, L"scrF"}, + {0x210b, L"scrH"}, + {0x2110, L"scrI"}, + {0x2112, L"scrL"}, + {0x2133, L"scrM"}, + {0x211b, L"scrR"}, + {0x212f, L"scre"}, + {0x210a, L"scrg"}, + {0x2134, L"scro"}, + {0x22b1, L"scurel"}, + {0x2198, L"searrow"}, + {0x292d, L"seovnearrow"}, + {0x2216, L"setminus"}, + {0x29f5, L"setminus"}, + {0x266f, L"sharp"}, + {0x2adf, L"shortdowntack"}, + {0x2190, L"shortleftarrow"}, + {0x2ade, L"shortlefttack"}, + {0x2192, L"shortrightarrow"}, + {0x2944, L"shortrightarrowleftarrow"}, + {0x2ae0, L"shortuptack"}, + {0x29e2, L"shuffle"}, + {0x3c3, L"sigma"}, + {0x3c5, L"silon"}, + {0x3d2, L"silon"}, + {0x223c, L"sim"}, + {0x2243, L"simeq"}, + {0x2aa0, L"simgE"}, + {0x2a9e, L"simgtr"}, + {0x2b49, L"similarleftarrow"}, + {0x2972, L"similarrightarrow"}, + {0x2a9f, L"simlE"}, + {0x2a9d, L"simless"}, + {0x2a6c, L"simminussim"}, + {0x2246, L"simneqq"}, + {0x2a24, L"simplus"}, + {0x2a6b, L"simrdots"}, + {0x223f, L"sinewave"}, + {0x2215, L"slash"}, + {0x25c2, L"smallblacktriangleleft"}, + {0x25b8, L"smallblacktriangleright"}, + {0x22c4, L"smalldiamond"}, + {0x220a, L"smallin"}, + {0x222b, L"smallint"}, + {0x220d, L"smallni"}, + {0x2216, L"smallsetminus"}, + {0x25c3, L"smalltriangleleft"}, + {0x25b9, L"smalltriangleright"}, + {0x2a33, L"smashtimes"}, + {0x2b29, L"smblkdiamond"}, + {0x2b2a, L"smblklozenge"}, + {0x25aa, L"smblksquare"}, + {0x29e4, L"smeparsl"}, + {0x2323, L"smile"}, + {0x263a, L"smiley"}, + {0x2aaa, L"smt"}, + {0x2aac, L"smte"}, + {0x2b52, L"smwhitestar"}, + {0x25e6, L"smwhtcircle"}, + {0x2b2b, L"smwhtlozenge"}, + {0x25ab, L"smwhtsquare"}, + {0x2660, L"spadesuit"}, + {0x2222, L"sphericalangle"}, + {0x29a1, L"sphericalangleup"}, + {0x2293, L"sqcap"}, + {0x2294, L"sqcup"}, + {0x2a16, L"sqint"}, + {0x2311, L"sqlozenge"}, + {0x800221a, L"sqrt"}, + {0x800221b, L"sqrt3"}, + {0x800221c, L"sqrt4"}, + {0x23b7, L"sqrtbottom"}, + {0x228f, L"sqsubset"}, + {0x2291, L"sqsubseteq"}, + {0x22e4, L"sqsubsetneq"}, + {0x2290, L"sqsupset"}, + {0x2292, L"sqsupseteq"}, + {0x22e5, L"sqsupsetneq"}, + {0x25a9, L"squarecrossfill"}, + {0x25a9, L"squaregrayfill"}, + {0x25a4, L"squarehfill"}, + {0x25a6, L"squarehvfill"}, + {0x25e7, L"squareleftblack"}, + {0x25e8, L"squareleftblack"}, + {0x2b15, L"squarellblack"}, + {0x25f1, L"squarellquad"}, + {0x25ea, L"squarelrblack"}, + {0x25f2, L"squarelrquad"}, + {0x25a8, L"squareneswfill"}, + {0x25a7, L"squarenwsefill"}, + {0x25e9, L"squareulblack"}, + {0x25f0, L"squareulquad"}, + {0x2b14, L"squareurblack"}, + {0x25f3, L"squareurquad"}, + {0x25a5, L"squarevfill"}, + {0x25a2, L"squoval"}, + {0xdf, L"ss"}, + {0x22c6, L"star"}, + {0x225b, L"stareq"}, + {0xa3, L"sterling"}, + {0x3db, L"stigma"}, + {0x23e4, L"strns"}, + {0x2ac3, L"subedot"}, + {0x2ac1, L"submult"}, + {0x2979, L"subrarr"}, + {0x2282, L"subset"}, + {0x2ac9, L"subsetapprox"}, + {0x27c3, L"subsetcirc"}, + {0x2abd, L"subsetdot"}, + {0x2286, L"subseteq"}, + {0x2ac5, L"subseteqq"}, + {0x228a, L"subsetneq"}, + {0x2acb, L"subsetneqq"}, + {0x2abf, L"subsetplus"}, + {0x2ac7, L"subsim"}, + {0x2ad5, L"subsub"}, + {0x2ad3, L"subsup"}, + {0x227b, L"succ"}, + {0x2ab8, L"succapprox"}, + {0x227d, L"succcurlyeq"}, + {0x2ab0, L"succeq"}, + {0x2ab4, L"succeqq"}, + {0x2aba, L"succnapprox"}, + {0x2ab2, L"succneq"}, + {0x2ab6, L"succneqq"}, + {0x22e9, L"succnsim"}, + {0x227f, L"succsim"}, + {0x2211, L"sum"}, + {0x23b3, L"sumbottom"}, + {0x2a0b, L"sumint"}, + {0x23b2, L"sumtop"}, + {0x263c, L"sun"}, + {0x2ad8, L"supdsub"}, + {0x2ac4, L"supedot"}, + {0x27c9, L"suphsol"}, + {0x2ad7, L"suphsub"}, + {0x297b, L"suplarr"}, + {0x2ac2, L"supmult"}, + {0x207f, L"supn"}, + {0x2283, L"supset"}, + {0x2aca, L"supsetapprox"}, + {0x27c4, L"supsetcirc"}, + {0x2abe, L"supsetdot"}, + {0x2287, L"supseteq"}, + {0x2ac6, L"supseteqq"}, + {0x228b, L"supsetneq"}, + {0x2acc, L"supsetneqq"}, + {0x2ac0, L"supsetplus"}, + {0x2ac8, L"supsim"}, + {0x2ad4, L"supsub"}, + {0x2ad6, L"supsup"}, + {0x221a, L"surd"}, + {0x2199, L"swarrow"}, + {0x2afe, L"talloblong"}, + {0x2316, L"target"}, + {0x3c4, L"tau"}, + {0x2649, L"taurus"}, + {0x1d8d, L"testhookx"}, + {0x2051, L"textAsterisks"}, + {0x2ca, L"textacute"}, + {0x2d6, L"textadvanced"}, + {0x2bf, L"textain"}, + {0xb4, L"textasciiacute"}, + {0x5e, L"textasciicircum"}, + {0xa8, L"textasciidieresis"}, + {0x60, L"textasciigrave"}, + {0xaf, L"textasciimacron"}, + {0x7e, L"textasciitilde"}, + {0x204e, L"textasterisklow"}, + {0x2036, L"textbackdprime"}, + {0x2035, L"textbackprime"}, + {0x2037, L"textbacktrprime"}, + {0x25f, L"textbardotlessj"}, + {0x284, L"textbardotlessjvar"}, + {0x2a1, L"textbarglotstop"}, + {0x268, L"textbari"}, + {0x19a, L"textbarl"}, + {0x275, L"textbaro"}, + {0x2a2, L"textbarrevglotstop"}, + {0x289, L"textbaru"}, + {0x26c, L"textbeltl"}, + {0x1ba, L"textbenttailyogh"}, + {0x2d8, L"textbreve"}, + {0xa6, L"textbrokenbar"}, + {0x2022, L"textbullet"}, + {0x298, L"textbullseye"}, + {0xa2, L"textcent"}, + {0x2117, L"textcircledP"}, + {0x29a, L"textcloseepsilon"}, + {0x277, L"textcloseomega"}, + {0x25e, L"textcloserevepsilon"}, + {0xa9, L"textcopyright"}, + {0x180, L"textcrb"}, + {0x127, L"textcrh"}, + {0x1be, L"textcrinvglotstop"}, + {0x19b, L"textcrlambda"}, + {0x1bb, L"textcrtwo"}, + {0x255, L"textctc"}, + {0x221, L"textctd"}, + {0x286, L"textctesh"}, + {0x29d, L"textctj"}, + {0x234, L"textctl"}, + {0x235, L"textctn"}, + {0x236, L"textctt"}, + {0x293, L"textctyogh"}, + {0x291, L"textctz"}, + {0xa4, L"textcurrency"}, + {0x2a5, L"textdctzlig"}, + {0xb0, L"textdegree"}, + {0x2052, L"textdiscount"}, + {0x24, L"textdollar"}, + {0x2d9, L"textdotaccent"}, + {0x237, L"textdotlessj"}, + {0x2dd, L"textdoubleacute"}, + {0x1c2, L"textdoublebarpipe"}, + {0x1c1, L"textdoublepipe"}, + {0x2033, L"textdprime"}, + {0x2c5, L"textdptr"}, + {0x2a4, L"textdyoghlig"}, + {0x2a3, L"textdzlig"}, + {0x25b, L"textepsilon"}, + {0x283, L"textesh"}, + {0x212e, L"textestimated"}, + {0x1c3, L"textexclam"}, + {0xa1, L"textexclamdown"}, + {0x27e, L"textfishhookr"}, + {0x192, L"textflorin"}, + {0x20a3, L"textfranc"}, + {0x263, L"textgamma"}, + {0x294, L"textglotstop"}, + {0x2cb, L"textgrave"}, + {0x2d1, L"texthalflength"}, + {0x2be, L"texthamza"}, + {0xa727, L"texthen"}, + {0xa727, L"textheng"}, + {0x1d8a, L"texthooks"}, + {0x1d8e, L"texthookz"}, + {0x253, L"texthtb"}, + {0x188, L"texthtc"}, + {0x257, L"texthtd"}, + {0x260, L"texthtg"}, + {0x266, L"texthth"}, + {0x267, L"texththeng"}, + {0x199, L"texthtk"}, + {0x1a5, L"texthtp"}, + {0x2a0, L"texthtq"}, + {0x29b, L"texthtscg"}, + {0x1ad, L"texthtt"}, + {0x195, L"texthvlig"}, + {0x2010, L"texthyphen"}, + {0x296, L"textinvglotstop"}, + {0x281, L"textinvscr"}, + {0x269, L"textiota"}, + {0x2d0, L"textlengthmark"}, + {0x2d3, L"textlhalfring"}, + {0x1d81, L"textlhookd"}, + {0x1d84, L"textlhookk"}, + {0x1d85, L"textlhookl"}, + {0x1ab, L"textlhookt"}, + {0x27f, L"textlhti"}, + {0x20a4, L"textlira"}, + {0x27c, L"textlonglegr"}, + {0x2ae, L"textlongy"}, + {0x2af, L"textlongy"}, + {0x1aa, L"textlooptoprevesh"}, + {0x2cf, L"textlowacute"}, + {0x2d5, L"textlowered"}, + {0x2ce, L"textlowgrave"}, + {0x2cd, L"textlowmacron"}, + {0x2c2, L"textlptr"}, + {0x271, L"textltailm"}, + {0x272, L"textltailn"}, + {0x26b, L"textltilde"}, + {0x26e, L"textlyoghlig"}, + {0x2c9, L"textmacron"}, + {0xb5, L"textmu"}, + {0x2116, L"textnumero"}, + {0x2db, L"textogonek"}, + {0x2126, L"textohm"}, + {0xbd, L"textonehalf"}, + {0xbc, L"textonequarter"}, + {0xb9, L"textonesuperior"}, + {0x254, L"textopeno"}, + {0xaa, L"textordfeminine"}, + {0xba, L"textordmasculine"}, + {0x2df, L"textovercross"}, + {0x2125, L"textoz"}, + {0x2031, L"textpertenthousand"}, + {0x2030, L"textperthousand"}, + {0x20a7, L"textpesetas"}, + {0x278, L"textphi"}, + {0x1c0, L"textpipe"}, + {0x2032, L"textprime"}, + {0x2c8, L"textprimstress"}, + {0x2057, L"textqprime"}, + {0xbf, L"textquestiondown"}, + {0x22, L"textquotedbl"}, + {0x201c, L"textquotedblleft"}, + {0x201d, L"textquotedblright"}, + {0x2d4, L"textraised"}, + {0x2c0, L"textraiseglotstop"}, + {0x2c1, L"textraiserevglotstop"}, + {0x264, L"textramshorns"}, + {0x211e, L"textrecipe"}, + {0x203b, L"textreferencemark"}, + {0xae, L"textregistered"}, + {0x2d7, L"textretracted"}, + {0x258, L"textreve"}, + {0x25c, L"textrevepsilon"}, + {0x295, L"textrevglotstop"}, + {0x2d2, L"textrhalfring"}, + {0x25d, L"textrhookrevepsilon"}, + {0x25a, L"textrhookschwa"}, + {0x2de, L"textrhoticity"}, + {0x2da, L"textringaccent"}, + {0x2c3, L"textrptr"}, + {0x256, L"textrtaild"}, + {0x26d, L"textrtaill"}, + {0x273, L"textrtailn"}, + {0x27d, L"textrtailr"}, + {0x282, L"textrtails"}, + {0x288, L"textrtailt"}, + {0x290, L"textrtailz"}, + {0x1d00, L"textsca"}, + {0x299, L"textscb"}, + {0x1d07, L"textsce"}, + {0x262, L"textscg"}, + {0x29c, L"textsch"}, + {0x259, L"textschwa"}, + {0x26a, L"textsci"}, + {0x29f, L"textscl"}, + {0x274, L"textscn"}, + {0x276, L"textscoelig"}, + {0x280, L"textscr"}, + {0x251, L"textscripta"}, + {0x261, L"textscriptg"}, + {0x28b, L"textscriptv"}, + {0x1d1c, L"textscu"}, + {0x28f, L"textscy"}, + {0x2cc, L"textsecstress"}, + {0x204f, L"textsemicolonreversed"}, + {0x3a5, L"textsilon"}, + {0x2dc, L"textsmalltilde"}, + {0x297, L"textstretchcvar"}, + {0x77, L"textsubw"}, + {0x2b0, L"textsuph"}, + {0x2b1, L"textsuphth"}, + {0x2b6, L"textsupinvscr"}, + {0x2b2, L"textsupj"}, + {0x2b3, L"textsupr"}, + {0x2b4, L"textsupturnr"}, + {0x2b5, L"textsupturnrrtail"}, + {0x2b7, L"textsupw"}, + {0x2b8, L"textsupy"}, + {0x2a7, L"texttctctlig"}, + {0x2a8, L"texttctctlig"}, + {0xbe, L"textthreequarters"}, + {0xb3, L"textthreesuperior"}, + {0x2122, L"texttrademark"}, + {0x2034, L"texttrprime"}, + {0x2a6, L"texttslig"}, + {0x250, L"textturna"}, + {0x2bb, L"textturncomma"}, + {0x265, L"textturnh"}, + {0x29e, L"textturnk"}, + {0x27a, L"textturnlonglegr"}, + {0x26f, L"textturnm"}, + {0x270, L"textturnmrleg"}, + {0x279, L"textturnr"}, + {0x27b, L"textturnrrtail"}, + {0x252, L"textturnscripta"}, + {0x287, L"textturnt"}, + {0x28c, L"textturnv"}, + {0x28d, L"textturnw"}, + {0x28e, L"textturny"}, + {0xb2, L"texttwosuperior"}, + {0x28a, L"textupsilon"}, + {0x2c4, L"textuptr"}, + {0x285, L"textvibyi"}, + {0x2423, L"textvisiblespace"}, + {0x292, L"textyogh"}, + {0xfe, L"th"}, + {0x2234, L"therefore"}, + {0x29e7, L"thermod"}, + {0x3b8, L"theta"}, + {0x2248, L"thickapprox"}, + {0x223c, L"thicksim"}, + {0x27c0, L"threedangle"}, + {0x2af6, L"threedotcolon"}, + {0x2040, L"tieconcat"}, + {0x29dd, L"tieinfty"}, + {0xd7, L"times"}, + {0x2a31, L"timesbar"}, + {0x29ff, L"tminus"}, + {0x2192, L"to"}, + {0x2928, L"toea"}, + {0x2927, L"tona"}, + {0x2e5, L"tonebarextrahigh"}, + {0x2e9, L"tonebarextralow"}, + {0x2e6, L"tonebarhigh"}, + {0x2e8, L"tonebarlow"}, + {0x2e7, L"tonebarmid"}, + {0x22a4, L"top"}, + {0x2336, L"topbot"}, + {0x2af1, L"topcir"}, + {0x2ada, L"topfork"}, + {0x25e0, L"topsemicircle"}, + {0x2929, L"tosa"}, + {0x292a, L"towa"}, + {0x29fe, L"tplus"}, + {0x23e2, L"trapezium"}, + {0x25ec, L"trianglecdot"}, + {0x25bf, L"triangledown"}, + {0x26a0, L"triangleexclam"}, + {0x25c1, L"triangleleft"}, + {0x25ed, L"triangleleftblack"}, + {0x22b4, L"trianglelefteq"}, + {0x2a3a, L"triangleminus"}, + {0x29ca, L"triangleodot"}, + {0x2a39, L"triangleplus"}, + {0x225c, L"triangleq"}, + {0x25b7, L"triangleright"}, + {0x25ee, L"trianglerightblack"}, + {0x22b5, L"trianglerighteq"}, + {0x29cc, L"triangles"}, + {0x29cd, L"triangleserifs"}, + {0x2a3b, L"triangletimes"}, + {0x29cb, L"triangleubar"}, + {0x29fb, L"tripleplus"}, + {0x2034, L"trprime"}, + {0x29a2, L"turnangle"}, + {0x2129, L"turnediota"}, + {0x2319, L"turnednot"}, + {0x2a4b, L"twocaps"}, + {0x2a4a, L"twocups"}, + {0x21a1, L"twoheaddownarrow"}, + {0x219e, L"twoheadleftarrow"}, + {0x2b3b, L"twoheadleftarrowtail"}, + {0x2b37, L"twoheadleftdbkarrow"}, + {0x2b36, L"twoheadmapsfrom"}, + {0x2905, L"twoheadmapsto"}, + {0x21a0, L"twoheadrightarrow"}, + {0x2916, L"twoheadrightarrowtail"}, + {0x219f, L"twoheaduparrow"}, + {0x2949, L"twoheaduparrowcircle"}, + {0x2017, L"twolowline"}, + {0x266b, L"twonotes"}, + {0x2982, L"typecolon"}, + {0x23e1, L"ubrbrak"}, + {0x1b0, L"uhorn"}, + {0x25dc, L"ularc"}, + {0x25e4, L"ulblacktriangle"}, + {0x231c, L"ulcorner"}, + {0x230f, L"ulcrop"}, + {0x25f8, L"ultriangle"}, + {0x2a41, L"uminus"}, + {0x23df, L"underbrace"}, + {0x23b5, L"underbracket"}, + {0x23dd, L"underparen"}, + {0x22b4, L"unlhd"}, + {0x22b5, L"unrhd"}, + {0x214b, L"upand"}, + {0x2191, L"uparrow"}, + {0x2909, L"uparrowbarred"}, + {0x29bd, L"uparrowoncircle"}, + {0x21e2, L"updasharrow"}, + {0x2195, L"updownarrow"}, + {0x21a8, L"updownarrowbar"}, + {0x21c5, L"updownarrows"}, + {0x2951, L"updownharpoonleftleft"}, + {0x294d, L"updownharpoonleftright"}, + {0x294c, L"updownharpoonrightleft"}, + {0x294f, L"updownharpoonrightright"}, + {0x296e, L"updownharpoonsleftright"}, + {0x297e, L"upfishtail"}, + {0x21bf, L"upharpoonleft"}, + {0x2960, L"upharpoonleftbar"}, + {0x21be, L"upharpoonright"}, + {0x295c, L"upharpoonrightbar"}, + {0x2963, L"upharpoonsleftright"}, + {0x27d2, L"upin"}, + {0x2a1b, L"upint"}, + {0x228e, L"uplus"}, + {0x2934, L"uprightcurvearrow"}, + {0x2127, L"upsilon"}, + {0x21c8, L"upuparrows"}, + {0x21e7, L"upwhitearrow"}, + {0x25dd, L"urarc"}, + {0x25e5, L"urblacktriangle"}, + {0x231d, L"urcorner"}, + {0x230e, L"urcrop"}, + {0x25f9, L"urtriangle"}, + {0x2c7, L"v"}, + {0x2ae8, L"vBar"}, + {0x2ae9, L"vBarv"}, + {0x22a8, L"vDash"}, + {0x2ae2, L"vDdash"}, + {0x3f4, L"varTheta"}, + {0x2ae6, L"varVdash"}, + {0x2305, L"varbarwedge"}, + {0x3d0, L"varbeta"}, + {0x2667, L"varclubsuit"}, + {0x2666, L"vardiamondsuit"}, + {0x2306, L"vardoublebarwedge"}, + {0x3b5, L"varepsilon"}, + {0x2665, L"varheartsuit"}, + {0x2b21, L"varhexagon"}, + {0x2b22, L"varhexagonblack"}, + {0x232c, L"varhexagonlrbonds"}, + {0x2208, L"varin"}, + {0x22f6, L"varisinobar"}, + {0x22f3, L"varisins"}, + {0x3f0, L"varkappa"}, + {0x22bf, L"varlrtriangle"}, + {0x220b, L"varni"}, + {0x22fd, L"varniobar"}, + {0x22fb, L"varnis"}, + {0x2205, L"varnothing"}, + {0x2232, L"varointclockwise"}, + {0x3c6, L"varphi"}, + {0x3d6, L"varpi"}, + {0x221d, L"varpropto"}, + {0x3f1, L"varrho"}, + {0x23d0, L"varrowextender"}, + {0x3c2, L"varsigma"}, + {0x2664, L"varspadesuit"}, + {0x2736, L"varstar"}, + {0x3d1, L"vartheta"}, + {0x25b5, L"vartriangle"}, + {0x22b2, L"vartriangleleft"}, + {0x22b3, L"vartriangleright"}, + {0x2a61, L"varveebar"}, + {0x23aa, L"vbraceextender"}, + {0x29d0, L"vbrtri"}, + {0x22a2, L"vdash"}, + {0x22ee, L"vdots"}, + {0x2a2f, L"vectimes"}, + {0x2228, L"vee"}, + {0x22bb, L"veebar"}, + {0x27c7, L"veedot"}, + {0x2a63, L"veedoublebar"}, + {0x225a, L"veeeq"}, + {0x2a5b, L"veemidvert"}, + {0x2a52, L"veeodot"}, + {0x2a56, L"veeonvee"}, + {0x2a59, L"veeonwedge"}, + {0x7c, L"vert"}, + {0x2317, L"viewdata"}, + {0x27dd, L"vlongdash"}, + {0x25af, L"vrectangle"}, + {0x25ae, L"vrectangleblack"}, + {0x2b1d, L"vysmlblksquare"}, + {0x2b1e, L"vysmlwhtsquare"}, + {0x299a, L"vzigzag"}, + {0x231a, L"watchicon"}, + {0x2227, L"wedge"}, + {0x2a5f, L"wedgebar"}, + {0x27d1, L"wedgedot"}, + {0x2a60, L"wedgedoublebar"}, + {0x2a5a, L"wedgemidvert"}, + {0x2a51, L"wedgeodot"}, + {0x2a55, L"wedgeonwedge"}, + {0x2259, L"wedgeq"}, + {0x21ea, L"whitearrowupfrombar"}, + {0x27c1, L"whiteinwhitetriangle"}, + {0x25c5, L"whitepointerleft"}, + {0x25bb, L"whitepointerright"}, + {0x27e4, L"whitesquaretickleft"}, + {0x27e5, L"whitesquaretickright"}, + {0x2b2d, L"whthorzoval"}, + {0x2b2f, L"whtvertoval"}, + {0x29a6, L"wideangledown"}, + {0x29a7, L"wideangleup"}, + {0x2118, L"wp"}, + {0x2240, L"wr"}, + {0x29f9, L"xbsol"}, + {0x3be, L"xi"}, + {0x29f8, L"xsol"}, + {0xa5, L"yen"}, + {0x3b6, L"zeta"}, + {0x2a20, L"zpipe"}, +{0, L""}}; +//----------------------------------------------------------------------------- diff --git a/src/tex_table.cpp b/src/tex_table.cpp deleted file mode 100644 index e8297d9..0000000 --- a/src/tex_table.cpp +++ /dev/null @@ -1,1883 +0,0 @@ -/*************************************************************************** - * tex_table.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 "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"%"}, - {0x26, L"&"}, - {0xc5, L"AA"}, - {0xc6, L"AE"}, - {0x2370, L"APLboxquestion"}, - {0x2353, L"APLboxupcaret"}, - {0x2340, L"APLnotbackslash"}, - {0x233f, L"APLnotslash"}, - {0x391, L"Alpha"}, - {0x26, L"And"}, - {0x212b, L"Angstrom"}, - {0x2ae7, L"Barv"}, - {0x2102, L"BbbC"}, - {0x213e, L"BbbGamma"}, - {0x210d, L"BbbH"}, - {0x2115, L"BbbN"}, - {0x2119, L"BbbP"}, - {0x213f, L"BbbPi"}, - {0x211a, L"BbbQ"}, - {0x211d, L"BbbR"}, - {0x2124, L"BbbZ"}, - {0x213d, L"Bbbgamma"}, - {0x213c, L"Bbbpi"}, - {0x2140, L"Bbbsum"}, - {0x392, L"Beta"}, - {0x224e, L"Bumpeq"}, - {0x22d2, L"Cap"}, - {0x3a7, L"Chi"}, - {0x2237, L"Colon"}, - {0x2a74, L"Coloneq"}, - {0x22d3, L"Cup"}, - {0x27f1, L"DDownarrow"}, - {0xd0, L"DH"}, - {0x110, L"DJ"}, - {0x2ae5, L"DashV"}, - {0x27da, L"DashVDash"}, - {0x2ae4, L"Dashv"}, - {0x290b, L"Ddownarrow"}, - {0x394, L"Delta"}, - {0x3dc, L"Digamma"}, - {0x2251, L"Doteq"}, - {0x21d3, L"Downarrow"}, - {0x395, L"Epsilon"}, - {0x2263, L"Equiv"}, - {0x397, L"Eta"}, - {0x2107, L"Eulerconst"}, - {0x203c, L"Exclam"}, - {0x2132, L"Finv"}, - {0x2141, L"Game"}, - {0x393, L"Gamma"}, - {0x2aa2, L"Gt"}, - {0x26a5, L"Hermaphrodite"}, - {0x2111, L"Im"}, - {0x399, L"Iota"}, - {0x39a, L"Kappa"}, - {0x3de, L"Koppa"}, - {0x141, L"L"}, - {0x2b45, L"LLeftarrow"}, - {0x39b, L"Lambda"}, - {0x27ec, L"Lbrbrak"}, - {0x21b2, L"Ldsh"}, - {0x21d0, L"Leftarrow"}, - {0x21d4, L"Leftrightarrow"}, - {0x21da, L"Lleftarrow"}, - {0x27f8, L"Longleftarrow"}, - {0x27fa, L"Longleftrightarrow"}, - {0x27fd, L"Longmapsfrom"}, - {0x27fe, L"Longmapsto"}, - {0x27f9, L"Longrightarrow"}, - {0x2995, L"Lparengtr"}, - {0x21b0, L"Lsh"}, - {0x2aa1, L"Lt"}, - {0x29da, L"Lvzigzag"}, - {0x2906, L"Mapsfrom"}, - {0x2907, L"Mapsto"}, - {0x39c, L"Mu"}, - {0x14a, L"NG"}, - {0x21d7, L"Nearrow"}, - {0x2aec, L"Not"}, - {0x39d, L"Nu"}, - {0x21d6, L"Nwarrow"}, - {0xd8, L"O"}, - {0x152, L"OE"}, - {0x1a0, L"Ohorn"}, - {0x3a9, L"Omega"}, - {0x39f, L"Omicron"}, - {0x2a37, L"Otimes"}, - {0xb6, L"P"}, - {0x3a6, L"Phi"}, - {0x3a0, L"Pi"}, - {0x210e, L"Planckconst"}, - {0x2abb, L"Prec"}, - {0x214a, L"PropertyLine"}, - {0x3a8, L"Psi"}, - {0x220e, L"QED"}, - {0x2047, L"Question"}, - {0x2b46, L"RRightarrow"}, - {0x27ed, L"Rbrbrak"}, - {0x21b3, L"Rdsh"}, - {0x211c, L"Re"}, - {0x3a1, L"Rho"}, - {0x21d2, L"Rightarrow"}, - {0x2996, L"Rparenless"}, - {0x21db, L"Rrightarrow"}, - {0x21b1, L"Rsh"}, - {0x29db, L"Rvzigzag"}, - {0xa7, L"S"}, - {0x2abc, L"Sc"}, - {0x21d8, L"Searrow"}, - {0x3a3, L"Sigma"}, - {0x2a4e, L"Sqcap"}, - {0x2a4f, L"Sqcup"}, - {0x3da, L"Stigma"}, - {0x22d0, L"Subset"}, - {0x22d1, L"Supset"}, - {0x21d9, L"Swarrow"}, - {0xde, L"TH"}, - {0x3a4, L"Tau"}, - {0x398, L"Theta"}, - {0x27f0, L"UUparrow"}, - {0x1af, L"Uhorn"}, - {0x21d1, L"Uparrow"}, - {0x21d5, L"Updownarrow"}, - {0x290a, L"Uuparrow"}, - {0x22ab, L"VDash"}, - {0x2aeb, L"Vbar"}, - {0x22a9, L"Vdash"}, - {0x2a54, L"Vee"}, - {0x2016, L"Vert"}, - {0x22aa, L"Vvdash"}, - {0x2980, L"Vvert"}, - {0x2a53, L"Wedge"}, - {0x2612, L"XBox"}, - {0x39e, L"Xi"}, - {0x2144, L"Yup"}, - {0x1b5, L"Zbar"}, - {0x396, L"Zeta"}, - {0x5e, L"^"}, - {0xe5, L"aa"}, - {0x223e, L"ac"}, - {0x23e6, L"accurrent"}, - {0x267e, L"acidfree"}, - {0x2940, L"acwcirclearrow"}, - {0x27f2, L"acwgapcirclearrow"}, - {0x2939, L"acwleftarcarrow"}, - {0x21ba, L"acwopencirclearrow"}, - {0x293a, L"acwoverarcarrow"}, - {0x293b, L"acwundercurvearrow"}, - {0x22f0, L"adots"}, - {0xe6, L"ae"}, - {0x2135, L"aleph"}, - {0x3b1, L"alpha"}, -// {0x2210, L"amalg"}, - {0x2a3f, L"amalg"}, - {0x299f, L"angdnr"}, - {0x2220, L"angle"}, - {0x299e, L"angles"}, - {0x29a4, L"angleubar"}, - {0x2248, L"approx"}, - {0x224a, L"approxeq"}, - {0x2a70, L"approxeqq"}, - {0x224b, L"approxident"}, - {0x2258, L"arceq"}, - {0x2648, L"aries"}, - {0x22a6, L"assert"}, - {0x2217, L"ast"}, - {0x2a6e, L"asteq"}, - {0x2609, L"astrosun"}, - {0x224d, L"asymp"}, - {0x2a11, L"awint"}, - {0x2aed, L"bNot"}, - {0x224c, L"backcong"}, - {0x2036, L"backdprime"}, - {0x3f6, L"backepsilon"}, - {0x2035, L"backprime"}, - {0x223d, L"backsim"}, - {0x22cd, L"backsimeq"}, - {0x5c, L"backslash"}, - {0x2037, L"backtrprime"}, - {0x22ff, L"bagmember"}, - {0x2aea, L"barV"}, - {0x2a43, L"barcap"}, - {0x2a42, L"barcup"}, - {0x2961, L"bardownharpoonleft"}, - {0x295d, L"bardownharpoonright"}, - {0x21e4, L"barleftarrow"}, - {0x21b9, L"barleftarrowrightarrowbar"}, - {0x2956, L"barleftharpoondown"}, - {0x2952, L"barleftharpoonup"}, - {0x21b8, L"barovernorthwestarrow"}, - {0x2920, L"barrightarrowdiamond"}, - {0x295f, L"barrightharpoondown"}, - {0x295b, L"barrightharpoonup"}, - {0x2912, L"baruparrow"}, - {0x2958, L"barupharpoonleft"}, - {0x2954, L"barupharpoonright"}, - {0x22bd, L"barvee"}, - {0x22bc, L"barwedge"}, - {0x23b6, L"bbrktbrk"}, - {0x2550, L"bdHrule"}, - {0x2551, L"bdVrule"}, - {0x256c, L"bdbVbH"}, - {0x256b, L"bdbVbh"}, - {0x2563, L"bdbVlH"}, - {0x2562, L"bdbVlh"}, - {0x2560, L"bdbVrH"}, - {0x255f, L"bdbVrh"}, - {0x256a, L"bdbvbH"}, - {0x253c, L"bdbvbh"}, - {0x2561, L"bdbvlH"}, - {0x2524, L"bdbvlh"}, - {0x255e, L"bdbvrH"}, - {0x251c, L"bdbvrh"}, - {0x2566, L"bddVbH"}, - {0x2565, L"bddVbh"}, - {0x2557, L"bddVlH"}, - {0x2556, L"bddVlh"}, - {0x2554, L"bddVrH"}, - {0x2553, L"bddVrh"}, - {0x2564, L"bddvbH"}, - {0x252c, L"bddvbh"}, - {0x2555, L"bddvlH"}, - {0x2510, L"bddvlh"}, - {0x2552, L"bddvrH"}, - {0x250c, L"bddvrh"}, - {0x2500, L"bdhrule"}, - {0x2571, L"bdnesw"}, - {0x2572, L"bdnwse"}, - {0x2508, L"bdquadhdash"}, - {0x250a, L"bdquadvdash"}, - {0x2506, L"bdtriplevdash"}, - {0x2569, L"bduVbH"}, - {0x2568, L"bduVbh"}, - {0x255d, L"bduVlH"}, - {0x255c, L"bduVlh"}, - {0x255a, L"bduVrH"}, - {0x2559, L"bduVrh"}, - {0x2567, L"bduvbH"}, - {0x2534, L"bduvbh"}, - {0x255b, L"bduvlH"}, - {0x2518, L"bduvlh"}, - {0x2558, L"bduvrH"}, - {0x2514, L"bduvrh"}, - {0x2502, L"bdvrule"}, - {0x2235, L"because"}, - {0x23e3, L"benzenr"}, - {0x3b2, L"beta"}, - {0x2136, L"beth"}, - {0x226c, L"between"}, - {0x25bc, L"bigblacktriangledown"}, - {0x25b2, L"bigblacktriangleup"}, - {0x27d8, L"bigbot"}, - {0x22c2, L"bigcap"}, - {0x22c3, L"bigcup"}, - {0x2a57, L"bigslopedvee"}, - {0x2a58, L"bigslopedwedge"}, - {0x2605, L"bigstar"}, - {0x27d9, L"bigtop"}, - {0x25bd, L"bigtriangledown"}, - {0x25b3, L"bigtriangleup"}, - {0x22c1, L"bigvee"}, - {0x22c0, L"bigwedge"}, - {0x2606, L"bigwhitestar"}, - {0x29ed, L"blackcircledownarrow"}, - {0x2688, L"blackcircledrightdot"}, - {0x2791, L"blackcircledsanseight"}, - {0x278e, L"blackcircledsansfive"}, - {0x278d, L"blackcircledsansfour"}, - {0x2792, L"blackcircledsansnine"}, - {0x278a, L"blackcircledsansone"}, - {0x2790, L"blackcircledsansseven"}, - {0x278f, L"blackcircledsanssix"}, - {0x2793, L"blackcircledsansten"}, - {0x278c, L"blackcircledsansthree"}, - {0x278b, L"blackcircledsanstwo"}, - {0x2689, L"blackcircledtwodots"}, - {0x25d5, L"blackcircleulquadwhite"}, - {0x29ea, L"blackdiamonddownarrow"}, - {0x29d7, L"blackhourglass"}, - {0x25c8, L"blackinwhitediamond"}, - {0x25a3, L"blackinwhitesquare"}, - {0x25d6, L"blacklefthalfcircle"}, - {0x25c4, L"blackpointerleft"}, - {0x25ba, L"blackpointerright"}, - {0x25d7, L"blackrighthalfcircle"}, - {0x263b, L"blacksmiley"}, - {0x25b4, L"blacktriangle"}, - {0x25be, L"blacktriangledown"}, - {0x25c0, L"blacktriangleleft"}, - {0x25b6, L"blacktriangleright"}, - {0x2b2c, L"blkhorzoval"}, - {0x2b2e, L"blkvertoval"}, - {0x2588, L"blockfull"}, - {0x2592, L"blockhalfshaded"}, - {0x258c, L"blocklefthalf"}, - {0x2584, L"blocklowhalf"}, - {0x2591, L"blockqtrshaded"}, - {0x2590, L"blockrighthalf"}, - {0x2593, L"blockthreeqtrshaded"}, - {0x2580, L"blockuphalf"}, - {0x22a5, L"bot"}, - {0x25e1, L"botsemicircle"}, - {0x22c8, L"bowtie"}, - {0x25fb, L"box"}, - {0x29c6, L"boxast"}, - {0x25eb, L"boxbar"}, - {0x29c8, L"boxbox"}, - {0x29c5, L"boxbslash"}, - {0x29c7, L"boxcircle"}, - {0x29c4, L"boxdiag"}, - {0x22a1, L"boxdot"}, - {0x229f, L"boxminus"}, - {0x29c9, L"boxonbox"}, - {0x229e, L"boxplus"}, - {0x22a0, L"boxtimes"}, - {0x2b41, L"bsimilarleftarrow"}, - {0x2b47, L"bsimilarrightarrow"}, - {0x27c8, L"bsolhsub"}, - {0x2a32, L"btimes"}, - {0x2219, L"bullet"}, - {0x25ce, L"bullseye"}, - {0x224f, L"bumpeq"}, - {0x2aae, L"bumpeqq"}, - {0x212c, L"calB"}, - {0x2130, L"calE"}, - {0x2131, L"calF"}, - {0x210b, L"calH"}, - {0x2110, L"calI"}, - {0x2112, L"calL"}, - {0x2133, L"calM"}, - {0x211b, L"calR"}, - {0x2229, L"cap"}, - {0x2a40, L"capdot"}, - {0x2a44, L"capwedge"}, - {0x2038, L"caretinsert"}, - {0x23ce, L"carreturn"}, - {0x21b5, L"carriagereturn"}, - {0x293f, L"ccwundercurvearrow"}, - {0x22c5, L"cdot"}, - {0xb7, L"cdotp"}, - {0x22ef, L"cdots"}, - {0x2ba, L"cdprime"}, - {0x2713, L"checkmark"}, - {0x3c7, L"chi"}, - {0x29c3, L"cirE"}, - {0x27df, L"cirbot"}, - {0x2218, L"circ"}, - {0x2257, L"circeq"}, - {0x2a10, L"circfint"}, - {0x25d2, L"circlebottomhalfblack"}, - {0x24b6, L"circledA"}, - {0x24b7, L"circledB"}, - {0x24b8, L"circledC"}, - {0x24b9, L"circledD"}, - {0x24ba, L"circledE"}, - {0x24bb, L"circledF"}, - {0x24bc, L"circledG"}, - {0x24bd, L"circledH"}, - {0x24be, L"circledI"}, - {0x24bf, L"circledJ"}, - {0x24c0, L"circledK"}, - {0x24c1, L"circledL"}, - {0x24c2, L"circledM"}, - {0x24c3, L"circledN"}, - {0x24c4, L"circledO"}, - {0x24c5, L"circledP"}, - {0x24c6, L"circledQ"}, - {0x24c7, L"circledR"}, - {0x24c8, L"circledS"}, - {0x24c9, L"circledT"}, - {0x24ca, L"circledU"}, - {0x24cb, L"circledV"}, - {0x24cc, L"circledW"}, - {0x24cd, L"circledX"}, - {0x24ce, L"circledY"}, - {0x24cf, L"circledZ"}, - {0x24d0, L"circleda"}, - {0x229b, L"circledast"}, - {0x24d1, L"circledb"}, - {0x29bf, L"circledbullet"}, - {0x24d2, L"circledc"}, - {0x229a, L"circledcirc"}, - {0x24d3, L"circledd"}, - {0x229d, L"circleddash"}, - {0x24d4, L"circlede"}, - {0x2467, L"circledeight"}, - {0x229c, L"circledequal"}, - {0x24d5, L"circledf"}, - {0x2464, L"circledfive"}, - {0x2463, L"circledfour"}, - {0x24d6, L"circledg"}, - {0x24d7, L"circledh"}, - {0x24d8, L"circledi"}, - {0x24d9, L"circledj"}, - {0x24da, L"circledk"}, - {0x24db, L"circledl"}, - {0x24dc, L"circledm"}, - {0x24dd, L"circledn"}, - {0x2468, L"circlednine"}, - {0x24de, L"circledo"}, - {0x2460, L"circledone"}, - {0x29ec, L"circledownarrow"}, - {0x24df, L"circledp"}, - {0x29b7, L"circledparallel"}, - {0x24e0, L"circledq"}, - {0x24e1, L"circledr"}, - {0x2686, L"circledrightdot"}, - {0x24e2, L"circleds"}, - {0x2787, L"circledsanseight"}, - {0x2784, L"circledsansfive"}, - {0x2783, L"circledsansfour"}, - {0x2788, L"circledsansnine"}, - {0x2780, L"circledsansone"}, - {0x2786, L"circledsansseven"}, - {0x2785, L"circledsanssix"}, - {0x2789, L"circledsansten"}, - {0x2782, L"circledsansthree"}, - {0x2781, L"circledsanstwo"}, - {0x2466, L"circledseven"}, - {0x2465, L"circledsix"}, - {0x272a, L"circledstar"}, - {0x24e3, L"circledt"}, - {0x2462, L"circledthree"}, - {0x2461, L"circledtwo"}, - {0x2687, L"circledtwodots"}, - {0x24e4, L"circledu"}, - {0x24e5, L"circledv"}, - {0x29b6, L"circledvert"}, - {0x24e6, L"circledw"}, - {0x29be, L"circledwhitebullet"}, - {0x24e7, L"circledx"}, - {0x24e8, L"circledy"}, - {0x24e9, L"circledz"}, - {0x24ea, L"circledzero"}, - {0x29b5, L"circlehbar"}, - {0x25d0, L"circlelefthalfblack"}, - {0x25f5, L"circlellquad"}, - {0x25f6, L"circlelrquad"}, - {0x2b30, L"circleonleftarrow"}, - {0x21f4, L"circleonrightarrow"}, - {0x25d1, L"circlerighthalfblack"}, - {0x25d3, L"circletophalfblack"}, - {0x25f4, L"circleulquad"}, - {0x25f7, L"circleurquad"}, - {0x25d4, L"circleurquadblack"}, - {0x25cd, L"circlevertfill"}, - {0x2aef, L"cirmid"}, - {0x29c2, L"cirscir"}, - {0x2329, L"clangle"}, - {0x2a4d, L"closedvarcap"}, - {0x2a4c, L"closedvarcup"}, - {0x2a50, L"closedvarcupsmashprod"}, - {0x2050, L"closure"}, - {0x2318, L"cloverleaf"}, - {0x2663, L"clubsuit"}, - {0x3a, L"colon"}, - {0x2236, L"colon"}, - {0x2254, L"coloneq"}, - {0x2a29, L"commaminus"}, - {0x2201, L"complement"}, - {0x27e1, L"concavediamond"}, - {0x27e2, L"concavediamondtickleft"}, - {0x27e3, L"concavediamondtickright"}, - {0x2245, L"cong"}, - {0x2a6d, L"congdot"}, - {0x2332, L"conictaper"}, - {0x260c, L"conjunction"}, - {0x2210, L"coprod"}, - {0x2b9, L"cprime"}, - {0x232a, L"crangle"}, - {0x2acf, L"csub"}, - {0x2ad1, L"csube"}, - {0x2ad0, L"csup"}, - {0x2ad2, L"csupe"}, - {0x221b, L"cuberoot"}, - {0x222a, L"cup"}, - {0x228d, L"cupdot"}, - {0x228c, L"cupleftarrow"}, - {0x2a45, L"cupvee"}, - {0x22de, L"curlyeqprec"}, - {0x22df, L"curlyeqsucc"}, - {0x22ce, L"curlyvee"}, - {0x22cf, L"curlywedge"}, - {0x21b6, L"curvearrowleft"}, - {0x293d, L"curvearrowleftplus"}, - {0x21b7, L"curvearrowright"}, - {0x293c, L"curvearrowrightminus"}, - {0x2941, L"cwcirclearrow"}, - {0x27f3, L"cwgapcirclearrow"}, - {0x21bb, L"cwopencirclearrow"}, - {0x2938, L"cwrightarcarrow"}, - {0x293e, L"cwundercurvearrow"}, - {0x232d, L"cylcty"}, - {0x2020, L"dag"}, - {0x2020, L"dagger"}, - {0x2138, L"daleth"}, - {0x2621, L"danger"}, - {0x2ae3, L"dashV"}, - {0x27db, L"dashVdash"}, - {0x2239, L"dashcolon"}, - {0x296b, L"dashleftharpoondown"}, - {0x296d, L"dashrightharpoondown"}, - {0x22a3, L"dashv"}, - {0x290f, L"dbkarow"}, - {0x2021, L"ddag"}, - {0x2021, L"ddagger"}, - {0x22f1, L"ddots"}, - {0x2a77, L"ddotseq"}, - {0xb0, L"degree"}, - {0x3b4, L"delta"}, - {0xf0, L"dh"}, - {0x2300, L"diameter"}, - {0x25c7, L"diamond"}, - {0x2b19, L"diamondbotblack"}, - {0x27d0, L"diamondcdot"}, - {0x291d, L"diamondleftarrow"}, - {0x291f, L"diamondleftarrowbar"}, - {0x2b16, L"diamondleftblack"}, - {0x2b17, L"diamondrightblack"}, - {0x2662, L"diamondsuit"}, - {0x2b18, L"diamondtopblack"}, - {0x2680, L"dicei"}, - {0x2681, L"diceii"}, - {0x2682, L"diceiii"}, - {0x2683, L"diceiv"}, - {0x2684, L"dicev"}, - {0x2685, L"dicevi"}, - {0x3dd, L"digamma"}, - {0x273d, L"dingasterisk"}, - {0x2393, L"dircurrent"}, - {0x22f2, L"disin"}, - {0xf7, L"div"}, - {0x22c7, L"divideontimes"}, - {0x111, L"dj"}, - {0x230d, L"dlcrop"}, - {0x2250, L"doteq"}, - {0x2a67, L"dotequiv"}, - {0x2238, L"dotminus"}, - {0x2214, L"dotplus"}, - {0x2026, L"dots"}, - {0x2a6a, L"dotsim"}, - {0x223a, L"dotsminusdots"}, - {0x25cc, L"dottedcircle"}, - {0x2b1a, L"dottedsquare"}, - {0x2a30, L"dottimes"}, - {0x2a62, L"doublebarvee"}, - {0x2a5e, L"doublebarwedge"}, - {0x29fa, L"doubleplus"}, - {0x2193, L"downarrow"}, - {0x2913, L"downarrowbar"}, - {0x2908, L"downarrowbarred"}, - {0x21e3, L"downdasharrow"}, - {0x21ca, L"downdownarrows"}, - {0x297f, L"downfishtail"}, - {0x21c3, L"downharpoonleft"}, - {0x2959, L"downharpoonleftbar"}, - {0x21c2, L"downharpoonright"}, - {0x2955, L"downharpoonrightbar"}, - {0x2965, L"downharpoonsleftright"}, - {0x2935, L"downrightcurvedarrow"}, - {0x29e8, L"downtriangleleftblack"}, - {0x29e9, L"downtrianglerightblack"}, - {0x21f5, L"downuparrows"}, - {0x296f, L"downupharpoonsleftright"}, - {0x21e9, L"downwhitearrow"}, - {0x21af, L"downzigzagarrow"}, - {0x2033, L"dprime"}, - {0x279b, L"draftingarrow"}, - {0x2910, L"drbkarow"}, - {0x230c, L"drcrop"}, - {0x29f6, L"dsol"}, - {0x2a64, L"dsub"}, - {0x29df, L"dualmap"}, - {0x2641, L"earth"}, - {0x2a98, L"egsdot"}, - {0x266a, L"eighthnote"}, - {0x23e7, L"elinters"}, - {0x2113, L"ell"}, - {0x2a97, L"elsdot"}, - {0x2014, L"emdash"}, - {0x2205, L"emptyset"}, - {0x29b3, L"emptysetoarr"}, - {0x29b4, L"emptysetoarrl"}, - {0x29b1, L"emptysetobar"}, - {0x29b2, L"emptysetocirc"}, - {0x2013, L"endash"}, - {0x2025, L"enleadertwodots"}, - {0x2709, L"envelope"}, - {0x29e3, L"eparsl"}, - {0x3f5, L"epsilon"}, - {0x2256, L"eqcirc"}, - {0x2255, L"eqcolon"}, - {0x225d, L"eqdef"}, - {0x2a66, L"eqdot"}, - {0x2a75, L"eqeq"}, - {0x2a76, L"eqeqeq"}, - {0x22dd, L"eqgtr"}, - {0x22dc, L"eqless"}, - {0x2a9a, L"eqqgtr"}, - {0x2a99, L"eqqless"}, - {0x2a71, L"eqqplus"}, - {0x2a73, L"eqqsim"}, - {0x2a9c, L"eqqslantgtr"}, - {0x2a9b, L"eqqslantless"}, - {0x2242, L"eqsim"}, - {0x2a96, L"eqslantgtr"}, - {0x2a95, L"eqslantless"}, - {0x2b40, L"equalleftarrow"}, - {0x22d5, L"equalparallel"}, - {0x2971, L"equalrightarrow"}, - {0x2261, L"equiv"}, - {0x2a78, L"equivDD"}, - {0x2a68, L"equivVert"}, - {0x2a69, L"equivVvert"}, - {0x29e5, L"eqvparsl"}, - {0x29f3, L"errbarblackcircle"}, - {0x29f1, L"errbarblackdiamond"}, - {0x29ef, L"errbarblacksquare"}, - {0x29f2, L"errbarcircle"}, - {0x29f0, L"errbardiamond"}, - {0x29ee, L"errbarsquare"}, - {0x3b7, L"eta"}, - {0x20ac, L"euro"}, - {0x2203, L"exists"}, - {0x2252, L"fallingdotseq"}, - {0x29d3, L"fbowtie"}, - {0x2a3e, L"fcmp"}, - {0x292f, L"fdiagovnearrow"}, - {0x292c, L"fdiagovrdiag"}, - {0x2640, L"female"}, - {0x2012, L"figdash"}, - {0x2a0f, L"fint"}, - {0x25c9, L"fisheye"}, - {0x266d, L"flat"}, - {0x23e5, L"fltns"}, - {0x2200, L"forall"}, - {0x2adc, L"forks"}, - {0x2add, L"forksnot"}, - {0x2ad9, L"forkv"}, - {0x221c, L"fourthroot"}, - {0x2999, L"fourvdots"}, - {0x215d, L"fracfiveeighths"}, - {0x215a, L"fracfivesixths"}, - {0x2158, L"fracfourfifths"}, - {0x215b, L"fraconeeighth"}, - {0x2155, L"fraconefifth"}, - {0x2159, L"fraconesixth"}, - {0x2153, L"fraconethird"}, - {0x215e, L"fracseveneights"}, - {0x2044, L"fracslash"}, - {0x215c, L"fracthreeeighths"}, - {0x2157, L"fracthreefifths"}, - {0x2156, L"fractwofifths"}, - {0x2154, L"fractwothirds"}, - {0x212d, L"frakC"}, - {0x210c, L"frakH"}, - {0x2128, L"frakZ"}, - {0x2322, L"frown"}, - {0x2639, L"frownie"}, - {0x27d7, L"fullouterjoin"}, - {0x3b3, L"gamma"}, - {0x2265, L"ge"}, - {0x2265, L"geq"}, - {0x2267, L"geqq"}, - {0x2a7e, L"geqslant"}, - {0x2aa9, L"gescc"}, - {0x2a80, L"gesdot"}, - {0x2a82, L"gesdoto"}, - {0x2a84, L"gesdotol"}, - {0x2a94, L"gesles"}, - {0x2190, L"gets"}, - {0x226b, L"gg"}, - {0x22d9, L"ggg"}, - {0x2af8, L"gggnest"}, - {0x2137, L"gimel"}, - {0x2a92, L"glE"}, - {0x2aa5, L"gla"}, - {0x29e6, L"gleichstark"}, - {0x2aa4, L"glj"}, - {0x2a8a, L"gnapprox"}, - {0x2a88, L"gneq"}, - {0x2269, L"gneqq"}, - {0x22e7, L"gnsim"}, - {0x3e, L"greater"}, - {0x2a8e, L"gsime"}, - {0x2a90, L"gsiml"}, - {0x2aa7, L"gtcc"}, - {0x2a7a, L"gtcir"}, - {0x29a0, L"gtlpar"}, - {0x2a7c, L"gtquest"}, - {0x2a86, L"gtrapprox"}, - {0x2978, L"gtrarr"}, - {0x22d7, L"gtrdot"}, - {0x22db, L"gtreqless"}, - {0x2a8c, L"gtreqqless"}, - {0x2277, L"gtrless"}, - {0x2273, L"gtrsim"}, - {0xab, L"guillemotleft"}, - {0xbb, L"guillemotright"}, - {0x2039, L"guilsinglleft"}, - {0x203a, L"guilsinglright"}, - {0x23af, L"harrowextender"}, - {0x2a6f, L"hatapprox"}, - {0x210f, L"hbar"}, - {0x2661, L"heartsuit"}, - {0x22b9, L"hermitmatrix"}, - {0x2394, L"hexagon"}, - {0x2b23, L"hexagonblack"}, - {0x306e, L"hiraganano"}, - {0x2924, L"hknearrow"}, - {0x2923, L"hknwarrow"}, - {0x2925, L"hksearow"}, - {0x2926, L"hkswarow"}, - {0x21a9, L"hookleftarrow"}, - {0x21aa, L"hookrightarrow"}, - {0x2015, L"horizbar"}, - {0x29d6, L"hourglass"}, - {0x2302, L"house"}, - {0x25ad, L"hrectangle"}, - {0x25ac, L"hrectangleblack"}, - {0x210f, L"hslash"}, - {0x2043, L"hyphenbullet"}, - {0x3030, L"hzigzag"}, - {0x2a0c, L"iiiint"}, - {0x222d, L"iiint"}, - {0x29dc, L"iinfin"}, - {0x222c, L"iint"}, - {0x22b7, L"imageof"}, - {0x2208, L"in"}, - {0x2105, L"incare"}, - {0x2206, L"increment"}, - {0x221e, L"infty"}, - {0x222b, L"int"}, - {0x2a0e, L"intBar"}, - {0x2a0d, L"intbar"}, - {0x2321, L"intbottom"}, - {0x2a19, L"intcap"}, - {0x2231, L"intclockwise"}, - {0x2a1a, L"intcup"}, - {0x22ba, L"intercal"}, - {0x2af4, L"interleave"}, - {0x23ae, L"intextender"}, - {0x2a17, L"intlharhk"}, - {0x2a3c, L"intprod"}, - {0x2a3d, L"intprodr"}, - {0x2320, L"inttop"}, - {0x2a18, L"intx"}, - {0x25d8, L"inversebullet"}, - {0x25d9, L"inversewhitecircle"}, - {0x2310, L"invnot"}, - {0x25db, L"invwhitelowerhalfcircle"}, - {0x25da, L"invwhiteupperhalfcircle"}, - {0x3b9, L"iota"}, - {0x2e0, L"ipasupgamma"}, - {0x2e1, L"ipasupl"}, - {0x2e4, L"ipasuprerglotstpp"}, - {0x2e2, L"ipasups"}, - {0x2e3, L"ipasupx"}, - {0x2ed, L"ipaunaspirated"}, - {0x2ec, L"ipavoicing"}, - {0x22f9, L"isinE"}, - {0x22f5, L"isindot"}, - {0x22f7, L"isinobar"}, - {0x22f4, L"isins"}, - {0x22f8, L"isinvb"}, - {0x2145, L"itBbbD"}, - {0x2146, L"itBbbd"}, - {0x2147, L"itBbbe"}, - {0x2148, L"itBbbi"}, - {0x2149, L"itBbbj"}, - {0x2643, L"jupiter"}, - {0x3ba, L"kappa"}, - {0x223b, L"kernelcontraction"}, - {0x3df, L"koppa"}, - {0x142, L"l"}, - {0x27ea, L"lAngle"}, - {0x2983, L"lBrace"}, - {0x27e6, L"lBrack"}, - {0x2985, L"lParen"}, - {0x3bb, L"lambda"}, - {0x19b, L"lambdabar"}, - {0x27e8, L"langle"}, - {0x2991, L"langledot"}, - {0x29e0, L"laplac"}, - {0x2bd, L"lasp"}, - {0x2aab, L"lat"}, - {0x2aad, L"late"}, - {0x27c5, L"lbag"}, - {0x2997, L"lblkbrbrak"}, - {0x7b, L"lbrace"}, - {0x23a9, L"lbracelend"}, - {0x23a8, L"lbracemid"}, - {0x23a7, L"lbraceuend"}, - {0x5b, L"lbrack"}, - {0x23a2, L"lbrackextender"}, - {0x23a3, L"lbracklend"}, - {0x298f, L"lbracklltick"}, - {0x298b, L"lbrackubar"}, - {0x23a1, L"lbrackuend"}, - {0x298d, L"lbrackultick"}, - {0x2772, L"lbrbrak"}, - {0x2308, L"lceil"}, - {0x29fc, L"lcurvyangle"}, - {0x21e0, L"ldasharrhead"}, - {0x2264, L"le"}, - {0x219d, L"leadsto"}, - {0x2190, L"leftarrow"}, - {0x2b4a, L"leftarrowapprox"}, - {0x2b42, L"leftarrowbackapprox"}, - {0x2b4b, L"leftarrowbsimilar"}, - {0x2977, L"leftarrowless"}, - {0x2b32, L"leftarrowonoplus"}, - {0x2946, L"leftarrowplus"}, - {0x2943, L"leftarrowshortrightarrow"}, - {0x2973, L"leftarrowsimilar"}, - {0x297a, L"leftarrowsubset"}, - {0x21a2, L"leftarrowtail"}, - {0x21fd, L"leftarrowtriangle"}, - {0x2b3e, L"leftarrowx"}, - {0x290c, L"leftbkarrow"}, - {0x2b3f, L"leftcurvedarrow"}, - {0x21e0, L"leftdasharrow"}, - {0x21e1, L"leftdasharrowhead"}, - {0x290e, L"leftdbkarrow"}, - {0x291b, L"leftdbltail"}, - {0x2b38, L"leftdotarrow"}, - {0x2936, L"leftdowncurvedarrow"}, - {0x297c, L"leftfishtail"}, - {0x21bd, L"leftharpoondown"}, - {0x295e, L"leftharpoondownbar"}, - {0x2962, L"leftharpoonsupdown"}, - {0x21bc, L"leftharpoonup"}, - {0x295a, L"leftharpoonupbar"}, - {0x296a, L"leftharpoonupdash"}, - {0x21c7, L"leftleftarrows"}, - {0x263e, L"leftmoon"}, - {0x27d5, L"leftouterjoin"}, - {0x2194, L"leftrightarrow"}, - {0x2948, L"leftrightarrowcircle"}, - {0x21c6, L"leftrightarrows"}, - {0x21ff, L"leftrightarrowtriangle"}, - {0x2950, L"leftrightharpoondowndown"}, - {0x294b, L"leftrightharpoondownup"}, - {0x21cb, L"leftrightharpoons"}, - {0x2967, L"leftrightharpoonsdown"}, - {0x2966, L"leftrightharpoonsup"}, - {0x294a, L"leftrightharpoonupdown"}, - {0x294e, L"leftrightharpoonupup"}, - {0x21ad, L"leftrightsquigarrow"}, - {0x219c, L"leftsquigarrow"}, - {0x21dc, L"leftsquigarrow"}, - {0x2919, L"lefttail"}, - {0x2b31, L"leftthreearrows"}, - {0x22cb, L"leftthreetimes"}, - {0x21e6, L"leftwhitearrow"}, - {0x2264, L"leq"}, - {0x2266, L"leqq"}, - {0x2af9, L"leqqslant"}, - {0x2afa, L"leqqslant"}, - {0x2a7d, L"leqslant"}, - {0x2aa8, L"lescc"}, - {0x2a7f, L"lesdot"}, - {0x2a81, L"lesdoto"}, - {0x2a83, L"lesdotor"}, - {0x2a93, L"lesges"}, - {0x3c, L"less"}, - {0x2a85, L"lessapprox"}, - {0x22d6, L"lessdot"}, - {0x22da, L"lesseqgtr"}, - {0x2a8b, L"lesseqqgtr"}, - {0x2276, L"lessgtr"}, - {0x2272, L"lesssim"}, - {0x29d1, L"lfbowtie"}, - {0x230a, L"lfloor"}, - {0x29d4, L"lftimes"}, - {0x2a91, L"lgE"}, - {0x2b24, L"lgblkcircle"}, - {0x2b1b, L"lgblksquare"}, - {0x25ef, L"lgwhtcircle"}, - {0x2b1c, L"lgwhtsquare"}, - {0x22b2, L"lhd"}, - {0x21b4, L"linefeed"}, - {0x226a, L"ll"}, - {0x2989, L"llangle"}, - {0x25df, L"llarc"}, - {0x25e3, L"llblacktriangle"}, - {0x231e, L"llcorner"}, - {0x22d8, L"lll"}, - {0x2af7, L"lllnest"}, - {0x2987, L"llparenthesis"}, - {0x25fa, L"lltriangle"}, - {0x23b0, L"lmoustache"}, - {0x2a89, L"lnapprox"}, - {0x2a87, L"lneq"}, - {0x2268, L"lneqq"}, - {0x22e6, L"lnsim"}, - {0x27de, L"longdashv"}, - {0x27cc, L"longdivision"}, - {0x27f5, L"longleftarrow"}, - {0x27f7, L"longleftrightarrow"}, - {0x2b33, L"longleftsquigarrow"}, - {0x27fb, L"longmapsfrom"}, - {0x27fc, L"longmapsto"}, - {0x27f6, L"longrightarrow"}, - {0x27ff, L"longrightsquigarrow"}, - {0x21ab, L"looparrowleft"}, - {0x21ac, L"looparrowright"}, - {0x2a1c, L"lowint"}, - {0x25ca, L"lozenge"}, - {0x27e0, L"lozengeminus"}, - {0x239c, L"lparenextender"}, - {0x239d, L"lparenlend"}, - {0x2993, L"lparenless"}, - {0x239b, L"lparenuend"}, - {0x2018, L"lq"}, - {0x25de, L"lrarc"}, - {0x25e2, L"lrblacktriangle"}, - {0x231f, L"lrcorner"}, - {0x25ff, L"lrtriangle"}, - {0x29e1, L"lrtriangleeq"}, - {0x2a8d, L"lsime"}, - {0x2a8f, L"lsimg"}, - {0x2acd, L"lsqhook"}, - {0x2aa6, L"ltcc"}, - {0x2a79, L"ltcir"}, - {0x22c9, L"ltimes"}, - {0x2976, L"ltlarr"}, - {0x2a7b, L"ltquest"}, - {0x29cf, L"ltrivb"}, - {0x23b8, L"lvboxline"}, - {0x29d8, L"lvzigzag"}, - {0x2642, L"male"}, - {0x2720, L"maltese"}, - {0x21a7, L"mapsdown"}, - {0x21a4, L"mapsfrom"}, - {0x21a6, L"mapsto"}, - {0x21a5, L"mapsup"}, - {0x2b25, L"mdblkdiamond"}, - {0x2b27, L"mdblklozenge"}, - {0x26ab, L"mdblkrcl"}, - {0x25fc, L"mdblksquare"}, - {0x25cf, L"mdlgblkcircle"}, - {0x25c6, L"mdlgblkdiamond"}, - {0x29eb, L"mdlgblklozenge"}, - {0x25a0, L"mdlgblksquare"}, - {0x25cb, L"mdlgwhtcircle"}, - {0x25c7, L"mdlgwhtdiamond"}, - {0x25a1, L"mdlgwhtsquare"}, - {0x2981, L"mdsmblkcircle"}, - {0x25fe, L"mdsmblksquare"}, - {0x26ac, L"mdsmwhtcircl"}, - {0x25fd, L"mdsmwhtsquare"}, - {0x26aa, L"mdwhtcircl"}, - {0x2b26, L"mdwhtdiamond"}, - {0x2b28, L"mdwhtlozenge"}, - {0x25fb, L"mdwhtsquare"}, - {0x29af, L"measangledltosw"}, - {0x29ae, L"measangledrtose"}, - {0x29ab, L"measangleldtosw"}, - {0x29a9, L"measanglelutonw"}, - {0x29aa, L"measanglerdtose"}, - {0x29a8, L"measanglerutone"}, - {0x29ad, L"measangleultonw"}, - {0x29ac, L"measangleurtone"}, - {0x225e, L"measeq"}, - {0x2221, L"measuredangle"}, - {0x299b, L"measuredangleleft"}, - {0x22be, L"measuredrightangle"}, - {0x2b51, L"medblackstar"}, - {0x205f, L"medmathspace"}, - {0x2b50, L"medwhitestar"}, - {0x263f, L"mercury"}, - {0x2127, L"mho"}, - {0x2223, L"mid"}, - {0x2a5d, L"midbarvee"}, - {0x2a5c, L"midbarwedge"}, - {0x2af0, L"midcir"}, - {0x2212, L"minus"}, - {0x2a2a, L"minusdot"}, - {0x2a2b, L"minusfdots"}, - {0x2a2c, L"minusrdots"}, - {0x2adb, L"mlcp"}, - {0x22a7, L"models"}, - {0x2213, L"mp"}, - {0x3bc, L"mu"}, - {0x22b8, L"multimap"}, - {0x27dc, L"multimapinv"}, - {0x21df, L"nHdownarrow"}, - {0x21de, L"nHuparrow"}, - {0x21cd, L"nLeftarrow"}, - {0x21ce, L"nLeftrightarrow"}, - {0x21cf, L"nRightarrow"}, - {0x22af, L"nVDash"}, - {0x22ae, L"nVdash"}, - {0x21fa, L"nVleftarrow"}, - {0x2b3a, L"nVleftarrowtail"}, - {0x21fc, L"nVleftrightarrow"}, - {0x21fb, L"nVrightarrow"}, - {0x2915, L"nVrightarrowtail"}, - {0x2b35, L"nVtwoheadleftarrow"}, - {0x2b3d, L"nVtwoheadleftarrowtail"}, - {0x2901, L"nVtwoheadrightarrow"}, - {0x2918, L"nVtwoheadrightarrowtail"}, - {0x2207, L"nabla"}, - {0x2249, L"napprox"}, - {0x226d, L"nasymp"}, - {0x266e, L"natural"}, - {0x2247, L"ncong"}, - {0x2260, L"ne"}, - {0x2197, L"nearrow"}, - {0xac, L"neg"}, - {0x2931, L"neovnwarrow"}, - {0x292e, L"neovsearrow"}, - {0x2646, L"neptune"}, - {0x2260, L"neq"}, - {0x2262, L"nequiv"}, - {0x2922, L"neswarrow"}, - {0x26b2, L"neuter"}, - {0x2204, L"nexists"}, - {0x14b, L"ng"}, - {0x2271, L"ngeq"}, - {0x226f, L"ngtr"}, - {0x2279, L"ngtrless"}, - {0x2275, L"ngtrsim"}, - {0x2af5, L"nhVvert"}, - {0x2af2, L"nhpar"}, - {0x220b, L"ni"}, - {0x22fe, L"niobar"}, - {0x22fc, L"nis"}, - {0x22fa, L"nisd"}, - {0x219a, L"nleftarrow"}, - {0x21ae, L"nleftrightarrow"}, - {0x2270, L"nleq"}, - {0x226e, L"nless"}, - {0x2278, L"nlessgtr"}, - {0x2274, L"nlesssim"}, - {0x2224, L"nmid"}, - {0x220c, L"nni"}, - {0x2011, L"nobreakhyphen"}, - {0x2209, L"notin"}, - {0x2226, L"nparallel"}, - {0x2a14, L"npolint"}, - {0x2280, L"nprec"}, - {0x22e0, L"npreccurlyeq"}, - {0x219b, L"nrightarrow"}, - {0x2241, L"nsim"}, - {0x2244, L"nsime"}, - {0x22e2, L"nsqsubseteq"}, - {0x22e3, L"nsqsupseteq"}, - {0x2284, L"nsubset"}, - {0x2288, L"nsubseteq"}, - {0x2281, L"nsucc"}, - {0x22e1, L"nsucccurlyeq"}, - {0x2285, L"nsupset"}, - {0x2289, L"nsupseteq"}, - {0x22ea, L"ntriangleleft"}, - {0x22ec, L"ntrianglelefteq"}, - {0x22eb, L"ntriangleright"}, - {0x22ed, L"ntrianglerighteq"}, - {0x3bd, L"nu"}, - {0x22ad, L"nvDash"}, - {0x2902, L"nvLeftarrow"}, - {0x2904, L"nvLeftrightarrow"}, - {0x2903, L"nvRightarrow"}, - {0x22ac, L"nvdash"}, - {0x29de, L"nvinfty"}, - {0x21f7, L"nvleftarrow"}, - {0x2b39, L"nvleftarrowtail"}, - {0x21f9, L"nvleftrightarrow"}, - {0x21f8, L"nvrightarrow"}, - {0x2914, L"nvrightarrowtail"}, - {0x2b34, L"nvtwoheadleftarrow"}, - {0x2b3c, L"nvtwoheadleftarrowtail"}, - {0x2900, L"nvtwoheadrightarrow"}, - {0x2917, L"nvtwoheadrightarrowtail"}, - {0x2196, L"nwarrow"}, - {0x2932, L"nwovnearrow"}, - {0x2921, L"nwsearrow"}, - {0xf8, L"o"}, - {0x233d, L"obar"}, - {0x29ba, L"obot"}, - {0x23e0, L"obrbrak"}, - {0x29b8, L"obslash"}, - {0x2a38, L"odiv"}, - {0x2299, L"odot"}, - {0x29bc, L"odotslashdot"}, - {0x153, L"oe"}, - {0x29c1, L"ogreaterthan"}, - {0x1a1, L"ohorn"}, - {0x2230, L"oiiint"}, - {0x222f, L"oiint"}, - {0x222e, L"oint"}, - {0x2233, L"ointctrclockwise"}, - {0x29bb, L"olcross"}, - {0x3d8, L"oldKoppa"}, - {0x3d9, L"oldkoppa"}, - {0x29c0, L"olessthan"}, - {0x3c9, L"omega"}, - {0x3bf, L"omicron"}, - {0x2296, L"ominus"}, - {0x29b9, L"operp"}, - {0x2295, L"oplus"}, - {0x2a2d, L"opluslhrim"}, - {0x2a2e, L"oplusrhrim"}, - {0x22b6, L"origof"}, - {0x2298, L"oslash"}, - {0x2297, L"otimes"}, - {0x2a36, L"otimeshat"}, - {0x2a34, L"otimeslhrim"}, - {0x2a35, L"otimesrhrim"}, - {0x23de, L"overbrace"}, - {0x23b4, L"overbracket"}, - {0x203e, L"overline"}, - {0x23dc, L"overparen"}, - {0x220b, L"owns"}, - {0x2225, L"parallel"}, - {0x25b1, L"parallelogram"}, - {0x25b0, L"parallelogramblack"}, - {0x2af3, L"parsim"}, - {0x2202, L"partial"}, - {0x2aa3, L"partialmeetcontraction"}, - {0x2b20, L"pentagon"}, - {0x2b1f, L"pentagonblack"}, - {0x27c2, L"perp"}, - {0x2ae1, L"perps"}, - {0x3d5, L"phi"}, - {0x260e, L"phone"}, - {0x3c0, L"pi"}, - {0x22d4, L"pitchfork"}, - {0x2a25, L"plusdot"}, - {0x2a72, L"pluseqq"}, - {0x2a23, L"plushat"}, - {0x2a26, L"plussim"}, - {0x2a27, L"plussubtwo"}, - {0x2a28, L"plustrif"}, - {0x2647, L"pluto"}, - {0xb1, L"pm"}, - {0x2a15, L"pointnt"}, - {0x3012, L"postalmark"}, - {0x227a, L"prec"}, - {0x2ab7, L"precapprox"}, - {0x227c, L"preccurlyeq"}, - {0x2aaf, L"preceq"}, - {0x2ab3, L"preceqq"}, - {0x2ab9, L"precnapprox"}, - {0x2ab1, L"precneq"}, - {0x2ab5, L"precneqq"}, - {0x22e8, L"precnsim"}, - {0x227e, L"precsim"}, - {0x2032, L"prime"}, - {0x220f, L"prod"}, - {0x232e, L"profalar"}, - {0x2312, L"profline"}, - {0x2313, L"profsurf"}, - {0x221d, L"propto"}, - {0x22b0, L"prurel"}, - {0x3c8, L"psi"}, - {0x27d3, L"pullback"}, - {0x27d4, L"pushout"}, - {0x2057, L"qprime"}, - {0x2669, L"quarternote"}, - {0x225f, L"questeq"}, - {0x201e, L"quotdblbase"}, - {0x201f, L"quotdblright"}, - {0x201a, L"quotsinglbase"}, - {0x201b, L"quotsinglright"}, - {0x27eb, L"rAngle"}, - {0x2984, L"rBrace"}, - {0x27e7, L"rBrack"}, - {0x2986, L"rParen"}, - {0x27e9, L"rangle"}, - {0x2992, L"rangledot"}, - {0x237c, L"rangledownzigzagarrow"}, - {0x2bc, L"rasp"}, - {0x27c6, L"rbag"}, - {0x2998, L"rblkbrbrak"}, - {0x7d, L"rbrace"}, - {0x23ad, L"rbracelend"}, - {0x23ac, L"rbracemid"}, - {0x23ab, L"rbraceuend"}, - {0x5d, L"rbrack"}, - {0x23a5, L"rbrackextender"}, - {0x23a6, L"rbracklend"}, - {0x298e, L"rbracklrtick"}, - {0x298c, L"rbrackubar"}, - {0x23a4, L"rbrackuend"}, - {0x2990, L"rbrackurtick"}, - {0x2773, L"rbrbrak"}, - {0x2309, L"rceil"}, - {0x29fd, L"rcurvyangle"}, - {0x292b, L"rdiagovfdiag"}, - {0x2930, L"rdiagovsearrow"}, - {0x2315, L"recorder"}, - {0x29a3, L"revangle"}, - {0x29a5, L"revangleubar"}, - {0x29b0, L"revemptyset"}, - {0x2aee, L"revnmid"}, - {0x29d2, L"rfbowtie"}, - {0x230b, L"rfloor"}, - {0x29d5, L"rftimes"}, - {0x22b3, L"rhd"}, - {0x3c1, L"rho"}, - {0x2b4c, L"righarrowbsimilar"}, - {0x221f, L"rightangle"}, - {0x299d, L"rightanglemdot"}, - {0x299c, L"rightanglesqr"}, - {0x2192, L"rightarrow"}, - {0x2975, L"rightarrowapprox"}, - {0x2b48, L"rightarrowbackapprox"}, - {0x21e5, L"rightarrowbar"}, - {0x291e, L"rightarrowdiamond"}, - {0x2b43, L"rightarrowgtr"}, - {0x27f4, L"rightarrowonoplus"}, - {0x2945, L"rightarrowplus"}, - {0x2942, L"rightarrowshortleftarrow"}, - {0x2974, L"rightarrowsimilar"}, - {0x2b44, L"rightarrowsupset"}, - {0x21a3, L"rightarrowtail"}, - {0x21fe, L"rightarrowtriangle"}, - {0x2947, L"rightarrowx"}, - {0x290d, L"rightbkarrow"}, - {0x2933, L"rightcurvedarrow"}, - {0x21e2, L"rightdasharrow"}, - {0x291c, L"rightdbltail"}, - {0x2911, L"rightdotarrow"}, - {0x2937, L"rightdowncurvedarrow"}, - {0x297d, L"rightfishtail"}, - {0x21c1, L"rightharpoondown"}, - {0x2957, L"rightharpoondownbar"}, - {0x2964, L"rightharpoonsupdown"}, - {0x21c0, L"rightharpoonup"}, - {0x2953, L"rightharpoonupbar"}, - {0x296c, L"rightharpoonupdash"}, - {0x2970, L"rightimply"}, - {0x21c4, L"rightleftarrows"}, - {0x21cc, L"rightleftharpoons"}, - {0x2969, L"rightleftharpoonsdown"}, - {0x2968, L"rightleftharpoonsup"}, - {0x263d, L"rightmoon"}, - {0x27d6, L"rightouterjoin"}, - {0x2b54, L"rightpentagon"}, - {0x2b53, L"rightpentagonblack"}, - {0x21c9, L"rightrightarrows"}, - {0x219d, L"rightsquigarrow"}, - {0x21dd, L"rightsquigarrow"}, - {0x291a, L"righttail"}, - {0x21f6, L"rightthreearrows"}, - {0x22cc, L"rightthreetimes"}, - {0x21e8, L"rightwhitearrow"}, - {0x2a22, L"ringplus"}, - {0x2253, L"risingdotseq"}, - {0x23b1, L"rmoustache"}, - {0x239f, L"rparenextender"}, - {0x2994, L"rparengtr"}, - {0x23a0, L"rparenlend"}, - {0x239e, L"rparenuend"}, - {0x2a12, L"rppolint"}, - {0x2019, L"rq"}, - {0x298a, L"rrangle"}, - {0x2988, L"rrparenthesis"}, - {0x29f7, L"rsolbar"}, - {0x2ace, L"rsqhook"}, - {0x2a65, L"rsub"}, - {0x22ca, L"rtimes"}, - {0x29ce, L"rtriltri"}, - {0x29f4, L"ruledelayed"}, - {0x23b9, L"rvboxline"}, - {0x29d9, L"rvzigzag"}, - {0x3e1, L"sampi"}, - {0x2143, L"sansLmirrored"}, - {0x2142, L"sansLturned"}, - {0x2644, L"saturn"}, - {0x2702, L"scissors"}, - {0x2a13, L"scpolint"}, - {0x212c, L"scrB"}, - {0x2130, L"scrE"}, - {0x2131, L"scrF"}, - {0x210b, L"scrH"}, - {0x2110, L"scrI"}, - {0x2112, L"scrL"}, - {0x2133, L"scrM"}, - {0x211b, L"scrR"}, - {0x212f, L"scre"}, - {0x210a, L"scrg"}, - {0x2134, L"scro"}, - {0x22b1, L"scurel"}, - {0x2198, L"searrow"}, - {0x292d, L"seovnearrow"}, - {0x2216, L"setminus"}, - {0x29f5, L"setminus"}, - {0x266f, L"sharp"}, - {0x2adf, L"shortdowntack"}, - {0x2190, L"shortleftarrow"}, - {0x2ade, L"shortlefttack"}, - {0x2192, L"shortrightarrow"}, - {0x2944, L"shortrightarrowleftarrow"}, - {0x2ae0, L"shortuptack"}, - {0x29e2, L"shuffle"}, - {0x3c3, L"sigma"}, - {0x3c5, L"silon"}, - {0x3d2, L"silon"}, - {0x223c, L"sim"}, - {0x2243, L"simeq"}, - {0x2aa0, L"simgE"}, - {0x2a9e, L"simgtr"}, - {0x2b49, L"similarleftarrow"}, - {0x2972, L"similarrightarrow"}, - {0x2a9f, L"simlE"}, - {0x2a9d, L"simless"}, - {0x2a6c, L"simminussim"}, - {0x2246, L"simneqq"}, - {0x2a24, L"simplus"}, - {0x2a6b, L"simrdots"}, - {0x223f, L"sinewave"}, - {0x2215, L"slash"}, - {0x25c2, L"smallblacktriangleleft"}, - {0x25b8, L"smallblacktriangleright"}, - {0x22c4, L"smalldiamond"}, - {0x220a, L"smallin"}, - {0x222b, L"smallint"}, - {0x220d, L"smallni"}, - {0x2216, L"smallsetminus"}, - {0x25c3, L"smalltriangleleft"}, - {0x25b9, L"smalltriangleright"}, - {0x2a33, L"smashtimes"}, - {0x2b29, L"smblkdiamond"}, - {0x2b2a, L"smblklozenge"}, - {0x25aa, L"smblksquare"}, - {0x29e4, L"smeparsl"}, - {0x2323, L"smile"}, - {0x263a, L"smiley"}, - {0x2aaa, L"smt"}, - {0x2aac, L"smte"}, - {0x2b52, L"smwhitestar"}, - {0x25e6, L"smwhtcircle"}, - {0x2b2b, L"smwhtlozenge"}, - {0x25ab, L"smwhtsquare"}, - {0x2660, L"spadesuit"}, - {0x2222, L"sphericalangle"}, - {0x29a1, L"sphericalangleup"}, - {0x2293, L"sqcap"}, - {0x2294, L"sqcup"}, - {0x2a16, L"sqint"}, - {0x2311, L"sqlozenge"}, - {0x800221a, L"sqrt"}, - {0x800221b, L"sqrt3"}, - {0x800221c, L"sqrt4"}, - {0x23b7, L"sqrtbottom"}, - {0x228f, L"sqsubset"}, - {0x2291, L"sqsubseteq"}, - {0x22e4, L"sqsubsetneq"}, - {0x2290, L"sqsupset"}, - {0x2292, L"sqsupseteq"}, - {0x22e5, L"sqsupsetneq"}, - {0x25a9, L"squarecrossfill"}, - {0x25a9, L"squaregrayfill"}, - {0x25a4, L"squarehfill"}, - {0x25a6, L"squarehvfill"}, - {0x25e7, L"squareleftblack"}, - {0x25e8, L"squareleftblack"}, - {0x2b15, L"squarellblack"}, - {0x25f1, L"squarellquad"}, - {0x25ea, L"squarelrblack"}, - {0x25f2, L"squarelrquad"}, - {0x25a8, L"squareneswfill"}, - {0x25a7, L"squarenwsefill"}, - {0x25e9, L"squareulblack"}, - {0x25f0, L"squareulquad"}, - {0x2b14, L"squareurblack"}, - {0x25f3, L"squareurquad"}, - {0x25a5, L"squarevfill"}, - {0x25a2, L"squoval"}, - {0xdf, L"ss"}, - {0x22c6, L"star"}, - {0x225b, L"stareq"}, - {0xa3, L"sterling"}, - {0x3db, L"stigma"}, - {0x23e4, L"strns"}, - {0x2ac3, L"subedot"}, - {0x2ac1, L"submult"}, - {0x2979, L"subrarr"}, - {0x2282, L"subset"}, - {0x2ac9, L"subsetapprox"}, - {0x27c3, L"subsetcirc"}, - {0x2abd, L"subsetdot"}, - {0x2286, L"subseteq"}, - {0x2ac5, L"subseteqq"}, - {0x228a, L"subsetneq"}, - {0x2acb, L"subsetneqq"}, - {0x2abf, L"subsetplus"}, - {0x2ac7, L"subsim"}, - {0x2ad5, L"subsub"}, - {0x2ad3, L"subsup"}, - {0x227b, L"succ"}, - {0x2ab8, L"succapprox"}, - {0x227d, L"succcurlyeq"}, - {0x2ab0, L"succeq"}, - {0x2ab4, L"succeqq"}, - {0x2aba, L"succnapprox"}, - {0x2ab2, L"succneq"}, - {0x2ab6, L"succneqq"}, - {0x22e9, L"succnsim"}, - {0x227f, L"succsim"}, - {0x2211, L"sum"}, - {0x23b3, L"sumbottom"}, - {0x2a0b, L"sumint"}, - {0x23b2, L"sumtop"}, - {0x263c, L"sun"}, - {0x2ad8, L"supdsub"}, - {0x2ac4, L"supedot"}, - {0x27c9, L"suphsol"}, - {0x2ad7, L"suphsub"}, - {0x297b, L"suplarr"}, - {0x2ac2, L"supmult"}, - {0x207f, L"supn"}, - {0x2283, L"supset"}, - {0x2aca, L"supsetapprox"}, - {0x27c4, L"supsetcirc"}, - {0x2abe, L"supsetdot"}, - {0x2287, L"supseteq"}, - {0x2ac6, L"supseteqq"}, - {0x228b, L"supsetneq"}, - {0x2acc, L"supsetneqq"}, - {0x2ac0, L"supsetplus"}, - {0x2ac8, L"supsim"}, - {0x2ad4, L"supsub"}, - {0x2ad6, L"supsup"}, - {0x221a, L"surd"}, - {0x2199, L"swarrow"}, - {0x2afe, L"talloblong"}, - {0x2316, L"target"}, - {0x3c4, L"tau"}, - {0x2649, L"taurus"}, - {0x1d8d, L"testhookx"}, - {0x2051, L"textAsterisks"}, - {0x2ca, L"textacute"}, - {0x2d6, L"textadvanced"}, - {0x2bf, L"textain"}, - {0xb4, L"textasciiacute"}, - {0x5e, L"textasciicircum"}, - {0xa8, L"textasciidieresis"}, - {0x60, L"textasciigrave"}, - {0xaf, L"textasciimacron"}, - {0x7e, L"textasciitilde"}, - {0x204e, L"textasterisklow"}, - {0x2036, L"textbackdprime"}, - {0x2035, L"textbackprime"}, - {0x2037, L"textbacktrprime"}, - {0x25f, L"textbardotlessj"}, - {0x284, L"textbardotlessjvar"}, - {0x2a1, L"textbarglotstop"}, - {0x268, L"textbari"}, - {0x19a, L"textbarl"}, - {0x275, L"textbaro"}, - {0x2a2, L"textbarrevglotstop"}, - {0x289, L"textbaru"}, - {0x26c, L"textbeltl"}, - {0x1ba, L"textbenttailyogh"}, - {0x2d8, L"textbreve"}, - {0xa6, L"textbrokenbar"}, - {0x2022, L"textbullet"}, - {0x298, L"textbullseye"}, - {0xa2, L"textcent"}, - {0x2117, L"textcircledP"}, - {0x29a, L"textcloseepsilon"}, - {0x277, L"textcloseomega"}, - {0x25e, L"textcloserevepsilon"}, - {0xa9, L"textcopyright"}, - {0x180, L"textcrb"}, - {0x127, L"textcrh"}, - {0x1be, L"textcrinvglotstop"}, - {0x19b, L"textcrlambda"}, - {0x1bb, L"textcrtwo"}, - {0x255, L"textctc"}, - {0x221, L"textctd"}, - {0x286, L"textctesh"}, - {0x29d, L"textctj"}, - {0x234, L"textctl"}, - {0x235, L"textctn"}, - {0x236, L"textctt"}, - {0x293, L"textctyogh"}, - {0x291, L"textctz"}, - {0xa4, L"textcurrency"}, - {0x2a5, L"textdctzlig"}, - {0xb0, L"textdegree"}, - {0x2052, L"textdiscount"}, - {0x24, L"textdollar"}, - {0x2d9, L"textdotaccent"}, - {0x237, L"textdotlessj"}, - {0x2dd, L"textdoubleacute"}, - {0x1c2, L"textdoublebarpipe"}, - {0x1c1, L"textdoublepipe"}, - {0x2033, L"textdprime"}, - {0x2c5, L"textdptr"}, - {0x2a4, L"textdyoghlig"}, - {0x2a3, L"textdzlig"}, - {0x25b, L"textepsilon"}, - {0x283, L"textesh"}, - {0x212e, L"textestimated"}, - {0x1c3, L"textexclam"}, - {0xa1, L"textexclamdown"}, - {0x27e, L"textfishhookr"}, - {0x192, L"textflorin"}, - {0x20a3, L"textfranc"}, - {0x263, L"textgamma"}, - {0x294, L"textglotstop"}, - {0x2cb, L"textgrave"}, - {0x2d1, L"texthalflength"}, - {0x2be, L"texthamza"}, - {0xa727, L"texthen"}, - {0xa727, L"textheng"}, - {0x1d8a, L"texthooks"}, - {0x1d8e, L"texthookz"}, - {0x253, L"texthtb"}, - {0x188, L"texthtc"}, - {0x257, L"texthtd"}, - {0x260, L"texthtg"}, - {0x266, L"texthth"}, - {0x267, L"texththeng"}, - {0x199, L"texthtk"}, - {0x1a5, L"texthtp"}, - {0x2a0, L"texthtq"}, - {0x29b, L"texthtscg"}, - {0x1ad, L"texthtt"}, - {0x195, L"texthvlig"}, - {0x2010, L"texthyphen"}, - {0x296, L"textinvglotstop"}, - {0x281, L"textinvscr"}, - {0x269, L"textiota"}, - {0x2d0, L"textlengthmark"}, - {0x2d3, L"textlhalfring"}, - {0x1d81, L"textlhookd"}, - {0x1d84, L"textlhookk"}, - {0x1d85, L"textlhookl"}, - {0x1ab, L"textlhookt"}, - {0x27f, L"textlhti"}, - {0x20a4, L"textlira"}, - {0x27c, L"textlonglegr"}, - {0x2ae, L"textlongy"}, - {0x2af, L"textlongy"}, - {0x1aa, L"textlooptoprevesh"}, - {0x2cf, L"textlowacute"}, - {0x2d5, L"textlowered"}, - {0x2ce, L"textlowgrave"}, - {0x2cd, L"textlowmacron"}, - {0x2c2, L"textlptr"}, - {0x271, L"textltailm"}, - {0x272, L"textltailn"}, - {0x26b, L"textltilde"}, - {0x26e, L"textlyoghlig"}, - {0x2c9, L"textmacron"}, - {0xb5, L"textmu"}, - {0x2116, L"textnumero"}, - {0x2db, L"textogonek"}, - {0x2126, L"textohm"}, - {0xbd, L"textonehalf"}, - {0xbc, L"textonequarter"}, - {0xb9, L"textonesuperior"}, - {0x254, L"textopeno"}, - {0xaa, L"textordfeminine"}, - {0xba, L"textordmasculine"}, - {0x2df, L"textovercross"}, - {0x2125, L"textoz"}, - {0x2031, L"textpertenthousand"}, - {0x2030, L"textperthousand"}, - {0x20a7, L"textpesetas"}, - {0x278, L"textphi"}, - {0x1c0, L"textpipe"}, - {0x2032, L"textprime"}, - {0x2c8, L"textprimstress"}, - {0x2057, L"textqprime"}, - {0xbf, L"textquestiondown"}, - {0x22, L"textquotedbl"}, - {0x201c, L"textquotedblleft"}, - {0x201d, L"textquotedblright"}, - {0x2d4, L"textraised"}, - {0x2c0, L"textraiseglotstop"}, - {0x2c1, L"textraiserevglotstop"}, - {0x264, L"textramshorns"}, - {0x211e, L"textrecipe"}, - {0x203b, L"textreferencemark"}, - {0xae, L"textregistered"}, - {0x2d7, L"textretracted"}, - {0x258, L"textreve"}, - {0x25c, L"textrevepsilon"}, - {0x295, L"textrevglotstop"}, - {0x2d2, L"textrhalfring"}, - {0x25d, L"textrhookrevepsilon"}, - {0x25a, L"textrhookschwa"}, - {0x2de, L"textrhoticity"}, - {0x2da, L"textringaccent"}, - {0x2c3, L"textrptr"}, - {0x256, L"textrtaild"}, - {0x26d, L"textrtaill"}, - {0x273, L"textrtailn"}, - {0x27d, L"textrtailr"}, - {0x282, L"textrtails"}, - {0x288, L"textrtailt"}, - {0x290, L"textrtailz"}, - {0x1d00, L"textsca"}, - {0x299, L"textscb"}, - {0x1d07, L"textsce"}, - {0x262, L"textscg"}, - {0x29c, L"textsch"}, - {0x259, L"textschwa"}, - {0x26a, L"textsci"}, - {0x29f, L"textscl"}, - {0x274, L"textscn"}, - {0x276, L"textscoelig"}, - {0x280, L"textscr"}, - {0x251, L"textscripta"}, - {0x261, L"textscriptg"}, - {0x28b, L"textscriptv"}, - {0x1d1c, L"textscu"}, - {0x28f, L"textscy"}, - {0x2cc, L"textsecstress"}, - {0x204f, L"textsemicolonreversed"}, - {0x3a5, L"textsilon"}, - {0x2dc, L"textsmalltilde"}, - {0x297, L"textstretchcvar"}, - {0x77, L"textsubw"}, - {0x2b0, L"textsuph"}, - {0x2b1, L"textsuphth"}, - {0x2b6, L"textsupinvscr"}, - {0x2b2, L"textsupj"}, - {0x2b3, L"textsupr"}, - {0x2b4, L"textsupturnr"}, - {0x2b5, L"textsupturnrrtail"}, - {0x2b7, L"textsupw"}, - {0x2b8, L"textsupy"}, - {0x2a7, L"texttctctlig"}, - {0x2a8, L"texttctctlig"}, - {0xbe, L"textthreequarters"}, - {0xb3, L"textthreesuperior"}, - {0x2122, L"texttrademark"}, - {0x2034, L"texttrprime"}, - {0x2a6, L"texttslig"}, - {0x250, L"textturna"}, - {0x2bb, L"textturncomma"}, - {0x265, L"textturnh"}, - {0x29e, L"textturnk"}, - {0x27a, L"textturnlonglegr"}, - {0x26f, L"textturnm"}, - {0x270, L"textturnmrleg"}, - {0x279, L"textturnr"}, - {0x27b, L"textturnrrtail"}, - {0x252, L"textturnscripta"}, - {0x287, L"textturnt"}, - {0x28c, L"textturnv"}, - {0x28d, L"textturnw"}, - {0x28e, L"textturny"}, - {0xb2, L"texttwosuperior"}, - {0x28a, L"textupsilon"}, - {0x2c4, L"textuptr"}, - {0x285, L"textvibyi"}, - {0x2423, L"textvisiblespace"}, - {0x292, L"textyogh"}, - {0xfe, L"th"}, - {0x2234, L"therefore"}, - {0x29e7, L"thermod"}, - {0x3b8, L"theta"}, - {0x2248, L"thickapprox"}, - {0x223c, L"thicksim"}, - {0x27c0, L"threedangle"}, - {0x2af6, L"threedotcolon"}, - {0x2040, L"tieconcat"}, - {0x29dd, L"tieinfty"}, - {0xd7, L"times"}, - {0x2a31, L"timesbar"}, - {0x29ff, L"tminus"}, - {0x2192, L"to"}, - {0x2928, L"toea"}, - {0x2927, L"tona"}, - {0x2e5, L"tonebarextrahigh"}, - {0x2e9, L"tonebarextralow"}, - {0x2e6, L"tonebarhigh"}, - {0x2e8, L"tonebarlow"}, - {0x2e7, L"tonebarmid"}, - {0x22a4, L"top"}, - {0x2336, L"topbot"}, - {0x2af1, L"topcir"}, - {0x2ada, L"topfork"}, - {0x25e0, L"topsemicircle"}, - {0x2929, L"tosa"}, - {0x292a, L"towa"}, - {0x29fe, L"tplus"}, - {0x23e2, L"trapezium"}, - {0x25ec, L"trianglecdot"}, - {0x25bf, L"triangledown"}, - {0x26a0, L"triangleexclam"}, - {0x25c1, L"triangleleft"}, - {0x25ed, L"triangleleftblack"}, - {0x22b4, L"trianglelefteq"}, - {0x2a3a, L"triangleminus"}, - {0x29ca, L"triangleodot"}, - {0x2a39, L"triangleplus"}, - {0x225c, L"triangleq"}, - {0x25b7, L"triangleright"}, - {0x25ee, L"trianglerightblack"}, - {0x22b5, L"trianglerighteq"}, - {0x29cc, L"triangles"}, - {0x29cd, L"triangleserifs"}, - {0x2a3b, L"triangletimes"}, - {0x29cb, L"triangleubar"}, - {0x29fb, L"tripleplus"}, - {0x2034, L"trprime"}, - {0x29a2, L"turnangle"}, - {0x2129, L"turnediota"}, - {0x2319, L"turnednot"}, - {0x2a4b, L"twocaps"}, - {0x2a4a, L"twocups"}, - {0x21a1, L"twoheaddownarrow"}, - {0x219e, L"twoheadleftarrow"}, - {0x2b3b, L"twoheadleftarrowtail"}, - {0x2b37, L"twoheadleftdbkarrow"}, - {0x2b36, L"twoheadmapsfrom"}, - {0x2905, L"twoheadmapsto"}, - {0x21a0, L"twoheadrightarrow"}, - {0x2916, L"twoheadrightarrowtail"}, - {0x219f, L"twoheaduparrow"}, - {0x2949, L"twoheaduparrowcircle"}, - {0x2017, L"twolowline"}, - {0x266b, L"twonotes"}, - {0x2982, L"typecolon"}, - {0x23e1, L"ubrbrak"}, - {0x1b0, L"uhorn"}, - {0x25dc, L"ularc"}, - {0x25e4, L"ulblacktriangle"}, - {0x231c, L"ulcorner"}, - {0x230f, L"ulcrop"}, - {0x25f8, L"ultriangle"}, - {0x2a41, L"uminus"}, - {0x23df, L"underbrace"}, - {0x23b5, L"underbracket"}, - {0x23dd, L"underparen"}, - {0x22b4, L"unlhd"}, - {0x22b5, L"unrhd"}, - {0x214b, L"upand"}, - {0x2191, L"uparrow"}, - {0x2909, L"uparrowbarred"}, - {0x29bd, L"uparrowoncircle"}, - {0x21e2, L"updasharrow"}, - {0x2195, L"updownarrow"}, - {0x21a8, L"updownarrowbar"}, - {0x21c5, L"updownarrows"}, - {0x2951, L"updownharpoonleftleft"}, - {0x294d, L"updownharpoonleftright"}, - {0x294c, L"updownharpoonrightleft"}, - {0x294f, L"updownharpoonrightright"}, - {0x296e, L"updownharpoonsleftright"}, - {0x297e, L"upfishtail"}, - {0x21bf, L"upharpoonleft"}, - {0x2960, L"upharpoonleftbar"}, - {0x21be, L"upharpoonright"}, - {0x295c, L"upharpoonrightbar"}, - {0x2963, L"upharpoonsleftright"}, - {0x27d2, L"upin"}, - {0x2a1b, L"upint"}, - {0x228e, L"uplus"}, - {0x2934, L"uprightcurvearrow"}, - {0x21c8, L"upuparrows"}, - {0x21e7, L"upwhitearrow"}, - {0x25dd, L"urarc"}, - {0x25e5, L"urblacktriangle"}, - {0x231d, L"urcorner"}, - {0x230e, L"urcrop"}, - {0x25f9, L"urtriangle"}, - {0x2c7, L"v"}, - {0x2ae8, L"vBar"}, - {0x2ae9, L"vBarv"}, - {0x22a8, L"vDash"}, - {0x2ae2, L"vDdash"}, - {0x3f4, L"varTheta"}, - {0x2ae6, L"varVdash"}, - {0x2305, L"varbarwedge"}, - {0x3d0, L"varbeta"}, - {0x2667, L"varclubsuit"}, - {0x2666, L"vardiamondsuit"}, - {0x2306, L"vardoublebarwedge"}, - {0x3b5, L"varepsilon"}, - {0x2665, L"varheartsuit"}, - {0x2b21, L"varhexagon"}, - {0x2b22, L"varhexagonblack"}, - {0x232c, L"varhexagonlrbonds"}, - {0x2208, L"varin"}, - {0x22f6, L"varisinobar"}, - {0x22f3, L"varisins"}, - {0x3f0, L"varkappa"}, - {0x22bf, L"varlrtriangle"}, - {0x220b, L"varni"}, - {0x22fd, L"varniobar"}, - {0x22fb, L"varnis"}, - {0x2205, L"varnothing"}, - {0x2232, L"varointclockwise"}, - {0x3c6, L"varphi"}, - {0x3d6, L"varpi"}, - {0x221d, L"varpropto"}, - {0x3f1, L"varrho"}, - {0x23d0, L"varrowextender"}, - {0x3c2, L"varsigma"}, - {0x2664, L"varspadesuit"}, - {0x2736, L"varstar"}, - {0x3d1, L"vartheta"}, - {0x25b5, L"vartriangle"}, - {0x22b2, L"vartriangleleft"}, - {0x22b3, L"vartriangleright"}, - {0x2a61, L"varveebar"}, - {0x23aa, L"vbraceextender"}, - {0x29d0, L"vbrtri"}, - {0x22a2, L"vdash"}, - {0x22ee, L"vdots"}, - {0x2a2f, L"vectimes"}, - {0x2228, L"vee"}, - {0x22bb, L"veebar"}, - {0x27c7, L"veedot"}, - {0x2a63, L"veedoublebar"}, - {0x225a, L"veeeq"}, - {0x2a5b, L"veemidvert"}, - {0x2a52, L"veeodot"}, - {0x2a56, L"veeonvee"}, - {0x2a59, L"veeonwedge"}, - {0x7c, L"vert"}, - {0x2317, L"viewdata"}, - {0x27dd, L"vlongdash"}, - {0x25af, L"vrectangle"}, - {0x25ae, L"vrectangleblack"}, - {0x2b1d, L"vysmlblksquare"}, - {0x2b1e, L"vysmlwhtsquare"}, - {0x299a, L"vzigzag"}, - {0x231a, L"watchicon"}, - {0x2227, L"wedge"}, - {0x2a5f, L"wedgebar"}, - {0x27d1, L"wedgedot"}, - {0x2a60, L"wedgedoublebar"}, - {0x2a5a, L"wedgemidvert"}, - {0x2a51, L"wedgeodot"}, - {0x2a55, L"wedgeonwedge"}, - {0x2259, L"wedgeq"}, - {0x21ea, L"whitearrowupfrombar"}, - {0x27c1, L"whiteinwhitetriangle"}, - {0x25c5, L"whitepointerleft"}, - {0x25bb, L"whitepointerright"}, - {0x27e4, L"whitesquaretickleft"}, - {0x27e5, L"whitesquaretickright"}, - {0x2b2d, L"whthorzoval"}, - {0x2b2f, L"whtvertoval"}, - {0x29a6, L"wideangledown"}, - {0x29a7, L"wideangleup"}, - {0x2118, L"wp"}, - {0x2240, L"wr"}, - {0x29f9, L"xbsol"}, - {0x3be, L"xi"}, - {0x29f8, L"xsol"}, - {0xa5, L"yen"}, - {0x3b6, L"zeta"}, - {0x2a20, L"zpipe"}, -{0, L""}}; -//----------------------------------------------------------------------------- diff --git a/src/vect.cpp b/src/vect.cpp index 66034f2..9983da4 100644 --- a/src/vect.cpp +++ b/src/vect.cpp @@ -21,6 +21,7 @@ #include "mgl2/eval.h" #include "mgl2/data.h" #include "mgl2/base.h" +#define MGL_FLOW_ACC 0.05 // accuracy of loop detection //----------------------------------------------------------------------------- // // Traj series @@ -58,8 +59,8 @@ void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, long mx = jGetNy() ? j:0,my = jGetNy() ? j:0,mz = jGetNy() ? j:0; for(long i=0;iv(i,nx), y->v(i,ny), z->v(i,nz)); - p2 = mglPoint(ax->v(i,mx),ay->v(i,my),az->v(i,mz)); + p1.Set(x->v(i,nx), y->v(i,ny), z->v(i,nz)); + p2.Set(ax->v(i,mx),ay->v(i,my),az->v(i,mz)); mreal dd = p2.norm(); if(len==0) { @@ -131,8 +132,8 @@ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const cha #pragma omp for nowait collapse(3) reduction(+:ca) for(long k=0;kv(i,j,k),ay->v(i,j,k)); + d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x); + v.Set(ax->v(i,j,k),ay->v(i,j,k)); c1 = v.norm(); xm1 = xm1GetNz()>1) zVal = gr->Min.z+(gr->Max.z-gr->Min.z)*mreal(k)/(ax->GetNz()-1); for(long j=0;jv(i,j,k),ay->v(i,j,k)); + d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x, zVal); + v.Set(ax->v(i,j,k),ay->v(i,j,k)); mreal dd = v.norm(), c1, c2; v *= cm*(fix?(dd>dm ? 1./dd : 0) : xm); @@ -228,8 +229,8 @@ void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, #pragma omp for nowait collapse(3) reduction(+:ca) for(long k=0;kv(i,j,k),ay->v(i,j,k),az->v(i,j,k)); + d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x); + v.Set(ax->v(i,j,k),ay->v(i,j,k),az->v(i,j,k)); c1 = v.norm(); xm1 = xm1NeedStop()) break; for(long i=0;iv(i,j,k),ay->v(i,j,k),az->v(i,j,k)); + d.Set(GetX(x,i,j,k).x, GetY(y,i,j,k).x, GetZ(z,i,j,k).x); + v.Set(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); @@ -436,7 +437,7 @@ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, xx = s.x.a[i0]; yy = s.y.a[i0]; zz = s.z.a[i0]; p1 = idm ? 1./dd : 0) : xm); @@ -506,30 +507,71 @@ void MGL_NO_EXPORT flow(mglBase *gr, double zVal, double u, double v, const mglD mglPoint *pp = new mglPoint[n], dp; 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; - if(u<0 || v<0) { dt = -dt; u = -u; v = -v; s = -1;} + mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=2; + if(u<0 || v<0) { dt = -dt; u = -u; v = -v; s *= -1;} register long k=0,m; bool end = false; - do{ - 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); + if(nboth) do{ + mglPoint dif; + pp[k].x = x.Spline1(dif,u,0,0); f = ax.Spline1(u,v,0)/dif.x; + pp[k].y = y.Spline1(dif,v,0,0); g = ay.Spline1(u,v,0)/dif.x; pp[k].z = zVal; for(m=0;mGetC(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; + x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; + y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + 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; + x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; + y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + h = 1+hypot(f,g); ff[2]=f*dt/h; gg[2]=g*dt/h; + e = u+ff[2]; h = v+gg[2]; + x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; + y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + 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; + // condition of end + end = end || k>=n || u<0 || v<0 || u>1 || v>1; + } while(!end); + else do{ + mglPoint dif; + register mreal xu,xv,yu,yv,det,xx,yy; + pp[k].x = x.Spline1(dif,u,v,0); xu=dif.x; xv=dif.y; + pp[k].y = y.Spline1(dif,u,v,0); yu=dif.x; yv=dif.y; + xx = ax.Spline1(u,v,0); yy = ay.Spline1(u,v,0); + det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; + pp[k].z = zVal; + for(m=0;mGetC(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.Spline1(e,h,0); g = ay.Spline1(e,h,0); + x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; 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.Spline1(e,h,0); g = ay.Spline1(e,h,0); + x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; 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.Spline1(e,h,0); g = ay.Spline1(e,h,0); + x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; 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; @@ -696,34 +738,94 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl nn = (ax.nx > ax.ny ? ax.nx : ax.ny); nn = (nn > ax.nz ? nn : ax.nz); - mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=1,u1,v1,w1; + mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=2,u1,v1,w1; if(u<0 || v<0 || w<0) - { dt = -dt; u = -u; v = -v; w = -w; s = -1;} + { dt = -dt; u = -u; v = -v; w = -w; s *= -1;} register long k=0,m; bool end = false; - do{ - 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); + if(nboth) do{ + mglPoint dif; + pp[k].x = x.Spline1(dif,u,0,0); e = ax.Spline1(u,v,w)/dif.x; + pp[k].y = y.Spline1(dif,v,0,0); f = ay.Spline1(u,v,w)/dif.x; + pp[k].z = z.Spline1(dif,w,0,0); g = az.Spline1(u,v,w)/dif.x; + for(m=0;mGetC(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; + x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; + y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; + z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + 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; + x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; + y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; + z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + 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]; + x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; + y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; + z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + 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; + w += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6; + // condition of end + end = end || k>=n || u<0 || v<0 || u>1 || v>1 || w<0 || w>1; + } while(!end); + else do{ + mglPoint dif; + register mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz; + pp[k].x = x.Spline1(dif,u,v,w); xu=dif.x; xv=dif.y; xw=dif.z; + pp[k].y = y.Spline1(dif,u,v,w); yu=dif.x; yv=dif.y; yw=dif.z; + pp[k].z = z.Spline1(dif,u,v,w); zu=dif.x; zv=dif.y; zw=dif.z; + xx = ax.Spline1(u,v,w); yy = ay.Spline1(u,v,w); zz = az.Spline1(u,v,w); + det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; + e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; + f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; + g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det; for(m=0;mGetC(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.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); + x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); + y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); + z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; + e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; + f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; + g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det; + 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.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); + x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); + y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); + z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; + e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; + f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; + g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det; + 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.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); + x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); + y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); + z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; + e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; + f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; + g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det; + 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; @@ -740,8 +842,8 @@ void flow(mglBase *gr, double u, double v, double w, const mglData &x, const mgl 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); + q1.Set(l.y,-l.x,0); ll = mgl_norm(q1); + if(ll) q1 /= ll; else q1.Set(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); } @@ -977,18 +1079,18 @@ void MGL_NO_EXPORT flowr(mglBase *gr, double zVal, double u, double v, const mgl 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; - mreal ss = 4./mgl_ipow(gr->Max.c - gr->Min.c,2); - if(u<0 || v<0) { dt = -dt; u = -u; v = -v; s = -1;} + mreal dt = 0.5/(ax.nx > ax.ny ? ax.nx : ax.ny),e,f,g,ff[4],gg[4],h,s=2; + mreal ss = 16./mgl_ipow(gr->Max.c - gr->Min.c,2); + if(u<0 || v<0) { dt = -dt; u = -u; v = -v; s *= -1;} register long k=0,m; bool end = false; - do{ - 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); + if(nboth) do{ + mglPoint dif; + pp[k].x = x.Spline1(dif,u,0,0); f = ax.Spline1(u,v,0)/dif.x; + pp[k].y = y.Spline1(dif,v,0,0); g = ay.Spline1(u,v,0)/dif.x; 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 @@ -996,14 +1098,56 @@ 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.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; + x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; + y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + 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.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; + x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; + y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + 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.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; + x.Spline1(dif,e,0,0); f = ax.Spline1(e,h,0)/dif.x; + y.Spline1(dif,h,0,0); g = ay.Spline1(e,h,0)/dif.x; + 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; + // condition of end + end = end || k>=n || u<0 || v<0 || u>1 || v>1; + } while(!end); + else do{ + mglPoint dif; + register mreal xu,xv,yu,yv,det,xx,yy; + pp[k].x = x.Spline1(dif,u,v,0); xu=dif.x; xv=dif.y; + pp[k].y = y.Spline1(dif,u,v,0); yu=dif.x; yv=dif.y; + xx = ax.Spline1(u,v,0); yy = ay.Spline1(u,v,0); + det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; + 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 + 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; + x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; + 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; + x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; + h = 1+hypot(f,g); ff[2]=f*dt/h; gg[2]=g*dt/h; + e = u+ff[2]; h = v+gg[2]; + x.Spline1(dif,e,h,0); xu=dif.x; xv=dif.y; + y.Spline1(dif,e,h,0); yu=dif.x; yv=dif.y; + xx = ax.Spline1(e,h,0); yy = ay.Spline1(e,h,0); + det = xv*yu-xu*yv; f = (yy*xv-xx*yv)/det; g = (xx*yu-yy*xu)/det; + 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; // condition of end @@ -1125,20 +1269,63 @@ void flowr(mglBase *gr, double u, double v, double w, const mglData &x, const mg nn = (ax.nx > ax.ny ? ax.nx : ax.ny); nn = (nn > ax.nz ? nn : ax.nz); - mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=1,u1,v1,w1; - mreal ss = 4./mgl_ipow(gr->Max.c - gr->Min.c,2); + mreal dt = 0.2/nn, e,f,g,ee[4],ff[4],gg[4],h,s=2,u1,v1,w1; + mreal ss = 16./mgl_ipow(gr->Max.c - gr->Min.c,2); if(u<0 || v<0 || w<0) - { dt = -dt; u = -u; v = -v; w = -w; s = -1;} + { dt = -dt; u = -u; v = -v; w = -w; s *= -1;} register long k=0,m; bool end = false; - do{ - 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); + if(nboth) do{ + mglPoint dif; + pp[k].x = x.Spline1(dif,u,0,0); e = ax.Spline1(u,v,w)/dif.x; + pp[k].y = y.Spline1(dif,v,0,0); f = ay.Spline1(u,v,w)/dif.x; + pp[k].z = z.Spline1(dif,w,0,0); g = az.Spline1(u,v,w)/dif.x; + 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 + 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; + x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; + y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; + z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + 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; + x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; + y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; + z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + 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]; + x.Spline1(dif,u1,0,0); e = ax.Spline1(u1,v1,w1)/dif.x; + y.Spline1(dif,v1,0,0); f = ay.Spline1(u1,v1,w1)/dif.x; + z.Spline1(dif,w1,0,0); g = az.Spline1(u1,v1,w1)/dif.x; + 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; + w += gg[0]/6+gg[1]/3+gg[2]/3+gg[3]/6; + // condition of end + end = end || k>=n || u<0 || v<0 || u>1 || v>1 || w<0 || w>1; + } while(!end); + else do{ + mglPoint dif; + register mreal xu,xv,xw,yu,yv,yw,zv,zu,zw,det,xx,yy,zz; + pp[k].x = x.Spline1(dif,u,v,w); xu=dif.x; xv=dif.y; xw=dif.z; + pp[k].y = y.Spline1(dif,u,v,w); yu=dif.x; yv=dif.y; yw=dif.z; + pp[k].z = z.Spline1(dif,u,v,w); zu=dif.x; zv=dif.y; zw=dif.z; + xx = ax.Spline1(u,v,w); yy = ay.Spline1(u,v,w); zz = az.Spline1(u,v,w); + det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; + e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; + f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; + g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det; 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 @@ -1146,16 +1333,34 @@ 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.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); + x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); + y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); + z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; + e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; + f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; + g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det; + 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.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); + x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); + y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); + z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; + e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; + f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; + g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det; + 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.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); + x.Spline1(dif,u1,v1,w1); xu=dif.x; xv=dif.y; xw=dif.z; xx = ax.Spline1(u1,v1,w1); + y.Spline1(dif,u1,v1,w1); yu=dif.x; yv=dif.y; yw=dif.z; yy = ay.Spline1(u1,v1,w1); + z.Spline1(dif,u1,v1,w1); zu=dif.x; zv=dif.y; zw=dif.z; zz = az.Spline1(u1,v1,w1); + det = -xu*yv*zw+xv*yu*zw+xu*yw*zv-xw*yu*zv-xv*yw*zu+xw*yv*zu; + e = (-xv*yw*zz+xw*yv*zz+xv*yy*zw-xx*yv*zw-xw*yy*zv+xx*yw*zv)/det; + f = (xu*yw*zz-xw*yu*zz-xu*yy*zw+xx*yu*zw+xw*yy*zu-xx*yw*zu)/det; + g = (-xu*yv*zz+xv*yu*zz+xu*yy*zv-xx*yu*zv-xv*yy*zu+xx*yv*zu)/det; + 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; diff --git a/src/volume.cpp b/src/volume.cpp index c4bf96e..d36b11e 100644 --- a/src/volume.cpp +++ b/src/volume.cpp @@ -57,7 +57,7 @@ void MGL_EXPORT mgl_cloud_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const cha n /= tx; m /= ty; l /= tz; long *pos=new long[n*m*l]; gr->Reserve(n*m*l); - mglPoint q=mglPoint(NAN); + mglPoint q(NAN); for(long k=0;kNeedStop()) break; @@ -182,7 +182,7 @@ void MGL_EXPORT mgl_surf3_plot(HMGL gr, long n,long m,long *kx1,long *kx2,long * if(ni<3) continue; for(jj=0;jjGetNx(),m=a->GetNy(),l=a->GetNz(); - long *kx1,*kx2,*ky1,*ky2,*kz; - bool nboth = !mgl_isboth(x,y,z,a); + long n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); + 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,!nboth,x,y,z,a,0,"Surf3")) return; - - gr->SaveState(opt); - static int cgid=1; gr->StartGroup("Surf3",cgid++); - bool inv = (mglchr(sch,'-')); - long ss = gr->AddTexture(sch), pos; + long ss = gr->AddTexture(sch); - kx1 = new long[n*m]; kx2 = new long[n*m]; - ky1 = new long[n*m]; ky2 = new long[n*m]; - kz = new long[n*m]; - mreal c=gr->GetC(ss,val); + long *kx1 = new long[n*m], *kx2 = new long[n*m]; + long *ky1 = new long[n*m], *ky2 = new long[n*m]; + long *kz = new long[n*m]; std::vector kk; -// kk.reserve(n*m*l); + kk.reserve(n*m*l); - mglPoint p,q,u, p0; - 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); - for(j=0;jv(i,j,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)); + register long i1 = i+n*j; + mreal a0 = a->v(i,j,k); if(iv(i+1,j,k)); + mreal d = mgl_d(val,a0,a->v(i+1,j,k)); if(d>=0 && d<1) - { - 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(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); - } + { kx2[i1] = kk.size(); kk.push_back(mglPoint(i+d,j,k)); } } if(jv(i,j+1,k)); + mreal d = mgl_d(val,a0,a->v(i,j+1,k)); if(d>=0 && d<1) - { - 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(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); - } + { ky2[i1] = kk.size(); kk.push_back(mglPoint(i,j+d,k)); } } if(k>0) - { - d = mgl_d(val,a->v(i,j,k-1),a0); + { + mreal d = mgl_d(val,a->v(i,j,k-1),a0); if(d>=0 && d<1) - { - 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(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); - } + { kz[i1] = kk.size(); kk.push_back(mglPoint(i,j,k+d-1)); } } } + mreal cv=gr->GetC(ss,val); + if(b && c) for(size_t i=kk1;iAddPnt(nboth ? mglPoint(mgl_data_linear(x,u.x,0,0),mgl_data_linear(y,u.y,0,0),mgl_data_linear(z,u.z,0,0)) : + mglPoint(mgl_data_linear(x,u.x,u.y,u.z),mgl_data_linear(y,u.x,u.y,u.z),mgl_data_linear(z,u.x,u.y,u.z)), + gr->GetC(ss,mgl_data_linear(c,u.x,u.y,u.z)), + mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l), + gr->GetA(mgl_data_linear(b,u.x,u.y,u.z))); + } + else if(c) for(size_t i=kk1;iAddPnt(nboth ? mglPoint(mgl_data_linear(x,u.x,0,0),mgl_data_linear(y,u.y,0,0),mgl_data_linear(z,u.z,0,0)) : + mglPoint(mgl_data_linear(x,u.x,u.y,u.z),mgl_data_linear(y,u.x,u.y,u.z),mgl_data_linear(z,u.x,u.y,u.z)), + gr->GetC(ss,mgl_data_linear(c,u.x,u.y,u.z)), + mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l)); + } + else if(b) for(size_t i=kk1;iAddPnt(nboth ? mglPoint(mgl_data_linear(x,u.x,0,0),mgl_data_linear(y,u.y,0,0),mgl_data_linear(z,u.z,0,0)) : + mglPoint(mgl_data_linear(x,u.x,u.y,u.z),mgl_data_linear(y,u.x,u.y,u.z),mgl_data_linear(z,u.x,u.y,u.z)), + cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l), + gr->GetA(mgl_data_linear(b,u.x,u.y,u.z))); + } + else for(size_t i=kk1;iAddPnt(nboth ? mglPoint(mgl_data_linear(x,u.x,0,0),mgl_data_linear(y,u.y,0,0),mgl_data_linear(z,u.z,0,0)) : + mglPoint(mgl_data_linear(x,u.x,u.y,u.z),mgl_data_linear(y,u.x,u.y,u.z),mgl_data_linear(z,u.x,u.y,u.z)), + cv, mgl_find_norm(nboth, x,y,z,a, u, inv,n,m,l)); + } + if(k>0) mgl_surf3_plot(gr,n,m,kx1,kx2,ky1,ky2,kz,kk,wire); } - gr->EndGroup(); delete []kx1; delete []kx2; delete []ky1; - delete []ky2; delete []kz; + delete []ky2; delete []kz; gr->EndGroup(); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf3_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt) +{ + if(mgl_check_dim3(gr,mgl_isboth(x,y,z,a),x,y,z,a,0,"Surf3")) return; + gr->SaveState(opt); + static int cgid=1; gr->StartGroup("Surf3",cgid++); + mgl_surf3ca_gen(gr, val, x, y, z, a, 0, 0, sch); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_surf3_val(HMGL gr, double val, HCDT a, const char *sch, const char *opt) @@ -378,92 +386,10 @@ void MGL_EXPORT mgl_surf3_(uintptr_t *gr, uintptr_t *a, const char *sch, const c //----------------------------------------------------------------------------- void MGL_EXPORT mgl_surf3a_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt) { - long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); - long *kx1,*kx2,*ky1,*ky2,*kz; - 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,!nboth,x,y,z,a,b,"Surf3A")) return; - + if(mgl_check_dim3(gr,!mgl_isnboth(x,y,z,a),x,y,z,a,b,"Surf3A")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Surf3A",cgid++); - - bool inv = (mglchr(sch,'-')); - long ss = gr->AddTexture(sch), pos; - - kx1 = new long[n*m]; kx2 = new long[n*m]; - ky1 = new long[n*m]; ky2 = new long[n*m]; - kz = new long[n*m]; - mreal c=gr->GetC(ss,val),aa; - std::vector kk; - kk.reserve(n*m*l); - - mglPoint p,q,u, p0; - 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); - for(j=0;jv(i,j,k); b0 = b->v(i,j,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(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(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); - } - } - if(jv(i,j+1,k)); - if(d>=0 && d<1) - { - 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(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); - } - } - if(k>0) - { - d = mgl_d(val,a->v(i,j,k-1),a0); - if(d>=0 && d<1) - { - 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(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); - } - } - } - if(k>0) mgl_surf3_plot(gr,n,m,kx1,kx2,ky1,ky2,kz,kk,wire); - } - gr->EndGroup(); - delete []kx1; delete []kx2; delete []ky1; - delete []ky2; delete []kz; + mgl_surf3ca_gen(gr, val, x, y, z, a, 0, b, sch); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_surf3a_val(HMGL gr, double val, HCDT a, HCDT b, const char *sch, const char *opt) @@ -535,94 +461,12 @@ void MGL_EXPORT mgl_surf3a_(uintptr_t *gr, uintptr_t *a, uintptr_t *b, const cha // Surf3C series // //----------------------------------------------------------------------------- -void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt) +void MGL_EXPORT mgl_surf3c_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, const char *sch, const char *opt) { - long i,j,k,i1,n=a->GetNx(),m=a->GetNy(),l=a->GetNz(); - long *kx1,*kx2,*ky1,*ky2,*kz; - 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,!nboth,x,y,z,a,b,"Surf3C")) return; - + if(mgl_check_dim3(gr,!mgl_isnboth(x,y,z,a),x,y,z,a,c,"Surf3C")) return; gr->SaveState(opt); static int cgid=1; gr->StartGroup("Surf3C",cgid++); - - bool inv = (mglchr(sch,'-')); - long ss = gr->AddTexture(sch), pos; - - kx1 = new long[n*m]; kx2 = new long[n*m]; - ky1 = new long[n*m]; ky2 = new long[n*m]; - kz = new long[n*m]; - mreal c; - std::vector kk; - kk.reserve(n*m*l); - - mglPoint p,q,u, p0; - 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); - for(j=0;jv(i,j,k); b0 = b->v(i,j,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(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(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); - } - } - if(jv(i,j+1,k)); - if(d>=0 && d<1) - { - 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(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); - } - } - if(k>0) - { - d = mgl_d(val,a->v(i,j,k-1),a0); - if(d>=0 && d<1) - { - 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(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); - } - } - } - if(k>0) mgl_surf3_plot(gr,n,m,kx1,kx2,ky1,ky2,kz,kk,wire); - } - gr->EndGroup(); - delete []kx1; delete []kx2; delete []ky1; - delete []ky2; delete []kz; + mgl_surf3ca_gen(gr, val, x, y, z, a, c, 0, sch); } //----------------------------------------------------------------------------- void MGL_EXPORT mgl_surf3c_val(HMGL gr, double val, HCDT a, HCDT b, const char *sch, const char *opt) @@ -680,6 +524,72 @@ void MGL_EXPORT mgl_surf3c_(uintptr_t *gr, uintptr_t *a, uintptr_t *b, const cha mgl_surf3c(_GR_, _DA_(a), _DA_(b), s, o); delete []o; delete []s; } //----------------------------------------------------------------------------- // +// Surf3C series +// +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf3ca_xyz_val(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *sch, const char *opt) +{ + if(mgl_check_dim3(gr,!mgl_isnboth(x,y,z,a),x,y,z,a,c,"Surf3C") || mgl_check_dim3(gr,!mgl_isnboth(x,y,z,a),x,y,z,a,b,"Surf3C")) return; + gr->SaveState(opt); + static int cgid=1; gr->StartGroup("Surf3C",cgid++); + mgl_surf3ca_gen(gr, val, x, y, z, a, c, b, sch); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf3ca_val(HMGL gr, double val, HCDT a, HCDT c, HCDT b, const char *sch, const char *opt) +{ + gr->SaveState(opt); + 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); + mgl_surf3ca_xyz_val(gr,val,&x,&y,&z,a,c,b,sch,0); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf3ca_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *sch, const char *opt) +{ + mreal r = gr->SaveState(opt); + long num = mgl_isnan(r)?3:long(r+0.5); + for(long i=0;iMax.c + (gr->Min.c-gr->Max.c)*(i+1.)/(num+1); + mgl_surf3ca_xyz_val(gr,v,x,y,z,a,c,b,sch,0); + } + gr->LoadState(); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf3ca(HMGL gr, HCDT a, HCDT c, HCDT b, const char *sch, const char *opt) +{ + gr->SaveState(opt); + 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); + mgl_surf3ca_xyz(gr,&x,&y,&z,a,c,b,sch,0); +} +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf3ca_xyz_val_(uintptr_t *gr, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, 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_surf3ca_xyz_val(_GR_, *Val, _DA_(x), _DA_(y), _DA_(z), _DA_(a), _DA_(c), _DA_(b), s, o); + delete []o; delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf3ca_val_(uintptr_t *gr, mreal *Val, uintptr_t *a, uintptr_t *c, uintptr_t *b, 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_surf3ca_val(_GR_, *Val, _DA_(a), _DA_(c), _DA_(b), s, o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf3ca_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, 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_surf3ca_xyz(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), _DA_(c), _DA_(b), s, o); + delete []o; delete []s; } +//----------------------------------------------------------------------------- +void MGL_EXPORT mgl_surf3ca_(uintptr_t *gr, uintptr_t *a, uintptr_t *c, uintptr_t *b, 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_surf3ca(_GR_, _DA_(a), _DA_(c), _DA_(b), s, o); delete []o; delete []s; } +//----------------------------------------------------------------------------- +// // Beam series // //----------------------------------------------------------------------------- diff --git a/texinfo/CMakeLists.txt b/texinfo/CMakeLists.txt index a57e112..2b268ae 100644 --- a/texinfo/CMakeLists.txt +++ b/texinfo/CMakeLists.txt @@ -1,198 +1,200 @@ - set(MGL_EXTRA light) - set(MGL_PNG alpha area aspect axial axis barh bars belt boxplot - box boxs candle chart cloud colorbar combined cones conta contd - contfa contf contf_xyz cont contv cont_xyz curvcoor cut dat_diff - dat_extra densa dens dens_xyz dew dots error error2 fall fit flow fonts - fog grad hist inplot label legend loglog map mark mesh mirror - molecule parser pde pipe plot primitives projection qo2d radar region schemes - 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 ode indirect) - set(MGL_PNG_N ) - set(MGL_PNG_S ) - set(MGL_PNG_J ) - set(MGL_PNG_D ) - - set(MGL_OUT ${CMAKE_BINARY_DIR}/texinfo) - set(MGL_TEX ${CMAKE_SOURCE_DIR}/texinfo) - file(MAKE_DIRECTORY ${MGL_OUT}/udav) - file(MAKE_DIRECTORY ${MGL_OUT}/png) - file(MAKE_DIRECTORY ${MGL_OUT}/small) - file(MAKE_DIRECTORY ${MGL_OUT}/json) - file(MAKE_DIRECTORY ${MGL_OUT}/pdf) - 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_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/) - endforeach(SAMPLE) - - 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} - DEPENDS mgl_example - WORKING_DIRECTORY ${MGL_OUT}/png ) - set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png) - add_custom_command(OUTPUT ${MGL_OUT}/small/${SAMPLE}-sm.png - COMMAND mgl_example -kind=${SAMPLE} -mini - DEPENDS mgl_example - WORKING_DIRECTORY ${MGL_OUT}/small ) +configure_file(${MathGL_SOURCE_DIR}/texinfo/version.texi.in ${MathGL_BINARY_DIR}/texinfo/version.texi) + +set(MGL_EXTRA light) +set(MGL_PNG alpha area aspect axial axis barh bars belt boxplot + box boxs candle chart cloud colorbar combined cones conta contd + contfa contf contf_xyz cont contv cont_xyz curvcoor cut dat_diff + dat_extra densa dens dens_xyz dew dots error error2 fall fit flow fonts + fog grad hist inplot label legend loglog map mark mesh mirror + molecule parser pde pipe plot primitives projection qo2d radar region schemes + several_light solve stem step stereo stfa style surf3a surf3c surf3ca surf3 + surfa surfc surfca 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 ode indirect) +set(MGL_PNG_N ) +set(MGL_PNG_S ) +set(MGL_PNG_J ) +set(MGL_PNG_D ) + +set(MGL_OUT ${CMAKE_BINARY_DIR}/texinfo) +set(MGL_TEX ${CMAKE_SOURCE_DIR}/texinfo) +file(MAKE_DIRECTORY ${MGL_OUT}/udav) +file(MAKE_DIRECTORY ${MGL_OUT}/png) +file(MAKE_DIRECTORY ${MGL_OUT}/small) +file(MAKE_DIRECTORY ${MGL_OUT}/json) +file(MAKE_DIRECTORY ${MGL_OUT}/pdf) +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_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/) +endforeach(SAMPLE) + +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} + DEPENDS mgl_example + WORKING_DIRECTORY ${MGL_OUT}/png ) + set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png) + add_custom_command(OUTPUT ${MGL_OUT}/small/${SAMPLE}-sm.png + COMMAND mgl_example -kind=${SAMPLE} -mini + DEPENDS mgl_example + WORKING_DIRECTORY ${MGL_OUT}/small ) 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} - DEPENDS mgl_example - WORKING_DIRECTORY ${MGL_OUT}/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} + DEPENDS mgl_example + WORKING_DIRECTORY ${MGL_OUT}/json ) endif(MGL_HAVE_DOC_JSON) if(MGL_HAVE_DOC_PRC) - set(MGL_PNG_D ${MGL_PNG_D} ${MGL_OUT}/pdf/${SAMPLE}.pdf) - add_custom_command(OUTPUT ${MGL_OUT}/pdf/${SAMPLE}.pdf - COMMAND mgl_example -pdf -kind=${SAMPLE} - DEPENDS mgl_example - WORKING_DIRECTORY ${MGL_OUT}/pdf ) + set(MGL_PNG_D ${MGL_PNG_D} ${MGL_OUT}/pdf/${SAMPLE}.pdf) + add_custom_command(OUTPUT ${MGL_OUT}/pdf/${SAMPLE}.pdf + COMMAND mgl_example -pdf -kind=${SAMPLE} + DEPENDS mgl_example + WORKING_DIRECTORY ${MGL_OUT}/pdf ) endif(MGL_HAVE_DOC_PRC) - endforeach(SAMPLE) - - 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} - DEPENDS mgl_example - WORKING_DIRECTORY ${MGL_OUT}/png ) - set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png) - add_custom_command(OUTPUT ${MGL_OUT}/small/${SAMPLE}-sm.png - COMMAND mgl_example -kind=${SAMPLE} -mini - DEPENDS mgl_example - WORKING_DIRECTORY ${MGL_OUT}/small ) - endforeach(SAMPLE) - - set(list_texi_files_en overview_en.texi example_en.texi ex_mgl_en.texi parse_en.texi formats_en.texi udav_en.texi symbols_en.texi core_en.texi concept_en.texi widget_en.texi data_en.texi other_en.texi appendix_en.texi fdl.texi version.texi time.texi time_big.texi ) - set(list_texi_files_ru overview_ru.texi example_ru.texi ex_mgl_ru.texi parse_ru.texi formats_ru.texi udav_ru.texi symbols_ru.texi core_ru.texi concept_ru.texi widget_ru.texi data_ru.texi other_ru.texi appendix_ru.texi fdl.texi version.texi time.texi time_big.texi ) - - add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.info - COMMAND ${findmi} ${MGL_TEX}/mathgl_en.texi - DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} +endforeach(SAMPLE) + +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} + DEPENDS mgl_example + WORKING_DIRECTORY ${MGL_OUT}/png ) + set(MGL_PNG_S ${MGL_PNG_S} ${MGL_OUT}/small/${SAMPLE}-sm.png) + add_custom_command(OUTPUT ${MGL_OUT}/small/${SAMPLE}-sm.png + COMMAND mgl_example -kind=${SAMPLE} -mini + DEPENDS mgl_example + WORKING_DIRECTORY ${MGL_OUT}/small ) +endforeach(SAMPLE) + +set(list_texi_files_en overview_en.texi example_en.texi ex_mgl_en.texi parse_en.texi formats_en.texi udav_en.texi symbols_en.texi core_en.texi concept_en.texi widget_en.texi data_en.texi other_en.texi appendix_en.texi fdl.texi ${MathGL_BINARY_DIR}/texinfo/version.texi time.texi time_big.texi ) +set(list_texi_files_ru overview_ru.texi example_ru.texi ex_mgl_ru.texi parse_ru.texi formats_ru.texi udav_ru.texi symbols_ru.texi core_ru.texi concept_ru.texi widget_ru.texi data_ru.texi other_ru.texi appendix_ru.texi fdl.texi ${MathGL_BINARY_DIR}/texinfo/version.texi time.texi time_big.texi ) + +add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.info + COMMAND ${findmi} ${MGL_TEX}/mathgl_en.texi + DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) +add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.info + COMMAND ${findmi} ${MGL_TEX}/mathgl_ru.texi + DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) + +add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.html + COMMAND ${findth} ${th_opt} -I ${MGL_OUT} --no-split ${MGL_TEX}/mathgl_en.texi + DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) +add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.html + COMMAND ${findth} ${th_opt} --set-customization-variable 'BODYTEXT ' -I ${MGL_OUT} --no-split ${MGL_TEX}/mgl_en.texi + DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) +add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.html + COMMAND ${findth} ${th_opt} -I=${MGL_OUT} --no-split ${MGL_TEX}/mathgl_ru.texi + DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) +add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.html + COMMAND ${findth} ${th_opt} --set-customization-variable 'BODYTEXT ' -I=${MGL_OUT} --no-split ${MGL_TEX}/mgl_ru.texi + DEPENDS ${list_texi_files_ru} mgl_ru.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) + +add_custom_command(OUTPUT ${site_en} + COMMAND ${findth} ${th_opt} -I=${MGL_OUT}/png --split=node -o doc_en ${MGL_TEX}/doc_en.texi + DEPENDS ${list_texi_files_en} doc_en.texi ${MGL_PNG_N} web_en.texi ${MGL_PNG_S} ${MGL_PNG_J} ${MGL_PNG_D} + WORKING_DIRECTORY ${MGL_OUT} +) +add_custom_command(OUTPUT ${site_ru} + COMMAND ${findth} ${th_opt} -I=${MGL_OUT}/png --split=node -o doc_ru ${MGL_TEX}/doc_ru.texi + DEPENDS ${list_texi_files_ru} doc_ru.texi ${MGL_PNG_N} web_ru.texi ${MGL_PNG_S} ${MGL_PNG_J} ${MGL_PNG_D} + WORKING_DIRECTORY ${MGL_OUT} +) + +add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.pdf + COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi + COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi + COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi + DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) +add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.pdf + COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi + COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi + COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi + DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) + +add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.pdf + COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi + COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi + COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi + DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) +add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.pdf + COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi + COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi + COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi + DEPENDS ${list_texi_files_en} mgl_ru.texi ${MGL_PNG_N} + WORKING_DIRECTORY ${MGL_OUT} +) + +if(MGL_HAVE_DOC_INFO) + add_custom_target(doc_info ALL + DEPENDS ${MGL_OUT}/mathgl_en.info + DEPENDS ${MGL_OUT}/mathgl_ru.info ) - add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.info - COMMAND ${findmi} ${MGL_TEX}/mathgl_ru.texi - DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} - ) - - add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.html - COMMAND ${findth} ${th_opt} -I ${MGL_OUT} --no-split ${MGL_TEX}/mathgl_en.texi - DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} - ) - add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.html - COMMAND ${findth} ${th_opt} -I ${MGL_OUT} --no-split ${MGL_TEX}/mgl_en.texi - DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} - ) - add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.html - COMMAND ${findth} ${th_opt} -I=${MGL_OUT} --no-split ${MGL_TEX}/mathgl_ru.texi - DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} - ) - add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.html - COMMAND ${findth} ${th_opt} -I=${MGL_OUT} --no-split ${MGL_TEX}/mgl_ru.texi - DEPENDS ${list_texi_files_ru} mgl_ru.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} - ) - - add_custom_command(OUTPUT ${site_en} - COMMAND ${findth} ${th_opt} -I=${MGL_OUT}/png --split=node -o doc_en ${MGL_TEX}/doc_en.texi - DEPENDS ${list_texi_files_en} doc_en.texi ${MGL_PNG_N} web_en.texi ${MGL_PNG_S} ${MGL_PNG_J} ${MGL_PNG_D} - WORKING_DIRECTORY ${MGL_OUT} +# 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 + DEPENDS ${MGL_OUT}/mathgl_en.html + DEPENDS ${MGL_OUT}/mgl_ru.html + DEPENDS ${MGL_OUT}/mathgl_ru.html ) - add_custom_command(OUTPUT ${site_ru} - COMMAND ${findth} ${th_opt} -I=${MGL_OUT}/png --split=node -o doc_ru ${MGL_TEX}/doc_ru.texi - DEPENDS ${list_texi_files_ru} doc_ru.texi ${MGL_PNG_N} web_ru.texi ${MGL_PNG_S} ${MGL_PNG_J} ${MGL_PNG_D} - WORKING_DIRECTORY ${MGL_OUT} + install(FILES ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_DOC_PATH}) + install(FILES ${MGL_OUT}/mathgl_en.html ${MGL_OUT}/mgl_en.html ${MGL_OUT}/mathgl_ru.html ${MGL_OUT}/mgl_ru.html DESTINATION ${MGL_DOC_PATH}) + install(DIRECTORY ${MGL_OUT}/png DESTINATION ${MGL_DOC_PATH}) + install(DIRECTORY ${MGL_OUT}/udav DESTINATION ${MGL_DOC_PATH}) +endif(MGL_HAVE_DOC_HTML) + +if(MGL_HAVE_DOC_SITE) + add_custom_target(doc_site ALL + DEPENDS ${site_en} + DEPENDS ${site_ru} ) +endif(MGL_HAVE_DOC_SITE) - add_custom_command(OUTPUT ${MGL_OUT}/mathgl_en.pdf - COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi - COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi - COMMAND ${findtp} ${MGL_TEX}/mathgl_en.texi - DEPENDS ${list_texi_files_en} mathgl_en.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} - ) - add_custom_command(OUTPUT ${MGL_OUT}/mgl_en.pdf - COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi - COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi - COMMAND ${findtp} ${MGL_TEX}/mgl_en.texi - DEPENDS ${list_texi_files_en} mgl_en.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} +if(MGL_HAVE_DOC_PDF_EN) + add_custom_target(doc_en ALL + DEPENDS ${MGL_OUT}/mgl_en.pdf + DEPENDS ${MGL_OUT}/mathgl_en.pdf ) + install(FILES ${MGL_OUT}/mathgl_en.pdf ${MGL_OUT}/mgl_en.pdf DESTINATION ${MGL_DOC_PATH}) +endif(MGL_HAVE_DOC_PDF_EN) - add_custom_command(OUTPUT ${MGL_OUT}/mathgl_ru.pdf - COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi - COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi - COMMAND ${findtp} ${MGL_TEX}/mathgl_ru.texi - DEPENDS ${list_texi_files_ru} mathgl_ru.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} - ) - add_custom_command(OUTPUT ${MGL_OUT}/mgl_ru.pdf - COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi - COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi - COMMAND ${findtp} ${MGL_TEX}/mgl_ru.texi - DEPENDS ${list_texi_files_en} mgl_ru.texi ${MGL_PNG_N} - WORKING_DIRECTORY ${MGL_OUT} - ) - - if(MGL_HAVE_DOC_INFO) - add_custom_target(doc_info ALL - DEPENDS ${MGL_OUT}/mathgl_en.info - DEPENDS ${MGL_OUT}/mathgl_ru.info - ) -# 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 - DEPENDS ${MGL_OUT}/mathgl_en.html - DEPENDS ${MGL_OUT}/mgl_ru.html - DEPENDS ${MGL_OUT}/mathgl_ru.html - ) - install(FILES ${MGL_TEX}/qt.png ${MGL_TEX}/fltk.png ${MGL_TEX}/classes.png ${MGL_TEX}/datadvance.png DESTINATION ${MGL_DOC_PATH}) - install(FILES ${MGL_OUT}/mathgl_en.html ${MGL_OUT}/mgl_en.html ${MGL_OUT}/mathgl_ru.html ${MGL_OUT}/mgl_ru.html DESTINATION ${MGL_DOC_PATH}) - install(DIRECTORY ${MGL_OUT}/png DESTINATION ${MGL_DOC_PATH}) - install(DIRECTORY ${MGL_OUT}/udav DESTINATION ${MGL_DOC_PATH}) - endif(MGL_HAVE_DOC_HTML) - - if(MGL_HAVE_DOC_SITE) - add_custom_target(doc_site ALL - DEPENDS ${site_en} - DEPENDS ${site_ru} - ) - endif(MGL_HAVE_DOC_SITE) - - if(MGL_HAVE_DOC_PDF_EN) - add_custom_target(doc_en ALL - DEPENDS ${MGL_OUT}/mgl_en.pdf - DEPENDS ${MGL_OUT}/mathgl_en.pdf - ) - 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 +if(MGL_HAVE_DOC_PDF_RU) + add_custom_target(doc_ru ALL # DEPENDS ${MGL_OUT}/mgl_ru.pdf # DEPENDS ${MGL_OUT}/mathgl_ru.pdf - ) + ) # install(FILES ${MGL_OUT}/mathgl_ru.pdf DESTINATION ${MGL_DOC_PATH}) - endif(MGL_HAVE_DOC_PDF_RU) +endif(MGL_HAVE_DOC_PDF_RU) - set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "doc_en;doc_ru;./mathgl*.*;./mgl*.*") +set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "doc_en;doc_ru;./mathgl*.*;./mgl*.*") - install(FILES ${MGL_TEX}/mglconv.1 ${MGL_TEX}/mglview.1 ${MGL_TEX}/udav.1 ${MGL_TEX}/mgl.cgi.1 DESTINATION ${MGL_MAN_PATH}/man1) - install(FILES ${MGL_TEX}/mgl.5 DESTINATION ${MGL_MAN_PATH}/man5) +install(FILES ${MGL_TEX}/mglconv.1 ${MGL_TEX}/mglview.1 ${MGL_TEX}/udav.1 ${MGL_TEX}/mgl.cgi.1 DESTINATION ${MGL_MAN_PATH}/man1) +install(FILES ${MGL_TEX}/mgl.5 DESTINATION ${MGL_MAN_PATH}/man5) diff --git a/texinfo/concept_en.texi b/texinfo/concept_en.texi index 202b454..c668416 100644 --- a/texinfo/concept_en.texi +++ b/texinfo/concept_en.texi @@ -118,6 +118,8 @@ The color scheme is used for determining the color of surfaces, isolines, isosur 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. +The special 2-axis color scheme (like in @ref{map} plot) can be used if it contain symbol @samp{%}. In this case the second direction (alpha channel) is used as second coordinate for colors. At this, up to 4 colors can be specified for corners: @{c1,a1@}, @{c2,a1@}, @{c1,a2@}, @{c2,a2@}. Here color and alpha ranges are @{c1,c2@} and @{a1,a2@} correspondingly. If one specify less than 4 colors then black color is used for corner @{c1,a1@}. If only 2 colors are specified then the color of their sum is used for corner @{c2,a2@}. + 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. For more precise coloring, you can change default (equidistant) position of colors in color scheme. The format is @samp{@{CN,pos@}}, @samp{@{CN,pos@}} or @samp{@{xRRGGBB,pos@}}. The position value @var{pos} should be in range [0, 1]. Note, that alternative method for fine tuning of the color scheme is using the formula for coloring (see @ref{Curved coordinates}). @@ -153,7 +155,7 @@ or just use manual mask style (for v.2.3 and later)@* 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. +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, @samp{T} -- align under, @samp{V} -- align center vertical. Additional font effects are: @samp{w} -- wired, @samp{o} -- over-lined, @samp{u} -- underlined. Also a parsing of the LaTeX-like syntax is provided. There are commands for the font style changing inside the string (for example, use \b for bold font): \a or \overline -- over-lined, \b or \textbf -- bold, \i or \textit -- italic, \r or \textrm -- roman (disable bold and italic attributes), \u or \underline -- underlined, \w or \wire -- wired, \big -- bigger size, @@ -- smaller size. The lower and upper indexes are specified by @samp{_} and @samp{^} symbols. At this the changed font style is applied only on next symbol or symbols in braces @{@}. The text in braces @{@} are treated as single symbol that allow one to print the index of index. For example, compare the strings @samp{sin (x^@{2^3@})} and @samp{sin (x^2^3)}. You may also change text color inside string by command #? or by \color? where @samp{?} is symbolic id of the color (@pxref{Color styles}). For example, words @samp{blue} and @samp{red} will be colored in the string @samp{#b@{blue@} and \colorr@{red@} text}. The most of functions understand the newline symbol @samp{\n} and allows to print multi-line text. Finally, you can use arbitrary (if it was defined in font-face) UTF codes by command @code{\utf0x????}. For example, @code{\utf0x3b1} will produce @ifhtml @@ -201,13 +203,15 @@ MathGL have the fast variant of textual formula evaluation 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… +π = 3.1415926…, inf=∞ @end html @end ifhtml @ifnothtml -@math{\pi=3.1415926...} +@math{\pi=3.1415926..., inf=\infty} @end ifnothtml +Functions for complex numbers @samp{real(x)}, @samp{imag(x)}, @samp{abs(x)}, @samp{arg(x)}, @samp{conj(x)}. + Trigonometric functions are: @samp{sin(x)}, @samp{cos(x)}, @samp{tan(x)} (or @samp{tg(x)}). Inverse trigonometric functions are: @samp{asin(x)}, @samp{acos(x)}, @samp{atan(x)}. Hyperbolic functions are: @samp{sinh(x)} (or @samp{sh(x)}), @samp{cosh(x)} (or @samp{ch(x)}), @samp{tanh(x)} (or @samp{th(x)}). Inverse hyperbolic functions are: @samp{asinh(x)}, @samp{acosh(x)}, @samp{atanh(x)}. @ifhtml diff --git a/texinfo/concept_ru.texi b/texinfo/concept_ru.texi index fedfece..d0bea93 100644 --- a/texinfo/concept_ru.texi +++ b/texinfo/concept_ru.texi @@ -116,6 +116,8 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. При определении цвета по @emph{амплитуде} (наиболее часто используется) окончательный цвет определяется путем линейной интерполяции массива цветов. Массив цветов формируется из цветов, указанных в строке спецификации. Аргумент -- амплитуда, нормированная на диапазон изменения цвета (см. @ref{Axis settings}). Например, строка из 4 символов @samp{bcyr} соответствует изменению цвета от синего (минимальное значение) через голубой и желтый (промежуточные значения) к красному (максимальное значение). Строка @samp{kw} соответствует изменению цвета от черного (минимальное значение) к белому (максимальное значение). Строка из одного символа (например, @samp{g}) соответствует однотонному цвету (в данному случае зеленому). +Специальная двуосная цветовая схема (как в графике @ref{map}) задается символом @samp{%}. В ней второе направление (прозрачность) используется как вторая координата для цвета. При этом можно указать до 4 цветов для углов: @{c1,a1@}, @{c2,a1@}, @{c1,a2@}, @{c2,a2@}. Здесь диапазоны цвета и прозрачности равны @{c1,c2@} и @{a1,a2@}. Если указано меньше 4 цветов, то черный используется для угла @{c1,a1@}. Если задано только 2 цвета, то их сумма используется для угла @{c2,a2@}. + Есть несколько полезных цветовых схем. Строка @samp{kw} дает обычную серую (черно-белую) схему, когда большие значения светлее. Строка @samp{wk} представляет обратную серую схему, когда большие значения темнее. Строки @samp{kRryw}, @samp{kGgw}, @samp{kBbcw} представляют собой хорошо известные схемы @emph{hot}, @emph{summer} и @emph{winter}. Строки @samp{BbwrR} и @samp{bBkRr} позволяют рисовать двухцветные фигуры на белом или черном фоне, когда отрицательные значения показаны синим цветом, а положительные -- красным. Строка @samp{BbcyrR} дает цветовую схему, близкую к хорошо известной схеме @emph{jet}. Для более точно раскрашивания поверхностей можно изменить равномерное (по умолчанию) положение цветов в цветовой схеме. Формат следующий: @samp{@{CN,pos@}}, @samp{@{CN,pos@}} или @samp{@{xRRGGBB,pos@}}. Здесь значение @var{pos} положения цвета должно быть в диапазоне [0, 1]. Отмечу, что альтернативным механизмом тонкой настройки цветовой схемы может служить использование формул для цветовой координаты (см. @ref{Curved coordinates}). @@ -152,7 +154,7 @@ Base colors are defined by one of symbol @samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}. Стиль текста задается строкой, которая может содержать цвет текста @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} -- подчеркнутый. +Начертания шрифта: @samp{r} -- прямой шрифт, @samp{i} -- курсив, @samp{b} -- жирный. По умолчанию используется прямой шрифт. Типы выравнивания текста: @samp{L} -- по левому краю (по умолчанию), @samp{C} -- по центру, @samp{R} -- по правому краю, @samp{T} -- под текстом, @samp{V} -- по центру вертикально. Дополнительные эффекты шрифта: @samp{w} -- контурный, @samp{o} -- надчеркнутый, @samp{u} -- подчеркнутый. Синтаксический разбор LaTeX-их команд по умолчанию включен. Это команды смены стиля текста (например, \b для жирного текста): \a или \overline -- надчеркивание, \b или \textbf -- жирный, \i или \textit -- курсив, \r или \textrm -- прямой (отменяет стили жирного и курсива), \u или \underline -- подчеркнутый, \w или \wire -- контурный, \big -- большего размера, @@ -- меньшего размера. Нижний и верхний индексы задаются символами @samp{_} и @samp{^}. При этом изменение стиля применяется только к следующему символу или к символам в фигурных скобках @{@}, которые понимаются как единый блок. Например, сравните строки @samp{sin (x^@{2^3@})} и @samp{sin (x^2^3)}. Можно также менять цвет текста внутри строки с помощью команд #? или \color?, где @samp{?} -- символ цвета (@pxref{Line styles}). Например, слова @samp{Blue} и @samp{red} будут окрашены в соответствующий цвет в строке @samp{#b@{Blue@} and \colorr@{red@} text}. Большинство функций понимает символ новой строки @samp{\n} и позволяет выводить много строчный текст. Наконец, можно использовать символы с произвольным UTF кодом с помощью команды @code{\utf0x????}. Например, @code{\utf0x3b1} даст символ @ifhtml @@ -199,13 +201,15 @@ MathGL имеет быстрый парсер текстовых формул Базовые функции: @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… +π = 3.1415926…, inf=∞ @end html @end ifhtml @ifnothtml -@math{\pi=3.1415926...} +@math{\pi=3.1415926..., inf=\infty} @end ifnothtml +Функции для работы с комплексными числами @samp{real(x)}, @samp{imag(x)}, @samp{abs(x)}, @samp{arg(x)}, @samp{conj(x)}. + Тригонометрические функции: @samp{sin(x)}, @samp{cos(x)}, @samp{tan(x)} (или @samp{tg(x)}). Обратные тригонометрические функции: @samp{asin(x)}, @samp{acos(x)}, @samp{atan(x)}. Гиперболические функции: @samp{sinh(x)} (или @samp{sh(x)}), @samp{cosh(x)} (или @samp{ch(x)}), @samp{tanh(x)} (или @samp{th(x)}). Обратные гиперболические функции: @samp{asinh(x)}, @samp{acosh(x)}, @samp{atanh(x)}. @ifhtml diff --git a/texinfo/core_en.texi b/texinfo/core_en.texi index b31e7da..4a7a4f0 100644 --- a/texinfo/core_en.texi +++ b/texinfo/core_en.texi @@ -159,6 +159,7 @@ Lamp-like transparency (@samp{2}) -- below and upper things are commutable and a @node Lighting, Fog, Transparency, Graphics setup @subsection Lighting @nav{} + @ifclear UDAV @cindex SetAmbient @cindex AddLight @@ -166,7 +167,7 @@ Lamp-like transparency (@samp{2}) -- below and upper things are commutable and a @cindex Light @cindex Ambient -There are several functions for setup lighting. The general function is @ref{light} which switch on/off the lighting for overall plot. It influence only for graphics which created after @ref{light} call (with one exception, OpenGL). Generally MathGL support up to 10 independent light sources. But in OpenGL mode only 8 of light sources is used due to OpenGL limitations. The position, color, brightness of each light source can be set separately. By default only one light source is active. It is source number @code{0} with white color, located at top of the plot. +There are several functions for setup lighting. The general function is @ref{light} which switch on/off the lighting for overall plot. It influence only for graphics which created after @ref{light} call (with one exception, OpenGL). Generally MathGL support up to 10 independent light sources. But in OpenGL mode only 8 of light sources is used due to OpenGL limitations. The position, color, brightness of each light source can be set separately. By default only one light source is active. It is source number @code{0} with white color, located at top of the plot. @sref{Lighting sample} @anchor{light} @deftypefn {MGL command} {} light @code{[val=on]} @@ -215,6 +216,15 @@ Set brightness of diffusive light (only for local light sources). Sets the brightness of ambient light. The value should be in range [0,1]. @end deftypefn +@anchor{attachlight} +@deftypefn {MGL command} {} attachlight @code{val} +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} AttachLight (@code{bool} val) +@deftypefnx {C function} @code{void} mgl_set_attach_light (@code{HMGL} gr, @code{int} val) +@end ifclear +Set to attach light settings to @ref{inplot}/@ref{subplot}. Note, OpenGL and some output formats don't support this feature. +@end deftypefn + @c ================================================================== @external{} @node Fog, Default sizes, Lighting, Graphics setup @@ -569,6 +579,8 @@ Wrong command in MGL script Too long line in MGL script @item mglScrStr Unbalanced ' in MGL script +@item mglScrTemp +Change temporary data in MGL script @end table @end deftypefn @@ -864,7 +876,7 @@ The same as previous but add single tick label @var{lbl} at position @var{val} t @deftypefnx {C function} @code{void} mgl_set_tick_templ (@code{HMGL} gr, @code{const char *}templ) @deftypefnx {C function} @code{void} mgl_set_tick_templw (@code{HMGL} gr, @code{const wchar_t *}templ) @end ifclear -Set template @var{templ} for x-,y-,z-axis ticks or colorbar ticks. It may contain TeX symbols also. If @var{templ}=@code{""} then default template is used (in simplest case it is @samp{%.2g}). Setting on template switch off automatic ticks tuning. +Set template @var{templ} for x-,y-,z-axis ticks or colorbar ticks. It may contain TeX symbols also. If @var{templ}=@code{""} then default template is used (in simplest case it is @samp{%.2g}). If template start with @samp{&} symbol then @code{long} integer value will be passed instead of default type @code{double}. Setting on template switch off automatic ticks tuning. @end deftypefn @anchor{ticktime} @@ -888,7 +900,7 @@ Gets number of seconds from 1970 year to specified date/time @var{str}. The form @deftypefnx {Method on @code{mglGraph}} @code{void} SetTuneTicks (@code{int} tune, @code{mreal} pos=@code{1.15}) @deftypefnx {C function} @code{void} mgl_tune_ticks (@code{HMGL} gr, @code{int} tune, @code{mreal} pos) @end ifclear -Switch on/off ticks enhancing by factoring common multiplier (for small, like from 0.001 to 0.002, or large, like from 1000 to 2000, coordinate values -- enabled if @var{tune}&1 is nonzero) or common component (for narrow range, like from 0.999 to 1.000 -- enabled if @var{tune}&2 is nonzero). Also set the position @var{pos} of common multiplier/component on the axis: =0 at minimal axis value, =1 at maximal axis value. Default value is 1.15. If @var{tune}&4 is nonzero then zeros will be added to fixed width of all axis labels. +Switch on/off ticks enhancing by factoring common multiplier (for small, like from 0.001 to 0.002, or large, like from 1000 to 2000, coordinate values -- enabled if @var{tune}&1 is nonzero) or common component (for narrow range, like from 0.999 to 1.000 -- enabled if @var{tune}&2 is nonzero). Also set the position @var{pos} of common multiplier/component on the axis: =0 at minimal axis value, =1 at maximal axis value. Default value is 1.15. @end deftypefn @anchor{tickshift} @@ -1156,6 +1168,13 @@ Functions in this group save or give access to produced picture. So, usually the Sets size of picture in pixels. This function @strong{must be} called before any other plotting because it completely remove picture contents. @end deftypefn +@ifclear UDAV +@deftypefn {Method on @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor) +@deftypefnx {C function} @code{void} mgl_set_size_scl (@code{HMGL} gr, @code{double} factor) +Set factor for width and height in all further calls of @ref{setsize}. +@end deftypefn +@end ifclear + @anchor{quality} @deftypefn {MGL command} {} quality [@code{val}=2] @ifclear UDAV @@ -1703,7 +1722,7 @@ Draw tube (or truncated cone if @var{edge}=@code{false}) between points @var{p1} @item @samp{t} for drawing tubes/cylinder instead of cones/prisms; @item -@samp{4}, @samp{6}, @samp{8}, @samp{t} for drawing square, hex- or octo-prism instead of cones. +@samp{4}, @samp{6}, @samp{8} for drawing square, hex- or octo-prism instead of cones. @end itemize @end deftypefn @@ -1818,7 +1837,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command 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}). 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. +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{LRCTV}) 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, @samp{T} -- align under, @samp{V} -- align center vertical. 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. @@ -1911,7 +1930,7 @@ Draws axes with ticks (see @ref{Axis settings}). Parameter @var{dir} may contain @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} +Styles of ticks and axis can be overrided by using @var{stl} string. Option @code{value} set the manual rotation angle for the ticks. @sref{Axis and ticks} @end deftypefn @anchor{colorbar} @@ -2021,7 +2040,9 @@ font style for legend text; @item @samp{#} for drawing box around legend; @item -colors for background (first one) and border (second one) of legend. Note, that last color is always used as color for legend text. +@samp{-} for arranging legend entries horizontally; +@item +colors for face (1st one), for border (2nd one) and for text (last one). If less than 3 colors are specified then the color for border is black (for 2 and less colors), and the color for face is white (for 1 or none colors). @end itemize @sref{Legend sample} @@ -2031,7 +2052,7 @@ colors for background (first one) and border (second one) of legend. Note, that @deftypefnx {Method on @code{mglGraph}} @code{void} Legend (@code{int} pos=@code{0x3}, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_legend (@code{HMGL} gr, @code{int} pos, @code{const char *}fnt, @code{const char *}opt) @end ifclear -Draws legend of accumulated legend entries by font @var{fnt} with @var{size}. Parameter @var{pos} sets the position of the legend: @samp{0} is bottom left corner, @samp{1} is bottom right corner, @samp{2} is top left corner, @samp{3} is top right corner (is default). Parameter @var{fnt} can contain colors for face (1st one), for border (2nd one) and for text (last one). If less than 3 colors are specified then the color for border is black (for 2 and less colors), and the color for face is white (for 1 or none colors). If string @var{fnt} contain @samp{#} then border around the legend is drawn. If string @var{fnt} contain @samp{-} then legend entries will arranged horizontally. Option @code{value} set the space between line samples and text (default is 0.1). +Draws legend of accumulated legend entries by font @var{fnt} with @var{size}. Parameter @var{pos} sets the position of the legend: @samp{0} is bottom left corner, @samp{1} is bottom right corner, @samp{2} is top left corner, @samp{3} is top right corner (is default). Option @code{value} set the space between line samples and text (default is 0.1). @end deftypefn @deftypefn {MGL command} {} legend @code{x y} ['fnt'='#'] @@ -2863,7 +2884,7 @@ These plotting functions draw @emph{two matrix} simultaneously. There are 5 gene @deftypefnx {C function} @code{void} mgl_surfc (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surfc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. 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. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfa}, @ref{surf3c}. @sref{SurfC sample} +The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. 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. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfa}, @ref{surfca}, @ref{surf3c}. @sref{SurfC sample} @end deftypefn @anchor{surf3c} @@ -2875,7 +2896,7 @@ The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j] @deftypefnx {C function} @code{void} mgl_surf3c_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3c_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3C sample} +The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{Surf3C sample} @end deftypefn @deftypefn {MGL command} {} surf3c adat cdat ['sch'=''] @@ -2899,7 +2920,7 @@ Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. @deftypefnx {C function} @code{void} mgl_surfa (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and transparent it by matrix @var{c}[i,j]. 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. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfc}, @ref{surf3a}. @sref{SurfA sample} +The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and transparent it by matrix @var{c}[i,j]. 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. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfc}, @ref{surfca}, @ref{surf3a}. @sref{SurfA sample} @end deftypefn @anchor{surf3a} @@ -2911,7 +2932,7 @@ The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j] @deftypefnx {C function} @code{void} mgl_surf3a_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3a_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear -The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the transparency of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample} +The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the transparency of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{Surf3A sample} @end deftypefn @deftypefn {MGL command} {} surf3a adat cdat ['sch'=''] @@ -2925,6 +2946,43 @@ The function draws isosurface plot for 3d array specified parametrically @var{a} Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. At this array @var{c} can be vector with values of transparency and @var{num}=@var{c}.nx. In opposite case @var{num} is equal to parameter @code{value} in options @var{opt} (default is 3). @end deftypefn + + +@anchor{surfca} +@deftypefn {MGL command} {} surfca zdat cdat adat ['sch'=''] +@deftypefnx {MGL command} {} surfca xdat ydat zdat cdat adat ['sch'=''] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_surfca (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) +@deftypefnx {C function} @code{void} mgl_surfca_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) +@end ifclear +The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}, color it by matrix @var{c}[i,j] and transparent it by matrix @var{a}[i,j]. 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. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{surf3ca}. @sref{SurfCA sample} +@end deftypefn + +@anchor{surf3ca} +@deftypefn {MGL command} {} surf3ca adat cdat bdat @code{val} ['sch'=''] +@deftypefnx {MGL command} {} surf3ca xdat ydat zdat adat cdat bdat @code{val} ['sch'=''] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_surf3ca_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) +@deftypefnx {C function} @code{void} mgl_surf3ca_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b,@code{const char *}sch, @code{const char *}opt) +@end ifclear +The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color and the transparency of isosurface depends on values of array @var{c} and @var{b} correspondingly. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf3}, @ref{surfca}, @ref{surf3c}, @ref{surf3a}. @sref{Surf3CA sample} +@end deftypefn + +@deftypefn {MGL command} {} surf3ca adat cdat bdat ['sch'=''] +@deftypefnx {MGL command} {} surf3ca xdat ydat zdat adat cdat bdat ['sch'=''] +@ifclear UDAV +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {C function} @code{void} mgl_surf3ca (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) +@deftypefnx {C function} @code{void} mgl_surf3ca_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) +@end ifclear +Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. Here parameter @var{num} is equal to parameter @code{value} in options @var{opt} (default is 3). +@end deftypefn + @anchor{tiles} @deftypefn {MGL command} {} tiles zdat rdat ['sch'=''] @deftypefnx {MGL command} {} tiles xdat ydat zdat rdat ['sch'=''] @@ -3430,9 +3488,14 @@ Get last fitted formula with found coefficients (as numbers). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{mreal} GetFitChi () -@deftypefnx {C function only} @code{mreal} mgl_get_fit_chi () +@deftypefnx {C function} @code{mreal} mgl_get_fit_chi () Get \chi for last fitted formula. @end deftypefn + +@deftypefn {Method on @code{mglGraph}} @code{mreal} GetFitCovar () +@deftypefnx {C function} @code{mreal} mgl_get_fit_covar () +Get covariance matrix for last fitted formula. +@end deftypefn @end ifclear diff --git a/texinfo/core_ru.texi b/texinfo/core_ru.texi index b2c87f5..d6eebab 100644 --- a/texinfo/core_ru.texi +++ b/texinfo/core_ru.texi @@ -157,7 +157,7 @@ MGL не требует создания данного типа объекто @cindex Light @cindex Ambient -Эти функции настраивают освещение графика. Главная функция @ref{light} включает/выключает освещение графиков построенных после ее вызова (в OpenGL работает сразу для всего рисунка). MathGL поддерживает до 10 независимых источников света. Но в режиме OpenGL можно использовать только первые 8 из них. Положение, цвет, яркость каждого источника света можно задавать по отдельности. По умолчанию включен только первый (с порядковым номером @code{0}) источник света белого цвета, расположенный сверху. +Эти функции настраивают освещение графика. Главная функция @ref{light} включает/выключает освещение графиков построенных после ее вызова (в OpenGL работает сразу для всего рисунка). MathGL поддерживает до 10 независимых источников света. Но в режиме OpenGL можно использовать только первые 8 из них. Положение, цвет, яркость каждого источника света можно задавать по отдельности. По умолчанию включен только первый (с порядковым номером @code{0}) источник света белого цвета, расположенный сверху. @sref{Lighting sample} @anchor{light} @deftypefn {Команда MGL} {} light @code{[val=on]} @@ -206,6 +206,16 @@ MGL не требует создания данного типа объекто Задает яркость рассеянного освещения. Значение должно быть в диапазоне [0,1]. @end deftypefn +@anchor{attachlight} +@deftypefn {Команда MGL} {} attachlight @code{val} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} AttachLight (@code{bool} val) +@deftypefnx {Функция С} @code{void} mgl_set_attach_light (@code{HMGL} gr, @code{int} val) +@end ifclear +Задает привязку настроек освещения к @ref{inplot}/@ref{subplot}. Отмечу, что OpenGL и некоторые выходные форматы не поддерживают эту возможность. +@end deftypefn + + @c ================================================================== @external{} @node Fog, Default sizes, Lighting, Graphics setup @@ -553,6 +563,8 @@ Setsize: размер(ы) равны нулю или отрицательны Слишком длинная строка в скрипте MGL @item mglScrStr Одиночная ' в скрипте MGL +@item mglScrTemp +Изменяется временная переменная в MGL скрипте @end table @end deftypefn @@ -847,7 +859,7 @@ Ternary -- специальный тип графика для 3 зависим @deftypefnx {Функция С} @code{void} mgl_set_tick_templ (@code{HMGL} gr, @code{const char *}templ) @deftypefnx {Функция С} @code{void} mgl_set_tick_templw (@code{HMGL} gr, @code{const wchar_t *}templ) @end ifclear -Задает шаблон @var{templ} для меток вдоль x-,y-,z-оси или colorbar. Шаблон может содержать и символы TeX. Если @var{templ}=@code{""}, то используется шаблон по умолчанию (в простейшем случае @samp{%.2g}). Установка шаблона выключает автоматическое улучшение вида меток. +Задает шаблон @var{templ} для меток вдоль x-,y-,z-оси или colorbar. Шаблон может содержать и символы TeX. Если @var{templ}=@code{""}, то используется шаблон по умолчанию (в простейшем случае @samp{%.2g}). Если шаблон начинается с символа @samp{&}, то будет использовано целое @code{long} вместо типа @code{double}. Установка шаблона выключает автоматическое улучшение вида меток. @end deftypefn @anchor{ticktime} @@ -871,7 +883,7 @@ Ternary -- специальный тип графика для 3 зависим @deftypefnx {Метод класса @code{mglGraph}} @code{void} SetTuneTicks (@code{int} tune, @code{mreal} pos=@code{1.15}) @deftypefnx {Функция С} @code{void} mgl_tune_ticks (@code{HMGL} gr, @code{int} tune, @code{mreal} pos) @end ifclear -Включает/выключает улучшение вида меток осей путем вынесения общего множителя (для маленьких, типа 0.001...0.002, или больших, типа 1000...2000, значений координат) или общей компоненты (для узкого диапазона, типа 0.999...1.000). Также задает положение @var{pos} общего множителя на оси: =0 около минимального значения, =1 около максимального значения. Если @var{tune}&4 не ноль, то нули будут добавлены для фиксированной ширины всех меток оси. +Включает/выключает улучшение вида меток осей путем вынесения общего множителя (для маленьких, типа 0.001...0.002, или больших, типа 1000...2000, значений координат) или общей компоненты (для узкого диапазона, типа 0.999...1.000). Также задает положение @var{pos} общего множителя на оси: =0 около минимального значения, =1 около максимального значения. @end deftypefn @anchor{tickshift} @@ -1109,6 +1121,15 @@ Ternary -- специальный тип графика для 3 зависим Изменяет размер картинки в пикселях. Функция должна вызываться @strong{перед} любыми функциями построения потому что полностью очищает содержимое рисунка. @end deftypefn + +@ifclear UDAV +@deftypefn {Метод класса @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor) +@deftypefnx {Функция С} @code{void} mgl_set_size_scl (@code{HMGL} gr, @code{double} factor) +Задает множитель для высоты и ширины во всех последующих вызовах @ref{setsize}. +@end deftypefn +@end ifclear + + @anchor{quality} @deftypefn {Команда MGL} {} quality [@code{val}=2] @ifclear UDAV @@ -1656,7 +1677,7 @@ These functions change background image. @item @samp{t} для рисования цилиндра вместо конуса/призмы; @item -@samp{4}, @samp{6}, @samp{8}, @samp{t} для рисования квадратной, шестиугольной или восьмиугольной призмы вместо конуса. +@samp{4}, @samp{6}, @samp{8} для рисования квадратной, шестиугольной или восьмиугольной призмы вместо конуса. @end itemize @end deftypefn @@ -1739,7 +1760,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command Функции для вывода текста позволяют вывести строку текста в произвольном месте рисунка, в произвольном направлении и вдоль произвольной кривой. 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{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{wkrgbcymhRGBCYMHW} (см. @ref{Color styles}). Также после символа @samp{:} можно указать символы стиля (@samp{rbiwou}) и/или выравнивания (@samp{LRCTV}). Стили шрифта: @samp{r} -- прямой, @samp{i} -- курсив, @samp{b} -- жирный, @samp{w} -- контурный, @samp{o} -- надчеркнутый, @samp{u} -- подчеркнутый. По умолчанию используется прямой шрифт. Типы выравнивания: @samp{L} -- по левому краю (по умолчанию), @samp{C} -- по центру, @samp{R} -- по правому краю, @samp{T} -- под текстом, @samp{V} -- по центру вертикально. Например, строка @samp{b:iC} соответствует курсиву синего цвета с выравниванием по центру. Начиная с MathGL версии 2.3, вы можете задать цветовой градиент для выводимой строки (см. @ref{Color scheme}). Если строка содержит символы @samp{aA}, то текст выводится в абсолютных координатах (полагаются в диапазоне [0,1]). При этом используются координаты относительно рисунка (если указано @samp{A}) или относительно последнего subplot/inplot (если указано @samp{a}). Если строка содержит символ @samp{@@}, то вокруг текста рисуется прямоугольник. @@ -1832,7 +1853,7 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command @item @samp{-} для вывода обычного @samp{-}; @item @samp{0123456789} для задания точности при выводе чисел. @end itemize -Стиль меток и оси(ей) задается строкой @var{stl}. @sref{Axis and ticks} +Стиль меток и оси(ей) задается строкой @var{stl}. Опция @code{value} задает угол вращения меток оси. @sref{Axis and ticks} @end deftypefn @anchor{colorbar} @@ -2837,6 +2858,44 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command Аналогично предыдущему для @var{num} поверхностей уровня равномерно распределённых в диапазоне изменения цвета. При этом массив @var{c} может быть вектором со значениями прозрачности и @var{num}=@var{c}.nx. В противном случае величина @var{num} равна значению параметра @code{value} в опциях @var{opt} (по умолчанию 3). @end deftypefn + + +@anchor{surfca} +@deftypefn {Команда MGL} {} surfca zdat cdat adat ['sch'=''] +@deftypefnx {Команда MGL} {} surfca xdat ydat zdat cdat adat ['sch'=''] +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_surfca (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) +@deftypefnx {Функция С} @code{void} mgl_surfca_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) +@end ifclear +Рисует параметрически заданную поверхность @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} с цветом и прозрачностью, заданными массивами @var{c}[i,j] и @var{a}[i,j] соответственно. Если @var{sch} содержит @samp{#}, то на поверхности рисуется сетка. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. Размерность массивов @var{z} и @var{c} должна быть одинакова. График строится для каждого z среза данных. См. также @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{surf3ca}. @sref{SurfCA sample} +@end deftypefn + +@anchor{surf3ca} +@deftypefn {Команда MGL} {} surf3ca adat cdat bdat @code{val} ['sch'=''] +@deftypefnx {Команда MGL} {} surf3ca xdat ydat zdat adat cdat bdat @code{val} ['sch'=''] +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_surf3ca_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) +@deftypefnx {Функция С} @code{void} mgl_surf3ca_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) +@end ifclear +Рисует поверхность уровня для 3d массива, заданного параметрически @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) при @var{a}(x,y,z)=@var{val}. Аналогично @ref{surf3}, но цвет и прозрачность задается массивами @var{c} и @var{b} соответственно. Если @var{sch} содержит @samp{#}, то рисуется сетчатая поверхность. Если @var{sch} содержит @samp{.}, то рисуется поверхность из точек. См. также @ref{surf3}, @ref{surfc}, @ref{surf3a}. @sref{Surf3A sample} +@end deftypefn + +@deftypefn {Команда MGL} {} surf3ca adat cdat ['sch'=''] +@deftypefnx {Команда MGL} {} surf3ca xdat ydat zdat adat cdat ['sch'=''] +@ifclear UDAV +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Метод класса @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) +@deftypefnx {Функция С} @code{void} mgl_surf3ca (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) +@deftypefnx {Функция С} @code{void} mgl_surf3ca_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) +@end ifclear +Аналогично предыдущему для @var{num} поверхностей уровня равномерно распределённых в диапазоне изменения цвета. Здесь величина @var{num} равна значению параметра @code{value} в опциях @var{opt} (по умолчанию 3). +@end deftypefn + + @anchor{tiles} @deftypefn {Команда MGL} {} tiles zdat rdat ['sch'=''] @deftypefnx {Команда MGL} {} tiles xdat ydat zdat rdat ['sch'=''] @@ -3345,6 +3404,12 @@ Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command @deftypefnx {Функция С} @code{mreal} mgl_get_fit_chi () Возвращает величину \chi для последней подобранной формулы. @end deftypefn + +@deftypefn {Метод класса @code{mglGraph}} @code{mreal} GetFitCovar () +@deftypefnx {Функция С} @code{mreal} mgl_get_fit_covar () +Возвращает ковариационную матрицу для последней подобранной формулы. +@end deftypefn + @end ifclear diff --git a/texinfo/data_en.texi b/texinfo/data_en.texi index 8847537..7c0a0d8 100644 --- a/texinfo/data_en.texi +++ b/texinfo/data_en.texi @@ -322,7 +322,7 @@ Delete rows which values are equal to next row for given column @var{idx}. @end deftypefn @anchor{join} -@deftypefn {MGL command} {} join dat vdat +@deftypefn {MGL command} {} join dat vdat [v2dat ...] @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Join (@code{const mglDataA &}vdat) @deftypefnx {Method on @code{mglDataC}} @code{void} Join (@code{const mglDataA &}vdat) @@ -1028,6 +1028,16 @@ Do Fourier transform of the data in given direction or directions. If @var{dir} Do Hankel transform of the data in given direction or directions. The Hankel transform is @math{\sum a_j J_0(k j)} (see @uref{http://en.wikipedia.org/wiki/Hankel_transform}). @end deftypefn +@anchor{wavelet} +@deftypefn {MGL command} {} wavelet dat 'dir' @code{k} +@ifclear UDAV +@deftypefnx {Method on @code{mglData}} @code{void} Wavelet (@code{const char *}dir, @code{int} k) +@deftypefnx {C function} @code{void} mgl_data_wavelet (@code{HMDT} dat, @code{const char *}dir, @code{int} k) +@end ifclear +Apply wavelet transform of the data in given direction or directions. Parameter @var{dir} set the kind of wavelet transform: +@samp{d} for daubechies, @samp{D} for centered daubechies, @samp{h} for haar, @samp{H} for centered haar, @samp{b} for bspline, @samp{B} for centered bspline. If string @var{dir} contain symbol @samp{i} then inverse wavelet transform is applied. Parameter @var{k} set the size of wavelet transform. +@end deftypefn + @anchor{swap} @deftypefn {MGL command} {} swap dat 'dir' @ifclear UDAV @@ -1078,7 +1088,8 @@ Remove value steps (like phase jumps after inverse trigonometric functions) with @deftypefnx {C function} @code{void} mgl_data_smooth (@code{HMDT} dat, @code{const char *}dir, @code{mreal} delta) @deftypefnx {C function} @code{void} mgl_datac_smooth (@code{HADT} dat, @code{const char *}dir, @code{mreal} delta) @end ifclear -Smooths the data on specified direction or directions. String @var{dirs} specifies the dimensions which will be smoothed. It may contain characters: @samp{x} for 1st dimension, @samp{y} for 2nd dimension, @samp{z} for 3d dimension. If string @var{dir} contain: @samp{0} then does nothing, @samp{3} -- linear averaging over 3 points, @samp{5} -- linear averaging over 5 points. By default quadratic averaging over 5 points is used. +Smooths the data on specified direction or directions. String @var{dirs} specifies the dimensions which will be smoothed. It may contain characters: @samp{x} for 1st dimension, @samp{y} for 2nd dimension, @samp{z} for 3d dimension. If string @var{dir} contain: @samp{0} then does nothing, @samp{3} -- linear averaging over 3 points, @samp{5} -- linear averaging over 5 points. If string @var{dir} contain @samp{dN} (where @samp{N} is digit 1,2,...,9) then linear averaging over (2*N+1)-th points is used. +By default quadratic averaging over 5 points is used. @end deftypefn @anchor{envelop} @@ -1462,6 +1473,7 @@ The same as previous but with specified amplitude @var{ampl} and phase @var{phas @anchor{fourier} @deftypefn {MGL command} {} fourier reDat imDat 'dir' +@deftypefnx {MGL command} {} fourier complexDat 'dir' @ifclear UDAV @deftypefnx {Global function} @code{void} mglFourier @code{const mglDataA &}re, @code{const mglDataA &}im, @code{const char *}dir) @deftypefnx {C function} @code{void} mgl_data_fourier @code{HCDT} re, @code{HCDT} im, @code{const char *}dir) diff --git a/texinfo/data_ru.texi b/texinfo/data_ru.texi index 01afc69..8299764 100644 --- a/texinfo/data_ru.texi +++ b/texinfo/data_ru.texi @@ -320,7 +320,7 @@ a_ij^new = a_i^old where j=0...@var{n1}. Соответственно, для @v @anchor{join} -@deftypefn {Команда MGL} {} join dat vdat +@deftypefn {Команда MGL} {} join dat vdat [v2dat ...] @ifclear UDAV @deftypefnx {Метод класса @code{mglData}} @code{void} Join (@code{const mglDataA &}vdat) @deftypefnx {Метод класса @code{mglDataC}} @code{void} Join (@code{const mglDataA &}vdat) @@ -1018,6 +1018,16 @@ These functions change the data in some direction like differentiations, integra Выполняет преобразование Ханкеля в выбранном направлении(ях). Преобразование Ханкеля есть @math{\sum a_j J_0(k j)} (см. @uref{http://en.wikipedia.org/wiki/Hankel_transform}). @end deftypefn +@anchor{wavelet} +@deftypefn {Команда MGL} {} wavelet dat 'dir' @code{k} +@ifclear UDAV +@deftypefnx {Метод класса @code{mglData}} @code{void} Wavelet (@code{const char *}dir, @code{int} k) +@deftypefnx {Функция С} @code{void} mgl_data_wavelet (@code{HMDT} dat, @code{const char *}dir, @code{int} k) +@end ifclear +Выполняет преобразование wavelet в выбранном направлении(ях). Параметр @var{dir} задает тип: +@samp{d} для daubechies, @samp{D} для центрированного daubechies, @samp{h} для haar, @samp{H} для центрированного haar, @samp{b} для bspline, @samp{B} для центрированного bspline. Если указан символ @samp{i}, то выполняется обратное преобразование. Параметр @var{k} задает размер преобразования. +@end deftypefn + @anchor{swap} @deftypefn {Команда MGL} {} swap dat 'dir' @ifclear UDAV @@ -1068,7 +1078,7 @@ These functions change the data in some direction like differentiations, integra @deftypefnx {Функция С} @code{void} mgl_data_smooth (@code{HMDT} dat, @code{const char *}dir, @code{mreal} delta) @deftypefnx {Функция С} @code{void} mgl_datac_smooth (@code{HADT} dat, @code{const char *}dir, @code{mreal} delta) @end ifclear -Сглаживает данные в выбранном направлении(ях) @var{dir}. Строка @var{dirs} задает направления вдоль которых будет производиться сглаживание. Если @var{dirs} содержит: @samp{0} -- ничего не делает, @samp{3} линейное усреднение по 3 точкам, @samp{5} линейное усреднение по 5 точкам. По умолчанию используется квадратичное усреднение по 5 точкам. +Сглаживает данные в выбранном направлении(ях) @var{dir}. Строка @var{dirs} задает направления вдоль которых будет производиться сглаживание. Если @var{dirs} содержит: @samp{0} -- ничего не делает, @samp{3} линейное усреднение по 3 точкам, @samp{5} линейное усреднение по 5 точкам. Если @var{dir} содержит символы @samp{dN} (где @samp{N} -- цифра 1,2,...,9), то используется линейное усреднение по (2*N+1)-ой точке. По умолчанию используется квадратичное усреднение по 5 точкам. @end deftypefn @anchor{envelop} @@ -1453,6 +1463,7 @@ These functions change the data in some direction like differentiations, integra @anchor{fourier} @deftypefn {Команда MGL} {} fourier reDat imDat 'dir' +@deftypefnx {Команда MGL} {} fourier complexDat 'dir' @ifclear UDAV @deftypefnx {Global function} @code{void} mglFourier @code{const mglDataA &}re, @code{const mglDataA &}im, @code{const char *}dir) @deftypefnx {Функция С} @code{void} mgl_data_fourier @code{HCDT} re, @code{HCDT} im, @code{const char *}dir) diff --git a/texinfo/doc_en.texi b/texinfo/doc_en.texi index 5d09f28..4cf17a0 100644 --- a/texinfo/doc_en.texi +++ b/texinfo/doc_en.texi @@ -73,16 +73,14 @@ This file documents the Mathematical Graphic Library (MathGL), a collection of c
- - + + + @end html @@ -93,23 +91,21 @@ src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
+ style="display:inline-block;width:728px;height:15px" + data-ad-client="ca-pub-1128070552722622" + data-ad-slot="7008431385">
@comment - - + + +