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}}== |