From d8f770989c2e1dda2a8851091c44cf309f2f672f Mon Sep 17 00:00:00 2001 From: vocx-fc Date: Fri, 22 May 2020 23:39:27 -0500 Subject: [PATCH] Draft: move functions to draftgeoutils.linear_algebra --- src/Mod/Draft/CMakeLists.txt | 1 + src/Mod/Draft/DraftGeomUtils.py | 47 +---------- src/Mod/Draft/draftgeoutils/linear_algebra.py | 84 +++++++++++++++++++ 3 files changed, 87 insertions(+), 45 deletions(-) create mode 100644 src/Mod/Draft/draftgeoutils/linear_algebra.py diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index 8150d1e1b3..5534384c65 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -40,6 +40,7 @@ SET (Draft_geoutils draftgeoutils/arcs.py draftgeoutils/fillets.py draftgeoutils/offsets.py + draftgeoutils/linear_algebra.py ) SET(Draft_tests diff --git a/src/Mod/Draft/DraftGeomUtils.py b/src/Mod/Draft/DraftGeomUtils.py index 4ab9acfdfe..5d792fa7e5 100644 --- a/src/Mod/Draft/DraftGeomUtils.py +++ b/src/Mod/Draft/DraftGeomUtils.py @@ -1004,53 +1004,10 @@ def circleFrom3CircleTangents(circle1, circle2, circle3): return None -def linearFromPoints(p1, p2): - """Calculate linear equation from points. - - Calculate the slope and offset parameters of the linear equation of a line defined by two points. - - Linear equation: - y = m * x + b - m = dy / dx - m ... Slope - b ... Offset (point where the line intersects the y axis) - dx/dy ... Delta x and y. Using both as a vector results in a non-offset direction vector. - """ - if isinstance(p1, Vector) and isinstance(p2, Vector): - line = {} - line['dx'] = (p2.x - p1.x) - line['dy'] = (p2.y - p1.y) - line['slope'] = line['dy'] / line['dx'] - line['offset'] = p1.y - slope * p1.x - return line - else: - return None +from draftgeoutils.linear_algebra import linearFromPoints -def determinant(mat, n): - """ - determinant(matrix,int) - Determinat function. Returns the determinant - of a n-matrix. It recursively expands the minors. - """ - matTemp = [[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]] - if (n > 1): - if n == 2: - d = mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1] - else: - d = 0.0 - for j1 in range(n): - # Create minor - for i in range(1, n): - j2 = 0 - for j in range(n): - if j == j1: - continue - matTemp[i-1][j2] = mat[i][j] - j2 += 1 - d += (-1.0)**(1.0 + j1 + 1.0) * mat[0][j1] * determinant(matTemp, n-1) - return d - else: - return 0 +from draftgeoutils.linear_algebra import determinant def findHomotheticCenterOfCircles(circle1, circle2): diff --git a/src/Mod/Draft/draftgeoutils/linear_algebra.py b/src/Mod/Draft/draftgeoutils/linear_algebra.py new file mode 100644 index 0000000000..e2e26272f5 --- /dev/null +++ b/src/Mod/Draft/draftgeoutils/linear_algebra.py @@ -0,0 +1,84 @@ +# *************************************************************************** +# * Copyright (c) 2009, 2010 Yorik van Havre * +# * Copyright (c) 2009, 2010 Ken Cline * +# * * +# * This file is part of the FreeCAD CAx development system. * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * FreeCAD is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with FreeCAD; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** +"""Provides various functions for linear algebraic operations. + +This includes calculating linear equation parameters, and matrix determinants. +""" +## @package linear_algebra +# \ingroup DRAFTGEOUTILS +# \brief Provides various functions for linear algebraic operations. + +import FreeCAD as App + + +def linearFromPoints(p1, p2): + """Calculate linear equation from points. + + Calculate the slope and offset parameters of the linear equation + of a line defined by two points. + + Linear equation: + y = m * x + b + m = dy / dx + m ... Slope + b ... Offset (point where the line intersects the y axis) + dx/dy ... Delta x and y. Using both as a vector results + in a non-offset direction vector. + """ + if not isinstance(p1, App.Vector) and not isinstance(p2, App.Vector): + return None + + line = {} + line['dx'] = (p2.x - p1.x) + line['dy'] = (p2.y - p1.y) + line['slope'] = line['dy'] / line['dx'] + line['offset'] = p1.y - line['slope'] * p1.x + return line + + +def determinant(mat, n): + """Return the determinant of an N-matrix. + + It recursively expands the minors. + """ + matTemp = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] + if (n > 1): + if n == 2: + d = mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1] + else: + d = 0.0 + for j1 in range(n): + # Create minor + for i in range(1, n): + j2 = 0 + for j in range(n): + if j == j1: + continue + matTemp[i-1][j2] = mat[i][j] + j2 += 1 + d += ((-1.0)**(1.0 + j1 + 1.0) + * mat[0][j1] * determinant(matTemp, n-1)) + return d + else: + return 0