| # SPDX-License-Identifier: LGPL-2.1-or-later | |
| # *************************************************************************** | |
| # * Copyright (c) 2009, 2010 Yorik van Havre <yorik@uncreated.net> * | |
| # * Copyright (c) 2009, 2010 Ken Cline <cline@frii.com> * | |
| # * * | |
| # * 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 algebra. | |
| This includes calculating linear equation parameters, and matrix determinants. | |
| """ | |
| ## @package linear_algebra | |
| # \ingroup draftgeoutils | |
| # \brief Provides various functions for linear algebra. | |
| ## \addtogroup draftgeoutils | |
| # @{ | |
| 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 | |
| ## @} | |