Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 166 additions & 0 deletions demos/centered/center.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
// ----- setup ----- //
var isSpinning = true;

var model = new Zdog.Anchor();

// Made with Zdog

const orange = '#E62';
const garnet = '#C25';
const eggplant = '#636';

// origin dot
var dot = new Zdog.Shape({
addTo: model,
stroke: 8,
color: eggplant,
});

var zCircle = new Zdog.Ellipse({
addTo: model,
diameter: 20,
quarters: 2,
closed: true,
translate: { z: 40 },
scale: 1,
stroke: 8,
fill: true,
color: eggplant,
});

// z line
new Zdog.Shape({
addTo: zCircle,
path: [ {}, zCircle.translate.copy().multiply({ z: -1 }) ],
scale: 1/zCircle.scale.z,
stroke: 2,
color: zCircle.color,
});

var xRect = new Zdog.Rect({
addTo: zCircle,
width: 20,
height: 20,
translate: { x: 40 },
stroke: 8,
fill: true,
color: garnet,
});

// x line
new Zdog.Shape({
addTo: xRect,
path: [ {}, xRect.translate.copy().multiply({ x: -1 }) ],
stroke: 2,
color: xRect.color,
});

var yTri = new Zdog.Polygon({
addTo: xRect,
radius: 10,
sides: 3,
translate: { y: -60 },
stroke: 8,
fill: true,
color: orange,
});

// y line
new Zdog.Shape({
addTo: yTri,
path: [ {}, yTri.translate.copy().multiply({ y: -1 }) ],
stroke: 2,
color: yTri.color,
});

var canvasDot = new Zdog.Illustration({
element: 'canvas.dot',
dragRotate: model,
//centered: dot,
onDragStart: function() {
isSpinning = false;
},
});

var canvasEggplant = new Zdog.Illustration({
element: 'canvas.eggplant',
dragRotate: model,
centered: zCircle,
onDragStart: function() {
isSpinning = false;
},
});
var canvasGarnet = new Zdog.Illustration({
element: 'canvas.garnet',
dragRotate: model,
centered: xRect,
onDragStart: function() {
isSpinning = false;
},
});
var canvasOrange = new Zdog.Illustration({
element: 'canvas.orange',
dragRotate: model,
centered: yTri,
onDragStart: function() {
isSpinning = false;
},
});

var svgDot = new Zdog.Illustration({
element: 'svg.dot',
dragRotate: model,
isolated: true,
//centered: dot,
onDragStart: function() {
isSpinning = false;
},
});
var svgEggplant = new Zdog.Illustration({
element: 'svg.eggplant',
dragRotate: model,
isolated: true,
centered: zCircle,
onDragStart: function() {
isSpinning = false;
},
});
var svgGarnet = new Zdog.Illustration({
element: 'svg.garnet',
dragRotate: model,
isolated: true,
centered: xRect,
onDragStart: function() {
isSpinning = false;
},
});
var svgOrange = new Zdog.Illustration({
element: 'svg.orange',
dragRotate: model,
centered: yTri,
onDragStart: function() {
isSpinning = false;
},
});

// ----- animate ----- //

function animate() {
model.rotate.y += isSpinning ? 0.03 : 0;
model.updateGraph();

canvasDot.renderGraph( model );
canvasEggplant.renderGraph( model );
canvasGarnet.renderGraph( model );
canvasOrange.renderGraph( model );

svgDot.renderGraph( model );
svgEggplant.renderGraph( model );
svgGarnet.renderGraph( model );
svgOrange.renderGraph( model );

requestAnimationFrame( animate );
}

animate();

60 changes: 60 additions & 0 deletions demos/centered/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />

<title>centered</title>

<style>
html { height: 100%; }

body {
margin: 0;
display: grid;
grid-template-columns: 1fr 1fr;
place-items: center;
background: white;
font-family: sans-serif;
text-align: center;
}

.illo {
display: block;
cursor: move;
background: #FDB;
border-radius: 8px;
margin: 20px 2%;
}
</style>

</head>
<body>

