d3¶
WARNING: this package is still in dev. expect bugs
d3 is another popular DOM manipulation library available in javascript. This is the python port of that.
It has several utilities for working with the DOM.
selection¶
d3’s selection API is very powerful.
from domonic.dom import *
from domonic.html import *
from domonic.d3.selection import *
import domonic.d3 as d3
format¶
d3’s has a library for formatting numbers to avoid things like floating precision
from domonic.dom import *
from domonic.html import *
from domonic.d3.format import *
from domonic.d3.format import format
dispatch¶
d3 has an event system
from domonic.dom import *
from domonic.html import *
from domonic.d3.dispatch import dispatch, Dispatch
path¶
d3’s path API converts SVG paths to a d3.path object which is compatible with canvas.
from domonic.svg import *
from domonic.d3.path import Path
polygon¶
d3’s has shape API
from domonic.d3.polygon import *
D3 expects a “polygon” is a 2D array of integers listed counterclockwise (clockwise works too). This does not work with the polygon as defined by SVG, SVG polygons have a points method you can parse into a 2D array and use here.
polygonArea() finds the area of a given polygon. It returns a float/int.
def test_polygonArea(self):
irreg_0 = [[5,11],[12,4],[7,7],[6,1]] # area: 15
irreg_1 = [[-6,12],[23,2],[19,-8],[-7,-6]] # area: 400
irreg_2 = [[0,4],[12,8],[23,-5],[-5,-3]] # area: 203
square = [[0,4],[4,4],[4,0],[0,0]] # area: 16
triangle = [[-4,0],[0,4],[2,0]] # area: 12
self.assertEqual(polygonArea(irreg_0), 15)
self.assertEqual(polygonArea(irreg_1), 400)
self.assertEqual(polygonArea(irreg_2), 203)
self.assertEqual(polygonArea(square), 16)
self.assertEqual(polygonArea(triangle), 12)
polygonCentroid() finds the center of mass of a given polygon. It returns 2 ints in an array, representing the point of the polygons center of mass.
def test_polygonCentroid(self):
irreg = [[-4,0],[8,12],[4,8],[-4,-4],[0,0]] # centroid: [0, 4]
square = [[0,4],[4,4],[4,0],[0,0]] # centroid: [2, 2]
triangle = [[-4,0],[0,4],[4,2]] # centroid: [0, 2]
self.assertEqual(polygonCentroid(irreg), [0, 4])
self.assertEqual(polygonCentroid(square), [2, 2])
self.assertEqual(polygonCentroid(triangle), [0, 2])
polygonHull() takes a 2D array of points and determines the polygon hull using andrew’s monotone chain algorithm. It returns the polygon hull as a 2D array of points.
def test_polygonHull(self):
points_0 = [[0,6],[12,8],[23,-5],[-5,-3],[5,11],[12,4],[7,7],[6,1]]
points_1 = [[-4,0],[8,12],[4,8],[-4,-4],[0,0],[-6,12],[23,2],[19,-8],[-7,-6]]
hull_0 = [[-5,-3],[0,6],[5,11],[12,8],[23,-5]]
hull_1 = [[-7,-6],[-6,12],[8,12],[19,-8],[23,2]]
self.assertEqual(polygonHull(points_0), hull_0)
self.assertEqual(polygonHull(points_1), hull_1)
polygonContains() takes a polygon and a point, it returns true if the point is inside the polygon, false otherwise.
def test_polygonContains(self):
irreg_0 = [[5,11],[12,4],[7,7],[6,1]]
square = [[0,4],[4,4],[4,0],[0,0]]
triangle = [[-4,0],[0,4],[2,0]]
self.assertTrue(polygonContains(irreg_0, [6,8]))
self.assertFalse(polygonContains(irreg_0, [0,0]))
self.assertTrue(polygonContains(square, [2,2]))
self.assertFalse(polygonContains(square, [-2,-2]))
self.assertTrue(polygonContains(triangle, [0,1]))
self.assertFalse(polygonContains(triangle, [0,-1]))
polygonLength() takes a polygon and returns the sum of the length of the polygon’s sides.
def test_polygonLength(self):
irreg_0 = [[5,11],[12,4],[7,7],[6,1]] # length = 31.863
square = [[0,4],[4,4],[4,0],[0,0]] # length = 16
triangle = [[-4,0],[0,4],[2,0]] # length ~ 16.129
self.assertEqual(round(polygonLength(irreg_0), 3), 31.863)
self.assertEqual(polygonLength(square), 16)
self.assertEqual(round(polygonLength(triangle), 3), 16.129)