{"version":9,"randomSeed":"7fde73130a04aa8921b1047a140ae75c","graph":{"viewport":{"xmin":-1.391121092613557,"ymin":-1.0940173170747751,"xmax":1.4770766171591319,"ymax":0.8934245421840463},"showGrid":false},"expressions":{"list":[{"type":"folder","id":"61","title":"library of useful functions","collapsed":true},{"type":"text","id":"62","folderId":"61","text":"project, R^3 -> R^2"},{"type":"expression","id":"63","folderId":"61","color":"#2d70b3","latex":"P\\left(v\\right)=\\frac{\\left(v\\left[1\\right],v\\left[2\\right]\\right)}{v\\left[3\\right]}"},{"type":"text","id":"64","folderId":"61","text":"dot product, R^n -> R^n -> R"},{"type":"expression","id":"65","folderId":"61","color":"#c74440","latex":"D\\left(u,v\\right)=\\sum_{k=1}^{\\min\\left(\\operatorname{length}\\left(u\\right),\\operatorname{length}\\left(v\\right)\\right)}u\\left[k\\right]v\\left[k\\right]"},{"type":"text","id":"66","folderId":"61","text":"cross product, R^3 -> R^3"},{"type":"expression","id":"67","folderId":"61","color":"#388c46","latex":"C\\left(u,v\\right)=\\left[u\\left[2\\right]v\\left[3\\right]-u\\left[3\\right]v\\left[2\\right],u\\left[3\\right]v\\left[1\\right]-u\\left[1\\right]v\\left[3\\right],u\\left[1\\right]v\\left[2\\right]-u\\left[2\\right]v\\left[1\\right]\\right]"},{"type":"text","id":"68","folderId":"61","text":"normalise vector, R^n -> R^n"},{"type":"expression","id":"69","folderId":"61","color":"#6042a6","latex":"N\\left(v\\right)=\\frac{v}{\\sqrt{D\\left(v,v\\right)}}"},{"type":"text","id":"70","folderId":"61","text":"insert element as replacement, R^n -> N -> {R, R^2} -> R^n"},{"type":"expression","id":"71","folderId":"61","color":"#2d70b3","latex":"I\\left(L,i,x\\right)=\\left\\{i=1:\\operatorname{join}\\left(x,L\\left[2...\\right]\\right),i=\\operatorname{length}\\left(L\\right):\\operatorname{join}\\left(L\\left[1...\\operatorname{length}\\left(L\\right)-1\\right],x\\right),\\operatorname{join}\\left(L\\left[1...i-1\\right],x,L\\left[i+1...\\right]\\right)\\right\\}"},{"type":"text","id":"72","folderId":"61","text":"rotate around each axis, R^3 -> R^3"},{"type":"expression","id":"73","folderId":"61","color":"#2d70b3","latex":"R_{x}\\left(v,\\theta\\right)=\\left[v\\left[1\\right],v\\left[2\\right]\\cos\\theta-v\\left[3\\right]\\sin\\theta,v\\left[2\\right]\\sin\\theta+v\\left[3\\right]\\cos\\theta\\right]"},{"type":"expression","id":"74","folderId":"61","color":"#388c46","latex":"R_{y}\\left(v,\\theta\\right)=\\left[v\\left[1\\right]\\cos\\theta-v\\left[3\\right]\\sin\\theta,v\\left[2\\right],v\\left[1\\right]\\sin\\theta+v\\left[3\\right]\\cos\\theta\\right]"},{"type":"expression","id":"75","folderId":"61","color":"#6042a6","latex":"R_{z}\\left(v,\\theta\\right)=\\left[v\\left[1\\right]\\cos\\theta-v\\left[2\\right]\\sin\\theta,v\\left[1\\right]\\sin\\theta+v\\left[2\\right]\\cos\\theta,v\\left[3\\right]\\right]"},{"type":"folder","id":"46","title":"various surface parametrics"},{"type":"text","id":"132","folderId":"46","text":"Gabriel's horn"},{"type":"expression","id":"47","folderId":"46","color":"#388c46","latex":"f_{gh}\\left(p\\right)=\\left[p.y-3,\\frac{1}{p.y}\\cos\\left(p.x\\right),-\\frac{1}{p.y}\\sin\\left(p.x\\right)\\right]"},{"type":"text","id":"134","folderId":"46","text":"torus"},{"type":"expression","id":"48","folderId":"46","color":"#6042a6","latex":"f_{tor}\\left(p\\right)=\\left[\\left(3+\\cos\\left(p.y\\right)\\right)\\sin\\left(p.x\\right),-3+\\sin\\left(p.y\\right),\\left(3+\\cos\\left(p.y\\right)\\right)\\cos\\left(p.x\\right)\\right]"},{"type":"text","id":"136","folderId":"46","text":"sphere"},{"type":"expression","id":"49","folderId":"46","color":"#000000","latex":"f_{sph}\\left(p\\right)=\\left[\\cos\\left(p.x\\right)\\sin\\left(p.y\\right),\\sin\\left(p.x\\right)\\sin\\left(p.y\\right),\\cos\\left(p.y\\right)\\right]"},{"type":"text","id":"138","folderId":"46","text":"cone"},{"type":"expression","id":"53","folderId":"46","color":"#c74440","latex":"f_{cone}\\left(p\\right)=\\left[p.y\\cos\\left(p.x\\right),1-2p.y,p.y\\sin\\left(p.x\\right)\\right]"},{"type":"text","id":"140","folderId":"46","text":"weird spherey thing"},{"type":"expression","id":"59","folderId":"46","color":"#c74440","latex":"f_{cap}\\left(p\\right)=\\left[\\cos\\left(p.x\\right)\\sin\\left(p.y\\right),\\left\\{p.y\\le\\frac{\\pi}{2}:\\cos\\left(p.y\\right),\\frac{\\pi}{2}<p.y<\\frac{3}{2}\\pi:\\frac{\\pi}{2}-p.y,\\frac{3}{2}\\pi<p.y:\\cos\\left(p.y\\right)-\\frac{2}{2}\\pi\\right\\},\\sin\\left(p.x\\right)\\sin\\left(p.y\\right)\\right]"},{"type":"text","id":"142","folderId":"46","text":"plot y = f(x, z)"},{"type":"expression","id":"81","folderId":"46","color":"#c74440","latex":"f_{plot}\\left(p\\right)=\\left[p.x,3\\cos\\left(1.5\\left(p.x+T\\right)\\right)\\cos\\left(1.5p.y\\right)e^{\\frac{-p.x^{2}-p.y^{2}}{8}},p.y\\right]"},{"type":"text","id":"144","folderId":"46","text":"sphere (with projective plane angles)"},{"type":"expression","id":"93","folderId":"46","color":"#c74440","latex":"f_{psph}\\left(p\\right)=\\left[\\frac{2p.x}{p.x^{2}+p.y^{2}+1},\\frac{p.x^{2}+p.y^{2}-1}{p.x^{2}+p.y^{2}+1},\\frac{2p.y}{p.x^{2}+p.y^{2}+1}\\right]"},{"type":"text","id":"147","folderId":"46","text":"bilinear patch"},{"type":"expression","id":"95","folderId":"46","color":"#2d70b3","latex":"L\\left(a,b,t\\right)=a+t\\left(b-a\\right)"},{"type":"expression","id":"94","folderId":"46","color":"#c74440","latex":"f_{blp}\\left(p\\right)=\\left[p.x,L\\left(L\\left(-0.5,1,p.x\\right),L\\left(-1,1.5,p.x\\right),p.y\\right),p.y\\right]"},{"type":"text","id":"149","folderId":"46","text":"\"cylinder\" of an arbitrary curve"},{"type":"expression","id":"96","folderId":"46","color":"#c74440","latex":"f_{scyl}\\left(p\\right)=\\left[0,\\sin\\left(2p.x\\right),p.x\\right]+p.y\\cdot\\left[-1,0,0\\right]"},{"type":"text","id":"151","folderId":"46","text":"\"Pringle\" (hyperbolic paraboloid)"},{"type":"expression","id":"130","folderId":"46","color":"#2d70b3","latex":"f_{prn}\\left(p\\right)=\\left[p.x\\cdot\\cos\\left(p.y\\right),\\left(p.x\\cdot\\cos\\left(p.y\\right)\\right)^{2}-\\left(p.x\\cdot\\sin\\left(p.y\\right)\\right)^{2},p.x\\cdot\\sin\\left(p.y\\right)\\right]"},{"type":"text","id":"153","folderId":"46","text":"logical AND, continuously extended"},{"type":"expression","id":"154","folderId":"46","color":"#2d70b3","latex":"f_{and}\\left(p\\right)=\\left[p.x,2\\left(\\frac{1}{2}p.x+\\frac{1}{2}\\right)\\cdot\\left(\\frac{1}{2}p.y+\\frac{1}{2}\\right),p.y\\right]"},{"type":"text","id":"156","folderId":"46","text":"inscribed rectangle surface"},{"type":"expression","id":"158","folderId":"46","color":"#388c46","latex":"c_{is}\\left(x\\right)=\\left(\\cos x,\\sin x\\right)"},{"type":"expression","id":"157","folderId":"46","color":"#2d70b3","latex":"f_{cur}\\left(t\\right)=c_{is}\\left(4\\pi t\\right)"},{"type":"expression","id":"159","folderId":"46","color":"#6042a6","latex":"f_{irp}\\left(p\\right)=\\left[\\operatorname{midpoint}\\left(f_{cur}\\left(p.x\\right),f_{cur}\\left(p.y\\right)\\right).x,\\operatorname{distance}\\left(f_{cur}\\left(p.x\\right),f_{cur}\\left(p.y\\right)\\right),\\operatorname{midpoint}\\left(f_{cur}\\left(p.x\\right),f_{cur}\\left(p.y\\right)\\right).y\\right]"},{"type":"expression","id":"92","folderId":"46","color":"#2d70b3","latex":"T=0.119","slider":{"hardMin":true,"hardMax":true,"animationPeriod":11428.57142857143,"loopMode":"LOOP_FORWARD","min":"0","max":"\\frac{2}{3}\\pi"}},{"type":"folder","id":"77","title":"rotation setup","collapsed":true},{"type":"expression","id":"78","folderId":"77","color":"#2d70b3","latex":"\\alpha=-0.364","slider":{"hardMin":true,"hardMax":true,"min":"-2\\pi","max":"2\\pi"}},{"type":"expression","id":"79","folderId":"77","color":"#388c46","latex":"\\beta=-0.567","slider":{"hardMin":true,"hardMax":true,"min":"-\\pi","max":"\\pi"}},{"type":"expression","id":"80","folderId":"77","color":"#fa7e19","latex":"\\left(\\alpha,\\beta\\right)"},{"type":"text","id":"26","text":"function to map 2D points into 3D points on the surface"},{"type":"expression","id":"13","color":"#c74440","latex":"f\\left(p\\right)=\\left[0,0,8\\right]+R_{x}\\left(R_{y}\\left(f_{plot}\\left(p\\right),\\alpha\\right),\\beta\\right)"},{"type":"text","id":"28","text":"number of polygons around each dimension"},{"type":"expression","id":"14","color":"#2d70b3","latex":"n_{x}=32","slider":{"hardMin":true,"min":"1","step":"1"}},{"type":"expression","id":"15","color":"#388c46","latex":"n_{y}=32","slider":{"hardMin":true,"hardMax":true,"min":"1","max":"100","step":"1"}},{"type":"text","id":"88","text":"width (in input space) of the full surface along each dimension"},{"type":"expression","id":"89","color":"#2d70b3","latex":"w_{x}=8","slider":{"hardMin":true,"min":"0"}},{"type":"expression","id":"90","color":"#388c46","latex":"w_{y}=8","slider":{"hardMin":true,"min":"0"}},{"type":"text","id":"30","text":"list of 2D points to sample"},{"type":"expression","id":"16","color":"#6042a6","latex":"J=\\left[\\left(i,j\\right)\\operatorname{for}i=w_{x}\\cdot\\left[0,\\frac{1}{n_{x}},\\frac{2}{n_{x}}...,\\frac{n_{y}-1}{n_{y}}\\right]-\\frac{w_{x}}{2},j=w_{y}\\cdot\\left[0,\\frac{1}{n_{y}},\\frac{2}{n_{y}}...,\\frac{n_{y}-1}{n_{y}}\\right]-\\frac{w_{y}}{2}\\right]","hidden":true},{"type":"text","id":"32","text":"vertices of surface approximation"},{"type":"expression","id":"17","color":"#000000","latex":"\\left[P\\left(f\\left(z\\right)\\right)\\operatorname{for}z=J\\right]","hidden":true},{"type":"text","id":"34","text":"increment to approximate normals"},{"type":"expression","id":"18","color":"#c74440","latex":"h=0.0001","slider":{"hardMin":true,"hardMax":true,"min":"0","max":"1"}},{"type":"text","id":"36","text":"lighting magnitude"},{"type":"expression","id":"20","color":"#388c46","latex":"M=\\left[\\max\\left(0,D\\left(-N\\left(C\\left(f\\left(z+\\left(h,0\\right)\\right)-f\\left(z\\right),f\\left(z+\\left(0,h\\right)\\right)-f\\left(z\\right)\\right)\\right),N\\left(\\left[1,1,-1\\right]\\right)\\right)\\right)\\operatorname{for}z=J\\right]"},{"type":"text","id":"38","text":"colours"},{"type":"expression","id":"21","color":"#6042a6","latex":"W=\\operatorname{sort}\\left(\\left[\\operatorname{rgb}\\left(96+160c,96+160c,96+160c\\right)\\operatorname{for}c=M\\right],\\left[-f\\left(z\\right)\\left[3\\right]\\operatorname{for}z=J\\right]\\right)"},{"type":"text","id":"40","text":"polygon list"},{"type":"expression","id":"22","color":"#000000","latex":"G=\\left[\\operatorname{polygon}\\left(P\\left(f\\left(z\\right)\\right),P\\left(f\\left(z+\\left(\\frac{w_{x}}{n_{x}},0\\right)\\right)\\right),P\\left(f\\left(z+\\left(\\frac{w_{x}}{n_{x}},\\frac{w_{y}}{n_{y}}\\right)\\right)\\right),P\\left(f\\left(z+\\left(0,\\frac{w_{y}}{n_{y}}\\right)\\right)\\right)\\right)\\operatorname{for}z=J\\right]","hidden":true,"fill":false,"colorLatex":"R","fillOpacity":"1"},{"type":"text","id":"84","text":"shuffled rainbow"},{"type":"expression","id":"85","color":"#6042a6","latex":"R=\\operatorname{shuffle}\\left(\\left[\\operatorname{hsv}\\left(k,1,1\\right)\\operatorname{for}k=\\left[0,0.5...360\\right]\\right]\\right)"},{"type":"text","id":"51","text":"background"},{"type":"expression","id":"52","color":"#2d70b3","latex":"x\\le x+1","lines":false,"fillOpacity":"1"},{"type":"text","id":"42","text":"z-sorted polygon list"},{"type":"expression","id":"23","color":"#c74440","latex":"H=\\operatorname{sort}\\left(G,\\left[-f\\left(z\\right)\\left[3\\right]\\operatorname{for}z=J\\right]\\right)","lines":false,"colorLatex":"W","fillOpacity":"1"},{"type":"text","id":"44","text":"surface normals"},{"type":"expression","id":"24","color":"#fa7e19","latex":"\\left[\\operatorname{polygon}\\left(P\\left(f\\left(z\\right)\\right),P\\left(f\\left(z\\right)+0.1N\\left(-C\\left(f\\left(z+\\left(h,0\\right)\\right)-f\\left(z\\right),f\\left(z+\\left(0,h\\right)\\right)-f\\left(z\\right)\\right)\\right)\\right)\\right)\\operatorname{for}z=J\\right]","hidden":true}]}}