<canvas class="dot illo" width="200" height="200"></canvas>
<canvas class="eggplant illo" width="200" height="200"></canvas>
<canvas class="garnet illo" width="200" height="200"></canvas>
<canvas class="orange illo" width="200" height="200"></canvas>

<svg class="dot illo" width="200" height="200"></svg>
<svg class="eggplant illo" width="200" height="200"></svg>
<svg class="garnet illo" width="200" height="200"></svg>
<svg class="orange illo" width="200" height="200"></svg>

<script src="../../js/boilerplate.js"></script>
<script src="../../js/canvas-renderer.js"></script>
<script src="../../js/svg-renderer.js"></script>
<script src="../../js/vector.js"></script>
<script src="../../js/anchor.js"></script>
<script src="../../js/path-command.js"></script>
<script src="../../js/shape.js"></script>
<script src="../../js/ellipse.js"></script>
<script src="../../js/rect.js"></script>
<script src="../../js/polygon.js"></script>
<script src="../../js/group.js"></script>
<script src="../../js/dragger.js"></script>
<script src="../../js/illustration.js"></script>
<script src="center.js"></script>

</body>
</html>
39 changes: 30 additions & 9 deletions js/illustration.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ var TAU = utils.TAU;
var Illustration = Anchor.subclass({
element: undefined,
centered: true,
isolated: false,
zoom: 1,
dragRotate: false,
resize: false,
Expand Down Expand Up @@ -157,9 +158,13 @@ Illustration.prototype.prerenderCanvas = function() {
ctx.clearRect( 0, 0, this.canvasWidth, this.canvasHeight );
ctx.save();
if ( this.centered ) {
var centerX = this.width / 2 * this.pixelRatio;
var centerY = this.height / 2 * this.pixelRatio;
ctx.translate( centerX, centerY );
var centerX = this.width / 2;
var centerY = this.height / 2;
if (this.centered.origin) {
centerX -= this.centered.renderOrigin.x;
centerY -= this.centered.renderOrigin.y;
}
ctx.translate( centerX * this.pixelRatio, centerY * this.pixelRatio);
}
var scale = this.pixelRatio * this.zoom;
ctx.scale( scale, scale );
Expand All @@ -172,6 +177,25 @@ Illustration.prototype.postrenderCanvas = function() {

// ----- svg ----- //

Illustration.prototype.prerenderSvg = function() {
var viewWidth = this.width / this.zoom;
var viewHeight = this.height / this.zoom;
var viewX = this.centered ? -viewWidth/2 : 0;
var viewY = this.centered ? -viewHeight/2 : 0;
if (this.centered.origin) {
viewX += this.centered.renderOrigin.x;
viewY += this.centered.renderOrigin.y;
}
this.element.setAttribute( 'viewBox', viewX + ' ' + viewY + ' ' +
viewWidth + ' ' + viewHeight );
}

Illustration.prototype.postrenderSvg = function() {
if (this.isolated){
this.element.innerHTML = this.element.innerHTML;
}
}

Illustration.prototype.setSvg = function( element ) {
this.element = element;
this.isSvg = true;
Expand All @@ -185,12 +209,7 @@ Illustration.prototype.setSvg = function( element ) {
Illustration.prototype.setSizeSvg = function( width, height ) {
this.width = width;
this.height = height;
var viewWidth = width / this.zoom;
var viewHeight = height / this.zoom;
var viewX = this.centered ? -viewWidth/2 : 0;
var viewY = this.centered ? -viewHeight/2 : 0;
this.element.setAttribute( 'viewBox', viewX + ' ' + viewY + ' ' +
viewWidth + ' ' + viewHeight );
this.prerenderSvg();
if ( this.resize ) {
// remove size attributes, let size be determined by viewbox
this.element.removeAttribute('width');
Expand All @@ -204,8 +223,10 @@ Illustration.prototype.setSizeSvg = function( width, height ) {
Illustration.prototype.renderGraphSvg = function( item ) {
item = item || this;
empty( this.element );
this.prerenderSvg();
this.onPrerender( this.element );
Anchor.prototype.renderGraphSvg.call( item, this.element );
this.postrenderSvg();
};

function empty( element ) {
Expand Down