FreeCAD vector math library/pl: Difference between revisions

From FreeCAD Documentation
No edit summary
 
(14 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<languages/>
<languages/>

Jest to plik pythona zawierający kilka użytecznych funkcji do manipulowania wektorami w programie Freecad. Wystarczy wkleić następujący kod do pliku pythona po czym zaimportować go do swojego skryptu.<br /> Biblioteka ta jest zawarta w [[Draft Module]] i może być obsługiwana z interpretera pythona w następujący sposób:
==Wprowadzenie==
import DraftVecUtils

Jest to moduł [[Python/pl|Python]] zawierający kilka użytecznych funkcji do manipulowania wektorami. Biblioteka ta jest zawarta w środowisku pracy [[Draft_Workbench/pl|Rysunek Roboczy]] i może być dostępna w ten sposób z interpretera Python:
{{Code|code=
import DraftVecUtils
}}

Proszę zauważyć, że ten moduł został stworzony dawno temu, kiedy klasa {{incode|Vector}} nie miała wielu swoich metod. Teraz te operacje mogą być wykonywane przez samą klasę Vector.

Chociaż moduł {{incode|DraftVecUtils}} nadal istnieje i nadal jest używany w Środowisku pracy [[Draft_Workbench/pl|Rysunek Roboczy]], prawdopodobnie bezpośrednio do nowych rozwiązań lepiej jest używać metod {{incode|Vector}}.

==Funkcje==

Wektory są cegłami budowlanymi niemal wszystkich operacji geometrycznych 3D, dlatego warto wiedzieć o nich trochę więcej, aby zrozumieć, jak te funkcje mogą być dla Ciebie użyteczne. Poniżej kilka dobrych stron, aby poznać podstawy matematyki wektorowej:
Wektory są cegłami budowlanymi niemal wszystkich operacji geometrycznych 3D, dlatego warto wiedzieć o nich trochę więcej, aby zrozumieć, jak te funkcje mogą być dla Ciebie użyteczne. Poniżej kilka dobrych stron, aby poznać podstawy matematyki wektorowej:
* http://en.wikipedia.org/wiki/Vector_space
* http://en.wikipedia.org/wiki/Vector_space
* http://maths-wiki.wikispaces.com/Vectors
* http://maths-wiki.wikispaces.com/Vectors
* http://darksleep.com/player/opengl_coordinate_system_and_matrix_math.html
* http://darksleep.com/player/opengl_coordinate_system_and_matrix_math.html
<pre>
"Vector math library for FreeCAD"


{{Code|code=
import math,FreeCAD
"""Vector math library for FreeCAD"""

import math
import FreeCAD
def add(first, other):
def add(first, other):
"add(Vector,Vector) - adds two vectors"
"""add(Vector,Vector) - adds two vectors"""
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
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)
return FreeCAD.Vector(first.x+other.x, first.y+other.y, first.z+other.z)
def sub(first, other):
def sub(first, other):
"sub(Vector,Vector) - subtracts second vector from first one"
"""sub(Vector,Vector) - subtracts second vector from first one"""
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
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)
return FreeCAD.Vector(first.x-other.x, first.y-other.y, first.z-other.z)
def scale(first,scalar):
def scale(first,scalar):
"scale(Vector,Float) - scales (multiplies) a vector by a factor"
"""scale(Vector,Float) - scales (multiplies) a vector by a factor"""
if isinstance(first,FreeCAD.Vector):
if isinstance(first,FreeCAD.Vector):
return FreeCAD.Vector(first.x*scalar, first.y*scalar, first.z*scalar)
return FreeCAD.Vector(first.x*scalar, first.y*scalar, first.z*scalar)
def length(first):
def length(first):
"lengh(Vector) - gives vector length"
"""lengh(Vector) - gives vector length"""
if isinstance(first,FreeCAD.Vector):
if isinstance(first,FreeCAD.Vector):
return math.sqrt(first.x*first.x + first.y*first.y + first.z*first.z)
return math.sqrt(first.x*first.x + first.y*first.y + first.z*first.z)
def dist(first, other):
def dist(first, other):
"dist(Vector,Vector) - returns the distance between both points/vectors"
"""dist(Vector,Vector) - returns the distance between both points/vectors"""
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
return length(sub(first,other))
return length(sub(first,other))
def normalized(first):
def normalized(first):
"normalized(Vector) - returns a unit vector"
"""normalized(Vector) - returns a unit vector"""
if isinstance(first,FreeCAD.Vector):
if isinstance(first,FreeCAD.Vector):
l=length(first)
l=length(first)
return FreeCAD.Vector(first.x/l, first.y/l, first.z/l)
return FreeCAD.Vector(first.x/l, first.y/l, first.z/l)
def dotproduct(first, other):
def dotproduct(first, other):
"dotproduct(Vector,Vector) - returns the dot product of both vectors"
"""dotproduct(Vector,Vector) - returns the dot product of both vectors"""
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
return (first.x*other.x + first.y*other.y + first.z*other.z)
return (first.x*other.x + first.y*other.y + first.z*other.z)
def crossproduct(first, other=FreeCAD.Vector(0,0,1)):
def crossproduct(first, other=FreeCAD.Vector(0,0,1)):
"crossproduct(Vector,Vector) - returns the cross product of both vectors.
"""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 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):
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)
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)):
def angle(first, other=FreeCAD.Vector(1,0,0)):
"angle(Vector,Vector) - returns the angle in radians between the two vectors.
"""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 only one is given, angle is between the vector and the horizontal East direction"""
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
return math.acos(dotproduct(normalized(first),normalized(other)))
return math.acos(dotproduct(normalized(first),normalized(other)))
def project(first, other):
def project(first, other):
"project(Vector,Vector): projects the first vector onto the second one"
"""project(Vector,Vector): projects the first vector onto the second one"""
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
if isinstance(first,FreeCAD.Vector) and isinstance(other,FreeCAD.Vector):
return scale(other, dotproduct(first,other)/dotproduct(other,other))
return scale(other, dotproduct(first,other)/dotproduct(other,other))
}}
</pre>
[[Category:Poweruser Documentation/pl]]


{{Powerdocnavi{{#translation:}}}}
[[Category:Developer Documentation{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
{{clear}}
{{clear}}

Latest revision as of 03:47, 25 August 2021

Wprowadzenie

Jest to moduł Python zawierający kilka użytecznych funkcji do manipulowania wektorami. Biblioteka ta jest zawarta w środowisku pracy Rysunek Roboczy i może być dostępna w ten sposób z interpretera Python:

import DraftVecUtils

Proszę zauważyć, że ten moduł został stworzony dawno temu, kiedy klasa Vector nie miała wielu swoich metod. Teraz te operacje mogą być wykonywane przez samą klasę Vector.

Chociaż moduł DraftVecUtils nadal istnieje i nadal jest używany w Środowisku pracy Rysunek Roboczy, prawdopodobnie bezpośrednio do nowych rozwiązań lepiej jest używać metod Vector.

Funkcje

Wektory są cegłami budowlanymi niemal wszystkich operacji geometrycznych 3D, dlatego warto wiedzieć o nich trochę więcej, aby zrozumieć, jak te funkcje mogą być dla Ciebie użyteczne. Poniżej kilka dobrych stron, aby poznać podstawy matematyki wektorowej:

"""Vector math library for FreeCAD"""

import math
import 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))