Skip to content

Instantly share code, notes, and snippets.

@soumitradev
Last active January 7, 2020 18:00
Show Gist options
  • Save soumitradev/433ddc1f196ba04ed7e30c8b0c13c7b6 to your computer and use it in GitHub Desktop.
Save soumitradev/433ddc1f196ba04ed7e30c8b0c13c7b6 to your computer and use it in GitHub Desktop.
This script draws a scene using the package Luxor.jl. I have drawn a snowy landscape that looks simple at first, but uses complex features of Luxor.jl to add attention to detail.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Drawing a scene using Luxor.jl\n",
"\n",
"This script draws a scene using the package [Luxor.jl](https://github.com/JuliaGraphics/Luxor.jl). I have drawn a snowy landscape that looks simple at first, but uses complex features of Luxor.jl to add attention to detail.\n",
"\n",
"![](https://i.imgur.com/82ypriS.png)\n",
"\n",
"**Disclaimer:** I have **_very_** bad choice of color, and this shows especially in the part where we render the house. Any help relating to fix that eyesore of a house is always welcome. I'm sorry you have to see this house for now XD.\n",
"\n",
"## Background\n",
"To describe my image, I have used layers to add depth to the scene. In the background I have used a gradient color — or as Luxor calls it, a `blend` — for the sky, and have used circles for the moon and stars. Still in the background, but not quite the foreground, I have drawn coniferous trees by defining a function `generate_trees()` that takes in the following parameters listed in order:\n",
"- **`treex`**: Specifies the x-coordinate of the topmost part of the tree\n",
"- **`treey`**: Specifies the y-coordinate of the topmost part of the tree\n",
"- **`size`**: Specifies the size of the tree (arbitrary number, not pixels)\n",
"- **`hue`**: Color or `hue` of the tree\n",
"- **`snow`**: Specifies if the tree has snow on top (default = false)\n",
"\n",
"Then, I used Perlin noise to generate a smooth randomness between the sizes of the trees. [This blogpost](https://cormullion.github.io/blog/2018/10/16/noise.html) by Cormullion really helped. I used the same Perlin Noise to generate a `Bezier Curve` for the topmost part of the snow-covered ground for the trees.\n",
"I covered the rest of the ground using a `rect` or `box`.\n",
"\n",
"## Foreground\n",
"In the foreground, I again used Perlin Noise to generate the terrain on which the house lies, generated a `Bezier Curve`, and covered the rest of the ground using a `rect` or a `box`.\n",
"\n",
"For the house, I again defined a function purely for aesthetical and readability purposes since there was too much code in one cell.\n",
"\n",
"The function `generate_house()` takes in `x` and `y` signifying the x and y coordinates of the house respectively.\n",
"\n",
"I used **lots** of polygons to make the house, and made another one above the previous one for a slightly darker edge stroke to each polygon.\n",
"\n",
"For the house walls, I used a custom color since the colors in the palette were not looking all that great on the house. Since the house is done so poorly, I feel a pressing need to specify that the roof of the house is white due to the accumulation of snow over it.\n",
"\n",
"For the windows and chimney, I used polygons (again), but for the window frames, I used lines. I used a **t h i c c** bezier curve for the smoke, and reduced its opacity. In my opinion, the smoke _could_ be made using a brush made up of beziers, but it seemed like to much work for very little benefit.\n",
"\n",
"Again, I added some snow-covered trees in the foreground (which look _very_ \"South Park\" by the way), and added another layer of snow-covered land using a bezier curve made from a large triangle which is partially offscreen.\n",
"\n",
"Finally, after ~9 hours of continuous testing, coding, looking through docs, drawing beziers, and punching numbers on my calculator, this drawing was done.\n",
"\n",
"Comments are added througout the code explaining what each block of code does. I have not added markdown over every cell since most of the magic happens in one cell, while the others are just there for good organisation.\n",
"\n",
"## References & Thanks\n",
"HUGE thanks to docs and package of course, it is amazing how much work has gone into them and how extensive both the docs and the package are.\n",
"Repo of Package: https://github.com/JuliaGraphics/Luxor.jl\n",
"\n",
"Thanks to the [Blogpost](https://cormullion.github.io/blog/2018/10/16/noise.html) by [Cormullion](https://github.com/cormullion)."
]
},
{
"cell_type": "code",
"execution_count": 1073,
"metadata": {},
"outputs": [],
"source": [
"using Luxor"
]
},
{
"cell_type": "code",
"execution_count": 1074,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"generate_tree (generic function with 2 methods)"
]
},
"execution_count": 1074,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function generate_tree(treex, treey, size, hue, snow = false)\n",
"# Set color and opacity\n",
" setopacity(1)\n",
" sethue(hue)\n",
"# Decide number of triangles to draw for tree depending on size\n",
" for i in 1:round(size/4, digits = 0)+ 3\n",
"# Decide position of each triangle\n",
" pointa = Point(treex, treey + (size+1)*i)\n",
"# Draw triangle\n",
" ngonside(pointa, size*i, 3, pi/6, :fill)\n",
" end\n",
"# If tree is snow-covered, then render the two top triangles as white.\n",
"# This is placed after the loop since other triangles draw over the first 2 in the loop, and make it look weird.\n",
" if (snow)\n",
" setopacity(1)\n",
" sethue(\"snow\")\n",
" ngonside(Point(treex, treey + (size+1)*1), size, 3, pi/6, :fill)\n",
" ngonside(Point(treex, treey + (size+1)*2), size*2, 3, pi/6, :fill)\n",
" end\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 1075,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"generate_house (generic function with 1 method)"
]
},
"execution_count": 1075,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function generate_house(x, y)\n",
" \n",
"# Setup\n",
" setopacity(1)\n",
" \n",
"# Draw polygon on the left (left side of house, below the snowy roof)\n",
" sethue(0.7451, 0.5882, 0.549)\n",
" poly([Point(x-157, y+60), Point(x-86, y+50), Point(x-87, y+99), Point(x-157, y+103)], close = true, :fill)\n",
" sethue(0.6588, 0.4745, 0.4431)\n",
" poly([Point(x-157, y+60), Point(x-86, y+50), Point(x-87, y+99), Point(x-157, y+103)], close = true, :stroke)\n",
" \n",
"# Draw the front of the house (Pentagon shaped face)\n",
" sethue(0.7451, 0.5882, 0.549)\n",
" poly([Point(x-86, y+50), Point(x-87, y+99), Point(x+44, y+103), Point(x+42, y+53), Point(x-11, y-41)], close = true, :fill)\n",
" sethue(0.6588, 0.4745, 0.4431)\n",
" poly([Point(x-86, y+50), Point(x-87, y+99), Point(x+44, y+103), Point(x+42, y+53), Point(x-11, y-41)], close = true, :stroke)\n",
" \n",
"# Draw the snowy roof\n",
" sethue(\"snow\")\n",
" poly([Point(x-157, y+60), Point(x-86, y+50), Point(x-11, y-41), Point(x-116, y+11)], close = true, :fill)\n",
" sethue(\"snow2\")\n",
" poly([Point(x-157, y+60), Point(x-86, y+50), Point(x-11, y-41), Point(x-116, y+11)], close = true, :stroke)\n",
" \n",
"# Draw the chimney\n",
" sethue(0.7451, 0.5882, 0.549)\n",
" poly([Point(x-114, y+20), Point(x-90, y+20), Point(x-89, y-45), Point(x-106, y-40)], close = true, :fill)\n",
" sethue(0.6588, 0.4745, 0.4431)\n",
" poly([Point(x-114, y+20), Point(x-90, y+20), Point(x-89, y-45), Point(x-106, y-40)], close = true, :stroke)\n",
" \n",
"# Generate the bezier for the smoke and draw it\n",
" sethue(\"whitesmoke\")\n",
" setline(20)\n",
" setopacity(0.2)\n",
" drawbezierpath(makebezierpath([Point(x-100, y-45), Point(x-80, y-50), Point(x-130, y-80), Point(x-30, y-132), Point(x-100, y-200)]), close = false, :stroke)\n",
" \n",
"# Reset to original stroke properties after drawing smoke\n",
" setopacity(1)\n",
" setline(1)\n",
" \n",
"# Draw Windows\n",
"# Draw left most window\n",
" sethue(\"gold\")\n",
" poly([Point(x-150, y+87), Point(x-130, y+85), Point(x-131, y+61), Point(x-150, y+64)], close = true, :fill)\n",
" sethue(\"tan4\")\n",
" poly([Point(x-150, y+87), Point(x-130, y+85), Point(x-131, y+61), Point(x-150, y+64)], close = true, :stroke)\n",
" line(Point(x-140, y+85), Point(x-141, y+63), :stroke)\n",
" line(Point(x-130.5, y+73), Point(x-150, y+76), :stroke)\n",
" \n",
"# Draw the window to the immediate right of the leftmost window\n",
" sethue(\"gold\")\n",
" poly([Point(x-117, y+82), Point(x-97, y+80), Point(x-97, y+56), Point(x-117, y+59)], close = true, :fill)\n",
" sethue(\"tan4\")\n",
" poly([Point(x-117, y+82), Point(x-97, y+80), Point(x-97, y+56), Point(x-117, y+59)], close = true, :stroke)\n",
" line(Point(x-107, y+80), Point(x-108, y+57), :stroke)\n",
" line(Point(x-117, y+71), Point(x-97, y+69), :stroke)\n",
" \n",
"# Draw the window next to the door\n",
" sethue(\"gold\")\n",
" poly([Point(x, y+90), Point(x+30, y+90), Point(x+30, y+55), Point(x, y+53)], close = true, :fill)\n",
" sethue(\"tan4\")\n",
" poly([Point(x, y+90), Point(x+30, y+90), Point(x+30, y+55), Point(x, y+53)], close = true, :stroke)\n",
" line(Point(x, y+72), Point(x+30, y+73), :stroke)\n",
" line(Point(x+15, y+54), Point(x+15, y+90), :stroke)\n",
" \n",
"# Draw the circular window above the door\n",
" sethue(\"gold\")\n",
" circle(x-15, y+10, 12, :fill)\n",
" sethue(\"tan4\")\n",
" circle(x-15, y+10, 12, :stroke)\n",
" line(Point(x-27, y+10), Point(x-3, y+10), :stroke)\n",
" line(Point(x-15, y+22), Point(x-15, y-2), :stroke)\n",
" \n",
"# Draw the door \n",
" setopacity(0.3)\n",
" sethue(\"tan3\")\n",
" poly([Point(x-61, y+100), Point(x-30, y+100.8), Point(x-29, y+48), Point(x-60, y+48)], close = true, :fill)\n",
" setopacity(0.4)\n",
" sethue(\"tan4\")\n",
" poly([Point(x-61, y+100), Point(x-30, y+100.8), Point(x-29, y+48), Point(x-60, y+48)], close = true, :stroke)\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 1076,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Setup drawing\n",
"Drawing(600, 314, \"Scene.png\")\n",
"# Set current point to origin\n",
"origin()\n",
"\n",
"# Set up the sky\n",
"nightsky = blend(Point(0, -300), Point(0, 230), \"midnightblue\", \"steelblue2\")\n",
"setblend(nightsky)\n",
"box(O, 600, 314, :fill)\n",
"\n",
"# Draw the stars\n",
"sethue(\"grey100\")\n",
"circle(-136, -78, 1, :fill)\n",
"circle(-26, -88, 1, :fill)\n",
"circle(120, -117, 1, :fill)\n",
"\n",
"# Draw moon\n",
"sethue(\"white\")\n",
"setopacity(0.8)\n",
"circle(200, -100, 20, :fill)\n",
"\n",
"# Generate size noise for trees\n",
"size = noise.(range(0, 5, length=10), detail = 10, persistence = 0)\n",
"\n",
"# Generate new noise for ground on which house lies\n",
"yfore = noise.(range(4, 8, length=10), detail = 10, persistence = 0)\n",
"\n",
"# Process ground noise to an array of points, and get array of lowest y-coordinate of noise (we draw the rect using this)\n",
"y_fore = .-(20, 70*yfore)\n",
"# Generate the Points, and put them in an array (WARNING: LOTS of Arbitrary constants)\n",
"gpointa = Point.(-370 .+ 70*collect(1:10), y_fore[collect(1:10)] .+ (yfore[collect(1:10)]*4 .+ 12)*8.2)\n",
"# Get array of y-coordinates of noise\n",
"abcd = map(x -> x.y , gpointa)\n",
"\n",
"# Process tree size noise to an array of points, and get array of lowest y-coordinate of noise (we draw the ground using this)\n",
"y_pos = .-(-10, 50*size)\n",
"# Generate the Points, and put them in an array (WARNING: LOTS of arbitrary constants)\n",
"gpoint = Point.(-330 .+ 60*collect(1:10), y_pos[collect(1:10)] .+ (size[collect(1:10)]*4 .+ 10)*8.2)\n",
"# Get array of y-coordinates of noise\n",
"abc = map(x -> x.y , gpoint)\n",
"\n",
"# Add drawing endpoints to make Bezier cover a large chunk of ground without needing the rect (Background terrain)\n",
"push!(gpoint, Point(400, gpoint[end].y), Point(301, 158), Point(-301, 158), Point(-350, gpoint[1].y))\n",
"# Add drawing endpoints to make Bezier cover a large chunk of ground without needing the rect (House terrain)\n",
"push!(gpointa, Point(400, gpointa[end].y), Point(301, 158), Point(-301, 158), Point(-350, gpointa[1].y))\n",
"\n",
"# Draw trees starting from edge of the screen to the other edge, while using size and position noise.\n",
"for treenum in 1:10\n",
" x = -330 + 60*treenum\n",
" generate_tree(x, -10 - 50*size[treenum], size[treenum]*4 + 10, \"dodgerblue4\")\n",
"end\n",
"\n",
"# Create rect to cover up rest of terrain that Bezier didn't cover by using \n",
"# lowest point of bezier (minimum of noise y-coordinate), But using maximum since values are negative. (Background)\n",
"sethue(\"lavenderblush2\")\n",
"box(Point(-301, maximum(abc)), Point(301, 158), :fill, vertices = false)\n",
"poly(polyfit(gpoint), :fill)\n",
"\n",
"# Create rect to cover up rest of terrain that Bezier didn't cover by using \n",
"# lowest point of bezier (minimum of noise y-coordinate), But using maximum since values are negative. (House Ground)\n",
"sethue(\"lavenderblush1\")\n",
"setopacity(1)\n",
"box(Point(-301, maximum(abcd)), Point(301, 158), :fill, vertices = false)\n",
"poly(polyfit(gpointa), :fill)\n",
"\n",
"# Draw the house with slightly adjusted coordinates\n",
"generate_house(50, -10)\n",
"\n",
"# Draw snow-covered trees next to house without using noise\n",
"generate_tree(250, 20, 11, \"forestgreen\", true)\n",
"generate_tree(210, 70, 9, \"forestgreen\", true)\n",
"generate_tree(150, 30, 12, \"forestgreen\", true)\n",
"\n",
"# Draw terrain closest to viewer using a large triangle partially offscreen\n",
"sethue(\"snow\")\n",
"setopacity(0.9)\n",
"drawbezierpath(makebezierpath([Point(-400, 100), Point(200, 200), Point(-200, 350)]), :fill)\n",
"\n",
"# Draw our final tree in foreground\n",
"generate_tree(-250, -40, 16, \"forestgreen\", true)\n",
"\n",
"\n",
"finish()\n",
"preview()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.2.0",
"language": "julia",
"name": "julia-1.2"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.2.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
MIT License
Copyright (c) 2019 - 2020 Soumitra Shewale (soumitradev)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment