181 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						|
<html lang="en">
 | 
						|
    <head>
 | 
						|
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 | 
						|
 | 
						|
        <title>PIXI ForceLayout</title>
 | 
						|
 | 
						|
        <link rel="stylesheet" href="../3rdparty/highlight/styles/default.css" />
 | 
						|
        <link rel="stylesheet" href="../../css/doctest.css" />
 | 
						|
 | 
						|
        <script src="../3rdparty/highlight/highlight.pack.js"></script>
 | 
						|
        <script src="../../dist/iwmlib.3rdparty.js"></script>
 | 
						|
 | 
						|
        <script src="../../dist/iwmlib.js"></script>
 | 
						|
        <script src="../../dist/iwmlib.pixi.js"></script>
 | 
						|
 | 
						|
        <script src="./lib/graphology.min.js"></script>
 | 
						|
        <script src="./lib/graphology-layout-forceatlas2.js"></script>
 | 
						|
    </head>
 | 
						|
    <body onload="Doctest.run()">
 | 
						|
        <h1><a href="../index.html">lib.</a><a href="index.html">pixi.</a>ForceLayout</h1>
 | 
						|
        <p>
 | 
						|
            Comparison of a <a href="https://github.com/d3/d3-force/blob/master/README.md">D3 ForceLayout</a> with a
 | 
						|
            <a href="https://github.com/graphology/graphology-layout-forceatlas2">ForceAtlas 2</a> forcelayout.
 | 
						|
        </p>
 | 
						|
        <h2>Let's look at the D3 ForceLayout:</h2>
 | 
						|
        <br />
 | 
						|
        <canvas id="canvas" class="interactive"></canvas>
 | 
						|
        <script class="doctest">
 | 
						|
            const app = new PIXIApp({
 | 
						|
                view: canvas,
 | 
						|
                width: 900,
 | 
						|
                height: 420,
 | 
						|
                transparent: false
 | 
						|
            })
 | 
						|
                .setup()
 | 
						|
                .run()
 | 
						|
 | 
						|
            app.loadTextures(
 | 
						|
                ['./assets/circle.png'],
 | 
						|
                (textures) => {
 | 
						|
                    // add sprites
 | 
						|
                    //--------------------
 | 
						|
                    const sprites = []
 | 
						|
 | 
						|
                    for (let i = 0; i < 100; i++) {
 | 
						|
                        const sprite = new PIXI.Sprite(textures.get('./assets/circle.png'))
 | 
						|
                        sprite.x = randomInt(0, app.size.width)
 | 
						|
                        sprite.y = randomInt(0, app.size.height)
 | 
						|
                        sprite.width = sprite.height = 2
 | 
						|
                        sprite.anchor.set(0.5, 0.5)
 | 
						|
                        sprite.__random = Math.random()
 | 
						|
                        sprites.push(sprite)
 | 
						|
                    }
 | 
						|
 | 
						|
                    app.scene.addChild(...sprites)
 | 
						|
 | 
						|
                    // force simulation
 | 
						|
                    //--------------------
 | 
						|
                    const forceCollide = d3.forceCollide().radius((d) => d.width / 2 + 1)
 | 
						|
                    const simulation = d3
 | 
						|
                        .forceSimulation(sprites)
 | 
						|
                        .on('tick', () => {
 | 
						|
                            //forceCollide.radius(d => d.radius)
 | 
						|
                        })
 | 
						|
                        .force('collide', forceCollide)
 | 
						|
                        .force('x', d3.forceX(app.center.x))
 | 
						|
                        .force('y', d3.forceY(app.center.y))
 | 
						|
                        .stop()
 | 
						|
                        .force(
 | 
						|
                            'radial',
 | 
						|
                            d3.forceRadial(
 | 
						|
                                (d) => {
 | 
						|
                                    return d.__random < 0.5 ? 60 : 160
 | 
						|
                                },
 | 
						|
                                app.center.x,
 | 
						|
                                app.center.y
 | 
						|
                            )
 | 
						|
                        )
 | 
						|
 | 
						|
                    d3.timeout(() => {
 | 
						|
                        simulation.restart()
 | 
						|
                    }, 500)
 | 
						|
                },
 | 
						|
                { resolutionDependent: false }
 | 
						|
            )
 | 
						|
        </script>
 | 
						|
 | 
						|
        <h2>D3 ForceLayout with links:</h2>
 | 
						|
        <br />
 | 
						|
        <canvas id="canvas2" class="interactive"></canvas>
 | 
						|
        <script class="doctest">
 | 
						|
            const app2 = new PIXIApp({
 | 
						|
                view: canvas2,
 | 
						|
                width: 900,
 | 
						|
                height: 420,
 | 
						|
                transparent: false
 | 
						|
            })
 | 
						|
                .setup()
 | 
						|
                .run()
 | 
						|
 | 
						|
            app2.loadTextures(
 | 
						|
                ['./assets/circle2.png'],
 | 
						|
                (textures) => {
 | 
						|
                    // add sprites
 | 
						|
                    //--------------------
 | 
						|
                    const sprites = []
 | 
						|
 | 
						|
                    for (let i = 0; i < 100; i++) {
 | 
						|
                        const sprite = new PIXI.Sprite(textures.get('./assets/circle2.png'))
 | 
						|
                        sprite.id = i
 | 
						|
                        sprite.x = randomInt(0, app2.size.width)
 | 
						|
                        sprite.y = randomInt(0, app2.size.height)
 | 
						|
                        sprite.width = sprite.height = 16
 | 
						|
                        sprite.anchor.set(0.5, 0.5)
 | 
						|
                        sprites.push(sprite)
 | 
						|
                    }
 | 
						|
 | 
						|
                    app2.scene.addChild(...sprites)
 | 
						|
 | 
						|
                    const links = new PIXI.Graphics()
 | 
						|
                    app2.scene.addChildAt(links, 0)
 | 
						|
 | 
						|
                    // force simulation
 | 
						|
                    //--------------------
 | 
						|
                    const forceCollide = d3.forceCollide().radius((d) => d.width / 2 + 4)
 | 
						|
                    const forceLink = d3
 | 
						|
                        .forceLink([
 | 
						|
                            { source: 88, target: 8 },
 | 
						|
                            { source: 47, target: 55 },
 | 
						|
                            { source: 70, target: 1 },
 | 
						|
                            { source: 12, target: 12 },
 | 
						|
                            { source: 26, target: 33 },
 | 
						|
                            { source: 48, target: 53 },
 | 
						|
                            { source: 10, target: 70 },
 | 
						|
                            { source: 68, target: 61 },
 | 
						|
                            { source: 28, target: 65 },
 | 
						|
                            { source: 12, target: 34 },
 | 
						|
                            { source: 6, target: 55 },
 | 
						|
                            { source: 9, target: 16 },
 | 
						|
                            { source: 87, target: 96 },
 | 
						|
                            { source: 64, target: 24 },
 | 
						|
                            { source: 98, target: 14 },
 | 
						|
                            { source: 18, target: 23 },
 | 
						|
                            { source: 53, target: 62 },
 | 
						|
                            { source: 11, target: 53 },
 | 
						|
                            { source: 43, target: 23 },
 | 
						|
                            { source: 80, target: 9 },
 | 
						|
                            { source: 72, target: 88 },
 | 
						|
                            { source: 62, target: 3 },
 | 
						|
                            { source: 72, target: 15 },
 | 
						|
                            { source: 84, target: 25 },
 | 
						|
                            { source: 57, target: 58 },
 | 
						|
                            { source: 87, target: 19 }
 | 
						|
                        ])
 | 
						|
                        .id((d) => d.id)
 | 
						|
                        .strength(0.05)
 | 
						|
                    const simulation = d3
 | 
						|
                        .forceSimulation(sprites)
 | 
						|
                        .on('tick', () => {
 | 
						|
                            links.clear()
 | 
						|
                            links.lineStyle(1, 0xfdc02f)
 | 
						|
                            for (let link of forceLink.links()) {
 | 
						|
                                links.moveTo(link.source.x, link.source.y)
 | 
						|
                                links.lineTo(link.target.x, link.target.y)
 | 
						|
                            }
 | 
						|
                        })
 | 
						|
                        .force('collide', forceCollide)
 | 
						|
                        .force('link', forceLink)
 | 
						|
                        .stop()
 | 
						|
 | 
						|
                    d3.timeout(() => {
 | 
						|
                        simulation.restart()
 | 
						|
                    }, 1000)
 | 
						|
                },
 | 
						|
                { resolutionDependent: false }
 | 
						|
            )
 | 
						|
        </script>
 | 
						|
    </body>
 | 
						|
</html>
 |