From ff0b219980f2396de96fb2a4f13d7f5178d10d48 Mon Sep 17 00:00:00 2001 From: Sergei Yakimchik Date: Tue, 11 Dec 2012 23:55:34 +0300 Subject: [PATCH 1/2] Circumcircle of triangle has been added. --- components/geometry/base/geom_modes.py | 32 +++++++++++++ components/geometry/base/geom_objects.py | 60 ++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/components/geometry/base/geom_modes.py b/components/geometry/base/geom_modes.py index bbab719..4e9be55 100644 --- a/components/geometry/base/geom_modes.py +++ b/components/geometry/base/geom_modes.py @@ -44,6 +44,7 @@ import suit.cf.utils as comutils import suit.core.render.engine as render_engine import geom_controls +import math class GeometryEditMode(BaseEditMode): @@ -357,6 +358,37 @@ def _onKeyPressed(self, _evt): if isinstance(obj, (GeometryTriangle, GeometryQuadrangle)): self.state = GeometryEditMode.ES_PerimeterChange self.perimetr_changer = TextInput(obj, self._perimeter_change_callback, obj.getPropertyValue(GeometryAbstractObject.PropPerimeter)) + + if key == ois.KC_O: + selected = self._logic._getSheet().getSelected() + for obj in selected: + if isinstance(obj, (GeometryTriangle)): + circumcirclePoints = obj._calculateCircumcirclePoints() + + # create center point of circle + centerPointCoord = circumcirclePoints[0] + center = self._logic.createPoint(centerPointCoord) + sheet = self._logic._getSheet() + sheet.addChild(center) + center._updateView() + + #set point of circle as vertex of triangle + vertexPointCoord = circumcirclePoints[1] + vertex = self._logic.createPoint(vertexPointCoord) + sheet = self._logic._getSheet() + + _selected = center, vertex + + obj._setCircumcirclePoints(_selected) + + #draw circumcircle + self.active_object = self._logic.createCircle() + if self.active_object.makeBasedOnObjects(_selected): + self._logic._getSheet().addChild(self.active_object) + obj._setIsCircumcircleDrawed(True) + else: + self.active_object.delete() + self.active_object = None return False diff --git a/components/geometry/base/geom_objects.py b/components/geometry/base/geom_objects.py index 1d81cef..0c11976 100644 --- a/components/geometry/base/geom_objects.py +++ b/components/geometry/base/geom_objects.py @@ -919,6 +919,8 @@ def __init__(self): self.__manualObject = None # manual object to store and render geometry self.pts = [] # triangle vertex points self.sides = [] # triangle sides + self.isCircumcircleDrawed = False #flag showing is circumcircle shown on objects sheet + self.circumcirclePoints = [] #turple for circumcircle points def __del__(self): suit.core.objects.ObjectDepth.__del__(self) @@ -985,6 +987,15 @@ def _update(self, _timeSinceLastFrame): self.__manualObject.end() + # update circumcircle points position + if self.isCircumcircleDrawed: + circumcirclePointsCoordinates = self._calculateCircumcirclePoints() + circumcircle = self.circumcirclePoints[0] + vertex = self.circumcirclePoints[1] + circumcircle.setPosition(render_engine.pos2dTo3dIsoPos(circumcirclePointsCoordinates[0])) + vertex.setPosition(render_engine.pos2dTo3dIsoPos(circumcirclePointsCoordinates[1])) + + suit.core.objects.ObjectDepth._update(self, _timeSinceLastFrame) def _updateView(self): @@ -1119,6 +1130,55 @@ def build_text_idtf(self): else: return None + def _calculateCircumcirclePoints(self): + """Calculate points for circumcircle and draw it on objects sheet + """ + # calculate triangle vertex coordinates + pointA_x = render_engine.pos3dTo2dWindow(self.pts[0].getPosition())[0] + pointA_y = render_engine.pos3dTo2dWindow(self.pts[0].getPosition())[1] + pointB_x = render_engine.pos3dTo2dWindow(self.pts[1].getPosition())[0] + pointB_y = render_engine.pos3dTo2dWindow(self.pts[1].getPosition())[1] + pointC_x = render_engine.pos3dTo2dWindow(self.pts[2].getPosition())[0] + pointC_y = render_engine.pos3dTo2dWindow(self.pts[2].getPosition())[1] + + # calculate center coordinates + coefficient_A1 = 2*(pointB_x-pointA_x) + coefficient_A2 = 2*(pointC_x-pointB_x) + coefficient_B1 = 2*(pointB_y-pointA_y) + coefficient_B2 = 2*(pointC_y-pointB_y) + coefficient_C1 = math.pow(pointB_x, 2)-math.pow(pointA_x,2)+math.pow(pointB_y, 2)-math.pow(pointA_y,2) + coefficient_C2 = math.pow(pointC_x, 2)-math.pow(pointB_x,2)+math.pow(pointC_y, 2)-math.pow(pointB_y,2) + + center_y = (coefficient_C2*coefficient_A1-coefficient_A2*coefficient_C1)/(coefficient_B2*coefficient_A1-coefficient_A2*coefficient_B1) + center_x = (coefficient_C1-coefficient_B1*center_y)/coefficient_A1 + + # create center point + centerPointCoord = center_x, center_y + + # create vertex point + vertexPointCoord = pointA_x, pointA_y + + return [centerPointCoord, vertexPointCoord] + + def _setCircumcirclePoints(self, circumcirclePoints): + """set list of circumcircle points + """ + self.circumcirclePoints = circumcirclePoints + + def _getCircumcirclePoints(self): + """get list of circumcircle points + """ + return self.circumcirclePoints + + def _setIsCircumcircleDrawed(self, isCircumcircleDrawed): + """set flag circumcircle drawed + """ + self.isCircumcircleDrawed = isCircumcircleDrawed + + def _getIsCircumcircleDrawed(self): + """get flag circumcircle drawed + """ + return self.isCircumcircleDrawed class GeometryQuadrangle(suit.core.objects.ObjectDepth, GeometryAbstractObject): From 3495b1283274106b8f5ed6d1f47d360a66231a0e Mon Sep 17 00:00:00 2001 From: Sergei Yakimchik Date: Sun, 16 Dec 2012 22:26:37 +0300 Subject: [PATCH 2/2] Redrawing of triangle when change radius of circumcircle. --- components/geometry/base/geom_modes.py | 33 +++++++++++++++++++----- components/geometry/base/geom_objects.py | 10 ------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/components/geometry/base/geom_modes.py b/components/geometry/base/geom_modes.py index 4e9be55..d574d65 100644 --- a/components/geometry/base/geom_modes.py +++ b/components/geometry/base/geom_modes.py @@ -363,6 +363,9 @@ def _onKeyPressed(self, _evt): selected = self._logic._getSheet().getSelected() for obj in selected: if isinstance(obj, (GeometryTriangle)): + + triangleSides = obj.getSides() + circumcirclePoints = obj._calculateCircumcirclePoints() # create center point of circle @@ -372,22 +375,40 @@ def _onKeyPressed(self, _evt): sheet.addChild(center) center._updateView() - #set point of circle as vertex of triangle - vertexPointCoord = circumcirclePoints[1] - vertex = self._logic.createPoint(vertexPointCoord) - sheet = self._logic._getSheet() + vertexA_x = render_engine.pos3dTo2dWindow(triangleSides[0].getEnd().getPosition())[0] + vertexA_y = render_engine.pos3dTo2dWindow(triangleSides[0].getEnd().getPosition())[1] + vertexB_x = render_engine.pos3dTo2dWindow(triangleSides[1].getEnd().getPosition())[0] + vertexB_y = render_engine.pos3dTo2dWindow(triangleSides[1].getEnd().getPosition())[1] + vertexC_x = render_engine.pos3dTo2dWindow(triangleSides[2].getEnd().getPosition())[0] + vertexC_y = render_engine.pos3dTo2dWindow(triangleSides[2].getEnd().getPosition())[1] + + vertexPointCoordA = vertexA_x, vertexA_y + vertexPointCoordB = vertexB_x, vertexB_y + vertexPointCoordC = vertexC_x, vertexC_y + + sideObjects = self._logic._getSheet()._getObjectsUnderMouse(True, True, vertexPointCoordA) + vertexA = comutils._getFirstObjectTypeFromList(sideObjects, [GeometryPoint]) - _selected = center, vertex + sideObjects = self._logic._getSheet()._getObjectsUnderMouse(True, True, vertexPointCoordB) + vertexB = comutils._getFirstObjectTypeFromList(sideObjects, [GeometryPoint]) + + sideObjects = self._logic._getSheet()._getObjectsUnderMouse(True, True, vertexPointCoordC) + vertexC = comutils._getFirstObjectTypeFromList(sideObjects, [GeometryPoint]) + + _selected = center, vertexA obj._setCircumcirclePoints(_selected) + #draw circumcircle self.active_object = self._logic.createCircle() + if self.active_object.makeBasedOnObjects(_selected): self._logic._getSheet().addChild(self.active_object) - obj._setIsCircumcircleDrawed(True) else: self.active_object.delete() + self.active_object.addPoint(vertexB, self.active_object._calculatePointRelPosition(render_engine.pos2dTo3dIsoPos(vertexPointCoordB))) + self.active_object.addPoint(vertexC, self.active_object._calculatePointRelPosition(render_engine.pos2dTo3dIsoPos(vertexPointCoordC))) self.active_object = None return False diff --git a/components/geometry/base/geom_objects.py b/components/geometry/base/geom_objects.py index 0c11976..e9cff9f 100644 --- a/components/geometry/base/geom_objects.py +++ b/components/geometry/base/geom_objects.py @@ -1169,16 +1169,6 @@ def _getCircumcirclePoints(self): """get list of circumcircle points """ return self.circumcirclePoints - - def _setIsCircumcircleDrawed(self, isCircumcircleDrawed): - """set flag circumcircle drawed - """ - self.isCircumcircleDrawed = isCircumcircleDrawed - - def _getIsCircumcircleDrawed(self): - """get flag circumcircle drawed - """ - return self.isCircumcircleDrawed class GeometryQuadrangle(suit.core.objects.ObjectDepth, GeometryAbstractObject):