| |
|
|
ByteAttack | Hallo! Vielleicht gibt es den einen oder anderen der Fit in Mathe ist. Ich brauche mal eine Formelsammlung und zwar um XYZ-Daten in YBC (sprich LRA) umzuwandeln. Habe zwar per MatLab ein PlugIn gefunden, werde ich aber leider nicht schlau draus. Möchte das gerne unter XProfan berechnen.
Saluto Marc-Gordon
Plugin: KompilierenMarkierenSeparieren%XYZ2YBC convert form XYZ coordinate to YBC format (LRA)
% XYZ2YBC(X,Y,Z) convert the X,Y,Z values to Y,B,C values. assuming the bend
% radius is zero. the size of X,Y and Z must be the same.
%
% XYZ2YBC(X,Y,Z,R) where R is the bend radius. convert the X,Y,Z values to
% Y,B,C values, taking in to account the bend radius R.
%
% XYZ2YBC(X,Y,Z,R) where R is the bend radius matrix for each bend. convert
% the X,Y,Z values to Y,B,C values, taking in to account the bend radius R
% for each bend. size of R must be less than the number of XYZ points by 2.
%
% returns Y length between bends, B rotation between bends in radius,+ for
% clockwise and - for anticlockwise, C angle of bend in radius.
%
% File: xyz2ybc
% Author: Ammar Mousali
% Date: 29/04/2004
% Griffith University
% V1.1
%
% changes from V1.0
% changed the output from degrees to radius.
%
function [Y,B,C] = xyz2ybc(Xc,Yc,Zc,R)
if( (length(Xc) ~= length(Yc)) | (length(Xc) ~= length(Zc)) )
error('X,Y,Z are not the same size');
end
if(nargin == 3)
% set the bend radius to zero for all bends.
R = zeros(1,length(Xc)-2);
elseif(length(R) == 1)
% set the bend radius to R for all bends.
R = ones(1,length(Xc)-2).*R;
elseif(length(R) ~= length(Xc)-2)
error('R size doesnt match the number of bends');
end
% number of bends is less than the number of XYZ points by 2.
for i = 1:length(Xc)-2
% calculate the 2 vectors BA and BC, representing an angle ABC.
V1 = [Xc(i)-Xc(i+1) ; Yc(i)-Yc(i+1) ; Zc(i)-Zc(i+1)];
V2 = [Xc(i+2)-Xc(i+1) ; Yc(i+2)-Yc(i+1) ; Zc(i+2)-Zc(i+1)];
% calculate the length of vectors BA and BC.
V1l = Vlength(V1);
V2l = Vlength(V2);
% calculate the angle between the 2 vectors BA and BC.
C(i) = pi - acos(dot(V1,V2) / (V1l*V2l));
% calculate the vector perpendicular to the plan ABC.
planeV(i,:) = cross(V1,V2)';
if(i>1)
% calculate the length of the straight by subtracting the tangent of
% the bend angle.
Y(i) = Y(i) - R(i)*tan(C(i)/2);
Y(i+1) = V2l - R(i)*tan(C(i)/2);
% calculate the length of vectors perpendicular to the plan ABC and
% the plan of the bend before it.
PV1l = Vlength(planeV(i-1,:));
PV2l = Vlength(planeV(i,:));
% calculate the rotation direction. negative if counter clockwise.
s=sign(V1 .* cross(planeV(i-1,:),planeV(i,:))');
% calculate the rotation angle and multiply by the rotation direction.
B(i) = acos(dot(planeV(i-1,:),planeV(i,:))/(PV1l*PV2l))*s(1);
else
% calculate the length of the straight by subtracting the tangent of
% the bend angle.
Y(i) = V1l - R(i)*tan(C(i)/2);
Y(i+1) = V2l - R(i)*tan(C(i)/2);
% rotation of the first bend is always zero.
B(i) = 0;
end
end
% calculate the length of a 3D vector.
function l=Vlength(V)
l = sqrt(V(1)^2 + V(2)^2 + V(3an class=s2>)^2);
|
|
|
| |
|
|
|
ByteAttack | keiner der vielleicht Matlab hat? |
|
|
| |
|
|
|
| Also mich überforderts,
intelleleluell und zeitlich sodass ich mich da eben nicht fix rein und denken kann.
Vlt. kannst Du mal schreiben was Du machen möchtest, dann ists vlt. einfacher. |
|
|
| |
|
|
|
ByteAttack |
OK! Ich habe eine technische Zeichnung, das mir alle Biegekoordinaten in XYZ angibt. Und zwar den Rohranfang (Meißt X=0,Y=0,Z=0) und dann immer genau der Mittelpunkt der Biegung, sowie das Rohrende! (rotes + siehe Bild) Das was ich weiß sind halt die Koordinaten, sowie der Biegeradius. Diese sollen jetzt umgerechnet werden in Länge, Drehung, Biegewinkel.
Habe da ein Beispiel gefunden: (Biegeradius 30)
X Y Z 0 |0 |0 ' Anfang Rohr 100 | 0 |0 ' Erster Bogen 150 | 40 |0 ' Zweiter Bogen 50 | 100 | 80 'Ende Rohn
ergibt
L R A (Länge, Drehung, Biegung) 89,477 0° 38,66° 13,197 -36,20° 106,69° |
|
|
| |
|
|
|
| Hm und wenn Du einfach ein gerades Rohr kaufst? |
|
|
| |
|
|
|
ByteAttack | Gerades Rohr habe ich ja - Will es halt Krum machen |
|
|
| |
|
|
|
| Hm also normal ist das nicht.
Ich versuch mich grad intelleuel in das Rohr hinein zu versetzen, Stein hat glaube schon mal geklappt.
Wenn ich das richtig verstehe dann hast Du also 3 XYZ Koordinaten und möchtest von XYZ[1..3] nach XYZ[1..2] & LRA[1] rechnen, wobei naturalmente nur LRA auszurechnen wäre weil XYZ[1..2] als 3D-Vektor bereits bekannt ist?
Also erstmal die Drehung rechnen die notwendig ist um vom Vektor XYZ[1-2] auf die Koordinate XYZ[3] zu kommen und die Länge müsste dann vielleicht von der Biegung abhängen oder anders herum bzw. geht man dabei von einer linearen Biegeverbiegung aus?
Ich glaube das die Formel da oben noch einiges mehr macht quasi als Industrie- Formel und man sie per exakte Ergebnisse genau übersetzen müsste, was ich aber nicht kann, da ich nicht weiß wie Io l' Code zu interpretieren habe. |
|
|
| |
|
|
|
ByteAttack | Genau das ist mein Problem. Ich blick das mit dem Matlab net... |
|
|
| |
|
|
|
| Siehst Du es auch so, dass das L(ength) "nur" die Distanz zweier XYZ-Koordinaten ist wonach L = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) + (z2-z1)*(z2-z1)) wäre?
A(ngle) herausbekommen stelle ich mir bisher so vor, dass man die 3D-Koordinaten in un 2D-Räpresentation umwandelt potuto und damit einfach der Winkel zwischen beiden Punkten errechnet werden müsste z.B. mit angleByLine ( [...] ) . |
|
|
| |
|
|