The Mandelbrot Set
#include <stdio.h> #include "dislin.h" #define N 800 #define NITER 100 int iterate (double cx, double cy, int nmax); float zmat[N][N]; main () { float xscl[2], yscl[2], zscl[2]; double cx, cy, xd, yd; int i, j, n, nmax = 100; metafl ("cons"); scrmod ("revers"); disini (); pagera (); hwfont (); axspos (300, 1900); ax3len (2200,1700,1700); xscl[0] = -2.f; xscl[1] = 1.f; yscl[0] = -1.f; yscl[1] = 1.f; zscl[0] = 1.f; zscl[1] = nmax; name ("Real parts", "x"); name ("Imaginary parts", "y"); name ("Number of iterations", "z"); axsscl ("log", "z"); labels ("log", "z"); titlin ("The Mandelbrot Set", 4); setscl (xscl, 2, "x"); setscl (yscl, 2, "y"); setscl (zscl, 2, "z"); graf3 (-2., 1., -2., 0.5, -1., 1., -1., 0.5, 0., 100., 10., 10.); xd = (xscl[1] - xscl[0]) / (N - 1); yd = (yscl[1] - yscl[0]) / (N - 1); for (i = 0; i < N; i++) { cx = xscl[0] + i * xd; for (j = 0; j < N; j++) { cy = yscl[0] + j * yd; n = iterate (cx, cy, nmax); zmat[i][j] = n; } } crvmat ((float *) zmat, N, N, 1, 1); htitle (45); title (); disfin (); } int iterate (double cx, double cy, int nmax) { int n = 0; double x = 0., y = 0., x2 = 0., y2 = 0., zb = 0., zbmax = 4.; while (zb < zbmax && n < nmax) { y = 2 * x * y + cy; x = x2 - y2 + cx; x2 = x * x; y2 = y * y; zb = x2 + y2; n++; } return n; }
The Mandelbrot Set (Widget Program)
#include <stdio.h> #include#include <math.h> #include "dislin.h" #define N 600 void myplot (int id); void zoomplot (int id); void resetplot (int id); void undoplot (int id); int iterate (double cx, double cy); float zmat[N][N], xscl[2], yscl[2], zscl[2], xold[2], yold[2], zold[N][N]; int iplot = 0, izoom = 0, iundo = 0, niter = 100, izlog = 0, iold = 0; int id_draw, id_xmin, id_xmax, id_ymin, id_ymax, id_zoom, id_reset, id_iter, id_scale, id_progress, id_cancel, id_undo; main () { int ip, ip1, ip2, id; swgtit ("DISLIN Mandelbrot Plot"); ip = wgini ("hori"); swgwth (-70); ip1 = wgbas (ip, "vert"); swgwth (-15); ip2 = wgbas (ip, "vert"); swgdrw (2100./2970.); id_draw = wgdraw (ip1); id_xmin = wgltxt (ip2, "xmin:", "-2.000000", 50); id_xmax = wgltxt (ip2, "xmax:", "1.000000", 50); id_ymin = wgltxt (ip2, "ymin:", "-1.000000", 50); id_ymax = wgltxt (ip2, "ymax:", "1.000000", 50); id = wglab (ip2, " "); id_scale = wgbut (ip2, "Log. Colous", 0); swgopt ("smooth", "pbar"); id = wglab (ip2, " "); id = wglab (ip2, "Progress:"); id_progress = wgpbar (ip2, 0., 100., 5.); id = wglab (ip2, " "); id_iter = wgltxt (ip2, "Iterations:", "100", 40); id = wglab (ip2, " "); id_zoom = wgpbut (ip2, "Zoom"); swgcbk (id_zoom, zoomplot); id_undo = wgpbut (ip2, "Undo Zoom"); swgcbk (id_undo, undoplot); id_cancel = wgpbut (ip2, "Cancel"); id_reset = wgpbut (ip2, "Reset"); swgcbk (id_reset, resetplot); id = wglab (ip2, " "); id = wgquit (ip2); id = wgpbut (ip2, "Plot"); swgcbk (id, myplot); wgfin (); } void myplot (int id) { int i, j, n, nclr, isel, nx1, ny1, nx2, ny2; double cx, cy, xd, yd; float xa = -1.0f, xe = 1.0f, xor = -1.0f, xstp = 0.2f, ya = -1.0f, ye = 1.0f, yor = -1.0f, ystp = 0.2f, za = 1.0f, ze = 100.0f, zor = 10.0f, zstp = 10.0f; setxid (id_draw, "widget"); xscl[0] = gwgflt (id_xmin); xscl[1] = gwgflt (id_xmax); yscl[0] = gwgflt (id_ymin); yscl[1] = gwgflt (id_ymax); niter = gwgint (id_iter); izlog = gwgbut (id_scale); xd = (xscl[1] - xscl[0]) / (N - 1); yd = (yscl[1] - yscl[0]) / (N - 1); metafl ("cons"); scrmod ("revers"); disini (); if (izoom == 0) erase (); zscl[0] = 1.f; zscl[1] = (float) niter; setscl (xscl, 2, "x"); setscl (yscl, 2, "y"); setscl (zscl, 2, "z"); nochek (); axspos (300, 1900); ax3len (2200,1700,1700); if (izlog == 1) { axsscl ("log", "z"); labels ("log", "z"); } else { axsscl ("lin", "z"); labels ("float", "z"); } graf3 (xa, xe, xor, xstp, ya, ye, yor, ystp, za, ze, zor, zstp); sendbf (); if (izoom == 0 && iundo == 0) { for (i = 0; i < N; i++) { cx = xscl[0] + i * xd; doevnt (); if (gwgbut (id_cancel) == 1) { swgbut (id_cancel, 0); erase (); iplot = 0; disfin (); return; } swgval (id_progress, i * 100.f / N); for (j = 0; j < N; j++) { cy = yscl[0] + j * yd; n = iterate (cx, cy); zmat[i][j] = n; } } } crvmat ((float *) zmat, N, N, 1, 1); if (izoom == 1) { csrrec (&nx1, &ny1, &nx2, &ny2); xold[0] = xscl[0]; xold[1] = xscl[1]; yold[0] = yscl[0]; yold[1] = yscl[1]; for (i = 0; i < N; i++) for (j = 0; j < N; j++) zold[i][j] = zmat[i][j]; iold = 1; xscl[0] = xinvrs (nx1); xscl[1] = xinvrs (nx2); yscl[1] = yinvrs (ny1); yscl[0] = yinvrs (ny2); swgflt (id_xmin, xscl[0], 6); swgflt (id_xmax, xscl[1], 6); swgflt (id_ymin, yscl[0], 6); swgflt (id_ymax, yscl[1], 6); } disfin (); iplot = 1; } void zoomplot (int id) { if (iplot == 0) return; /* nothing to zoom */ izoom = 1; myplot (id); /* just get the new scaling */ if (iplot == 0) return; /* maybe canceled */ izoom = 0; myplot (id); /* replot with new scaling */ } void undoplot (int id) { int i, j; if (iold == 0) return; /* nothing to do */ xscl[0] = xold[0]; xscl[1] = xold[1]; yscl[0] = yold[0]; yscl[1] = yold[1]; swgflt (id_xmin, xscl[0], 6); swgflt (id_xmax, xscl[1], 6); swgflt (id_ymin, yscl[0], 6); swgflt (id_ymax, yscl[1], 6); for (i = 0; i < N; i++) for (j = 0; j < N; j++) zmat[i][j] = zold[i][j]; iundo = 1; myplot (id); iundo = 0; } void resetplot (int id) { xscl[0] = -2.f; xscl[1] = 1.f; yscl[0] = -1.f; yscl[1] = 1.f; swgflt (id_xmin, xscl[0], 6); swgflt (id_xmax, xscl[1], 6); swgflt (id_ymin, yscl[0], 6); swgflt (id_ymax, yscl[1], 6); myplot (id); } int iterate (double cx, double cy) { int n = 0; double x = 0., y = 0., x2, y2, zb = 0., zbmax = 4.; while (zb < zbmax && n < niter) { x2 = x * x - y * y + cx; y2 = 2 * x * y + cy; x = x2; y = y2; n++; zb = x * x + y * y; } return n; }
Rotation of a 3D Surface
#include <stdio.h> #include <math.h> #include "dislin.h" #define N 50 static int id_draw, id_but, id_lab1, id_lab2, id_scl1, id_scl2; static float xrot1 = 50.0f, xrot2 = 40.0f; static float xray[N], yray[N], zmat[N][N]; void myplot (int id); int main() { int ip, ip1, ip2, i, j; double fpi=3.1415927/180., step, x, y; step = 360./(N-1); for (i = 0; i < N; i++) { x = i*step; xray[i] = x; for (j = 0; j < N; j++) { y = j*step; yray[j] = y; zmat[i][j] = (float) (2*sin(x*fpi)*sin(y*fpi)); } } swgtit ("DISLIN 3D Plot"); ip = wgini ("hori"); swgwth (-50); ip1 = wgbas (ip, "vert"); swgwth (-15); ip2 = wgbas (ip, "vert"); swgdrw ((float) (2100./2970.)); id_lab2 = wglab (ip1, "DISLIN 3D Plot:"); id_draw = wgdraw (ip1); swgopt ("track", "scroll"); id_lab1 = wglab (ip2, "Azimuthal Rotation Angle:"); id_scl1 = wgscl (ip2, " ", 0.f, 360.f, 50.f, -1); id_lab1 = wglab (ip2, "Polar Rotation Angle:"); id_scl2 = wgscl (ip2, " ", -90.f, 90.f, 40.f, -1); swgcbk (id_scl1, myplot); swgcbk (id_scl2, myplot); myplot (id_scl1); wgfin (); return 0; } void myplot (int id) { if (id == id_scl1) xrot1 = gwgscl (id); else if (id == id_scl2) xrot2 = gwgscl (id); scrmod ("revers"); setxid (id_draw, "widget"); metafl ("xwin"); disini (); erase(); hwfont (); name ("X-axis", "x"); name ("Y-axis", "y"); name ("Z-axis", "z"); labdig (-1, "xyz"); axspos (585, 1800); axslen (1800, 1800); view3d (xrot1, xrot2, 6.0f, "angle"); height (40); graf3d(0.f,360.f,0.f,90.f,0.f,360.f,0.f,90.f,-3.f,3.f,-3.f,1.f); surshd(xray, N, yray, N, (float *) zmat); disfin (); }
News
Update 11.5.2
8. April 2024
Support für Python 3.11 und Windows
28. Juli 2023
Bugfix für die X11-Distributionen
22. Juli 2023
Update 11.5.1
25. April 2023
Support für Linux 64-bit auf IBM z Rechnern
30. Oktober 2022
Support für MingW 64-bit mit UCRT Runtime-Umgebung
28. September 2022
Release 11.5
15. März 2022
Release 11.4
15. März 2021
Support für Free Pascal 64-bit unter Windows
22. Juli 2020
Upgrade 11.3.3
28. Juni 2020
DISLIN-Buch Version 11 ist erhältlich
8. März 2017
8. April 2024
Support für Python 3.11 und Windows
28. Juli 2023
Bugfix für die X11-Distributionen
22. Juli 2023
Update 11.5.1
25. April 2023
Support für Linux 64-bit auf IBM z Rechnern
30. Oktober 2022
Support für MingW 64-bit mit UCRT Runtime-Umgebung
28. September 2022
Release 11.5
15. März 2022
Release 11.4
15. März 2021
Support für Free Pascal 64-bit unter Windows
22. Juli 2020
Upgrade 11.3.3
28. Juni 2020
DISLIN-Buch Version 11 ist erhältlich
8. März 2017