From dc5f3984bd9e739fedf72e68b5123ffd8c7100f3 Mon Sep 17 00:00:00 2001 From: Jamie Boisture Date: Mon, 08 Jun 2009 15:30:22 +0000 Subject: This is the initial commit for the Grapher activity --- (limited to 'graphs.py') diff --git a/graphs.py b/graphs.py new file mode 100755 index 0000000..32acaa7 --- /dev/null +++ b/graphs.py @@ -0,0 +1,256 @@ +import cairo, math +colors = [(1,0,0),(0,1,0),(0,0,1),(.8,.2,0),(0,.8,.3)] + + + +def ln(x): + try: + return math.log(x, math.e) + except: + return None +def log(x, base = 10): + try: + return math.log(x, base) + except: + return None +def sin(x): + if Settings["degrees"]: + x = math.radians(x) + try: + return math.sin(x) + except: + return None +def cos(x): + if Settings["degrees"]: + x = math.radians(x) + try: + return math.cos(x) + except: + return None +def tan(x): + if Settings["degrees"]: + x = math.radians(x) + try: + return math.tan(x) + except: + return None +def csc(x): + if Settings["degrees"]: + x = math.radians(x) + try: + return 1.0/math.sin(x) + except: + return None +def sec(x): + if Settings["degrees"]: + x = math.radians(x) + try: + return 1.0/math.cos(x) + except: + return None +def cot(x): + if Settings["degrees"]: + x = math.radians(x) + try: + return 1.0/math.tan(x) + except: + return None +def sqrt(x): + try: + return math.sqrt(x) + except: + return None + + + + +def calcXpos(x, settings): + return float(x - settings["xmin"])/float(settings["xmax"] - settings["xmin"]) * settings["width"] + +def calcYpos(y, settings): + return settings["height"] - float(y - settings["ymin"])/float(settings["ymax"] - settings["ymin"]) * settings["height"] + +def calcPosFromPolar(r, theta, settings): + if settings["degrees"]: + theta = math.radians(theta) + x = r*math.cos(theta) + y = r*math.sin(theta) + return (calcXpos(x,settings),calcYpos(y,settings)) + +class FunctionGraph: + def __init__(self, graph, settings, num): + self.num = num +1 + self.graph = self.formateGraph(graph) + self.settings = settings + self.color = colors[num] + self.points = self.EvaluateGraph() + + def formateGraph(self, graph): + formatedGraph = "" + acceptedNumbers = ["1","2","3","4","5","6","7","8","9","0"] + acceptedSymbols = [".",",","a","b","c","e","g","i","l","n","o","r","s","t","q","x","*","/","+","-","(",")"] + for s in graph: + if s in acceptedNumbers: formatedGraph += s + if s in acceptedSymbols: formatedGraph += s + if s == "{" or s == "[": formatedGraph += ("(") + if s == "}" or s == "}": formatedGraph += (")") + if s == "^": formatedGraph += ("**") + i = 0 + while i < len(formatedGraph)-1: + if formatedGraph[i] in acceptedNumbers: + if formatedGraph[i+1] == "x": + i += 1 + formatedGraph = formatedGraph[:i] + "*" + formatedGraph[i:] + i += 1 + return formatedGraph + + def EvaluateGraph(self): + graphList = [] + inc = float(self.settings["xmax"]-self.settings["xmin"])/float(self.settings["points"]) + x = self.settings["xmin"] + while x <= self.settings["xmax"] + inc: + y = eval(self.graph) + if y != None: + graphList.append((calcXpos(x,self.settings),calcYpos(y,self.settings))) + x += inc + return graphList + + def draw(self,context): + context.set_source_rgb(*self.color) + i = 1 + context.move_to(*self.points[0]) + while i < len(self.points): + context.line_to(*self.points[i]) + i+=1 + context.stroke() + +class PolarGraph: + def __init__(self, graph, settings, num): + self.num = num +1 + self.graph = self.formateGraph(graph) + self.settings = settings + self.color = colors[num] + self.points = self.EvaluateGraph() + + def formateGraph(self, graph): + formatedGraph = "" + acceptedNumbers = ["1","2","3","4","5","6","7","8","9","0"] + acceptedSymbols = [".",",","a","b","c","e","g","i","l","n","o","r","s","t","q","x","*","/","+","-","(",")"] + for s in graph: + if s in acceptedNumbers: formatedGraph += s + if s in acceptedSymbols: formatedGraph += s + if s == "{" or s == "[": formatedGraph += ("(") + if s == "}" or s == "}": formatedGraph += (")") + if s == "^": formatedGraph += ("**") + i = 0 + while i < len(formatedGraph)-1: + if formatedGraph[i] in acceptedNumbers: + if formatedGraph[i+1] == "x": + i += 1 + formatedGraph = formatedGraph[:i] + "*" + formatedGraph[i:] + i += 1 + return formatedGraph + + def EvaluateGraph(self): + graphList = [] + inc = float(self.settings["thetamax"]-self.settings["thetamin"])/float(self.settings["points"]) + x = self.settings["thetamin"] + while x <= self.settings["thetamax"] + inc: + y = eval(self.graph) + if y != None: + graphList.append(calcPosFromPolar(y,x,self.settings)) + x += inc + return graphList + + def draw(self,context): + context.set_source_rgb(*self.color) + i = 1 + context.move_to(*self.points[0]) + while i < len(self.points): + context.line_to(*self.points[i]) + i+=1 + context.stroke() + +class ParametricGraph: + def __init__(self, graphX, graphY, settings, num): + self.num = num +1 + self.graphX = self.formateGraph(graphX) + self.graphY = self.formateGraph(graphY) + self.settings = settings + self.color = colors[num] + self.points = self.EvaluateGraphs() + + def formateGraph(self, graph): + formatedGraph = "" + acceptedNumbers = ["1","2","3","4","5","6","7","8","9","0"] + acceptedSymbols = [".","a","b","c","g","i","l","n","o","r","s","t","q","*","/","+","-","(",")"] + for s in graph: + if s in acceptedNumbers: formatedGraph += s + if s in acceptedSymbols: formatedGraph += s + if s == "{" or s == "[": formatedGraph += ("(") + if s == "}" or s == "}": formatedGraph += (")") + if s == "^": formatedGraph += ("**") + i = 0 + while i < len(formatedGraph)-1: + if formatedGraph[i] in acceptedNumbers: + if formatedGraph[i+1] == "x": + i += 1 + formatedGraph = formatedGraph[:i] + "*" + formatedGraph[i:] + i += 1 + return formatedGraph + + def EvaluateGraphs(self): + graphList = [] + inc = float(self.settings["tmax"]-self.settings["tmin"])/float(self.settings["points"]) + t = self.settings["tmin"] + while t <= self.settings["tmax"] + inc: + y = eval(self.graphY) + x = eval(self.graphX) + graphList.append((calcXpos(x,self.settings),calcYpos(y,self.settings))) + t += inc + return graphList + + def draw(self,context): + context.set_source_rgb(*self.color) + i = 1 + context.move_to(*self.points[0]) + while i < len(self.points): + context.line_to(*self.points[i]) + i+=1 + context.stroke() + +class Axis: + def __init__(self, settings): + global Settings + Settings = settings + width = settings["width"] + height = settings["height"] + self.settings = settings + self.center = (width - width*(float(settings["xmax"])/(float(settings["xmax"]-settings["xmin"]))), + height*(float(settings["ymax"])/(float(settings["ymax"]-settings["ymin"])))) + self.x = self.center[0] + if self.center[0] < 0: + self.x = 0 + if self.center[0] > width: + self.x = width + self.y = self.center[1] + if self.center[1] < 0: + self.y = 0 + if self.center[1] > height: + self.y = height + + def draw(self,context): + context.move_to(self.center[0],0) + context.line_to(self.center[0],self.settings["height"]) + context.stroke() + context.move_to(0,self.center[1]) + context.line_to(self.settings["width"],self.center[1]) + context.stroke() + for x in range(int(self.settings["xmin"]), int(self.settings["xmax"])): + context.move_to(calcXpos(x, self.settings), self.y-5) + context.line_to(calcXpos(x, self.settings), self.y+5) + context.stroke() + for y in range(int(self.settings["ymin"]), int(self.settings["ymax"])): + context.move_to(self.x-5,calcYpos(y, self.settings)) + context.line_to(self.x+5,calcYpos(y, self.settings)) + context.stroke() -- cgit v0.9.1