let's talk about Bridgerton tea, my ask is open
𓃗
Sweet Seals For You, Always
Sade Olutola
ojovivo

No title available

titsay
occasionally subtle

No title available
Claire Keane

gracie abrams
"I'm Dorothy Gale from Kansas"

izzy's playlists!
tumblr dot com
Fai_Ryy

Origami Around
EXPECTATIONS

ellievsbear
YOU ARE THE REASON
cherry valley forever
seen from Germany

seen from Malaysia
seen from Malaysia

seen from Singapore
seen from Romania
seen from Czechia
seen from Czechia
seen from United States

seen from United States

seen from Russia
seen from United States
seen from Bangladesh

seen from United States
seen from United States

seen from United States
seen from Bangladesh
seen from Ireland

seen from United Kingdom
seen from Ukraine
seen from United States
@catechesis
2016 Called
The phone rang in January. I didn't recognize the number.
"Hello?" I answered. "Hi Sam," said the voice on the other end. "It's 2016. I was just calling to check in on how you're doing." "Oh, um, hi," I said. "I'm doing pretty well. We had a really good year just now. I got a promotion and we managed to put away some savings. Things are looking really good. Maybe we'll even buy a place this year." "Oh, cool. Let's keep in touch," said the voice. "Sure," I said and I hung up the phone. It rang again in a moment. "By the way, did you hear about Bowie?" "Yeah, I heard about Bowie," I said and hung up again.
The phone rang again, but this time I recognized the number.
"Hey 2106," I said as I picked up the phone. "Hey Sam", said the phone. "How are things?" "Oh, 2016 might be the best year yet. Sarah and I saved and saved and we found a really great agent and we managed to get an offer on a townhouse we liked accepted! I mean, it's still a process ahead, but we got it. It was actually really stressful to get this far. We kept falling in love with places and getting outbid and it was a real rollercoaster of emotions." "Yeah, the LA real estate market is like that." "But the neighborhood is great and we can afford it, so we're really happy," I said. "Okay, can I give you a call back when you close?" "Sure," I said. "Talk to you then." "One more thing. You heard about Alan Rickman, right?" "I'll talk to you when we close."
I hung up the phone and like we discussed it rang again a month later.
"We closed!" I shouted, picking up the phone. "Oh, wow! I'm so happy for you. That's really cool. You're happy with how the year is going?" "Of course," I said. "I mean, there have been some hiccups, but otherwise I'm thrilled." "Great, I'd love to see some pictures of your new place. You should go take pictures and put them on the internet. I bet you'll get so many nice comments." "Oh, yeah. I think I'll do that," I said. "Oh, one more thing. Your aunt is dead."
I checked the caller ID to see if I'd picked up the wrong call. I hadn't.
"I don't understand," I said. "How could that be?" "Well," said the phone, "she finished dinner, went upstairs and shot herself. Just last night. I thought you should know." "I just don't understand," I sobbed. "She's dead?" "She's dead. She left a will that said she didn't want a funeral. Call your other aunt, she can give you the details." "Can't I call her husband?" I asked. "Can't he tell me?" "No, he's in a hospital. He won't be out for a week. Really messed up. She was his everything. No, you need to call your other aunt because when he gets out of the hospital he'll only talk to a couple of people, and only on conference with his lawyer. You can call her, but I'll just tell you now that she doesn't want a funeral either. The thing is that this is your second daughter your grandparents have lost and she doesn't think her dad could bring himself to attend. You wouldn't want to have a secret funeral behind his back, would you?" "I guess not," I say. "Anything else?" "Did you know this is an election year?" "About my aunt, I mean. Can you call if there's going to be a funeral or memorial or anything?"
I hung up the phone and cried for a week. Then the phone rang.
"Is there going to be a funeral?" I asked. "Yes. It's at the military cemetery near Washington's Crossing." "I don't understand why it's there," I said. "Well, your grandpa didn't take the news very well. Did you know that it's possible to die of sadness? Did you know loss can break your heart in a very real sense? Burying two daughters was two daughters too many for him. Let me tell you what's going to happen. There's going to be a funeral on Friday the 13th. It's going to rain. You're going to cry harder than you ever have in your entire life. It's going to hurt like you wouldn't believe. You're about to experience pain you didn't even know you could feel. "Your grandmother won't be at the funeral. She doesn't know he's dead. They've already told her twice, but the dementia won't let her remember. Every time they tell her is the first time. The grief she feels is complete and unadulterated. They just celebrated their 65th wedding anniversary. They could keep telling her, but the nursing home staff are people and they see her cry. That's just cruel. You'll see her after the service and she won't know who you are. "But there's a lot to celebrate about his life. Your grandfather was a school principal and a colonel. He was the first one in his family to go to college. He loved learning and fun and fought the school board and also in Korea. He's the one who gave you your sense of humor and your love of puns. His love of jazz is why your aunt played the clarinet and he bought her the one she sent you when you said you wanted to learn. He commissioned your brother as an officer. After this funeral, you're not going be able to get any work done for a month. You'll keep going, but you're going to sit at your desk and stare into space for hours. But that's not going to happen until next week. Right now, you're in a coffee shop. Go cry in the corner. We'll talk again later."
I hung up the phone and sobbed. I didn't want to answer any more calls. But the phone rang when we got home from the funeral.
"What do you want?" I demanded. "Did you notice that your cat is drinking a lot of water ever since the funeral?" "I did notice. Do you know what it is?" I asked. "You're the type of person who's going to take him to the vet anyways, so I'll just tell you. Your cat has diabetes." "Okay. I was afraid you were going to say it was renal failure or something terrible," I said. "That's not until next week," said the voice. "Are you kidding me?" "No, he's going to get really sick. He weighs what, 16 or 17 pounds? Well next weekend he's going to stop eating. Maybe it's just an upset stomach. You won't get worried until Monday when he throws up and it's a lot of bile. He doesn't feel well enough to purr. Don't forget, he's diabetic. He needs his shots. But you can't just give insulin to a cat that's not eating. You're going to have to force feed him sugar paste and electrolytes. He's going to get really weak. He won't be able to use his litter box without help and he'll throw up everything you give him. You're going to cry yourself to sleep every night and wake up every morning afraid that you're going to find him dead in the bathroom. On Friday night he'll make the saddest meow and paw at the side of the bed, but you're afraid he's messy and will ruin the sheets. You'll wonder if maybe he was coming to cuddle one last time and you turned him away and you'll hate yourself and cry some more because he might be dead in the morning." "Why are you doing this to me?" I demanded. "Hey, I'm not magic. I'm not doing this. But don't worry, he's alive on Saturday morning. You need to take him back to the vet. I mean, he goes to the vet every day next week. He'll waive like $700 in bills, but it's expensive. Your vet tells you that he loves your kitty and he wants to see him through this." "Am I going to lose him?" I asked. "Well, I've got a patch through to your vet next Saturday. Here he is, any questions?" "Is Bear dying?" I asked the doctor. "I can't make that call, but Bear is in bad shape. His body turned the sugars into toxins and that just caused a seizure. He's lost about 10 pounds this week." "What are my options?" I couldn't hold the phone steady. "Well, there are some very risky experimental things we can try. Otherwise, we can simply end his suffering." "Well, try those risky things," I said. "I can't think about the other one. I can't say it out loud."
The vet hung up and so did I, but it rang again.
"Hi," I said. "Hey, I just wanted to let you know that next week is rough, but Bear will get better. You'll try the experimental treatments and you'll go buy a St Francis medal and have it blessed and hang it on his collar. The burgers you buy on your way back home are going to drive him nuts and he's going to start eating again." "If this doesn't happen until next week, should I suggest that treatment from the start?" I asked. "No. The vet won't tell you until after it's all over that there's a better than 50% chance they might have killed your kitty. He gets better but he'll weigh 8lbs for a while and have trouble walking. Enjoy your week." "Stop calling me," I said as I hung up. It was June.
The phone was pretty quiet until July. Then it rang.
"Hello?" I asked fearfully. "Hey, have you seen who's running for President this year?" "Oh, good," I said. "I've actually prepared myself for this. There are a couple good people running. I'm excited to vote for them in the primaries." "You won't. You live in the last state to hold a primary. All the good candidates will have dropped out before then." "Is that all you're calling to tell me?" "You should go see your uncle. He's got cancer and he's alive, but you should go see him before the summer ends." "He's had cancer for over a year now. I think this is just too much right now," I said. "I want to go, but I don't know if I can handle it." "I know what you mean. It is too much. I'll have him give you a call, then. I know you'll regret not going for a while. At least the Cubbies are doing okay this year." "Don't get my hopes up about baseball," I said as I hung up.
The phone rang in September. It was a Thursday.
"It's my uncle, isn't it?" I said picking up the phone. "He's moving to hospice." "Can I send him a card?" "You'd better overnight it. He'll pass away on Saturday. Make this one count. Nobody in the family knows how much you love him and you've never told him. Tell him all the things you've always thought and felt and never said. He's the uncle of so much legend, but the uncle of so much true compassion, kindness, and generosity. He's the lynchpin in your family. His funeral will be at the parish where he was an altar boy and the church will be overflowing with people who love him. Hundreds."
I hung up the phone and blocked the number. How about a moratorium on death? The phone rings anyways.
"The Cubs are going to make it to the World Series," said the voice. "I think I know what's going on," I said. "What do you mean?" "You're the Devil. This is some sort of Faustian deal, isn't it? We traded a World Series for everything I've lost," I said. "Everything you've lost? It's only October. Anyways, I didn't say they win." "So you're just calling to add that the Cubs don't win this year?" I asked. "Oh, they win. They'll be down and come back. But guess what odds they have. Also, don't forget about the election next week."
I hung up yet again. I didn't want to be reminded of the election. But then came the 8th and a ringing phone to match.
"Guess who's going to win tonight," I heard.
I hung up the phone and went to sleep. I blocked the number, but the next morning it was a number I didn't recognize.
"Hey," said a familiar voice. "I already know about the election. You don't need to remind me," I said. "Besides, I'm at a movie theater and can't talk." "Election? No, I'm calling because your grandma died an hour ago. Look, I know you're at a movie theater. It's a fancy one that has a bar, right? You should go order a stiff drink. The movie hasn't started yet, you still have time to go cry and scream in the bathroom. When the movie starts, just put your hoodie up and wear those glasses they give you and cry and drink. Go bowling afterwards and drink and throw some balls. It's super therapeutic. "Your grandma's death was really peaceful. I mean, her husband was her life. Sixty-five years, Sam. That's a long marriage. But she was confused and didn't know where he was or where she was. She stopped eating and drinking. But she was calm when she passed. Your aunt was there with her."
Thanksgiving came with a ringing to match.
"Don't talk," I said. "I've got something to say to you. I'm done. It's Thanksgiving. You're awful, but I'm blessed beyond measure. I'm healthy. I have a wife who supports me through thick and thin. She loves me like no other. She's my rock and my fortress. You're a year. You're a marlin. I'll reemerge onshore and rest, perhaps destroyed but not defeated."
sort of reminds me of joy division
Perlin octaves
canvas.perlin, img { max-width: 100%; width: auto; display: block; margin: auto; } canvas.plasma { height: 200px; } .terrain { margin: auto; width: 500px; height: 300px; }
If you recall from the last post, Perlin noise is a function to generate a gradient noise. We can apply frequency and amplitude to it to change its size. We can also move through it in three dimensions to generate a plasma effect. Great, you're all caught up.
If at the end of that post you felt unsatisfied because I talked about terrain generation and then all you got was a little blue orb, or if you thought "what's this about octaves?", then this is the post for you.
I should probably disclose that I don't really know what I'm talking about. I'm not a mathematician or game developer. I'm just a really curious person who likes to dive into the details on things I don't understand. I'm sure there are way more efficient ways to do everything I'm talking about. If you know them, I'd love to hear it. I'm just presenting naive solutions that I stumble upon by reading other blogs, wikis, and trying it out.
Octaves
Last time I ended by mentioning octaves. We're going to talk more about them right now.
If you're not a musician, an octave is the set of eight notes between two tones that are twice (or half) of each other's frequencies 🔊. A4 is a pitch standard that has a frequency of 440Hz. The A above it has a frequency of 880Hz and the one below it is 220Hz. All octaves are 8 notes apart.
An octave in Perlin noise is simply two waveforms that have the same twice/half relationship in frequency. We won't discuss the 6 frequencies in the middle. If you're frustrated by the use of a term whose etymology is actually a number of subdivisions of distance rather than the distance itself, your frustration is outside the scope of this article.
But let's recall what the world looks like for a moment. It's kind of a funny shape and we have a hard time describing it. But generally:
mountains have a high amplitude and low frequency
hills have a medium amplitude and medium frequency
plains have an incredibly low amplitude
And if we look at mountains, they're pretty jagged. They aren't nearly as smooth as a high amplitude/low frequency noise wave. Up close, they have a pretty tiny frequency/amplitude texture. Additionally, they usually have foothills that lead up to them. It's almost like a mountain range is a combination of different wavelengths.
We can effectively add details to very large amplitude waves by adding much smaller amplitude waves to them. This is typically done by repeatedly applying the noise function with halved amplitudes and periods.
In code it might look like this:
function octavewave(x, y, z, octaves, period, amplitude) { var res = 0; for (var i = 0; i < octaves; i++) { res += perlin.noise(x / period, y / period, z / period) * amplitude; period /= 2; amplitude /= 2; } return res; }
So we can take the following waves and sum the values at each point on the x axis...
...and they'll look something like this as they move through space:
Again, it doesn't look like anything in the real world. Fortunately, we can use that nice roughness to show something that at least looks a little bit like fire and embers.
We can generate an octave and use it to vary an HSV color on both hue and color.
var noise = octavewave(perlin, x, y, z, 6, freq, 1) + 1.5; var base = ((y * image.width) + x) * 4; var color = HSVtoRGB((16 + noise*5 -1)/360, 1, 1/ noise / 2) image.data[base] = color.r image.data[base + 1] = color.g image.data[base + 2] = color.b image.data[base + 3] = noise * amp
It's a little messy, but it works nicely.
Three Dimensions
At this point you're probably not terribly pleased with the two dimensional graphs anymore. Yes, you've seen them. Yes, you understand how they work. Let's move on. Let's go from two dimensions to into three.
There's a very useful library called three.js and it makes wireframing a snap. We can use it to create a plane mesh. The plane comes with a bunch of vertices because I can specify that it's an NxN grid. Then we can iterate over those points and set the Y coordinate to the output of the noise function.
If we did this with an octave set, then we can wind up with a rough wireframe like so:
Normally we'd say "TADA" and see each other next post, but I'm actually pretty dissatisfied with this texture. It's waaay to uniform, even with the octaves. If we're primarily concerned with maps and terrains, what part of the world looks like this? Where are the plains? Where would the cities even go?
I'm going to reiterate what I said before about terrain:
mountains have a high amplitude and low frequency
hills have a medium amplitude and medium frequency
plains have an incredibly low amplitude
Mountains should be large, plains should not. If you generate your map using too high of an amplitude, it's all mountains and boring. If you use too low of an amplitude, then everything is flat and boring.
But the world isn't all mountains or plains. It's almost like there are gradients.
What would be great is if we could actually fluctuate the amplitude throughout the grid so that there could be both mountains and plains. If only there were a function we knew about that could generate a gradient over a space...
We can use Perlin noise to find a gradient of amplitudes over the plane. Amplitude should change gradually, so it needs a yuuuge period, but also a decently large amplitude itself (I know, it's turtles all the way down) so that we can wind up with mountains. So for each point on the grid we can do this:
var ampl = perlin.noise(vertex.x / 200, 0, vertex.z / 200) * 150; vertex.y = octavewave(perlin, vertex.x, 0, vertex.z, 8, 100, ampl);
And that will give us something more like real land. Look at how nice the plains are next to the hills. I'd put a city there.
If you liked this or if I'm spreading misinformation, let me know on twitter.
Huge thanks to Zeeshan for proofreading this before I published it. The code is available as a gist
var ampliod = 100; var first = document.getElementById('overlaid-noise'); drawPoints(first, ampliod, ampliod) drawPoints(first, ampliod/2, ampliod/2) drawPoints(first, ampliod/4, ampliod/4) var fourth = document.getElementById('moving-octaves'); var ctx = fourth.getContext('2d'); var fourthZ = 0.5; function animFourth(argument) { requestAnimationFrame(animFourth) fourthZ += 1 ctx.clearRect(0,0, fourth.width, fourth.height) drawOctaveZ(ctx, 256, 100, fourthZ, '#595959'); } requestAnimationFrame(animFourth); var fifth = document.getElementById('fire-noise'); var z = 0; var delta = 2; function animPlasma() { requestAnimationFrame(animPlasma) z += delta; drawPlasma(fifth, 100, 255, z) } requestAnimationFrame(animPlasma); var sixth = document.getElementById('sixth'); var perlin = new ImprovedNoise(); drawTerrain(sixth, function(vertex, i) { vertex.y = octavewave(perlin, vertex.x, 0, vertex.z, 8, 100, 50) })() var seventh = document.getElementById('seventh'); drawTerrain(seventh, function(vertex, i) { var ampl = perlin.noise(vertex.x / 200, 0, vertex.z / 200) * 150; vertex.y = octavewave(perlin, vertex.x, 0, vertex.z, 8, 100, ampl) })() // the rest of these are graphing functions function drawTerrain(container, heightMap) { var worldWidth = 64, worldDepth = 64; var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera( 60, container.clientWidth / container.clientHeight, 1, 20000 ); camera.position.y = 200; camera.position.z = -450 camera.lookAt(scene.position); var geometry = new THREE.PlaneGeometry(500, 500, worldWidth-1, worldDepth-1); geometry.rotateX(- Math.PI/2); geometry.vertices.forEach(heightMap) var mesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({ color: 0x333333, wireframe: true })); scene.add( mesh ); var renderer = new THREE.WebGLRenderer(); renderer.setClearColor( 0xffffff ); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize(container.clientWidth, container.clientHeight); container.appendChild(renderer.domElement); return function animateTerrain() { // requestAnimationFrame(animateTerrain) // scene.rotation.y += 0.1; renderer.render(scene, camera) } } function drawPoints(canvas, freq, amp) { var ctx = canvas.getContext('2d'); var perlin = new ImprovedNoise(); var points = new Array(canvas.width).fill().map(function (_, x) { return perlin.noise(x/freq, 0, 0.5)}); ctx.beginPath(); points.forEach(function (val, i) { ctx.lineTo(i, val * amp + (canvas.height/2)); }); ctx.stroke(); } function drawOctaveZ(ctx, freq, amp, z, color) { var perlin = new ImprovedNoise(); var canvas = ctx.canvas; var points = new Array(canvas.width).fill().map(function (_, x) { return octavewave(perlin, x, 0, z, 8, freq, amp); }); ctx.beginPath(); points.forEach(function (val, i) { ctx.lineTo(i, val + (canvas.height/2)); }); ctx.strokeStyle = color; ctx.stroke(); } function octavewave(perlin, x, y, z, octaves, period, amplitude) { var res = 0; for (var i = 0; i < octaves; i++) { res += perlin.noise(x / period, y / period, z / period) * amplitude; period /= 2; amplitude /= 2; } return res; } function drawPointsZ(ctx, freq, amp, z, color) { var perlin = new ImprovedNoise(); var canvas = ctx.canvas; var points = new Array(canvas.width).fill().map(function (_, x) { return perlin.noise(x/freq, 0, z)}); ctx.beginPath(); points.forEach(function (val, i) { ctx.lineTo(i, val * amp + (canvas.height/2)); }); ctx.strokeStyle = color; ctx.stroke(); } function drawPlasma(canvas, freq, amp, z) { var ctx = canvas.getContext('2d'); var image = ctx.createImageData(canvas.width, canvas.height); var perlin = new ImprovedNoise(); for (var y = 0; y < image.height; y ++) { for (var x = 0; x < image.width; x ++) { var noise = octavewave(perlin, x, y, z, 6, freq, 1) + 1.5; var base = ((y * image.width) + x) * 4; var color = HSVtoRGB((16 + noise*5 -1)/360, 1, 1/ noise / 2) image.data[base] = color.r image.data[base + 1] = color.g image.data[base + 2] = color.b image.data[base + 3] = noise * amp } } ctx.putImageData(image, 0, 0); } // I copied this straight off of StackOverflow // http://stackoverflow.com/a/17243070 function HSVtoRGB(h, s, v) { var r, g, b, i, f, p, q, t; if (arguments.length === 1) { s = h.s, v = h.v, h = h.h; } i = Math.floor(h * 6); f = h * 6 - i; p = v * (1 - s); q = v * (1 - f * s); t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v, g = t, b = p; break; case 1: r = q, g = v, b = p; break; case 2: r = p, g = v, b = t; break; case 3: r = p, g = q, b = v; break; case 4: r = t, g = p, b = v; break; case 5: r = v, g = p, b = q; break; } return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) }; }
Perlin noise
canvas.perlin { display: block; margin: auto; } canvas.plasma { height: 200px; }
Note: the diagrams here require a browser that supports canvases If you're on a mobile browser, they may not show up.
I've been reading about Perlin noise and I think it's an amazing method of generating gradients of colors and terrains. I originally came across it because my friend Bill sent me a link to a procedural map generator. Without driving you away from my own post (except it's way cooler), I'll explain the general map technique briefly.
An area is divided into a number of polygons using a Voronoi diagram and a heightmap is generated using Perlin noise to figure out the elevations of various areas on the map. Although I'm very familiar with Voronoi diagrams and how they're created, I had no idea how heightmaps were created.
What is it?
Perlin noise is an algorithm developed by Ken Perlin in the 1980s that generates what's called gradient noise. Basically, it interpolates points in a pre-set lattice. It can work for any number of dimensions, though we'll use 3 today.
It does this by calculating an n-dimensional grid of points that have somewhat random vectors off of each point, then calculates how each of those vectors "average out" to the input point. It's a little more complicated than that but it's a simple enough explanation for now. The algorithm itself, though, is simple and can be implemented in a couple dozen lines of code.
A key takeaway from this is that the Perlin noise function is not random. The vectors in the grid can be random, but once they're generated the function is completely referentially transparent -- that is, the same inputs will always produce the same outputs.
What does it look like?
We'll take a look at the Perlin noise function in two dimensions, since it's far simpler than three to discuss.
The noise function has a signature of perlin.noise(x, y, z), which takes 3 floats of any size and returns a float between -1 and 1. The input values are the coordinates of a point in three dimensional space: x is horizontal, y is vertical, z is depth.
If we graph the function along the x plane at a fixed y and z, then we'll see how it goes up and down. It looks like the following:
the perlin noise along the x axis
That might not seem very useful, so let's talk about it. Despite seeming a bit random, the output is a wave. It is subject to the same frequency and amplitude transforms that other waves can be subjected to.
The output above has a very high frequency and a very low amplitude.
We can reduce the frequency by multiplying the inputs by a new frequency. Because the frequencies will be quite small, it can sometimes be simpler to divide the inputs by a new period (the inverse of frequency). We can also increase the output by simply multiplying the result by an amplitude.
We can make a much more reasonable looking graph by using
perlin.noise(x/12, y/12, z/12) * 25:
lower frequency, higher amplitude
If we're thinking of this in terms of terrain, that might look like a jagged ridge. If we decrease the frequency by even more, we can create a landscape with smoother rolling hills:
perlin.noise(x/50, y/50, z/50) * 50:
even lower frequency, even higher amplitude
It's important to keep in mind that the graphs we're looking at are at a particular depth in 3-dimensional spaces. We can animate the wave as though it were coming toward us (out of the page) and continue to see how the same slice transforms along the z-axis.
the perlin noise on the x and z axes
Changing dimensions
I write this section with the following disclaimer: I kind of hate this.
By this, I mean the following diagram. Displaying the graph in two dimensions is hard. It's hard to show depth.
Until now, we've been graphing the output of the function as a vertical value along a single axis in the noise. We're going to start showing it in two dimensions. The typical way to do this is to move along both the x and y axes and use lightness and darkness to indicate the variations in the output. It's almost like we're trying to photograph a slice of an infinite smoke cloud.
such a tired, overused graph
Again, this is a slice of the box at a specific z value. Every pixel is black with its opacity adjusted to match the output of the noise. Remember, the output is somewhere between -1 and 1. We can just add 1 to get a range of 0 to 1 then divide by 2, and we have a percentage of opacity for each pixel.
What's much more fun is to move through space with colors.
In addition to the RGBA color scheme you're familiar with, we can also use the HSV (hue, saturation, value) scheme to create a light and dark scheme of shades within a particular color using the output value as the lightness value.
By decreasing the frequency significantly and using an HSV color, we can create a pretty cool plasma effect:
There's a lot more that can be said about the Perlin nois function, but it'll have to wait for other posts. We can talk about octaves and heightmaps then.
The code for this post is available as a github gist
var first = document.getElementById('tiny-noise'); drawPoints(first, 1, 10) var second = document.getElementById('medium-noise'); drawPoints(second, 12, 25) var third = document.getElementById('large-noise'); drawPoints(third, 50, 50) var fourth = document.getElementById('moving-large-noise'); var ctx = fourth.getContext('2d'); var fourthZ = 0.5; function animFourth(argument) { requestAnimationFrame(animFourth) fourthZ += 0.01 ctx.clearRect(0,0, fourth.width, fourth.height) drawPointsZ(ctx, 100, 75, fourthZ, '#595959'); drawPointsZ(ctx, 100, 75, fourthZ + 0.01, '#4d4d4d'); drawPointsZ(ctx, 100, 75, fourthZ + 0.02, '#404040'); drawPointsZ(ctx, 100, 75, fourthZ + 0.03, '#333333'); } requestAnimationFrame(animFourth); var fifth = document.getElementById('static-noise'); var z = 0; var delta = 0.01; drawGrid(fifth, 25, 128); var sixth = document.getElementById('blue-plasma'); var z = 0; var delta = 0.01; function animPlasma() { requestAnimationFrame(animPlasma) z += delta; drawPlasma(sixth, 100, 255, z) } requestAnimationFrame(animPlasma); // the rest of these are graphing functions function drawPoints(canvas, freq, amp) { var ctx = canvas.getContext('2d'); var perlin = new ImprovedNoise(); var points = new Array(canvas.width).fill().map(function (_, x) { return perlin.noise(x/freq, 0, 0.5)}); ctx.beginPath(); points.forEach(function (val, i) { ctx.lineTo(i, val * amp + (canvas.height/2)); }); ctx.stroke(); } function drawPointsZ(ctx, freq, amp, z, color) { var perlin = new ImprovedNoise(); var canvas = ctx.canvas; var points = new Array(canvas.width).fill().map(function (_, x) { return perlin.noise(x/freq, 0, z)}); ctx.beginPath(); points.forEach(function (val, i) { ctx.lineTo(i, val * amp + (canvas.height/2)); }); ctx.strokeStyle = color; ctx.stroke(); } function drawPlasma(canvas, freq, amp, z) { var ctx = canvas.getContext('2d'); var image = ctx.createImageData(canvas.width, canvas.height); var perlin = new ImprovedNoise(); for (var y = 0; y < image.height; y ++) { for (var x = 0; x < image.width; x ++) { var noise = perlin.noise(x/freq, y/freq, z) + 1; var base = ((y * image.width) + x) * 4; var color = HSVtoRGB(195/360, 1, noise / 2) image.data[base] = color.r image.data[base + 1] = color.g image.data[base + 2] = color.b image.data[base + 3] = noise * amp } } ctx.putImageData(image, 0, 0); } function drawGrid(canvas, freq, amp) { var ctx = canvas.getContext('2d'); var image = ctx.createImageData(canvas.width, canvas.height); var perlin = new ImprovedNoise(); for (var y = 0; y < image.height; y ++) { for (var x = 0; x < image.width; x ++) { var noise = perlin.noise(x/freq, y/freq, 0.5) + 1; var base = ((y * image.width) + x) * 4; image.data[base + 3] = noise * amp } } ctx.putImageData(image, 0, 0); } // I copied this straight off of StackOverflow // http://stackoverflow.com/a/17243070 function HSVtoRGB(h, s, v) { var r, g, b, i, f, p, q, t; if (arguments.length === 1) { s = h.s, v = h.v, h = h.h; } i = Math.floor(h * 6); f = h * 6 - i; p = v * (1 - s); q = v * (1 - f * s); t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v, g = t, b = p; break; case 1: r = q, g = v, b = p; break; case 2: r = p, g = v, b = t; break; case 3: r = p, g = q, b = v; break; case 4: r = t, g = p, b = v; break; case 5: r = v, g = p, b = q; break; } return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) }; }
I made a thing
canvas.perlin { width: 500px; height: 200px; }
longer post to follow.
function drawGrid(canvas, freq, amp, z) { var ctx = canvas.getContext('2d'); var image = ctx.createImageData(500, 200); var perlin = new ImprovedNoise(); for (var y = 0; y < image.height; y ++) { for (var x = 0; x < image.width; x ++) { var noise = perlin.noise(x/freq, y/freq, z) + 1; var base = ((y * image.width) + x) * 4; var color = HSVtoRGB(195/360, 1, noise / 2) image.data[base] = color.r image.data[base + 1] = color.g image.data[base + 2] = color.b image.data[base + 3] = noise * amp } } ctx.putImageData(image, 0, 0); } function HSVtoRGB(h, s, v) { var r, g, b, i, f, p, q, t; if (arguments.length === 1) { s = h.s, v = h.v, h = h.h; } i = Math.floor(h * 6); f = h * 6 - i; p = v * (1 - s); q = v * (1 - f * s); t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v, g = t, b = p; break; case 1: r = q, g = v, b = p; break; case 2: r = p, g = v, b = t; break; case 3: r = p, g = q, b = v; break; case 4: r = t, g = p, b = v; break; case 5: r = v, g = p, b = q; break; } return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) }; } var fifth = document.getElementById('fifth'); var z = 0; var delta = 0.01; function animGrid() { requestAnimationFrame(animGrid) z += delta; drawGrid(fifth, 100, 255, z) } requestAnimationFrame(animGrid);
code without keywords
I gave a talk at js.la last night about Church-encoding and writing code with just => functions. The following is a snippet from that. slides
((_void, _if, zero, succ, mult, pred, Y) => ((_true, _false, one) => ((is_zero) => ((factorial, five, native) => native(factorial(five)) )( Y((fact) => (n) => _if(is_zero(n)) (()=> one) (()=> mult(n)(fact(pred(n))))), succ(succ(succ(succ(one)))), (n) => n((x)=> x + 1)(0) ) )((n) => n(()=> _false)(_true)) )( (conseq) => (altern) => conseq(_void), (conseq) => (altern) => altern(_void), succ(zero) ) )( (x) => x, (test) => (conseq) => (altern) => test(conseq)(altern), (f) => (x) => x, (n) => (f) => (z) => f(n(f)(z)), (n) => (m) => (f) => (z) => n(m(f))(z), (n) => (f) => (z) => ((n((g) => (h) => h(g(f))))((u) => z)((x)=>x)), ((f) => (F) => F((x) => f(f)(F)(x)))((f) => (F) => F((x) => f(f)(F)(x))) )
An update on PDP colors
.color { display: inline-block; width: 18%; } .scheme, .selectors { vertical-align: top; margin-right: 40px; padding-top: 10px; }
@cateches TBH after looking at a few of them, it looks like they just group similar registers together. Like banding in a table.
— (mad extra) (@d_run) November 23, 2015
After my last post on PDP colors, I had a little twitter exchange with Darren trying to determine how the bands were determined. I also did some work with a color wheel and noticed some trends in the hsl aspect.
For any given set, I've noticed the following colors:
"anchor" - 60% saturation, 40% lightness
"washed out" - 20% sat, 80% lightness
"grey" - 1% sat, 50% lightness
"dark" - 20% sat, 15% lightness
"bright" - 60% sat, 40% lightness
You can play around with some anchor colors and watch the bands change. Give it a click:
You can also generate your own bands for any given hue with the following:
function getBands(angle) { return [ 'hsl('+angle+',57%,37%)', 'hsl('+angle+',20%,80%)', 'hsl('+angle+',1%,50%)', 'hsl('+angle+',20%,15%)', 'hsl('+angle+',60%,60%)', ]; }
function getBands(angle) { return [ 'hsl('+angle+',57%,37%)', 'hsl('+angle+',20%,80%)', 'hsl('+angle+',1%,50%)', 'hsl('+angle+',20%,15%)', 'hsl('+angle+',60%,60%)', ]; } var children = document.querySelectorAll('.scheme .color'); $('.selectors .color').click(function(e) { var angle = e.target.dataset.angle; getBands(angle).forEach(function(bgc, i) { children.item(i).style.backgroundColor = bgc; }); });
I gave the last talk of the year at Papers We Love LA.
I gave the last talk of the year at js.la in 2015.
Peafowl in Los Angeles.
While this isn’t the first time I’ve encountered feral peacocks in LA, it’s always a surprise. This is the first time I’ve encountered one in my home.
This bird is currently outside my window
That’s probably because I live 20 miles from the nearest feral peafowl population. And yes, I say “nearest” because there are apparently four distinct peafowl populations.
Peacocks are the male peafowl.
From what I can find on Google, peabirds have been in Los Angeles for about 130 years. The initial population was brought over from India in 1880 by Elias “Lucky” Baldwin, an enormously successful businessman and real estate speculator.
At the time, owning a peacock was a status symbol. Bringing a dozen to decorate his vast estate in what is now Arcadia was an obvious decision. To add to the brag factor, they were effective at eliminating pests.
Of course, keeping birds in a non-enclosed area is futile and Arcadia has a population of several hundred.
At some point around 1913, an entirely separate population of was introduced to Palos Verdes as a gift to banker Frank Vanderlip by the Wrigley Family (of gum & Cubs fame).
I guess another fashionable thing of the day was for millionaires to one-up each other in bizzare exotic animal hoarding matches.
There are also two feral populations in Glendora and La Canada-Flintridge that there's no decided theory on why they're there. My theory is that they're birds and migrated from nearby Arcadia.
Further reading:
L.A. Then and Now: Peacocks are one of Arcadia founder's legacies
Wild in the Streets: L.A.'s Feral Peacocks
Who’s Been Killing the Feral Peacocks of Palos Verdes?
Who’s to blame for the ‘Peacock Problem’ in Arcadia…
This Week In Pedantry #1: Rhode Island
Remember when you learned the states in middle school? Your teacher might have been different from mine, but mine would always remind us that the State of Rhode Island is not actually an island.
She was technically correct. The entire State of Rhode Island is not an island.
However, "Rhode Island" is not the full name of the state in question. The smallest state in The Union actually has the longest name: State of Rhode Island and Providence Plantations.
This name makes it sound like the state has a couple parts: an island and some mainland bits. That's pretty much what the state is. Yet Google Maps assured me there is no Rhode Island. It does show a rather large island in the state called "Aquidneck Island". Even Wikipedia has an article about Aquidneck.
So, there's a government agency in charge of keeping track of what things are called. The USGS keeps a registry of all the official names of things. Online, it's called GNIS.
GNIS has an entry for "Rhode Island" (link), classed as "Island", aliased "Aquidneck Island", with a note:
A proposal to change the name Rhode Island to Aquidneck Island was submitted in January 2000. In June 2004, the proposal was rejected by the U.S. Board on Geographic Names (USBGN).
Even though the locals don't call it Rhode, that's its official name.
So yes, the State of Rhode Island is not an island. It does, though, take its name from an island called Rhode Island. So the next time someone tells you that Rhode Island is not an island, you can confidently and smuggly contradict them. Perhaps even start your rebuttal with a firm "well, actually".
Rhode Island is highlighted in red.
As an aside, there are rumors that Rhode Island actually refers to Block Island, the southernmost island in RI. These rumors are false.
This Week in Pedantry is my own little outlet for trivia. Nothing here should be taken seriously. Please don't use the phrase "well, actually"
PDP Colors
.color { display: inline-block; width: 18%; } .scheme { vertical-align: top; margin-right: 40px; padding-top: 10px; }
I wrote a follow up to this here
The color schemes that DEC used on their PDP line was pretty amazing. I got curious about what values they actually used, so I ran a k-means analysis against some of the photos of the front panels on Wikipedia.
Here's the magenta-ish one:
And a couple orange ones:
A blue one:
I might keep updating this with other colors.
I've been writing a cartographic rendering engine lately.
Trains is FNP
There's a game that my family loves called Mexican Train, or just Trains. It's gameplay has fascinated me for some time, driving me to study the mathematics of it.
The Rules
The game is usually played with a double 12 set (91 tiles). Each round is started with a double as the lead for everyone to play off -- 12, 11, 10, etc down to 0.
Each player plays on their own track, with one common track. If you're unable to lay a tile during your turn, you must draw a tile and your track becomes public and anyone may play on it.
The winner runs out of tiles first.
Strategy
A key part of winning is keeping your track private and being able to play on it. The tiles that you can't play on your own track, you'll want to play on other tracks as you can throughout the game.
This presents a problem:
What is the longest chain of tiles that you can play on your own track without being forced public? Can this be determined efficiently?
Generally, as I play, I find myself with tiles that I realize I could have played to make a longer chain, but now are stuck in what I call my "etc" set.
Some Theory
I had a hunch that this is an NP-complete problem -- we can't solve it quickly, but we can verify it quickly -- but I didn't know how to prove it.
My first attempt at solving was the simply treat the set as a Set.
Example:
#{ [8,12] [7,12] [4,9] [3,3] [0,1] [6,10] ... }
If we're starting with the double 12, simply remove all 12s to their own set:
#{ [8,12] [7,12] [9,12] [11,12] }
These are your possible starting points. Take each one and find the dominoes that can pair up agains its other end. In this case, start by finding all the 8s, then recurse and start over.
This gives us a O(n!), which isn't great. In fact, wikipedia lists it as the worst order of common functions.
I firgure mostly I don't know Set Theory, so I don't know the shortcuts that can be taken. Sets mostly seem to be worried about comparing elements, but domino tiles aren't really comparable.
And so, I started looking for papers that had possibly done research in this area. It was hard because I didn't know how to frame my problem. Had I checked wikipedia at this point, I'd have noticed that O(n!) is associated with "Solving the traveling salesman problem", which should have given me a major tip that this is a hard problem.
Some Different Theory
I couldn't tell how Set Theory would help me solve this problem, so I tried to reframe it as a graph. This worked surprisingly well and even helped me find relevant work.
To make is a graph, think of each node as a tile, and the edges between them only exist if two tiles share a number. This graph is necessarily undirected (playing one tile on another works both ways) and possibly cyclical. From this, we'll find a directed, acyclical subgraph and call it a train.
What Does That Mean
Warning: math!
For a double-n set, each number appears on n+1 tiles (remember, 0), so each node/tile has n edges to other nodes for number on it. Doubles have n edges, everything else has n + n.
Visuals always help. This is what that looks like, if the "lead double" is blue:
Drawing 15 random tiles from a set is equivalent to just marking 15 random nodes in a different color. Maybe they connect to the lead, maybe they don't:
That's a little hard to read. We can show the same subgraph by removing all the nodes that arent' marked ours or the lead.
This is actually the same thing as the one above, but with all the nodes that aren't yours missing:
Wrap It Up
If you look at that last graph, it's easy to imagine that there's a way to move from node to node and find a path that doesn't cross any node more than once.
There is, and it's apparently a well known problem in Computer Science called a Hamilton Cycle and the related Hamiltonian Path Problem. The gist is that on some graphs, there is a way to draw a line between all the nodes without crossing any nodes more than once. This can't be done on all graphs (which is fine), but it can tell us the longest path that it was able to draw.
In other words, the core problem of Trains is actually the Hamiltonian Path Problem. It is, in fact, NP complete*, and optimizing a solution below O(n!) is very, very difficult. It can be easily brute-forced pretty quickly for set sizes of 15, but that solution doesn't scale well. (This means my original method of attack was correct)
* It's actually something called FNP, which is essentially NP complete for functions rather than yes-or-no questions.
Afterthoughts
If you have a hard time with Trains, don't feel bad. If you're playing and you think someone is taking too long, keep in mind that they're probably trying to solve a known hard problem in their head.
Be nice. That's good general advice too.
--
code here
var width = 500, height = 281; function doGraph(selector, graph) { var color = d3.scale.category10(); var force = d3.layout.force() .charge(-120) .linkDistance(60) .size([width, height]); var svg = d3.select(selector).append("svg") .attr("width", width) .attr("height", height); force .nodes(graph.nodes) .links(graph.links) .start(); var link = svg.selectAll(".link") .data(graph.links) .enter().append("line") .attr("class", "link") .style("stroke-width", function(d) { return Math.sqrt(d.value); }); var node = svg.selectAll(".node") .data(graph.nodes) .enter().append("circle") .attr("class", "node") .attr("r", 5) .style("fill", function(d) { return color(d.group); }) .call(force.drag); node.append("title") .text(function(d) { return d.name; }); force.on("tick", function() { link.attr("x1", function(d) { return d.source.x; }) .attr("y1", function(d) { return d.source.y; }) .attr("x2", function(d) { return d.target.x; }) .attr("y2", function(d) { return d.target.y; }); node.attr("cx", function(d) { return d.x; }) .attr("cy", function(d) { return d.y; }); }); } doGraph('#graph-set', {"nodes":[{"name":"0,0","group":"2"},{"name":"0,1","group":"1"},{"name":"0,2","group":"1"},{"name":"0,3","group":"1"},{"name":"0,4","group":"1"},{"name":"0,5","group":"1"},{"name":"0,6","group":"1"},{"name":"0,7","group":"1"},{"name":"0,8","group":"1"},{"name":"1,1","group":"1"},{"name":"1,2","group":"1"},{"name":"1,3","group":"1"},{"name":"1,4","group":"1"},{"name":"1,5","group":"1"},{"name":"1,6","group":"1"},{"name":"1,7","group":"1"},{"name":"1,8","group":"1"},{"name":"2,2","group":"1"},{"name":"2,3","group":"1"},{"name":"2,4","group":"1"},{"name":"2,5","group":"1"},{"name":"2,6","group":"1"},{"name":"2,7","group":"1"},{"name":"2,8","group":"1"},{"name":"3,3","group":"1"},{"name":"3,4","group":"1"},{"name":"3,5","group":"1"},{"name":"3,6","group":"1"},{"name":"3,7","group":"1"},{"name":"3,8","group":"1"},{"name":"4,4","group":"1"},{"name":"4,5","group":"1"},{"name":"4,6","group":"1"},{"name":"4,7","group":"1"},{"name":"4,8","group":"1"},{"name":"5,5","group":"1"},{"name":"5,6","group":"1"},{"name":"5,7","group":"1"},{"name":"5,8","group":"1"},{"name":"6,6","group":"1"},{"name":"6,7","group":"1"},{"name":"6,8","group":"1"},{"name":"7,7","group":"1"},{"name":"7,8","group":"1"},{"name":"8,8","group":"1"}],"links":[{"source":0,"target":1,"value":1},{"source":0,"target":2,"value":1},{"source":0,"target":3,"value":1},{"source":0,"target":4,"value":1},{"source":0,"target":5,"value":1},{"source":0,"target":6,"value":1},{"source":0,"target":7,"value":1},{"source":0,"target":8,"value":1},{"source":1,"target":0,"value":1},{"source":1,"target":2,"value":1},{"source":1,"target":3,"value":1},{"source":1,"target":4,"value":1},{"source":1,"target":5,"value":1},{"source":1,"target":6,"value":1},{"source":1,"target":7,"value":1},{"source":1,"target":8,"value":1},{"source":1,"target":9,"value":1},{"source":1,"target":10,"value":1},{"source":1,"target":11,"value":1},{"source":1,"target":12,"value":1},{"source":1,"target":13,"value":1},{"source":1,"target":14,"value":1},{"source":1,"target":15,"value":1},{"source":1,"target":16,"value":1},{"source":2,"target":0,"value":1},{"source":2,"target":1,"value":1},{"source":2,"target":3,"value":1},{"source":2,"target":4,"value":1},{"source":2,"target":5,"value":1},{"source":2,"target":6,"value":1},{"source":2,"target":7,"value":1},{"source":2,"target":8,"value":1},{"source":2,"target":10,"value":1},{"source":2,"target":17,"value":1},{"source":2,"target":18,"value":1},{"source":2,"target":19,"value":1},{"source":2,"target":20,"value":1},{"source":2,"target":21,"value":1},{"source":2,"target":22,"value":1},{"source":2,"target":23,"value":1},{"source":3,"target":0,"value":1},{"source":3,"target":1,"value":1},{"source":3,"target":2,"value":1},{"source":3,"target":4,"value":1},{"source":3,"target":5,"value":1},{"source":3,"target":6,"value":1},{"source":3,"target":7,"value":1},{"source":3,"target":8,"value":1},{"source":3,"target":11,"value":1},{"source":3,"target":18,"value":1},{"source":3,"target":24,"value":1},{"source":3,"target":25,"value":1},{"source":3,"target":26,"value":1},{"source":3,"target":27,"value":1},{"source":3,"target":28,"value":1},{"source":3,"target":29,"value":1},{"source":4,"target":0,"value":1},{"source":4,"target":1,"value":1},{"source":4,"target":2,"value":1},{"source":4,"target":3,"value":1},{"source":4,"target":5,"value":1},{"source":4,"target":6,"value":1},{"source":4,"target":7,"value":1},{"source":4,"target":8,"value":1},{"source":4,"target":12,"value":1},{"source":4,"target":19,"value":1},{"source":4,"target":25,"value":1},{"source":4,"target":30,"value":1},{"source":4,"target":31,"value":1},{"source":4,"target":32,"value":1},{"source":4,"target":33,"value":1},{"source":4,"target":34,"value":1},{"source":5,"target":0,"value":1},{"source":5,"target":1,"value":1},{"source":5,"target":2,"value":1},{"source":5,"target":3,"value":1},{"source":5,"target":4,"value":1},{"source":5,"target":6,"value":1},{"source":5,"target":7,"value":1},{"source":5,"target":8,"value":1},{"source":5,"target":13,"value":1},{"source":5,"target":20,"value":1},{"source":5,"target":26,"value":1},{"source":5,"target":31,"value":1},{"source":5,"target":35,"value":1},{"source":5,"target":36,"value":1},{"source":5,"target":37,"value":1},{"source":5,"target":38,"value":1},{"source":6,"target":0,"value":1},{"source":6,"target":1,"value":1},{"source":6,"target":2,"value":1},{"source":6,"target":3,"value":1},{"source":6,"target":4,"value":1},{"source":6,"target":5,"value":1},{"source":6,"target":7,"value":1},{"source":6,"target":8,"value":1},{"source":6,"target":14,"value":1},{"source":6,"target":21,"value":1},{"source":6,"target":27,"value":1},{"source":6,"target":32,"value":1},{"source":6,"target":36,"value":1},{"source":6,"target":39,"value":1},{"source":6,"target":40,"value":1},{"source":6,"target":41,"value":1},{"source":7,"target":0,"value":1},{"source":7,"target":1,"value":1},{"source":7,"target":2,"value":1},{"source":7,"target":3,"value":1},{"source":7,"target":4,"value":1},{"source":7,"target":5,"value":1},{"source":7,"target":6,"value":1},{"source":7,"target":8,"value":1},{"source":7,"target":15,"value":1},{"source":7,"target":22,"value":1},{"source":7,"target":28,"value":1},{"source":7,"target":33,"value":1},{"source":7,"target":37,"value":1},{"source":7,"target":40,"value":1},{"source":7,"target":42,"value":1},{"source":7,"target":43,"value":1},{"source":8,"target":0,"value":1},{"source":8,"target":1,"value":1},{"source":8,"target":2,"value":1},{"source":8,"target":3,"value":1},{"source":8,"target":4,"value":1},{"source":8,"target":5,"value":1},{"source":8,"target":6,"value":1},{"source":8,"target":7,"value":1},{"source":8,"target":16,"value":1},{"source":8,"target":23,"value":1},{"source":8,"target":29,"value":1},{"source":8,"target":34,"value":1},{"source":8,"target":38,"value":1},{"source":8,"target":41,"value":1},{"source":8,"target":43,"value":1},{"source":8,"target":44,"value":1},{"source":9,"target":1,"value":1},{"source":9,"target":10,"value":1},{"source":9,"target":11,"value":1},{"source":9,"target":12,"value":1},{"source":9,"target":13,"value":1},{"source":9,"target":14,"value":1},{"source":9,"target":15,"value":1},{"source":9,"target":16,"value":1},{"source":10,"target":1,"value":1},{"source":10,"target":2,"value":1},{"source":10,"target":9,"value":1},{"source":10,"target":11,"value":1},{"source":10,"target":12,"value":1},{"source":10,"target":13,"value":1},{"source":10,"target":14,"value":1},{"source":10,"target":15,"value":1},{"source":10,"target":16,"value":1},{"source":10,"target":17,"value":1},{"source":10,"target":18,"value":1},{"source":10,"target":19,"value":1},{"source":10,"target":20,"value":1},{"source":10,"target":21,"value":1},{"source":10,"target":22,"value":1},{"source":10,"target":23,"value":1},{"source":11,"target":1,"value":1},{"source":11,"target":3,"value":1},{"source":11,"target":9,"value":1},{"source":11,"target":10,"value":1},{"source":11,"target":12,"value":1},{"source":11,"target":13,"value":1},{"source":11,"target":14,"value":1},{"source":11,"target":15,"value":1},{"source":11,"target":16,"value":1},{"source":11,"target":18,"value":1},{"source":11,"target":24,"value":1},{"source":11,"target":25,"value":1},{"source":11,"target":26,"value":1},{"source":11,"target":27,"value":1},{"source":11,"target":28,"value":1},{"source":11,"target":29,"value":1},{"source":12,"target":1,"value":1},{"source":12,"target":4,"value":1},{"source":12,"target":9,"value":1},{"source":12,"target":10,"value":1},{"source":12,"target":11,"value":1},{"source":12,"target":13,"value":1},{"source":12,"target":14,"value":1},{"source":12,"target":15,"value":1},{"source":12,"target":16,"value":1},{"source":12,"target":19,"value":1},{"source":12,"target":25,"value":1},{"source":12,"target":30,"value":1},{"source":12,"target":31,"value":1},{"source":12,"target":32,"value":1},{"source":12,"target":33,"value":1},{"source":12,"target":34,"value":1},{"source":13,"target":1,"value":1},{"source":13,"target":5,"value":1},{"source":13,"target":9,"value":1},{"source":13,"target":10,"value":1},{"source":13,"target":11,"value":1},{"source":13,"target":12,"value":1},{"source":13,"target":14,"value":1},{"source":13,"target":15,"value":1},{"source":13,"target":16,"value":1},{"source":13,"target":20,"value":1},{"source":13,"target":26,"value":1},{"source":13,"target":31,"value":1},{"source":13,"target":35,"value":1},{"source":13,"target":36,"value":1},{"source":13,"target":37,"value":1},{"source":13,"target":38,"value":1},{"source":14,"target":1,"value":1},{"source":14,"target":6,"value":1},{"source":14,"target":9,"value":1},{"source":14,"target":10,"value":1},{"source":14,"target":11,"value":1},{"source":14,"target":12,"value":1},{"source":14,"target":13,"value":1},{"source":14,"target":15,"value":1},{"source":14,"target":16,"value":1},{"source":14,"target":21,"value":1},{"source":14,"target":27,"value":1},{"source":14,"target":32,"value":1},{"source":14,"target":36,"value":1},{"source":14,"target":39,"value":1},{"source":14,"target":40,"value":1},{"source":14,"target":41,"value":1},{"source":15,"target":1,"value":1},{"source":15,"target":7,"value":1},{"source":15,"target":9,"value":1},{"source":15,"target":10,"value":1},{"source":15,"target":11,"value":1},{"source":15,"target":12,"value":1},{"source":15,"target":13,"value":1},{"source":15,"target":14,"value":1},{"source":15,"target":16,"value":1},{"source":15,"target":22,"value":1},{"source":15,"target":28,"value":1},{"source":15,"target":33,"value":1},{"source":15,"target":37,"value":1},{"source":15,"target":40,"value":1},{"source":15,"target":42,"value":1},{"source":15,"target":43,"value":1},{"source":16,"target":1,"value":1},{"source":16,"target":8,"value":1},{"source":16,"target":9,"value":1},{"source":16,"target":10,"value":1},{"source":16,"target":11,"value":1},{"source":16,"target":12,"value":1},{"source":16,"target":13,"value":1},{"source":16,"target":14,"value":1},{"source":16,"target":15,"value":1},{"source":16,"target":23,"value":1},{"source":16,"target":29,"value":1},{"source":16,"target":34,"value":1},{"source":16,"target":38,"value":1},{"source":16,"target":41,"value":1},{"source":16,"target":43,"value":1},{"source":16,"target":44,"value":1},{"source":17,"target":2,"value":1},{"source":17,"target":10,"value":1},{"source":17,"target":18,"value":1},{"source":17,"target":19,"value":1},{"source":17,"target":20,"value":1},{"source":17,"target":21,"value":1},{"source":17,"target":22,"value":1},{"source":17,"target":23,"value":1},{"source":18,"target":2,"value":1},{"source":18,"target":3,"value":1},{"source":18,"target":10,"value":1},{"source":18,"target":11,"value":1},{"source":18,"target":17,"value":1},{"source":18,"target":19,"value":1},{"source":18,"target":20,"value":1},{"source":18,"target":21,"value":1},{"source":18,"target":22,"value":1},{"source":18,"target":23,"value":1},{"source":18,"target":24,"value":1},{"source":18,"target":25,"value":1},{"source":18,"target":26,"value":1},{"source":18,"target":27,"value":1},{"source":18,"target":28,"value":1},{"source":18,"target":29,"value":1},{"source":19,"target":2,"value":1},{"source":19,"target":4,"value":1},{"source":19,"target":10,"value":1},{"source":19,"target":12,"value":1},{"source":19,"target":17,"value":1},{"source":19,"target":18,"value":1},{"source":19,"target":20,"value":1},{"source":19,"target":21,"value":1},{"source":19,"target":22,"value":1},{"source":19,"target":23,"value":1},{"source":19,"target":25,"value":1},{"source":19,"target":30,"value":1},{"source":19,"target":31,"value":1},{"source":19,"target":32,"value":1},{"source":19,"target":33,"value":1},{"source":19,"target":34,"value":1},{"source":20,"target":2,"value":1},{"source":20,"target":5,"value":1},{"source":20,"target":10,"value":1},{"source":20,"target":13,"value":1},{"source":20,"target":17,"value":1},{"source":20,"target":18,"value":1},{"source":20,"target":19,"value":1},{"source":20,"target":21,"value":1},{"source":20,"target":22,"value":1},{"source":20,"target":23,"value":1},{"source":20,"target":26,"value":1},{"source":20,"target":31,"value":1},{"source":20,"target":35,"value":1},{"source":20,"target":36,"value":1},{"source":20,"target":37,"value":1},{"source":20,"target":38,"value":1},{"source":21,"target":2,"value":1},{"source":21,"target":6,"value":1},{"source":21,"target":10,"value":1},{"source":21,"target":14,"value":1},{"source":21,"target":17,"value":1},{"source":21,"target":18,"value":1},{"source":21,"target":19,"value":1},{"source":21,"target":20,"value":1},{"source":21,"target":22,"value":1},{"source":21,"target":23,"value":1},{"source":21,"target":27,"value":1},{"source":21,"target":32,"value":1},{"source":21,"target":36,"value":1},{"source":21,"target":39,"value":1},{"source":21,"target":40,"value":1},{"source":21,"target":41,"value":1},{"source":22,"target":2,"value":1},{"source":22,"target":7,"value":1},{"source":22,"target":10,"value":1},{"source":22,"target":15,"value":1},{"source":22,"target":17,"value":1},{"source":22,"target":18,"value":1},{"source":22,"target":19,"value":1},{"source":22,"target":20,"value":1},{"source":22,"target":21,"value":1},{"source":22,"target":23,"value":1},{"source":22,"target":28,"value":1},{"source":22,"target":33,"value":1},{"source":22,"target":37,"value":1},{"source":22,"target":40,"value":1},{"source":22,"target":42,"value":1},{"source":22,"target":43,"value":1},{"source":23,"target":2,"value":1},{"source":23,"target":8,"value":1},{"source":23,"target":10,"value":1},{"source":23,"target":16,"value":1},{"source":23,"target":17,"value":1},{"source":23,"target":18,"value":1},{"source":23,"target":19,"value":1},{"source":23,"target":20,"value":1},{"source":23,"target":21,"value":1},{"source":23,"target":22,"value":1},{"source":23,"target":29,"value":1},{"source":23,"target":34,"value":1},{"source":23,"target":38,"value":1},{"source":23,"target":41,"value":1},{"source":23,"target":43,"value":1},{"source":23,"target":44,"value":1},{"source":24,"target":3,"value":1},{"source":24,"target":11,"value":1},{"source":24,"target":18,"value":1},{"source":24,"target":25,"value":1},{"source":24,"target":26,"value":1},{"source":24,"target":27,"value":1},{"source":24,"target":28,"value":1},{"source":24,"target":29,"value":1},{"source":25,"target":3,"value":1},{"source":25,"target":4,"value":1},{"source":25,"target":11,"value":1},{"source":25,"target":12,"value":1},{"source":25,"target":18,"value":1},{"source":25,"target":19,"value":1},{"source":25,"target":24,"value":1},{"source":25,"target":26,"value":1},{"source":25,"target":27,"value":1},{"source":25,"target":28,"value":1},{"source":25,"target":29,"value":1},{"source":25,"target":30,"value":1},{"source":25,"target":31,"value":1},{"source":25,"target":32,"value":1},{"source":25,"target":33,"value":1},{"source":25,"target":34,"value":1},{"source":26,"target":3,"value":1},{"source":26,"target":5,"value":1},{"source":26,"target":11,"value":1},{"source":26,"target":13,"value":1},{"source":26,"target":18,"value":1},{"source":26,"target":20,"value":1},{"source":26,"target":24,"value":1},{"source":26,"target":25,"value":1},{"source":26,"target":27,"value":1},{"source":26,"target":28,"value":1},{"source":26,"target":29,"value":1},{"source":26,"target":31,"value":1},{"source":26,"target":35,"value":1},{"source":26,"target":36,"value":1},{"source":26,"target":37,"value":1},{"source":26,"target":38,"value":1},{"source":27,"target":3,"value":1},{"source":27,"target":6,"value":1},{"source":27,"target":11,"value":1},{"source":27,"target":14,"value":1},{"source":27,"target":18,"value":1},{"source":27,"target":21,"value":1},{"source":27,"target":24,"value":1},{"source":27,"target":25,"value":1},{"source":27,"target":26,"value":1},{"source":27,"target":28,"value":1},{"source":27,"target":29,"value":1},{"source":27,"target":32,"value":1},{"source":27,"target":36,"value":1},{"source":27,"target":39,"value":1},{"source":27,"target":40,"value":1},{"source":27,"target":41,"value":1},{"source":28,"target":3,"value":1},{"source":28,"target":7,"value":1},{"source":28,"target":11,"value":1},{"source":28,"target":15,"value":1},{"source":28,"target":18,"value":1},{"source":28,"target":22,"value":1},{"source":28,"target":24,"value":1},{"source":28,"target":25,"value":1},{"source":28,"target":26,"value":1},{"source":28,"target":27,"value":1},{"source":28,"target":29,"value":1},{"source":28,"target":33,"value":1},{"source":28,"target":37,"value":1},{"source":28,"target":40,"value":1},{"source":28,"target":42,"value":1},{"source":28,"target":43,"value":1},{"source":29,"target":3,"value":1},{"source":29,"target":8,"value":1},{"source":29,"target":11,"value":1},{"source":29,"target":16,"value":1},{"source":29,"target":18,"value":1},{"source":29,"target":23,"value":1},{"source":29,"target":24,"value":1},{"source":29,"target":25,"value":1},{"source":29,"target":26,"value":1},{"source":29,"target":27,"value":1},{"source":29,"target":28,"value":1},{"source":29,"target":34,"value":1},{"source":29,"target":38,"value":1},{"source":29,"target":41,"value":1},{"source":29,"target":43,"value":1},{"source":29,"target":44,"value":1},{"source":30,"target":4,"value":1},{"source":30,"target":12,"value":1},{"source":30,"target":19,"value":1},{"source":30,"target":25,"value":1},{"source":30,"target":31,"value":1},{"source":30,"target":32,"value":1},{"source":30,"target":33,"value":1},{"source":30,"target":34,"value":1},{"source":31,"target":4,"value":1},{"source":31,"target":5,"value":1},{"source":31,"target":12,"value":1},{"source":31,"target":13,"value":1},{"source":31,"target":19,"value":1},{"source":31,"target":20,"value":1},{"source":31,"target":25,"value":1},{"source":31,"target":26,"value":1},{"source":31,"target":30,"value":1},{"source":31,"target":32,"value":1},{"source":31,"target":33,"value":1},{"source":31,"target":34,"value":1},{"source":31,"target":35,"value":1},{"source":31,"target":36,"value":1},{"source":31,"target":37,"value":1},{"source":31,"target":38,"value":1},{"source":32,"target":4,"value":1},{"source":32,"target":6,"value":1},{"source":32,"target":12,"value":1},{"source":32,"target":14,"value":1},{"source":32,"target":19,"value":1},{"source":32,"target":21,"value":1},{"source":32,"target":25,"value":1},{"source":32,"target":27,"value":1},{"source":32,"target":30,"value":1},{"source":32,"target":31,"value":1},{"source":32,"target":33,"value":1},{"source":32,"target":34,"value":1},{"source":32,"target":36,"value":1},{"source":32,"target":39,"value":1},{"source":32,"target":40,"value":1},{"source":32,"target":41,"value":1},{"source":33,"target":4,"value":1},{"source":33,"target":7,"value":1},{"source":33,"target":12,"value":1},{"source":33,"target":15,"value":1},{"source":33,"target":19,"value":1},{"source":33,"target":22,"value":1},{"source":33,"target":25,"value":1},{"source":33,"target":28,"value":1},{"source":33,"target":30,"value":1},{"source":33,"target":31,"value":1},{"source":33,"target":32,"value":1},{"source":33,"target":34,"value":1},{"source":33,"target":37,"value":1},{"source":33,"target":40,"value":1},{"source":33,"target":42,"value":1},{"source":33,"target":43,"value":1},{"source":34,"target":4,"value":1},{"source":34,"target":8,"value":1},{"source":34,"target":12,"value":1},{"source":34,"target":16,"value":1},{"source":34,"target":19,"value":1},{"source":34,"target":23,"value":1},{"source":34,"target":25,"value":1},{"source":34,"target":29,"value":1},{"source":34,"target":30,"value":1},{"source":34,"target":31,"value":1},{"source":34,"target":32,"value":1},{"source":34,"target":33,"value":1},{"source":34,"target":38,"value":1},{"source":34,"target":41,"value":1},{"source":34,"target":43,"value":1},{"source":34,"target":44,"value":1},{"source":35,"target":5,"value":1},{"source":35,"target":13,"value":1},{"source":35,"target":20,"value":1},{"source":35,"target":26,"value":1},{"source":35,"target":31,"value":1},{"source":35,"target":36,"value":1},{"source":35,"target":37,"value":1},{"source":35,"target":38,"value":1},{"source":36,"target":5,"value":1},{"source":36,"target":6,"value":1},{"source":36,"target":13,"value":1},{"source":36,"target":14,"value":1},{"source":36,"target":20,"value":1},{"source":36,"target":21,"value":1},{"source":36,"target":26,"value":1},{"source":36,"target":27,"value":1},{"source":36,"target":31,"value":1},{"source":36,"target":32,"value":1},{"source":36,"target":35,"value":1},{"source":36,"target":37,"value":1},{"source":36,"target":38,"value":1},{"source":36,"target":39,"value":1},{"source":36,"target":40,"value":1},{"source":36,"target":41,"value":1},{"source":37,"target":5,"value":1},{"source":37,"target":7,"value":1},{"source":37,"target":13,"value":1},{"source":37,"target":15,"value":1},{"source":37,"target":20,"value":1},{"source":37,"target":22,"value":1},{"source":37,"target":26,"value":1},{"source":37,"target":28,"value":1},{"source":37,"target":31,"value":1},{"source":37,"target":33,"value":1},{"source":37,"target":35,"value":1},{"source":37,"target":36,"value":1},{"source":37,"target":38,"value":1},{"source":37,"target":40,"value":1},{"source":37,"target":42,"value":1},{"source":37,"target":43,"value":1},{"source":38,"target":5,"value":1},{"source":38,"target":8,"value":1},{"source":38,"target":13,"value":1},{"source":38,"target":16,"value":1},{"source":38,"target":20,"value":1},{"source":38,"target":23,"value":1},{"source":38,"target":26,"value":1},{"source":38,"target":29,"value":1},{"source":38,"target":31,"value":1},{"source":38,"target":34,"value":1},{"source":38,"target":35,"value":1},{"source":38,"target":36,"value":1},{"source":38,"target":37,"value":1},{"source":38,"target":41,"value":1},{"source":38,"target":43,"value":1},{"source":38,"target":44,"value":1},{"source":39,"target":6,"value":1},{"source":39,"target":14,"value":1},{"source":39,"target":21,"value":1},{"source":39,"target":27,"value":1},{"source":39,"target":32,"value":1},{"source":39,"target":36,"value":1},{"source":39,"target":40,"value":1},{"source":39,"target":41,"value":1},{"source":40,"target":6,"value":1},{"source":40,"target":7,"value":1},{"source":40,"target":14,"value":1},{"source":40,"target":15,"value":1},{"source":40,"target":21,"value":1},{"source":40,"target":22,"value":1},{"source":40,"target":27,"value":1},{"source":40,"target":28,"value":1},{"source":40,"target":32,"value":1},{"source":40,"target":33,"value":1},{"source":40,"target":36,"value":1},{"source":40,"target":37,"value":1},{"source":40,"target":39,"value":1},{"source":40,"target":41,"value":1},{"source":40,"target":42,"value":1},{"source":40,"target":43,"value":1},{"source":41,"target":6,"value":1},{"source":41,"target":8,"value":1},{"source":41,"target":14,"value":1},{"source":41,"target":16,"value":1},{"source":41,"target":21,"value":1},{"source":41,"target":23,"value":1},{"source":41,"target":27,"value":1},{"source":41,"target":29,"value":1},{"source":41,"target":32,"value":1},{"source":41,"target":34,"value":1},{"source":41,"target":36,"value":1},{"source":41,"target":38,"value":1},{"source":41,"target":39,"value":1},{"source":41,"target":40,"value":1},{"source":41,"target":43,"value":1},{"source":41,"target":44,"value":1},{"source":42,"target":7,"value":1},{"source":42,"target":15,"value":1},{"source":42,"target":22,"value":1},{"source":42,"target":28,"value":1},{"source":42,"target":33,"value":1},{"source":42,"target":37,"value":1},{"source":42,"target":40,"value":1},{"source":42,"target":43,"value":1},{"source":43,"target":7,"value":1},{"source":43,"target":8,"value":1},{"source":43,"target":15,"value":1},{"source":43,"target":16,"value":1},{"source":43,"target":22,"value":1},{"source":43,"target":23,"value":1},{"source":43,"target":28,"value":1},{"source":43,"target":29,"value":1},{"source":43,"target":33,"value":1},{"source":43,"target":34,"value":1},{"source":43,"target":37,"value":1},{"source":43,"target":38,"value":1},{"source":43,"target":40,"value":1},{"source":43,"target":41,"value":1},{"source":43,"target":42,"value":1},{"source":43,"target":44,"value":1},{"source":44,"target":8,"value":1},{"source":44,"target":16,"value":1},{"source":44,"target":23,"value":1},{"source":44,"target":29,"value":1},{"source":44,"target":34,"value":1},{"source":44,"target":38,"value":1},{"source":44,"target":41,"value":1},{"source":44,"target":43,"value":1}]}); doGraph('#graph-set-mine', {"nodes":[{"name":"0,0","group":"2"},{"name":"0,1","group":"1"},{"name":"0,2","group":"1"},{"name":"0,3","group":"1"},{"name":"0,4","group":"3"},{"name":"0,5","group":"1"},{"name":"0,6","group":"1"},{"name":"0,7","group":"1"},{"name":"0,8","group":"1"},{"name":"1,1","group":"1"},{"name":"1,2","group":"1"},{"name":"1,3","group":"3"},{"name":"1,4","group":"1"},{"name":"1,5","group":"1"},{"name":"1,6","group":"1"},{"name":"1,7","group":"1"},{"name":"1,8","group":"1"},{"name":"2,2","group":"3"},{"name":"2,3","group":"3"},{"name":"2,4","group":"1"},{"name":"2,5","group":"1"},{"name":"2,6","group":"3"},{"name":"2,7","group":"1"},{"name":"2,8","group":"3"},{"name":"3,3","group":"1"},{"name":"3,4","group":"3"},{"name":"3,5","group":"1"},{"name":"3,6","group":"3"},{"name":"3,7","group":"1"},{"name":"3,8","group":"3"},{"name":"4,4","group":"3"},{"name":"4,5","group":"3"},{"name":"4,6","group":"1"},{"name":"4,7","group":"1"},{"name":"4,8","group":"1"},{"name":"5,5","group":"1"},{"name":"5,6","group":"1"},{"name":"5,7","group":"1"},{"name":"5,8","group":"3"},{"name":"6,6","group":"1"},{"name":"6,7","group":"1"},{"name":"6,8","group":"1"},{"name":"7,7","group":"1"},{"name":"7,8","group":"1"},{"name":"8,8","group":"1"}],"links":[{"source":0,"target":1,"value":1},{"source":0,"target":2,"value":1},{"source":0,"target":3,"value":1},{"source":0,"target":4,"value":1},{"source":0,"target":5,"value":1},{"source":0,"target":6,"value":1},{"source":0,"target":7,"value":1},{"source":0,"target":8,"value":1},{"source":1,"target":0,"value":1},{"source":1,"target":2,"value":1},{"source":1,"target":3,"value":1},{"source":1,"target":4,"value":1},{"source":1,"target":5,"value":1},{"source":1,"target":6,"value":1},{"source":1,"target":7,"value":1},{"source":1,"target":8,"value":1},{"source":1,"target":9,"value":1},{"source":1,"target":10,"value":1},{"source":1,"target":11,"value":1},{"source":1,"target":12,"value":1},{"source":1,"target":13,"value":1},{"source":1,"target":14,"value":1},{"source":1,"target":15,"value":1},{"source":1,"target":16,"value":1},{"source":2,"target":0,"value":1},{"source":2,"target":1,"value":1},{"source":2,"target":3,"value":1},{"source":2,"target":4,"value":1},{"source":2,"target":5,"value":1},{"source":2,"target":6,"value":1},{"source":2,"target":7,"value":1},{"source":2,"target":8,"value":1},{"source":2,"target":10,"value":1},{"source":2,"target":17,"value":1},{"source":2,"target":18,"value":1},{"source":2,"target":19,"value":1},{"source":2,"target":20,"value":1},{"source":2,"target":21,"value":1},{"source":2,"target":22,"value":1},{"source":2,"target":23,"value":1},{"source":3,"target":0,"value":1},{"source":3,"target":1,"value":1},{"source":3,"target":2,"value":1},{"source":3,"target":4,"value":1},{"source":3,"target":5,"value":1},{"source":3,"target":6,"value":1},{"source":3,"target":7,"value":1},{"source":3,"target":8,"value":1},{"source":3,"target":11,"value":1},{"source":3,"target":18,"value":1},{"source":3,"target":24,"value":1},{"source":3,"target":25,"value":1},{"source":3,"target":26,"value":1},{"source":3,"target":27,"value":1},{"source":3,"target":28,"value":1},{"source":3,"target":29,"value":1},{"source":4,"target":0,"value":1},{"source":4,"target":1,"value":1},{"source":4,"target":2,"value":1},{"source":4,"target":3,"value":1},{"source":4,"target":5,"value":1},{"source":4,"target":6,"value":1},{"source":4,"target":7,"value":1},{"source":4,"target":8,"value":1},{"source":4,"target":12,"value":1},{"source":4,"target":19,"value":1},{"source":4,"target":25,"value":1},{"source":4,"target":30,"value":1},{"source":4,"target":31,"value":1},{"source":4,"target":32,"value":1},{"source":4,"target":33,"value":1},{"source":4,"target":34,"value":1},{"source":5,"target":0,"value":1},{"source":5,"target":1,"value":1},{"source":5,"target":2,"value":1},{"source":5,"target":3,"value":1},{"source":5,"target":4,"value":1},{"source":5,"target":6,"value":1},{"source":5,"target":7,"value":1},{"source":5,"target":8,"value":1},{"source":5,"target":13,"value":1},{"source":5,"target":20,"value":1},{"source":5,"target":26,"value":1},{"source":5,"target":31,"value":1},{"source":5,"target":35,"value":1},{"source":5,"target":36,"value":1},{"source":5,"target":37,"value":1},{"source":5,"target":38,"value":1},{"source":6,"target":0,"value":1},{"source":6,"target":1,"value":1},{"source":6,"target":2,"value":1},{"source":6,"target":3,"value":1},{"source":6,"target":4,"value":1},{"source":6,"target":5,"value":1},{"source":6,"target":7,"value":1},{"source":6,"target":8,"value":1},{"source":6,"target":14,"value":1},{"source":6,"target":21,"value":1},{"source":6,"target":27,"value":1},{"source":6,"target":32,"value":1},{"source":6,"target":36,"value":1},{"source":6,"target":39,"value":1},{"source":6,"target":40,"value":1},{"source":6,"target":41,"value":1},{"source":7,"target":0,"value":1},{"source":7,"target":1,"value":1},{"source":7,"target":2,"value":1},{"source":7,"target":3,"value":1},{"source":7,"target":4,"value":1},{"source":7,"target":5,"value":1},{"source":7,"target":6,"value":1},{"source":7,"target":8,"value":1},{"source":7,"target":15,"value":1},{"source":7,"target":22,"value":1},{"source":7,"target":28,"value":1},{"source":7,"target":33,"value":1},{"source":7,"target":37,"value":1},{"source":7,"target":40,"value":1},{"source":7,"target":42,"value":1},{"source":7,"target":43,"value":1},{"source":8,"target":0,"value":1},{"source":8,"target":1,"value":1},{"source":8,"target":2,"value":1},{"source":8,"target":3,"value":1},{"source":8,"target":4,"value":1},{"source":8,"target":5,"value":1},{"source":8,"target":6,"value":1},{"source":8,"target":7,"value":1},{"source":8,"target":16,"value":1},{"source":8,"target":23,"value":1},{"source":8,"target":29,"value":1},{"source":8,"target":34,"value":1},{"source":8,"target":38,"value":1},{"source":8,"target":41,"value":1},{"source":8,"target":43,"value":1},{"source":8,"target":44,"value":1},{"source":9,"target":1,"value":1},{"source":9,"target":10,"value":1},{"source":9,"target":11,"value":1},{"source":9,"target":12,"value":1},{"source":9,"target":13,"value":1},{"source":9,"target":14,"value":1},{"source":9,"target":15,"value":1},{"source":9,"target":16,"value":1},{"source":10,"target":1,"value":1},{"source":10,"target":2,"value":1},{"source":10,"target":9,"value":1},{"source":10,"target":11,"value":1},{"source":10,"target":12,"value":1},{"source":10,"target":13,"value":1},{"source":10,"target":14,"value":1},{"source":10,"target":15,"value":1},{"source":10,"target":16,"value":1},{"source":10,"target":17,"value":1},{"source":10,"target":18,"value":1},{"source":10,"target":19,"value":1},{"source":10,"target":20,"value":1},{"source":10,"target":21,"value":1},{"source":10,"target":22,"value":1},{"source":10,"target":23,"value":1},{"source":11,"target":1,"value":1},{"source":11,"target":3,"value":1},{"source":11,"target":9,"value":1},{"source":11,"target":10,"value":1},{"source":11,"target":12,"value":1},{"source":11,"target":13,"value":1},{"source":11,"target":14,"value":1},{"source":11,"target":15,"value":1},{"source":11,"target":16,"value":1},{"source":11,"target":18,"value":1},{"source":11,"target":24,"value":1},{"source":11,"target":25,"value":1},{"source":11,"target":26,"value":1},{"source":11,"target":27,"value":1},{"source":11,"target":28,"value":1},{"source":11,"target":29,"value":1},{"source":12,"target":1,"value":1},{"source":12,"target":4,"value":1},{"source":12,"target":9,"value":1},{"source":12,"target":10,"value":1},{"source":12,"target":11,"value":1},{"source":12,"target":13,"value":1},{"source":12,"target":14,"value":1},{"source":12,"target":15,"value":1},{"source":12,"target":16,"value":1},{"source":12,"target":19,"value":1},{"source":12,"target":25,"value":1},{"source":12,"target":30,"value":1},{"source":12,"target":31,"value":1},{"source":12,"target":32,"value":1},{"source":12,"target":33,"value":1},{"source":12,"target":34,"value":1},{"source":13,"target":1,"value":1},{"source":13,"target":5,"value":1},{"source":13,"target":9,"value":1},{"source":13,"target":10,"value":1},{"source":13,"target":11,"value":1},{"source":13,"target":12,"value":1},{"source":13,"target":14,"value":1},{"source":13,"target":15,"value":1},{"source":13,"target":16,"value":1},{"source":13,"target":20,"value":1},{"source":13,"target":26,"value":1},{"source":13,"target":31,"value":1},{"source":13,"target":35,"value":1},{"source":13,"target":36,"value":1},{"source":13,"target":37,"value":1},{"source":13,"target":38,"value":1},{"source":14,"target":1,"value":1},{"source":14,"target":6,"value":1},{"source":14,"target":9,"value":1},{"source":14,"target":10,"value":1},{"source":14,"target":11,"value":1},{"source":14,"target":12,"value":1},{"source":14,"target":13,"value":1},{"source":14,"target":15,"value":1},{"source":14,"target":16,"value":1},{"source":14,"target":21,"value":1},{"source":14,"target":27,"value":1},{"source":14,"target":32,"value":1},{"source":14,"target":36,"value":1},{"source":14,"target":39,"value":1},{"source":14,"target":40,"value":1},{"source":14,"target":41,"value":1},{"source":15,"target":1,"value":1},{"source":15,"target":7,"value":1},{"source":15,"target":9,"value":1},{"source":15,"target":10,"value":1},{"source":15,"target":11,"value":1},{"source":15,"target":12,"value":1},{"source":15,"target":13,"value":1},{"source":15,"target":14,"value":1},{"source":15,"target":16,"value":1},{"source":15,"target":22,"value":1},{"source":15,"target":28,"value":1},{"source":15,"target":33,"value":1},{"source":15,"target":37,"value":1},{"source":15,"target":40,"value":1},{"source":15,"target":42,"value":1},{"source":15,"target":43,"value":1},{"source":16,"target":1,"value":1},{"source":16,"target":8,"value":1},{"source":16,"target":9,"value":1},{"source":16,"target":10,"value":1},{"source":16,"target":11,"value":1},{"source":16,"target":12,"value":1},{"source":16,"target":13,"value":1},{"source":16,"target":14,"value":1},{"source":16,"target":15,"value":1},{"source":16,"target":23,"value":1},{"source":16,"target":29,"value":1},{"source":16,"target":34,"value":1},{"source":16,"target":38,"value":1},{"source":16,"target":41,"value":1},{"source":16,"target":43,"value":1},{"source":16,"target":44,"value":1},{"source":17,"target":2,"value":1},{"source":17,"target":10,"value":1},{"source":17,"target":18,"value":1},{"source":17,"target":19,"value":1},{"source":17,"target":20,"value":1},{"source":17,"target":21,"value":1},{"source":17,"target":22,"value":1},{"source":17,"target":23,"value":1},{"source":18,"target":2,"value":1},{"source":18,"target":3,"value":1},{"source":18,"target":10,"value":1},{"source":18,"target":11,"value":1},{"source":18,"target":17,"value":1},{"source":18,"target":19,"value":1},{"source":18,"target":20,"value":1},{"source":18,"target":21,"value":1},{"source":18,"target":22,"value":1},{"source":18,"target":23,"value":1},{"source":18,"target":24,"value":1},{"source":18,"target":25,"value":1},{"source":18,"target":26,"value":1},{"source":18,"target":27,"value":1},{"source":18,"target":28,"value":1},{"source":18,"target":29,"value":1},{"source":19,"target":2,"value":1},{"source":19,"target":4,"value":1},{"source":19,"target":10,"value":1},{"source":19,"target":12,"value":1},{"source":19,"target":17,"value":1},{"source":19,"target":18,"value":1},{"source":19,"target":20,"value":1},{"source":19,"target":21,"value":1},{"source":19,"target":22,"value":1},{"source":19,"target":23,"value":1},{"source":19,"target":25,"value":1},{"source":19,"target":30,"value":1},{"source":19,"target":31,"value":1},{"source":19,"target":32,"value":1},{"source":19,"target":33,"value":1},{"source":19,"target":34,"value":1},{"source":20,"target":2,"value":1},{"source":20,"target":5,"value":1},{"source":20,"target":10,"value":1},{"source":20,"target":13,"value":1},{"source":20,"target":17,"value":1},{"source":20,"target":18,"value":1},{"source":20,"target":19,"value":1},{"source":20,"target":21,"value":1},{"source":20,"target":22,"value":1},{"source":20,"target":23,"value":1},{"source":20,"target":26,"value":1},{"source":20,"target":31,"value":1},{"source":20,"target":35,"value":1},{"source":20,"target":36,"value":1},{"source":20,"target":37,"value":1},{"source":20,"target":38,"value":1},{"source":21,"target":2,"value":1},{"source":21,"target":6,"value":1},{"source":21,"target":10,"value":1},{"source":21,"target":14,"value":1},{"source":21,"target":17,"value":1},{"source":21,"target":18,"value":1},{"source":21,"target":19,"value":1},{"source":21,"target":20,"value":1},{"source":21,"target":22,"value":1},{"source":21,"target":23,"value":1},{"source":21,"target":27,"value":1},{"source":21,"target":32,"value":1},{"source":21,"target":36,"value":1},{"source":21,"target":39,"value":1},{"source":21,"target":40,"value":1},{"source":21,"target":41,"value":1},{"source":22,"target":2,"value":1},{"source":22,"target":7,"value":1},{"source":22,"target":10,"value":1},{"source":22,"target":15,"value":1},{"source":22,"target":17,"value":1},{"source":22,"target":18,"value":1},{"source":22,"target":19,"value":1},{"source":22,"target":20,"value":1},{"source":22,"target":21,"value":1},{"source":22,"target":23,"value":1},{"source":22,"target":28,"value":1},{"source":22,"target":33,"value":1},{"source":22,"target":37,"value":1},{"source":22,"target":40,"value":1},{"source":22,"target":42,"value":1},{"source":22,"target":43,"value":1},{"source":23,"target":2,"value":1},{"source":23,"target":8,"value":1},{"source":23,"target":10,"value":1},{"source":23,"target":16,"value":1},{"source":23,"target":17,"value":1},{"source":23,"target":18,"value":1},{"source":23,"target":19,"value":1},{"source":23,"target":20,"value":1},{"source":23,"target":21,"value":1},{"source":23,"target":22,"value":1},{"source":23,"target":29,"value":1},{"source":23,"target":34,"value":1},{"source":23,"target":38,"value":1},{"source":23,"target":41,"value":1},{"source":23,"target":43,"value":1},{"source":23,"target":44,"value":1},{"source":24,"target":3,"value":1},{"source":24,"target":11,"value":1},{"source":24,"target":18,"value":1},{"source":24,"target":25,"value":1},{"source":24,"target":26,"value":1},{"source":24,"target":27,"value":1},{"source":24,"target":28,"value":1},{"source":24,"target":29,"value":1},{"source":25,"target":3,"value":1},{"source":25,"target":4,"value":1},{"source":25,"target":11,"value":1},{"source":25,"target":12,"value":1},{"source":25,"target":18,"value":1},{"source":25,"target":19,"value":1},{"source":25,"target":24,"value":1},{"source":25,"target":26,"value":1},{"source":25,"target":27,"value":1},{"source":25,"target":28,"value":1},{"source":25,"target":29,"value":1},{"source":25,"target":30,"value":1},{"source":25,"target":31,"value":1},{"source":25,"target":32,"value":1},{"source":25,"target":33,"value":1},{"source":25,"target":34,"value":1},{"source":26,"target":3,"value":1},{"source":26,"target":5,"value":1},{"source":26,"target":11,"value":1},{"source":26,"target":13,"value":1},{"source":26,"target":18,"value":1},{"source":26,"target":20,"value":1},{"source":26,"target":24,"value":1},{"source":26,"target":25,"value":1},{"source":26,"target":27,"value":1},{"source":26,"target":28,"value":1},{"source":26,"target":29,"value":1},{"source":26,"target":31,"value":1},{"source":26,"target":35,"value":1},{"source":26,"target":36,"value":1},{"source":26,"target":37,"value":1},{"source":26,"target":38,"value":1},{"source":27,"target":3,"value":1},{"source":27,"target":6,"value":1},{"source":27,"target":11,"value":1},{"source":27,"target":14,"value":1},{"source":27,"target":18,"value":1},{"source":27,"target":21,"value":1},{"source":27,"target":24,"value":1},{"source":27,"target":25,"value":1},{"source":27,"target":26,"value":1},{"source":27,"target":28,"value":1},{"source":27,"target":29,"value":1},{"source":27,"target":32,"value":1},{"source":27,"target":36,"value":1},{"source":27,"target":39,"value":1},{"source":27,"target":40,"value":1},{"source":27,"target":41,"value":1},{"source":28,"target":3,"value":1},{"source":28,"target":7,"value":1},{"source":28,"target":11,"value":1},{"source":28,"target":15,"value":1},{"source":28,"target":18,"value":1},{"source":28,"target":22,"value":1},{"source":28,"target":24,"value":1},{"source":28,"target":25,"value":1},{"source":28,"target":26,"value":1},{"source":28,"target":27,"value":1},{"source":28,"target":29,"value":1},{"source":28,"target":33,"value":1},{"source":28,"target":37,"value":1},{"source":28,"target":40,"value":1},{"source":28,"target":42,"value":1},{"source":28,"target":43,"value":1},{"source":29,"target":3,"value":1},{"source":29,"target":8,"value":1},{"source":29,"target":11,"value":1},{"source":29,"target":16,"value":1},{"source":29,"target":18,"value":1},{"source":29,"target":23,"value":1},{"source":29,"target":24,"value":1},{"source":29,"target":25,"value":1},{"source":29,"target":26,"value":1},{"source":29,"target":27,"value":1},{"source":29,"target":28,"value":1},{"source":29,"target":34,"value":1},{"source":29,"target":38,"value":1},{"source":29,"target":41,"value":1},{"source":29,"target":43,"value":1},{"source":29,"target":44,"value":1},{"source":30,"target":4,"value":1},{"source":30,"target":12,"value":1},{"source":30,"target":19,"value":1},{"source":30,"target":25,"value":1},{"source":30,"target":31,"value":1},{"source":30,"target":32,"value":1},{"source":30,"target":33,"value":1},{"source":30,"target":34,"value":1},{"source":31,"target":4,"value":1},{"source":31,"target":5,"value":1},{"source":31,"target":12,"value":1},{"source":31,"target":13,"value":1},{"source":31,"target":19,"value":1},{"source":31,"target":20,"value":1},{"source":31,"target":25,"value":1},{"source":31,"target":26,"value":1},{"source":31,"target":30,"value":1},{"source":31,"target":32,"value":1},{"source":31,"target":33,"value":1},{"source":31,"target":34,"value":1},{"source":31,"target":35,"value":1},{"source":31,"target":36,"value":1},{"source":31,"target":37,"value":1},{"source":31,"target":38,"value":1},{"source":32,"target":4,"value":1},{"source":32,"target":6,"value":1},{"source":32,"target":12,"value":1},{"source":32,"target":14,"value":1},{"source":32,"target":19,"value":1},{"source":32,"target":21,"value":1},{"source":32,"target":25,"value":1},{"source":32,"target":27,"value":1},{"source":32,"target":30,"value":1},{"source":32,"target":31,"value":1},{"source":32,"target":33,"value":1},{"source":32,"target":34,"value":1},{"source":32,"target":36,"value":1},{"source":32,"target":39,"value":1},{"source":32,"target":40,"value":1},{"source":32,"target":41,"value":1},{"source":33,"target":4,"value":1},{"source":33,"target":7,"value":1},{"source":33,"target":12,"value":1},{"source":33,"target":15,"value":1},{"source":33,"target":19,"value":1},{"source":33,"target":22,"value":1},{"source":33,"target":25,"value":1},{"source":33,"target":28,"value":1},{"source":33,"target":30,"value":1},{"source":33,"target":31,"value":1},{"source":33,"target":32,"value":1},{"source":33,"target":34,"value":1},{"source":33,"target":37,"value":1},{"source":33,"target":40,"value":1},{"source":33,"target":42,"value":1},{"source":33,"target":43,"value":1},{"source":34,"target":4,"value":1},{"source":34,"target":8,"value":1},{"source":34,"target":12,"value":1},{"source":34,"target":16,"value":1},{"source":34,"target":19,"value":1},{"source":34,"target":23,"value":1},{"source":34,"target":25,"value":1},{"source":34,"target":29,"value":1},{"source":34,"target":30,"value":1},{"source":34,"target":31,"value":1},{"source":34,"target":32,"value":1},{"source":34,"target":33,"value":1},{"source":34,"target":38,"value":1},{"source":34,"target":41,"value":1},{"source":34,"target":43,"value":1},{"source":34,"target":44,"value":1},{"source":35,"target":5,"value":1},{"source":35,"target":13,"value":1},{"source":35,"target":20,"value":1},{"source":35,"target":26,"value":1},{"source":35,"target":31,"value":1},{"source":35,"target":36,"value":1},{"source":35,"target":37,"value":1},{"source":35,"target":38,"value":1},{"source":36,"target":5,"value":1},{"source":36,"target":6,"value":1},{"source":36,"target":13,"value":1},{"source":36,"target":14,"value":1},{"source":36,"target":20,"value":1},{"source":36,"target":21,"value":1},{"source":36,"target":26,"value":1},{"source":36,"target":27,"value":1},{"source":36,"target":31,"value":1},{"source":36,"target":32,"value":1},{"source":36,"target":35,"value":1},{"source":36,"target":37,"value":1},{"source":36,"target":38,"value":1},{"source":36,"target":39,"value":1},{"source":36,"target":40,"value":1},{"source":36,"target":41,"value":1},{"source":37,"target":5,"value":1},{"source":37,"target":7,"value":1},{"source":37,"target":13,"value":1},{"source":37,"target":15,"value":1},{"source":37,"target":20,"value":1},{"source":37,"target":22,"value":1},{"source":37,"target":26,"value":1},{"source":37,"target":28,"value":1},{"source":37,"target":31,"value":1},{"source":37,"target":33,"value":1},{"source":37,"target":35,"value":1},{"source":37,"target":36,"value":1},{"source":37,"target":38,"value":1},{"source":37,"target":40,"value":1},{"source":37,"target":42,"value":1},{"source":37,"target":43,"value":1},{"source":38,"target":5,"value":1},{"source":38,"target":8,"value":1},{"source":38,"target":13,"value":1},{"source":38,"target":16,"value":1},{"source":38,"target":20,"value":1},{"source":38,"target":23,"value":1},{"source":38,"target":26,"value":1},{"source":38,"target":29,"value":1},{"source":38,"target":31,"value":1},{"source":38,"target":34,"value":1},{"source":38,"target":35,"value":1},{"source":38,"target":36,"value":1},{"source":38,"target":37,"value":1},{"source":38,"target":41,"value":1},{"source":38,"target":43,"value":1},{"source":38,"target":44,"value":1},{"source":39,"target":6,"value":1},{"source":39,"target":14,"value":1},{"source":39,"target":21,"value":1},{"source":39,"target":27,"value":1},{"source":39,"target":32,"value":1},{"source":39,"target":36,"value":1},{"source":39,"target":40,"value":1},{"source":39,"target":41,"value":1},{"source":40,"target":6,"value":1},{"source":40,"target":7,"value":1},{"source":40,"target":14,"value":1},{"source":40,"target":15,"value":1},{"source":40,"target":21,"value":1},{"source":40,"target":22,"value":1},{"source":40,"target":27,"value":1},{"source":40,"target":28,"value":1},{"source":40,"target":32,"value":1},{"source":40,"target":33,"value":1},{"source":40,"target":36,"value":1},{"source":40,"target":37,"value":1},{"source":40,"target":39,"value":1},{"source":40,"target":41,"value":1},{"source":40,"target":42,"value":1},{"source":40,"target":43,"value":1},{"source":41,"target":6,"value":1},{"source":41,"target":8,"value":1},{"source":41,"target":14,"value":1},{"source":41,"target":16,"value":1},{"source":41,"target":21,"value":1},{"source":41,"target":23,"value":1},{"source":41,"target":27,"value":1},{"source":41,"target":29,"value":1},{"source":41,"target":32,"value":1},{"source":41,"target":34,"value":1},{"source":41,"target":36,"value":1},{"source":41,"target":38,"value":1},{"source":41,"target":39,"value":1},{"source":41,"target":40,"value":1},{"source":41,"target":43,"value":1},{"source":41,"target":44,"value":1},{"source":42,"target":7,"value":1},{"source":42,"target":15,"value":1},{"source":42,"target":22,"value":1},{"source":42,"target":28,"value":1},{"source":42,"target":33,"value":1},{"source":42,"target":37,"value":1},{"source":42,"target":40,"value":1},{"source":42,"target":43,"value":1},{"source":43,"target":7,"value":1},{"source":43,"target":8,"value":1},{"source":43,"target":15,"value":1},{"source":43,"target":16,"value":1},{"source":43,"target":22,"value":1},{"source":43,"target":23,"value":1},{"source":43,"target":28,"value":1},{"source":43,"target":29,"value":1},{"source":43,"target":33,"value":1},{"source":43,"target":34,"value":1},{"source":43,"target":37,"value":1},{"source":43,"target":38,"value":1},{"source":43,"target":40,"value":1},{"source":43,"target":41,"value":1},{"source":43,"target":42,"value":1},{"source":43,"target":44,"value":1},{"source":44,"target":8,"value":1},{"source":44,"target":16,"value":1},{"source":44,"target":23,"value":1},{"source":44,"target":29,"value":1},{"source":44,"target":34,"value":1},{"source":44,"target":38,"value":1},{"source":44,"target":41,"value":1},{"source":44,"target":43,"value":1}]}); doGraph('#graph-mine', {"nodes":[{"name":"5,8","group":"3"},{"name":"0,4","group":"3"},{"name":"2,6","group":"3"},{"name":"3,8","group":"3"},{"name":"4,4","group":"3"},{"name":"2,3","group":"3"},{"name":"3,6","group":"3"},{"name":"2,8","group":"3"},{"name":"4,5","group":"3"},{"name":"2,2","group":"3"},{"name":"1,3","group":"3"},{"name":"3,4","group":"3"},{"name":"0,0","group":"2"}],"links":[{"source":0,"target":3,"value":1},{"source":0,"target":7,"value":1},{"source":0,"target":8,"value":1},{"source":1,"target":4,"value":1},{"source":1,"target":8,"value":1},{"source":1,"target":11,"value":1},{"source":1,"target":12,"value":1},{"source":2,"target":5,"value":1},{"source":2,"target":6,"value":1},{"source":2,"target":7,"value":1},{"source":2,"target":9,"value":1},{"source":3,"target":0,"value":1},{"source":3,"target":5,"value":1},{"source":3,"target":6,"value":1},{"source":3,"target":7,"value":1},{"source":3,"target":10,"value":1},{"source":3,"target":11,"value":1},{"source":4,"target":1,"value":1},{"source":4,"target":8,"value":1},{"source":4,"target":11,"value":1},{"source":5,"target":2,"value":1},{"source":5,"target":3,"value":1},{"source":5,"target":6,"value":1},{"source":5,"target":7,"value":1},{"source":5,"target":9,"value":1},{"source":5,"target":10,"value":1},{"source":5,"target":11,"value":1},{"source":6,"target":2,"value":1},{"source":6,"target":3,"value":1},{"source":6,"target":5,"value":1},{"source":6,"target":10,"value":1},{"source":6,"target":11,"value":1},{"source":7,"target":0,"value":1},{"source":7,"target":2,"value":1},{"source":7,"target":3,"value":1},{"source":7,"target":5,"value":1},{"source":7,"target":9,"value":1},{"source":8,"target":0,"value":1},{"source":8,"target":1,"value":1},{"source":8,"target":4,"value":1},{"source":8,"target":11,"value":1},{"source":9,"target":2,"value":1},{"source":9,"target":5,"value":1},{"source":9,"target":7,"value":1},{"source":10,"target":3,"value":1},{"source":10,"target":5,"value":1},{"source":10,"target":6,"value":1},{"source":10,"target":11,"value":1},{"source":11,"target":1,"value":1},{"source":11,"target":3,"value":1},{"source":11,"target":4,"value":1},{"source":11,"target":5,"value":1},{"source":11,"target":6,"value":1},{"source":11,"target":8,"value":1},{"source":11,"target":10,"value":1},{"source":12,"target":1,"value":1}]});
playa vista