FreeCAD vector math library: Difference between revisions

From FreeCAD Documentation
m (2 revisions)
No edit summary
Line 6: Line 6:
* http://www.geocities.com/SiliconValley/2151/math3d.html
* http://www.geocities.com/SiliconValley/2151/math3d.html


Vector math library for FreeCAD"
<code python>
'''
Vector math library for FreeCAD"
import math,FreeCAD
'''
def add(first, other):

"add(Vector,Vector) - adds two vectors"
import math,FreeCAD
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):

return FreeCAD.Vector(first.x+other.x, first.y+other.y, first.z+other.z)
def add(first, other):
"add(Vector,Vector) - adds two vectors"
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
def sub(first, other):
"sub(Vector,Vector) - subtracts second vector from first one"
return FreeCAD.Vector(first.x+other.x, first.y+other.y, first.z+other.z)
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):

return FreeCAD.Vector(first.x-other.x, first.y-other.y, first.z-other.z)
def sub(first, other):
"sub(Vector,Vector) - subtracts second vector from first one"
def scale(first,scalar):
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
"scale(Vector,Float) - scales (multiplies) a vector by a factor"
return FreeCAD.Vector(first.x-other.x, first.y-other.y, first.z-other.z)
if isinstance(first,FreeCAD.Vector):

return FreeCAD.Vector(first.x*scalar, first.y*scalar, first.z*scalar)
def scale(first,scalar):
"scale(Vector,Float) - scales (multiplies) a vector by a factor"
if isinstance(first,FreeCAD.Vector):
def length(first):
"lengh(Vector) - gives vector length"
return FreeCAD.Vector(first.x*scalar, first.y*scalar, first.z*scalar)
if isinstance(first,FreeCAD.Vector):

return math.sqrt(first.x*first.x + first.y*first.y + first.z*first.z)
def length(first):
"lengh(Vector) - gives vector length"
if isinstance(first,FreeCAD.Vector):
def dist(first, other):
"dist(Vector,Vector) - returns the distance between both points/vectors"
return math.sqrt(first.x*first.x + first.y*first.y + first.z*first.z)
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):

def dist(first, other):
return length(sub(first,other))
"dist(Vector,Vector) - returns the distance between both points/vectors"
def normalized(first):
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
"normalized(Vector) - returns a unit vector"
return length(sub(first,other))
if isinstance(first,FreeCAD.Vector):

def normalized(first):
l=length(first)
return FreeCAD.Vector(first.x/l, first.y/l, first.z/l)
"normalized(Vector) - returns a unit vector"
if isinstance(first,FreeCAD.Vector):
l=length(first)
def dotproduct(first, other):
"dotproduct(Vector,Vector) - returns the dot product of both vectors"
return FreeCAD.Vector(first.x/l, first.y/l, first.z/l)
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):

def dotproduct(first, other):
return (first.x*other.x + first.y*other.y + first.z*other.z)
"dotproduct(Vector,Vector) - returns the dot product of both vectors"
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
def crossproduct(first, other=FreeCAD.Vector(0,0,1)):
"crossproduct(Vector,Vector) - returns the cross product of both vectors.
return (first.x*other.x + first.y*other.y + first.z*other.z)
If only one is specified, cross product is made with vertical axis, thus returning its perpendicular in XY plane"

def crossproduct(first, other=FreeCAD.Vector(0,0,1)):
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
return FreeCAD.Vector(first.y*other.z - first.z*other.y, first.z*other.x - first.x*other.z, first.x*other.y - first.y*other.x)
'''crossproduct(Vector,Vector) - returns the cross product of both vectors.
If only one is specified, cross product is made with vertical axis, thus returning its perpendicular in XY plane'''
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
def angle(first, other=FreeCAD.Vector(1,0,0)):
"angle(Vector,Vector) - returns the angle in radians between the two vectors.
return FreeCAD.Vector(first.y*other.z - first.z*other.y, first.z*other.x - first.x*other.z, first.x*other.y - first.y*other.x)
If only one is given, angle is between the vector and the horizontal East direction"

def angle(first, other=FreeCAD.Vector(1,0,0)):
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
return math.acos(dotproduct(normalized(first),normalized(other)))
'''angle(Vector,Vector) - returns the angle in radians between the two vectors.
If only one is given, angle is between the vector and the horizontal East direction'''
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
def project(first, other):
"project(Vector,Vector): projects the first vector onto the second one"
return math.acos(dotproduct(normalized(first),normalized(other)))
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):

return scale(other, dotproduct(first,other)/dotproduct(other,other))
def project(first, other):
"project(Vector,Vector): projects the first vector onto the second one"
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
return scale(other, dotproduct(first,other)/dotproduct(other,other))

</code>

Revision as of 02:57, 10 April 2009

This is a python file containing a couple of useful functions to manipulate freecad vectors. Just paste the following code in a python file, and import that file in your python script in order to use them.

Vectors are the building bricks of almost all 3D geometric operations, so it is useful to know a bit about them to understand how these functions can be useful to you. A couple of good pages to learn the basics of vector math:

Vector math library for FreeCAD"

import math,FreeCAD

def add(first, other):
	"add(Vector,Vector) - adds two vectors"
	if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
		return FreeCAD.Vector(first.x+other.x, first.y+other.y, first.z+other.z)

def sub(first, other): 
	"sub(Vector,Vector) - subtracts second vector from first one"
	if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
		return FreeCAD.Vector(first.x-other.x, first.y-other.y, first.z-other.z)

def scale(first,scalar):
	"scale(Vector,Float) - scales (multiplies) a vector by a factor"
	if isinstance(first,FreeCAD.Vector):
		return FreeCAD.Vector(first.x*scalar, first.y*scalar, first.z*scalar)

def length(first):
	"lengh(Vector) - gives vector length"
	if isinstance(first,FreeCAD.Vector):
		return math.sqrt(first.x*first.x + first.y*first.y + first.z*first.z)

def dist(first, other):
	"dist(Vector,Vector) - returns the distance between both points/vectors"
	if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
		return length(sub(first,other))

def normalized(first):
	"normalized(Vector) - returns a unit vector"
	if isinstance(first,FreeCAD.Vector):
		l=length(first)
		return FreeCAD.Vector(first.x/l, first.y/l, first.z/l)

def dotproduct(first, other):
	"dotproduct(Vector,Vector) - returns the dot product of both vectors"
	if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
		return (first.x*other.x + first.y*other.y + first.z*other.z)

def crossproduct(first, other=FreeCAD.Vector(0,0,1)):
	"crossproduct(Vector,Vector) - returns the cross product of both vectors. 
	If only one is specified, cross product is made with vertical axis, thus returning its perpendicular in XY plane"
	if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
		return FreeCAD.Vector(first.y*other.z - first.z*other.y, first.z*other.x - first.x*other.z, first.x*other.y - first.y*other.x)

def angle(first, other=FreeCAD.Vector(1,0,0)):
	"angle(Vector,Vector) - returns the angle in radians between the two vectors. 
	If only one is given, angle is between the vector and the horizontal East direction"
	if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
		return math.acos(dotproduct(normalized(first),normalized(other)))

def project(first, other):
	"project(Vector,Vector): projects the first vector onto the second one"
	if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
		return scale(other, dotproduct(first,other)/dotproduct(other,other))