Mandelbrot set: Difference between revisions

Content added Content deleted
(zoom in and out)
Line 12,986: Line 12,986:
:End
:End
</syntaxhighlight>
</syntaxhighlight>
=={{header|Transact-SQL‎}}==
This is a Transact-SQL version of SQL Server to generate Mandelbrot set. Export the final result to a .ppm file to view the image.
<syntaxhighlight lang="Transact-SQL‎">
-- Mandelbrot Set
-- SQL Server 2017 and above
SET NOCOUNT ON
GO

-- Plot area 800 X 800
DECLARE @width INT = 800
DECLARE @height INT = 800

DECLARE @r_min DECIMAL (10, 8) = -2.5;
DECLARE @r_max DECIMAL (10, 8) = 1.5;
DECLARE @r_step DECIMAL (10, 8) = 0.005;
DECLARE @i_min DECIMAL (10, 8) = -2;
DECLARE @i_max DECIMAL (10, 8) = 2;
DECLARE @i_step DECIMAL (10, 8) = 0.005;

DECLARE @iter INT = 255; -- Iteration

DROP TABLE IF EXISTS dbo.Numbers
DROP TABLE IF EXISTS dbo.mandelbrot_set;

CREATE TABLE dbo.Numbers (n INT);

-- Generate a number table of 1000 rows
;WITH N1(n) AS
(
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), -- 10
N2(n) AS (SELECT 1 FROM N1 CROSS JOIN N1 AS b), -- 10*10
N3(n) AS (SELECT 1 FROM N1 CROSS JOIN N2) -- 10*100
INSERT INTO dbo.Numbers (n)
SELECT n = ROW_NUMBER() OVER (ORDER BY n)
FROM N3 ORDER BY n;
/*
-- If the version is SQL Server 2022 and above
INSERT INTO dbo.Numbers (n)
SELECT value FROM GENERATE_SERIES(0, 1000);
*/


CREATE TABLE dbo.mandelbrot_set
(
a INT,
b INT,
c_re DECIMAL (10, 8),
c_im DECIMAL (10, 8),
z_re DECIMAL (10, 8) DEFAULT 0,
z_im DECIMAL (10, 8) DEFAULT 0,
znew_re DECIMAL (10, 8) DEFAULT 0,
znew_im DECIMAL (10, 8) DEFAULT 0,
steps INT DEFAULT 0,
active BIT DEFAULT 1,
)

-- Store all the c_re, c_im corresponding to each point in the plot area
-- Generate 640,000 rows (800 X 800)
INSERT INTO dbo.mandelbrot_set (a, b, c_re, c_im, steps)
SELECT a.n as a, b.n as b
,(@r_min + (a.n * @r_step)) AS c_re
,(@i_min + (b.n * @i_step)) AS c_im
,@iter AS steps
FROM
(
SELECT n FROM dbo.Numbers WHERE n <= @width - 1
) as a
CROSS JOIN
(
SELECT n FROM dbo.Numbers WHERE n <= @height - 1
) as b;

-- Iteration
WHILE (@iter > 1)
BEGIN

UPDATE dbo.mandelbrot_set
SET
znew_re = POWER(z_re,2)-POWER(z_im,2)+c_re,
znew_im = 2*z_re*z_im+c_im,
steps = steps-1
WHERE active=1;

UPDATE dbo.mandelbrot_set
SET
z_re=znew_re,
z_im=znew_im,
active= CASE
WHEN POWER(znew_re,2)+POWER(znew_im,2)>4 THEN 0
ELSE 1
END
WHERE active=1;

SET @iter = @iter - 1;
END

-- Generating PPM File
-- Save the below query results to a file with extension .ppm
-- NOTE : All the unwanted info like 'rows affected', 'completed time' etc. needs to be
-- removed from the file. Most of the image editing softwares and online viewers can display the .ppm file
SELECT 'P3' UNION ALL
SELECT CAST(@width AS VARCHAR(5)) + ' ' + CAST(@height AS VARCHAR(5)) UNION ALL
SELECT '255' UNION ALL
SELECT
STRING_AGG(CAST(CASE WHEN active = 1 THEN 0 ELSE 55 + steps % 200 END AS VARCHAR(10)) + ' ' -- R
+ CAST(CASE WHEN active = 1 THEN 0 ELSE 55+POWER(steps,3) % 200 END AS VARCHAR(10)) + ' ' -- G
+ CAST(CASE WHEN active = 1 THEN 0 ELSE 55+ POWER(steps,2) % 200 END AS VARCHAR(10)) -- B
, ' ') WITHIN GROUP (ORDER BY c_re, c_im)
FROM dbo.mandelbrot_set
GROUP BY c_re, c_im;
</syntaxhighlight>

'''OUTPUT'''
[[File:Mandelbrot set transact-sql.png|thumb]]


=={{header|TXR}}==
=={{header|TXR}}==