class TrimorphicUI(PolygonTileUI): def __init__(self, t, wiggle=CubicCurve2D.Double(0, 0, 0.5, 0.5, 0.5, -0.5, 1, 0)): self.preTransform = t self.wiggle = wiggle PolygonTileUI.__init__(self, Color(64, 183, 185), t) self.initialiseGraphics() def initialiseGraphics(self): self.polygonalTilePath = GeneralPath() self.polygonalTilePath.append(self.wiggle, 1) t = AffineTransform.getTranslateInstance(1, 0) t.rotate(math.pi / 2) wiggle2 = GeneralPath(self.wiggle) wiggle2.transform(t) self.polygonalTilePath.append(wiggle2, 1) t = AffineTransform.getTranslateInstance(1, 1) t.rotate(3 * math.pi / 4) t.scale(1 / math.sqrt(2), 1 / math.sqrt(2)) wiggle3 = GeneralPath(self.wiggle) wiggle3.transform(t) self.polygonalTilePath.append(wiggle3, 1) t = AffineTransform.getTranslateInstance(0.5, 1.5) t.rotate(5 * math.pi / 4) t.scale(1 / math.sqrt(2), 1 / math.sqrt(2)) wiggle4 = GeneralPath(self.wiggle) wiggle4.transform(t) self.polygonalTilePath.append(wiggle4, 1) t = AffineTransform.getTranslateInstance(0, 1) t.rotate(3 * math.pi / 2) wiggle5 = GeneralPath(self.wiggle) wiggle5.transform(t) self.polygonalTilePath.append(wiggle5, 1) self.polygonalTilePath.closePath() self.polygonalTilePath.transform(self.preTransform)
class SHornUI(PolygonTileUI): def __init__(self, t, n): self.preTransform = t self.n = n PolygonTileUI.__init__(self, Color(210, 83, 185), t) self.initialiseGraphics() def initialiseGraphics(self): wiggle=CubicCurve2D.Double(0, 0, 0.3, -0.3, 0.7, 0.3, 1, 0) reverseWiggle=CubicCurve2D.Double(1, 0, 0.7, 0.3, 0.3, -0.3, 0, 0) self.polygonalTilePath = GeneralPath() self.polygonalTilePath.append(wiggle, 1) self.polygonalTilePath.lineTo(math.cos(math.pi / self.n), math.sin(math.pi / self.n)) t = AffineTransform.getRotateInstance(math.pi / self.n) wiggle2 = GeneralPath(reverseWiggle) wiggle2.transform(t) self.polygonalTilePath.append(wiggle2, 1) self.polygonalTilePath.closePath() self.polygonalTilePath.transform(self.preTransform)
class Star(): def __init__(self, radius, color): self.color = color self.setSize(radius) def setSize(self, size): # First triangle, size is radius of circumcircle, center at (0,0) self.tri1 = GeneralPath() self.tri1.moveTo(size, 0) self.tri1.lineTo(int(-0.5 * size), int(0.866 * size)) self.tri1.lineTo(int(-0.5 * size), int(-0.866 * size)) self.tri1.closePath() # Second triangle like first, but rotated 180 degrees self.tri2 = self.tri1.clone() t = AffineTransform() t.rotate(math.pi) self.tri2.transform(t) def turn(self, angle): t = AffineTransform() t.rotate(angle) self.tri1.transform(t) self.tri2.transform(t) def showAt(self, mx, my): bg.setPaintColor(self.color) t = AffineTransform() t.translate(mx, -50 + my % 650) # Restrict to playground # Cloning to avoid side effects gp1 = self.tri1.clone() gp2 = self.tri2.clone() gp1.transform(t) gp2.transform(t) bg.fillGeneralPath(gp1) bg.fillGeneralPath(gp2)